From 43429906b89d8aed686a2552baab32351785eca6 Mon Sep 17 00:00:00 2001 From: =?utf8?q?St=C3=A9phane=20Glondu?= Date: Sun, 12 Oct 2025 11:55:19 +0200 Subject: [PATCH] New upstream version 5.4.0 --- .depend | 238 +- .editorconfig | 13 + .gitattributes | 49 +- .github/workflows/build-cross.yml | 273 + .github/workflows/build-msvc.yml | 182 +- .github/workflows/build.yml | 111 +- .github/workflows/hygiene.yml | 23 +- .github/workflows/multicoretests.yml | 73 + .github/workflows/parsetree-change.yml | 39 + .github/workflows/stale.yml | 18 - .github/workflows/tsan.yml | 7 +- .gitignore | 2 +- .gitmodules | 10 +- .mailmap | 1 + CONTRIBUTING.md | 16 + Changes | 823 +- HACKING.adoc | 67 +- INSTALL.adoc | 56 + Makefile | 58 +- Makefile.build_config.in | 13 + Makefile.common | 35 +- Makefile.config.in | 7 +- Makefile.cross | 115 + Makefile.dev | 11 +- README.adoc | 10 +- VERSION | 2 +- aclocal.m4 | 118 +- api_docgen/Ocaml_operators.mld | 49 +- api_docgen/ocamldoc/Makefile | 1 + asmcomp/afl_instrument.ml | 2 +- asmcomp/amd64/emit.mlp | 17 +- asmcomp/arm64/arch.ml | 2 +- asmcomp/arm64/emit.mlp | 235 +- asmcomp/arm64/proc.ml | 4 +- asmcomp/arm64/selection.ml | 2 +- asmcomp/cmm.ml | 5 + asmcomp/cmm.mli | 10 +- asmcomp/cmm_helpers.ml | 251 +- asmcomp/cmm_helpers.mli | 23 +- asmcomp/cmm_invariants.ml | 88 +- asmcomp/cmmgen.ml | 131 +- asmcomp/emitaux.ml | 29 +- asmcomp/emitaux.mli | 13 + asmcomp/power/emit.mlp | 14 +- asmcomp/printcmm.ml | 15 +- asmcomp/riscv/NOTES.md | 2 +- asmcomp/riscv/emit.mlp | 17 +- asmcomp/s390x/emit.mlp | 15 +- asmcomp/selectgen.ml | 9 +- asmcomp/thread_sanitizer.ml | 7 +- asmcomp/x86_proc.ml | 6 +- boot/menhir/menhirLib.ml | 2 +- boot/menhir/menhirLib.mli | 2 +- boot/menhir/parser.ml | 39948 +++++++++------- boot/ocamlc | Bin 3372764 -> 3515140 bytes boot/ocamllex | Bin 406627 -> 415557 bytes build-aux/ax_prog_cc_for_build.m4 | 175 + build-aux/compile | 347 - build-aux/config.guess | 26 +- build-aux/config.sub | 885 +- build-aux/install-sh | 185 +- build-aux/libtool.m4 | 661 +- build-aux/ltmain.sh | 1208 +- build-aux/ltoptions.m4 | 108 +- build-aux/ltsugar.m4 | 2 +- build-aux/ltversion.m4 | 13 +- build-aux/lt~obsolete.m4 | 4 +- build-aux/missing | 215 - build-aux/ocaml_version.m4 | 4 +- bytecomp/bytegen.ml | 14 +- bytecomp/bytelink.ml | 11 +- bytecomp/bytelink.mli | 1 + configure | 4761 +- configure.ac | 467 +- debugger/command_line.ml | 2 +- debugger/debugger_parser.mly | 24 +- debugger/eval.ml | 3 +- debugger/loadprinter.ml | 105 +- debugger/loadprinter.mli | 13 +- debugger/printval.ml | 9 +- debugger/printval.mli | 4 +- driver/compenv.ml | 34 +- driver/main_args.ml | 49 +- driver/main_args.mli | 6 + driver/makedepend.ml | 11 +- driver/pparse.ml | 13 + dune | 8 +- file_formats/cmt_format.ml | 43 +- file_formats/cmt_format.mli | 2 + lambda/lambda.ml | 34 +- lambda/lambda.mli | 16 +- lambda/matching.ml | 444 +- lambda/printlambda.ml | 21 +- lambda/tmc.ml | 9 +- lambda/translclass.ml | 300 +- lambda/translcore.ml | 148 +- lambda/translcore.mli | 2 +- lambda/translmod.ml | 105 +- lambda/translobj.ml | 11 +- lambda/translobj.mli | 2 +- lambda/translprim.ml | 132 +- lambda/value_rec_compiler.ml | 162 +- man/ocamldep.1 | 5 + man/ocamlprof.1 | 5 + manual/README.md | 6 +- manual/src/cmds/Makefile | 8 +- manual/src/cmds/intf-c.etex | 74 +- manual/src/cmds/ocamldep.etex | 15 + manual/src/cmds/profil.etex | 260 +- manual/src/cmds/unified-options.etex | 4 +- manual/src/library/compilerlibs.etex | 2 +- manual/src/library/stdlib-blurb.etex | 17 +- manual/src/macros.tex | 3 +- manual/src/refman/Makefile | 2 +- manual/src/refman/expr.etex | 6 +- manual/src/refman/exten.etex | 96 +- manual/src/refman/extensions/alerts.etex | 86 +- .../src/refman/extensions/arrayliterals.etex | 67 + manual/src/refman/extensions/attributes.etex | 8 + manual/src/refman/extensions/bigarray.etex | 3 + manual/src/refman/extensions/bindingops.etex | 3 + manual/src/refman/extensions/doccomments.etex | 3 + manual/src/refman/extensions/effects.etex | 3 + .../src/refman/extensions/emptyvariants.etex | 4 + .../refman/extensions/extensiblevariants.etex | 3 + .../src/refman/extensions/extensionnodes.etex | 14 +- .../refman/extensions/extensionsyntax.etex | 3 + .../refman/extensions/firstclassmodules.etex | 7 + manual/src/refman/extensions/gadts.etex | 5 + .../refman/extensions/generalizedopens.etex | 3 + .../refman/extensions/generativefunctors.etex | 3 + manual/src/refman/extensions/indexops.etex | 3 + .../src/refman/extensions/inlinerecords.etex | 3 + .../src/refman/extensions/labeledtuples.etex | 112 + .../src/refman/extensions/letrecvalues.etex | 3 + .../refman/extensions/locallyabstract.etex | 5 + manual/src/refman/extensions/modulealias.etex | 4 + .../src/refman/extensions/moduletypeof.etex | 7 + .../src/refman/extensions/overridingopen.etex | 4 + .../src/refman/extensions/privatetypes.etex | 4 + .../refman/extensions/recursivemodules.etex | 5 + .../extensions/signaturesubstitution.etex | 6 + manual/src/refman/modtypes.etex | 2 +- manual/src/refman/modules.etex | 3 +- manual/src/refman/patterns.etex | 6 +- manual/src/refman/typedecl.etex | 3 + manual/src/refman/types.etex | 5 +- manual/src/tutorials/parallelism.etex | 65 +- manual/tests/check-stdlib-modules | 2 +- manual/tests/cross_reference_checker.ml | 5 +- middle_end/clambda_primitives.ml | 8 +- middle_end/clambda_primitives.mli | 8 +- middle_end/closure/closure.ml | 45 +- middle_end/compilenv.ml | 11 +- middle_end/compilenv.mli | 4 + middle_end/convert_primitives.ml | 8 +- middle_end/flambda/closure_conversion.ml | 21 +- middle_end/flambda/flambda.ml | 18 +- middle_end/flambda/flambda.mli | 3 +- middle_end/flambda/flambda_invariants.ml | 2 +- middle_end/flambda/flambda_to_clambda.ml | 4 +- middle_end/flambda/flambda_utils.ml | 5 +- middle_end/flambda/inconstant_idents.ml | 2 +- middle_end/flambda/inline_and_simplify.ml | 6 +- middle_end/flambda/inlining_cost.ml | 4 +- middle_end/flambda/inlining_transforms.ml | 2 +- middle_end/internal_variable_names.ml | 20 +- middle_end/printclambda_primitives.ml | 12 +- middle_end/semantics_of_primitives.ml | 7 +- ocaml-variants.opam | 8 +- ocamldoc/odoc_args.ml | 3 + ocamldoc/odoc_ast.ml | 23 +- ocamldoc/odoc_env.ml | 4 +- ocamldoc/odoc_html.ml | 17 +- ocamldoc/odoc_html.mli | 4 +- ocamldoc/odoc_info.mli | 1 + ocamldoc/odoc_latex.ml | 11 +- ocamldoc/odoc_latex.mli | 2 + ocamldoc/odoc_lexer.mll | 4 +- ocamldoc/odoc_man.ml | 2 + ocamldoc/odoc_misc.ml | 4 +- ocamldoc/odoc_sig.ml | 12 +- ocamldoc/odoc_str.ml | 3 +- ocamldoc/odoc_type.ml | 1 + ocamldoc/odoc_type.mli | 1 + ocamldoc/odoc_value.ml | 2 +- ocamltest/OCAMLTEST.org | 4 + ocamltest/builtin_actions.ml | 54 +- ocamltest/builtin_variables.ml | 4 + ocamltest/builtin_variables.mli | 2 + ocamltest/debugger_actions.ml | 129 + ocamltest/debugger_actions.mli | 22 + ocamltest/debugger_flags.ml | 21 + ocamltest/debugger_flags.mli | 22 + ocamltest/debugger_variables.ml | 21 + ocamltest/debugger_variables.mli | 19 + ocamltest/environments.ml | 4 +- ocamltest/filecompare.ml | 6 + ocamltest/main.ml | 148 +- ocamltest/ocaml_actions.ml | 54 +- ocamltest/ocaml_flags.ml | 4 - ocamltest/ocaml_flags.mli | 2 - ocamltest/ocaml_tests.ml | 2 +- ocamltest/ocaml_variables.ml | 4 - ocamltest/ocaml_variables.mli | 1 - ocamltest/ocamltest_config.ml.in | 9 +- ocamltest/ocamltest_config.mli | 11 +- ocamltest/ocamltest_stdlib.ml | 10 +- ocamltest/ocamltest_stdlib.mli | 3 +- ocamltest/options.ml | 21 +- ocamltest/run_command.ml | 13 + ocamltest/run_common.h | 2 +- ocamltest/run_stubs.c | 57 + ocamltest/run_unix.c | 6 +- ocamltest/tsl_lexer.mll | 6 + otherlibs/dynlink/byte/dynlink.ml | 24 +- otherlibs/dynlink/dynlink_config.ml.in | 6 +- otherlibs/dynlink/dynlink_types.ml | 2 +- otherlibs/runtime_events/runtime_events.ml | 7 + otherlibs/runtime_events/runtime_events.mli | 11 + .../runtime_events/runtime_events_consumer.c | 14 +- otherlibs/str/strstubs.c | 22 +- otherlibs/systhreads/st_posix.h | 83 +- otherlibs/systhreads/st_pthreads.h | 92 +- otherlibs/systhreads/st_stubs.c | 178 +- otherlibs/systhreads/st_win32.h | 24 +- otherlibs/systhreads/thread.ml | 8 +- otherlibs/systhreads/thread.mli | 18 +- otherlibs/unix/access.c | 28 +- otherlibs/unix/caml/unixsupport.h | 46 +- otherlibs/unix/channels_win32.c | 20 +- otherlibs/unix/cstringv.c | 2 +- otherlibs/unix/envir_unix.c | 2 +- otherlibs/unix/execvp.c | 5 +- otherlibs/unix/fcntl.c | 2 +- otherlibs/unix/ftruncate.c | 2 +- otherlibs/unix/getgroups.c | 25 +- otherlibs/unix/gethost.c | 2 +- otherlibs/unix/gettimeofday_unix.c | 3 +- otherlibs/unix/gettimeofday_win32.c | 4 +- otherlibs/unix/initgroups.c | 2 +- otherlibs/unix/itimer.c | 19 +- otherlibs/unix/link_win32.c | 16 +- otherlibs/unix/lockf_unix.c | 2 +- otherlibs/unix/lseek_unix.c | 2 +- otherlibs/unix/lseek_win32.c | 2 +- otherlibs/unix/mmap_ba.c | 8 +- otherlibs/unix/mmap_unix.c | 2 +- otherlibs/unix/nice.c | 2 +- otherlibs/unix/open_unix.c | 2 +- otherlibs/unix/select_unix.c | 14 +- otherlibs/unix/select_win32.c | 33 +- otherlibs/unix/setgroups.c | 2 +- otherlibs/unix/setsid.c | 2 +- otherlibs/unix/signals.c | 18 +- otherlibs/unix/sleep_unix.c | 18 +- otherlibs/unix/sleep_win32.c | 7 +- otherlibs/unix/sockopt_unix.c | 8 +- otherlibs/unix/sockopt_win32.c | 8 +- otherlibs/unix/stat_unix.c | 2 +- otherlibs/unix/stat_win32.c | 4 +- otherlibs/unix/times_unix.c | 9 +- otherlibs/unix/truncate_unix.c | 2 +- otherlibs/unix/unix.mli | 40 +- otherlibs/unix/unixLabels.mli | 40 +- otherlibs/unix/unix_unix.ml | 1 + otherlibs/unix/unix_win32.ml | 1 + otherlibs/unix/unixsupport_unix.c | 6 +- otherlibs/unix/utimes_unix.c | 6 +- otherlibs/unix/utimes_win32.c | 4 +- parsing/HACKING.adoc | 3 +- parsing/ast_helper.ml | 21 +- parsing/ast_helper.mli | 19 +- parsing/ast_invariants.ml | 98 +- parsing/ast_invariants.mli | 10 + parsing/ast_iterator.ml | 98 +- parsing/ast_iterator.mli | 1 + parsing/ast_mapper.ml | 129 +- parsing/ast_mapper.mli | 1 + parsing/asttypes.ml | 3 + parsing/asttypes.mli | 3 + parsing/builtin_attributes.ml | 3 + parsing/builtin_attributes.mli | 2 + parsing/depend.ml | 27 +- parsing/lexer.mll | 10 +- parsing/location.ml | 64 +- parsing/location.mli | 33 +- parsing/longident.ml | 31 +- parsing/longident.mli | 10 +- parsing/parse.ml | 20 +- parsing/parser.mly | 376 +- parsing/parsetree.mli | 66 +- parsing/pprintast.ml | 147 +- parsing/printast.ml | 35 +- parsing/printast.mli | 1 + parsing/unit_info.mli | 9 +- release-info/calendar.md | 33 +- release-info/howto.md | 100 +- release-info/introduction.md | 4 +- runtime/addrmap.c | 2 +- runtime/afl.c | 2 +- runtime/alloc.c | 95 - runtime/amd64.S | 215 +- runtime/amd64nt.asm | 40 +- runtime/arm64.S | 128 +- runtime/array.c | 77 +- runtime/backtrace.c | 6 +- runtime/backtrace_byt.c | 2 +- runtime/backtrace_nat.c | 6 +- runtime/bigarray.c | 18 +- runtime/callback.c | 22 +- runtime/caml/alloc.h | 2 +- runtime/caml/asm.h | 20 + runtime/caml/atomic_refcount.h | 37 - runtime/caml/bigarray.h | 5 +- runtime/caml/camlatomic.h | 46 +- runtime/caml/compatibility.h | 5 + runtime/caml/custom.h | 2 +- runtime/caml/domain.h | 28 + runtime/caml/domain_state.h | 2 +- runtime/caml/domain_state.tbl | 41 +- runtime/caml/dynlink.h | 2 +- runtime/caml/fail.h | 3 + runtime/caml/fiber.h | 3 +- runtime/caml/finalise.h | 2 +- runtime/caml/frame_descriptors.h | 7 +- runtime/caml/gc_ctrl.h | 6 + runtime/caml/gc_stats.h | 2 + runtime/caml/intext.h | 2 +- runtime/caml/io.h | 20 +- runtime/caml/lf_skiplist.h | 2 +- runtime/caml/m.h.in | 10 + runtime/caml/major_gc.h | 26 +- runtime/caml/memory.h | 38 +- runtime/caml/memprof.h | 8 +- runtime/caml/minor_gc.h | 2 + runtime/caml/misc.h | 226 +- runtime/caml/mlvalues.h | 1 + runtime/caml/osdeps.h | 94 +- runtime/caml/platform.h | 15 +- runtime/caml/runtime_events.h | 4 +- runtime/caml/s.h.in | 12 +- runtime/caml/shared_heap.h | 19 +- runtime/caml/skiplist.h | 8 +- runtime/caml/startup.h | 4 +- runtime/caml/sys.h | 2 +- runtime/caml/tsan.h | 9 +- runtime/caml/weak.h | 23 +- runtime/codefrag.c | 11 +- runtime/compare.c | 8 +- runtime/custom.c | 14 +- runtime/debugger.c | 12 +- runtime/domain.c | 378 +- runtime/dynlink.c | 15 +- runtime/dynlink_nat.c | 9 +- runtime/extern.c | 16 +- runtime/fail_byt.c | 6 +- runtime/fiber.c | 93 +- runtime/finalise.c | 6 +- runtime/fix_code.c | 4 +- runtime/floats.c | 2 +- runtime/frame_descriptors.c | 3 +- runtime/gc_ctrl.c | 162 +- runtime/gc_stats.c | 12 +- runtime/globroots.c | 46 +- runtime/instrtrace.c | 12 +- runtime/intern.c | 28 +- runtime/interp.c | 10 +- runtime/ints.c | 2 +- runtime/io.c | 36 +- runtime/lexing.c | 2 +- runtime/lf_skiplist.c | 29 +- runtime/major_gc.c | 887 +- runtime/memory.c | 116 +- runtime/memprof.c | 40 +- runtime/meta.c | 2 +- runtime/minor_gc.c | 149 +- runtime/misc.c | 39 +- runtime/obj.c | 89 +- runtime/parsing.c | 5 +- runtime/platform.c | 73 +- runtime/power.S | 30 +- runtime/riscv.S | 23 +- runtime/runtime_events.c | 38 +- runtime/s390x.S | 38 +- runtime/sak.c | 164 +- runtime/shared_heap.c | 167 +- runtime/signals.c | 37 +- runtime/skiplist.c | 25 +- runtime/startup_aux.c | 25 +- runtime/startup_byt.c | 30 +- runtime/startup_nat.c | 4 +- runtime/sync.c | 39 +- runtime/sync_posix.h | 21 - runtime/sys.c | 135 +- runtime/unix.c | 17 +- runtime/weak.c | 104 +- runtime/win32.c | 164 +- stdlib/.depend | 48 +- stdlib/StdlibModules | 6 +- stdlib/arg.ml | 12 - stdlib/array.ml | 29 +- stdlib/array.mli | 16 + stdlib/arrayLabels.mli | 16 + stdlib/atomic.ml | 49 +- stdlib/atomic.mli | 26 + stdlib/bool.ml | 3 + stdlib/bool.mli | 9 + stdlib/camlinternalFormatBasics.ml | 59 + stdlib/camlinternalFormatBasics.mli | 12 + stdlib/camlinternalLazy.ml | 15 + stdlib/camlinternalLazy.mli | 2 + stdlib/camlinternalOO.ml | 17 +- stdlib/char.ml | 57 + stdlib/char.mli | 164 +- stdlib/domain.mli | 8 +- stdlib/dune | 3 +- stdlib/dune_support/dune | 6 + stdlib/dune_support/new_predef_types.mli | 1 + stdlib/dynarray.ml | 117 +- stdlib/dynarray.mli | 41 +- stdlib/effect.mli | 8 +- stdlib/either.ml | 12 + stdlib/either.mli | 19 + stdlib/ephemeron.ml | 2 +- stdlib/ephemeron.mli | 4 +- stdlib/filename.ml | 4 +- stdlib/filename.mli | 10 +- stdlib/float.ml | 49 +- stdlib/float.mli | 32 + stdlib/format.ml | 106 +- stdlib/format.mli | 45 +- stdlib/fun.mli | 171 + stdlib/gc.ml | 33 +- stdlib/gc.mli | 79 +- stdlib/hashbang | 1 - stdlib/header.c | 4 +- stdlib/iarray.ml | 334 + stdlib/iarray.mli | 286 + stdlib/in_channel.ml | 2 +- stdlib/list.ml | 18 +- stdlib/list.mli | 24 +- stdlib/listLabels.mli | 24 +- stdlib/map.mli | 2 +- stdlib/moreLabels.mli | 2 +- stdlib/pair.ml | 34 + stdlib/pair.mli | 66 + stdlib/pqueue.ml | 287 + stdlib/pqueue.mli | 275 + stdlib/random.mli | 10 +- stdlib/repr.ml | 21 + stdlib/repr.mli | 69 + stdlib/result.ml | 15 + stdlib/result.mli | 43 + stdlib/seq.ml | 13 + stdlib/seq.mli | 37 +- stdlib/stdlib.ml | 4 + stdlib/stdlib.mli | 59 +- stdlib/string.ml | 100 + stdlib/string.mli | 47 + stdlib/stringLabels.mli | 47 + stdlib/sys.ml.in | 64 +- stdlib/sys.mli | 129 +- .../templates/floatarraylabeled.template.mli | 16 + stdlib/templates/map.template.mli | 2 +- stdlib/type.ml | 2 +- stdlib/uchar.ml | 10 + stdlib/uchar.mli | 19 +- stdlib/weak.ml | 76 +- testsuite/HACKING.adoc | 3 +- .../tests/array-functions/test_iarray.ml | 270 + .../array-functions/test_iarray.reference | 1 + .../asmcomp/0001-test.compilers.reference | 2 +- testsuite/tests/asmcomp/func_sections.ml | 21 +- ...ctions.no_jump_tables_in_rodata.reference} | 0 testsuite/tests/asmcomp/func_sections.run | 2 +- testsuite/tests/asmcomp/issue13875.ml | 10 + .../tests/asmcomp/regression_value_kinds.ml | 21 + .../tests/asmcomp/static_catch_unboxing.ml | 17 + testsuite/tests/ast-invariants/test.ml | 6 +- .../tests/atomic-locs/cmm.compilers.reference | 56 + testsuite/tests/atomic-locs/cmm.ml | 42 + testsuite/tests/atomic-locs/record_fields.ml | 271 + .../backtrace_dynlink.flambda.reference | 8 +- .../backtrace/backtrace_dynlink.reference | 8 +- .../{cocinelle.ml => coccinelle.ml} | 14 +- ...cinelle.reference => coccinelle.reference} | 0 .../main.bytecode.reference | 6 +- .../badly-ordered-deps/main.native.reference | 6 +- .../basic-more/morematch.compilers.reference | 3 +- .../basic-more/pr10338.compilers.reference | 2 +- .../robustmatch.compilers.reference | 84 +- testsuite/tests/basic/eval_order_9.ml | 8 + testsuite/tests/basic/eval_order_9.reference | 1 + .../tests/basic/patmatch_for_multiple.ml | 166 +- testsuite/tests/basic/patmatch_incoherence.ml | 21 +- testsuite/tests/basic/patmatch_split_no_or.ml | 58 +- .../basic/unit_naming.compilers.reference | 6 +- testsuite/tests/callback/signals_alloc.ml | 3 +- .../tests/callback/test_signalhandler.ml | 3 +- .../compaction/test_compact_manydomains.ml | 16 + .../tests/compiler-libs/test_longident.ml | 211 +- .../tests/compiler-libs/test_untypeast.ml | 61 +- .../tests/effect-syntax/error_messages.ml | 8 - .../when_test.compilers.reference | 2 +- .../tests/formatting/errors_batch.reference | 4 +- .../tests/formatting/margins.ocaml.reference | 6 +- .../tests/frame-pointers/c_call.reference | 13 +- .../tests/frame-pointers/effects.reference | 24 +- .../tests/frame-pointers/exception_handler.ml | 14 +- .../exception_handler.reference | 24 +- testsuite/tests/frame-pointers/exceptions.ml | 34 + .../tests/frame-pointers/exceptions.reference | 14 + testsuite/tests/frame-pointers/fp_backtrace.c | 8 +- testsuite/tests/frame-pointers/qsort.ml | 48 + .../tests/frame-pointers/qsort.reference | 4 + testsuite/tests/frame-pointers/qsort_.c | 80 + .../tests/frame-pointers/reperform.reference | 26 +- .../stack_realloc.arm64.reference | 10 + .../tests/frame-pointers/stack_realloc.ml | 14 +- .../frame-pointers/stack_realloc.reference | 6 +- .../stack_realloc2.arm64.reference | 10 + .../tests/frame-pointers/stack_realloc2.ml | 14 +- .../frame-pointers/stack_realloc2.reference | 6 +- .../errors.compilers.reference | 521 +- .../cant_reference_hidden.ocamlc.reference | 6 +- .../hidden_stays_hidden.ocamlc.reference | 6 +- .../not_included.ocamlc.reference | 4 +- testsuite/tests/hidden_includes/test.ml | 6 +- .../wrong_include_order.ocamlc.reference | 4 +- testsuite/tests/lazy/lazy10.ml | 21 + testsuite/tests/lazy/lazy10.reference | 2 + testsuite/tests/lazy/lazy9.ml | 36 + testsuite/tests/lazy/lazy9.reference | 0 testsuite/tests/let-syntax/let_syntax.ml | 13 +- .../tests/letrec-check/pr7215.ocaml.reference | 2 +- .../tests/letrec-check/pr7231.ocaml.reference | 2 +- .../tests/letrec-check/pr7706.ocaml.reference | 4 +- testsuite/tests/letrec-compilation/lazy_.ml | 18 +- .../tests/letrec-compilation/lazy_.reference | 3 +- testsuite/tests/letrec-compilation/nested2.ml | 8 + testsuite/tests/lexing/escape.ocaml.reference | 18 +- .../tests/lexing/uchar_esc.ocaml.reference | 12 +- testsuite/tests/lib-array/test_array.ml | 44 + testsuite/tests/lib-array/test_iarray.ml | 445 + testsuite/tests/lib-bigarray-2/bigarrcstub.c | 7 + testsuite/tests/lib-bigarray-2/bigarrfstub.c | 7 + testsuite/tests/lib-bool/test.ml | 39 + .../tests/lib-channels/close_during_flush.ml | 34 + .../lib-channels/close_during_flush.reference | 1 + testsuite/tests/lib-char/test.ml | 132 + testsuite/tests/lib-char/test.reference | 1 + testsuite/tests/lib-dynarray/test.ml | 75 + testsuite/tests/lib-dynlink-domains/main.ml | 1 - .../test10_main.byte.reference | 6 +- .../test10_main.native.reference | 4 +- testsuite/tests/lib-either/test.ml | 15 + testsuite/tests/lib-floatarray/floatarray.ml | 2 + testsuite/tests/lib-format/format_text.ml | 92 + testsuite/tests/lib-format/unicode.ml | 179 + testsuite/tests/lib-list/test.ml | 37 +- testsuite/tests/lib-pair/test.ml | 83 + testsuite/tests/lib-pair/test.reference | 1 + testsuite/tests/lib-pqueue/test.ml | 135 + testsuite/tests/lib-pqueue/test.reference | 1 + testsuite/tests/lib-result/test.ml | 44 + .../lib-runtime-events/test_corrupted.ml | 3 +- .../lib-runtime-events/test_dropped_events.ml | 24 +- .../tests/lib-runtime-events/test_external.ml | 3 +- .../test_external_preserve.ml | 3 +- .../tests/lib-runtime-events/test_fork.ml | 3 +- .../test_timestamp_monotonic.ml | 15 + .../test_user_event_signal.ml | 2 +- .../test_user_event_unknown.ml | 3 +- testsuite/tests/lib-seq/test.ml | 10 + testsuite/tests/lib-string/test_string.ml | 83 +- testsuite/tests/lib-sys/signal.ml | 86 + testsuite/tests/lib-sys/signal.reference | 2 + testsuite/tests/lib-systhreads/eintr.ml | 2 +- .../lib-systhreads/test_c_thread_register.ml | 1 + testsuite/tests/lib-systhreads/testfork.ml | 3 +- testsuite/tests/lib-systhreads/testfork2.ml | 3 +- testsuite/tests/lib-systhreads/testpreempt.ml | 2 +- testsuite/tests/lib-systhreads/testyield.ml | 2 +- .../tests/lib-systhreads/threadsigmask.ml | 2 +- testsuite/tests/lib-threads/delayintr.ml | 2 +- testsuite/tests/lib-threads/signal.ml | 2 +- testsuite/tests/lib-threads/sockets.ml | 2 +- testsuite/tests/lib-uchar/test.ml | 10 + testsuite/tests/lib-unix/common/cloexec.ml | 136 +- .../tests/lib-unix/common/fdstatus_aux.c | 77 +- .../tests/lib-unix/common/fdstatus_main.ml | 36 +- .../tests/lib-unix/common/fork_cleanup.ml | 2 +- .../common/fork_cleanup_systhreads.ml | 2 +- .../common/multicore_fork_domain_alone.ml | 2 +- .../common/multicore_fork_domain_alone2.ml | 2 +- testsuite/tests/lib-unix/common/sigwait.ml | 25 + testsuite/tests/lib-unix/isatty/isatty_tty.ml | 3 +- testsuite/tests/lib-unix/kill/unix_kill.ml | 3 +- .../win-channel-of/parallel_channel_of.ml | 3 +- .../tests/lib-unix/win-createprocess/test.ml | 3 +- testsuite/tests/lib-unix/win-env/test_env.ml | 3 +- .../tests/lib-unix/win-socketpair/test.ml | 2 +- testsuite/tests/lib-unix/win-stat/test.ml | 3 +- .../lib-unix/win-symlink/parallel_symlink.ml | 3 +- testsuite/tests/lib-unix/win-symlink/test.ml | 3 +- .../non_local.compilers.reference | 3 +- .../exhaustiveness_warnings.ml | 12 +- .../tests/match-side-effects/check_partial.ml | 80 +- .../tests/match-side-effects/partiality.ml | 280 +- .../match-side-effects/test_contexts_code.ml | 66 +- testsuite/tests/memory-model/forbidden.ml | 1 + testsuite/tests/memory-model/publish.ml | 1 + testsuite/tests/messages/highlight_tabs.ml | 2 +- testsuite/tests/messages/precise_locations.ml | 2 +- testsuite/tests/messages/spellcheck.ml | 55 +- testsuite/tests/native-debugger/gdb-script | 17 + testsuite/tests/native-debugger/gdb_test.py | 23 + testsuite/tests/native-debugger/has_gdb.sh | 18 + testsuite/tests/native-debugger/has_lldb.sh | 38 + .../tests/native-debugger/linux-gdb-amd64.ml | 19 + .../native-debugger/linux-gdb-amd64.reference | 56 + .../tests/native-debugger/linux-gdb-arm64.ml | 19 + .../native-debugger/linux-gdb-arm64.reference | 56 + .../tests/native-debugger/linux-gdb-riscv.ml | 19 + .../native-debugger/linux-gdb-riscv.reference | 56 + .../tests/native-debugger/linux-lldb-amd64.ml | 19 + .../linux-lldb-amd64.reference | 111 + .../tests/native-debugger/linux-lldb-arm64.ml | 19 + .../linux-lldb-arm64.reference | 111 + testsuite/tests/native-debugger/lldb-script | 16 + testsuite/tests/native-debugger/lldb_test.py | 57 + .../tests/native-debugger/macos-lldb-amd64.ml | 19 + .../macos-lldb-amd64.reference | 95 + .../tests/native-debugger/macos-lldb-arm64.ml | 19 + .../macos-lldb-arm64.reference | 95 + testsuite/tests/native-debugger/meander.ml | 13 + testsuite/tests/native-debugger/meander_c.c | 8 + testsuite/tests/native-debugger/sanitize.awk | 61 + testsuite/tests/native-debugger/sanitize.sh | 9 + .../no-alias-deps/aliases.compilers.reference | 3 +- testsuite/tests/parallel/catch_break.ml | 2 +- testsuite/tests/parallel/mctest.ml | 1 + testsuite/tests/parallel/pingpong.ml | 1 + .../bigarray_index_labels.compilers.reference | 6 + .../parse-errors/bigarray_index_labels.ml | 13 + .../expecting.compilers.reference | 16 +- .../mismatch_struct_sig.compilers.reference | 16 +- ...ton_labeled_tuple_type.compilers.reference | 4 + .../singleton_labeled_tuple_type.ml | 7 + ...closed_class_signature.compilers.reference | 4 +- ...osed_class_simpl_expr1.compilers.reference | 4 +- ...osed_class_simpl_expr2.compilers.reference | 4 +- ...osed_class_simpl_expr3.compilers.reference | 4 +- .../unclosed_object.compilers.reference | 4 +- ...sed_paren_module_expr1.compilers.reference | 4 +- ...sed_paren_module_expr2.compilers.reference | 4 +- ...sed_paren_module_expr3.compilers.reference | 4 +- ...sed_paren_module_expr4.compilers.reference | 4 +- ...sed_paren_module_expr5.compilers.reference | 4 +- ...osed_paren_module_type.compilers.reference | 4 +- .../unclosed_sig.compilers.reference | 4 +- .../unclosed_simple_expr.compilers.reference | 100 +- ...nclosed_simple_pattern.compilers.reference | 26 +- .../unclosed_struct.compilers.reference | 4 +- .../locations_test.compilers.reference | 11 +- .../parsing/attributes.compilers.reference | 44 +- .../broken_invariants.compilers.reference | 8 + testsuite/tests/parsing/broken_invariants.ml | 2 + .../parsing/comments.compilers.reference | 9 +- testsuite/tests/parsing/comments.ml | 6 +- testsuite/tests/parsing/illegal_ppx.ml | 17 +- ...nd_float_with_modifier.compilers.reference | 2 +- .../tests/parsing/latin9.compilers.reference | 4 +- .../shortcut_ext_attr.compilers.reference | 197 +- testsuite/tests/parsing/shortcut_ext_attr.ml | 2 +- testsuite/tests/ppx-contexts/myppx.ml | 4 +- .../ppx-contexts/test.compilers.reference | 4 +- testsuite/tests/regression/pr11865/mkroot.ml | 30 + .../tests/regression/pr11865/mkroot.reference | 1 + .../tests/regression/pr11865/mkroot_stubs.c | 50 + testsuite/tests/runtime-errors/syserror.ml | 10 +- .../cannot_shadow_error.compilers.reference | 6 +- testsuite/tests/shadow_include/shadow_all.ml | 28 +- testsuite/tests/shape-index/index.ml | 8 +- testsuite/tests/shape-index/index.reference | 76 +- .../tests/shape-index/index_aliases.reference | 47 +- .../shape-index/index_bindingops.reference | 44 +- .../tests/shape-index/index_constrs.reference | 18 +- .../shape-index/index_constrs_records.ml | 8 + .../index_constrs_records.reference | 88 +- .../tests/shape-index/index_functor.reference | 12 +- .../tests/shape-index/index_labels.reference | 21 +- .../tests/shape-index/index_modules.reference | 12 +- .../tests/shape-index/index_objects.reference | 22 +- .../tests/shape-index/index_types.reference | 18 +- .../tests/shape-index/index_vb.reference | 22 +- testsuite/tests/statmemprof/bigarray.ml | 105 + .../tests/statmemprof/bigarray.reference | 20 + testsuite/tests/statmemprof/bigarray_stubs.c | 45 + .../tests/statmemprof/user_data_regression.ml | 26 + .../user_data_regression.reference | 1 + .../statmemprof/user_data_regression_stub.c | 13 + .../max_arity.compilers.reference | 2 +- testsuite/tests/tmc/other_features.ml | 4 +- .../partial_application.compilers.reference | 2 +- .../tupled_function_calls.native.reference | 2 +- testsuite/tests/tmc/usage_warnings.ml | 73 +- .../tests/tool-debugger/basic/debuggee.ml | 2 +- testsuite/tests/tool-debugger/dynlink/host.ml | 2 +- .../tool-debugger/find-artifacts/debuggee.ml | 2 +- .../tool-debugger/module_named_main/main.ml | 2 +- .../tool-debugger/no_debug_event/noev.ml | 2 +- .../tests/tool-debugger/printer/debuggee.ml | 2 +- .../marshalled.compilers.reference | 4 +- .../test.compilers.reference | 2 +- ...tool-ocamlc-open-error.compilers.reference | 2 +- .../tool-ocamldoc/Paragraph.html.reference | 3 +- .../check_for_pack.compilers.reference | 2 +- .../tool-toplevel/constructor_printing.ml | 130 + .../error_highlighting.compilers.reference | 46 +- .../multi_phrase_line.compilers.reference | 23 +- .../tool-toplevel/pr7060.compilers.reference | 3 +- .../redefinition_hints.compilers.reference | 22 +- .../tool-toplevel/strings.compilers.reference | 3 +- .../comparison_table.compilers.reference | 4 +- testsuite/tests/tsan/array_elt.reference | 20 +- testsuite/tests/tsan/exn_from_c.reference | 22 +- .../tests/tsan/exn_in_callback.reference | 22 +- testsuite/tests/tsan/exn_reraise.reference | 22 +- testsuite/tests/tsan/filter-locations.sh | 4 +- testsuite/tests/tsan/perform.reference | 74 +- .../tsan/raise_through_handler.reference | 22 +- testsuite/tests/tsan/record_field.reference | 20 +- testsuite/tests/tsan/reperform.reference | 74 +- testsuite/tests/tsan/unhandled.reference | 50 +- testsuite/tests/tsan/waitgroup_stubs.c | 11 +- testsuite/tests/typedtree/module_presence.ml | 66 + testsuite/tests/typeopt/nested_unboxed.ml | 32 + .../tests/typing-core-bugs/const_int_hint.ml | 32 +- .../typing-core-bugs/missing_rec_hint.ml | 4 +- .../typing-core-bugs/repeated_did_you_mean.ml | 2 +- .../type_expected_explanation.ml | 4 +- testsuite/tests/typing-deprecated/alerts.ml | 12 +- .../tests/typing-deprecated/deprecated.ml | 3 +- .../test.ocaml.reference | 6 +- .../tests/typing-extensions/disambiguation.ml | 18 +- .../tests/typing-extensions/floatarray.ml | 73 + testsuite/tests/typing-extensions/iarray.ml | 88 + .../tests/typing-extensions/open_types.ml | 24 +- .../tests/typing-fstclassmod/scope_escape.ml | 33 - testsuite/tests/typing-gadts/didier.ml | 6 +- testsuite/tests/typing-gadts/pr10189.ml | 42 +- testsuite/tests/typing-gadts/pr13579.ml | 3 +- testsuite/tests/typing-gadts/pr5785.ml | 3 +- testsuite/tests/typing-gadts/pr5906.ml | 3 +- testsuite/tests/typing-gadts/pr5981.ml | 6 +- testsuite/tests/typing-gadts/pr5989.ml | 6 +- testsuite/tests/typing-gadts/pr5997.ml | 6 +- testsuite/tests/typing-gadts/pr6241.ml | 3 +- testsuite/tests/typing-gadts/pr6993_bad.ml | 3 +- testsuite/tests/typing-gadts/pr7016.ml | 3 +- testsuite/tests/typing-gadts/pr7234.ml | 6 +- testsuite/tests/typing-gadts/pr7269.ml | 9 +- testsuite/tests/typing-gadts/pr7390.ml | 3 +- testsuite/tests/typing-gadts/pr7432.ml | 3 +- testsuite/tests/typing-gadts/pr9019.ml | 16 +- .../typing-gadts/principality-and-gadts.ml | 75 +- .../tests/typing-gadts/syntactic-arity.ml | 9 +- testsuite/tests/typing-gadts/test.ml | 24 +- .../typing-gadts/unexpected_existentials.ml | 4 +- testsuite/tests/typing-gadts/yallop_bugs.ml | 61 +- .../labeled_tuple_patterns.ml | 641 + .../typing-labeled-tuples/labeled_tuples.ml | 569 + .../labeled_tuples_and_constructors.ml | 88 + .../labeled_tuples_dsource.ml | 33 + .../pr6303_bad.compilers.reference | 6 +- .../pr6946_bad.compilers.reference | 2 +- testsuite/tests/typing-misc/build_as_type.ml | 9 +- .../tests/typing-misc/coerce_principal.ml | 18 + testsuite/tests/typing-misc/constraints.ml | 79 +- .../typing-misc/disambiguate_principality.ml | 50 +- testsuite/tests/typing-misc/empty_variant.ml | 6 +- testsuite/tests/typing-misc/injectivity.ml | 119 +- testsuite/tests/typing-misc/labels.ml | 2 +- testsuite/tests/typing-misc/polyvars.ml | 42 +- testsuite/tests/typing-misc/pr6416.ml | 12 +- .../typing-misc/pr6939-no-flat-float-array.ml | 2 +- testsuite/tests/typing-misc/printing.ml | 2 +- testsuite/tests/typing-misc/records.ml | 20 +- testsuite/tests/typing-misc/type_approx.ml | 12 + ...mpty_polyvariant_error.compilers.reference | 2 +- .../typing-misc/typecore_nolabel_errors.ml | 14 +- .../tests/typing-misc/typetexp_errors.ml | 13 +- testsuite/tests/typing-misc/variance.ml | 152 +- .../test.compilers.reference | 6 +- .../pr10693_bad.compilers.reference | 18 +- .../pr6293_bad.compilers.reference | 2 +- .../pr6752_bad.compilers.reference | 6 +- .../pr6899_first_bad.compilers.reference | 4 +- .../pr6899_second_bad.compilers.reference | 4 +- .../pr6992_bad.compilers.reference | 6 +- .../pr7414_2_bad.compilers.reference | 6 +- .../pr7414_bad.compilers.reference | 6 +- .../pr9695_bad.compilers.reference | 2 +- testsuite/tests/typing-modules/Test.ml | 4 +- testsuite/tests/typing-modules/aliases.ml | 51 +- .../applicative_functor_type.ml | 16 +- testsuite/tests/typing-modules/firstclass.ml | 20 + testsuite/tests/typing-modules/functors.ml | 236 +- testsuite/tests/typing-modules/generative.ml | 2 +- .../module_type_substitution.ml | 222 + testsuite/tests/typing-modules/nondep.ml | 15 + .../typing-modules/package_constraint.ml | 51 +- .../pr13099/test.compilers.reference | 4 +- testsuite/tests/typing-modules/pr6633.ml | 8 +- testsuite/tests/typing-modules/pr7207.ml | 4 +- testsuite/tests/typing-modules/pr7726.ml | 16 +- testsuite/tests/typing-modules/pr7851.ml | 4 +- testsuite/tests/typing-modules/recursive.ml | 24 + .../pr3968_bad.compilers.reference | 18 +- .../pr4018_bad.compilers.reference | 30 +- .../pr4435_bad.compilers.reference | 2 +- .../pr4824a_bad.compilers.reference | 2 +- .../pr7284_bad.compilers.reference | 3 +- testsuite/tests/typing-objects/Exemples.ml | 4 +- testsuite/tests/typing-objects/Tests.ml | 33 +- testsuite/tests/typing-objects/field_kind.ml | 12 +- testsuite/tests/typing-objects/pr6383.ml | 4 +- .../pervasives_leitmotiv.compilers.reference | 12 +- .../pr4791.compilers.reference | 12 +- .../pr6323.compilers.reference | 12 +- .../pr7402.compilers.reference | 12 +- .../pr7620_bad.compilers.reference | 6 +- testsuite/tests/typing-poly/poly.ml | 28 +- testsuite/tests/typing-poly/pr11544.ml | 11 + .../pr3918c.compilers.reference | 4 +- .../pr5057a_bad.compilers.reference | 6 +- .../tests/typing-polyvariants-bugs/pr7824.ml | 3 +- .../tests/typing-polyvariants-bugs/pr8575.ml | 6 +- .../pr5026_bad.compilers.reference | 6 +- .../typing-private/invalid_private_row.ml | 15 +- .../private.compilers.principal.reference | 22 +- .../private.compilers.reference | 22 +- testsuite/tests/typing-recmod/gpr1626.ml | 15 +- testsuite/tests/typing-recmod/pr6491.ml | 35 +- .../typing-recmod/t01bad.compilers.reference | 4 +- .../typing-recmod/t02bad.compilers.reference | 8 +- .../typing-recmod/t04bad.compilers.reference | 8 +- .../typing-recmod/t05bad.compilers.reference | 12 +- .../typing-recmod/t07bad.compilers.reference | 6 +- .../typing-recmod/t08bad.compilers.reference | 10 +- .../typing-recmod/t09bad.compilers.reference | 10 +- .../typing-recmod/t11bad.compilers.reference | 6 +- .../typing-recmod/t12bad.compilers.reference | 6 +- .../typing-recmod/t14bad.compilers.reference | 6 +- .../typing-recmod/t15bad.compilers.reference | 4 +- .../recordarg.ocaml.reference | 8 +- .../pr5343_bad.compilers.reference | 6 +- .../pr6174_bad.compilers.reference | 4 +- .../pr6870_bad.compilers.reference | 6 +- .../b_bad.compilers.reference | 5 +- .../pr5918.compilers.reference | 2 +- .../short-paths.compilers.reference | 6 +- .../typing-sigsubst/sig_local_aliases.ml | 6 +- ..._aliases_syntax_errors.compilers.reference | 10 +- .../test_locations.compilers.reference | 12 +- .../typing-typeparam/newtype.ocaml.reference | 8 +- testsuite/tests/typing-unboxed/test.ml | 45 +- .../ambiguous_guarded_disjunction.ml | 139 +- .../tests/typing-warnings/application.ml | 15 +- .../disable_warnings_classes.ml | 8 +- .../tests/typing-warnings/exhaustiveness.ml | 44 +- .../tests/typing-warnings/open_warnings.ml | 42 +- testsuite/tests/typing-warnings/pr5892.ml | 3 +- testsuite/tests/typing-warnings/pr6872.ml | 27 +- testsuite/tests/typing-warnings/pr7085.ml | 3 +- testsuite/tests/typing-warnings/pr7115.ml | 8 +- .../pr7261.compilers.reference | 3 +- testsuite/tests/typing-warnings/pr7553.ml | 7 +- testsuite/tests/typing-warnings/pr9244.ml | 6 +- testsuite/tests/typing-warnings/records.ml | 237 +- .../unused_functor_parameter.ml | 6 +- .../tests/typing-warnings/unused_recmodule.ml | 2 +- .../tests/typing-warnings/unused_types.ml | 128 +- .../tests/unwind/check-linker-version.sh | 21 +- testsuite/tests/unwind/stack_walker.c | 4 +- .../deprecated_module.compilers.reference | 4 +- .../deprecated_module_use.compilers.reference | 4 +- .../tests/warnings/w01.compilers.reference | 5 +- .../tests/warnings/w03.compilers.reference | 2 +- .../tests/warnings/w04.compilers.reference | 2 +- .../warnings/w04_failure.compilers.reference | 6 +- .../tests/warnings/w06.compilers.reference | 6 +- testsuite/tests/warnings/w26_alias.ml | 2 +- testsuite/tests/warnings/w32.ml | 20 + testsuite/tests/warnings/w44.ml | 7 +- .../tests/warnings/w45.compilers.reference | 7 +- .../warnings/w47_inline.compilers.reference | 27 +- .../w47_ppwarning.compilers.reference | 12 +- testsuite/tests/warnings/w51.ml | 4 +- testsuite/tests/warnings/w52.ml | 42 +- .../tests/warnings/w53.compilers.reference | 364 +- .../w53_across_cmi.compilers.reference | 12 +- .../tests/warnings/w54.compilers.reference | 12 +- .../tests/warnings/w55.flambda.reference | 9 +- testsuite/tests/warnings/w55.native.reference | 9 +- testsuite/tests/warnings/w58.native.reference | 3 +- .../tests/warnings/w59.flambda.reference | 30 +- testsuite/tests/warnings/w74.ml | 32 +- .../tests/weak-ephe-final/ephe_custom.ml | 21 + .../weak-ephe-final/ephe_custom.reference | 2 + .../tests/weak-ephe-final/weak_array_par.ml | 25 + .../weak-ephe-final/weak_array_par.reference | 1 + .../win-unicode/mltest.compilers.reference | 14 +- testsuite/tools/asmgen_arm.S | 6 +- testsuite/tools/asmgen_arm64.S | 8 +- testsuite/tools/asmgen_power.S | 6 +- testsuite/tools/asmgen_s390x.S | 6 +- testsuite/tools/expect.ml | 16 +- testsuite/tools/parsecmm.mly | 12 +- testsuite/tools/parsecmmaux.ml | 31 +- testsuite/tools/parsecmmaux.mli | 10 +- tools/check-symbol-names | 4 +- tools/check-typo | 51 +- tools/ci/actions/check-configure.sh | 61 +- tools/ci/actions/check-parsetree-modified.sh | 54 - tools/ci/actions/check-typo.sh | 13 + tools/ci/actions/multicoretests.sh | 89 + tools/ci/actions/runner.sh | 50 +- tools/ci/appveyor/appveyor_build.cmd | 10 +- tools/ci/appveyor/appveyor_build.sh | 146 +- tools/ci/inria/main | 2 +- tools/gdb.py | 3 + tools/lldb.py | 7 +- tools/ocaml.py | 38 +- tools/ocamlcp_common.ml | 5 + tools/ocamlprof.ml | 27 +- tools/pre-commit-githook | 2 +- tools/sync_stdlib_docs | 2 +- toplevel/byte/topeval.ml | 11 +- toplevel/byte/trace.ml | 4 +- toplevel/genprintval.ml | 500 +- toplevel/native/topeval.ml | 11 +- toplevel/topcommon.ml | 28 +- toplevel/topcommon.mli | 14 +- toplevel/topdirs.ml | 148 +- toplevel/topprinters.ml | 124 +- toplevel/topprinters.mli | 24 +- typing/btype.ml | 27 +- typing/btype.mli | 5 - typing/cmt2annot.ml | 2 +- typing/ctype.ml | 402 +- typing/ctype.mli | 39 +- typing/data_types.ml | 91 + typing/data_types.mli | 75 + typing/datarepr.ml | 14 +- typing/datarepr.mli | 1 + typing/env.ml | 389 +- typing/env.mli | 27 +- typing/errortrace.ml | 4 +- typing/errortrace.mli | 1 + typing/errortrace_report.ml | 25 +- typing/gprinttyp.ml | 126 +- typing/gprinttyp.mli | 9 +- typing/ident.ml | 49 +- typing/includecore.ml | 44 +- typing/includecore.mli | 1 + typing/includemod.ml | 78 +- typing/includemod.mli | 24 +- typing/includemod_errorprinter.ml | 82 +- typing/mtype.ml | 9 +- typing/oprint.ml | 90 +- typing/out_type.ml | 61 +- typing/outcometree.mli | 15 +- typing/parmatch.ml | 164 +- typing/parmatch.mli | 5 +- typing/path.ml | 4 + typing/path.mli | 3 + typing/patterns.ml | 41 +- typing/patterns.mli | 11 +- typing/predef.ml | 336 +- typing/predef.mli | 39 +- typing/printpat.ml | 29 +- typing/printtyp.ml | 2 +- typing/printtyped.ml | 105 +- typing/rawprinttyp.ml | 16 +- typing/shape.ml | 24 +- typing/shape_reduce.ml | 12 +- typing/subst.ml | 10 +- typing/tast_iterator.ml | 97 +- typing/tast_mapper.ml | 105 +- typing/typeclass.ml | 60 +- typing/typecore.ml | 1452 +- typing/typecore.mli | 15 +- typing/typedecl.ml | 453 +- typing/typedecl.mli | 4 +- typing/typedecl_separability.ml | 8 +- typing/typedecl_variance.ml | 60 +- typing/typedecl_variance.mli | 6 +- typing/typedtree.ml | 66 +- typing/typedtree.mli | 77 +- typing/typemod.ml | 453 +- typing/typemod.mli | 3 +- typing/typeopt.ml | 76 +- typing/types.ml | 84 +- typing/types.mli | 65 +- typing/typetexp.ml | 269 +- typing/typetexp.mli | 4 +- typing/untypeast.ml | 89 +- typing/value_rec_check.ml | 27 +- utils/clflags.ml | 205 +- utils/clflags.mli | 46 +- utils/config.common.ml.in | 10 +- utils/config.fixed.ml | 8 + utils/config.generated.ml.in | 11 +- utils/config.mli | 33 + utils/format_doc.ml | 77 + utils/format_doc.mli | 9 + utils/misc.ml | 51 +- utils/misc.mli | 69 +- utils/numbers.ml | 2 +- utils/warnings.ml | 521 +- utils/warnings.mli | 13 +- yacc/defs.h | 20 +- yacc/error.c | 9 +- yacc/lr0.c | 10 +- yacc/main.c | 11 +- yacc/output.c | 2 +- yacc/skeleton.c | 6 +- yacc/symtab.c | 8 +- 1031 files changed, 58184 insertions(+), 29946 deletions(-) create mode 100644 .editorconfig create mode 100644 .github/workflows/build-cross.yml create mode 100644 .github/workflows/multicoretests.yml create mode 100644 .github/workflows/parsetree-change.yml delete mode 100644 .github/workflows/stale.yml create mode 100644 Makefile.cross create mode 100644 build-aux/ax_prog_cc_for_build.m4 delete mode 100755 build-aux/compile delete mode 100755 build-aux/missing create mode 100644 manual/src/refman/extensions/arrayliterals.etex create mode 100644 manual/src/refman/extensions/labeledtuples.etex create mode 100644 ocamltest/debugger_actions.ml create mode 100644 ocamltest/debugger_actions.mli create mode 100644 ocamltest/debugger_flags.ml create mode 100644 ocamltest/debugger_flags.mli create mode 100644 ocamltest/debugger_variables.ml create mode 100644 ocamltest/debugger_variables.mli delete mode 100644 runtime/caml/atomic_refcount.h create mode 100644 stdlib/dune_support/dune create mode 100644 stdlib/dune_support/new_predef_types.mli delete mode 100644 stdlib/hashbang create mode 100644 stdlib/iarray.ml create mode 100644 stdlib/iarray.mli create mode 100644 stdlib/pair.ml create mode 100644 stdlib/pair.mli create mode 100644 stdlib/pqueue.ml create mode 100644 stdlib/pqueue.mli create mode 100644 stdlib/repr.ml create mode 100644 stdlib/repr.mli create mode 100644 testsuite/tests/array-functions/test_iarray.ml create mode 100644 testsuite/tests/array-functions/test_iarray.reference rename testsuite/tests/asmcomp/{func_sections.arm.reference => func_sections.no_jump_tables_in_rodata.reference} (100%) create mode 100644 testsuite/tests/asmcomp/issue13875.ml create mode 100644 testsuite/tests/asmcomp/regression_value_kinds.ml create mode 100644 testsuite/tests/asmcomp/static_catch_unboxing.ml create mode 100644 testsuite/tests/atomic-locs/cmm.compilers.reference create mode 100644 testsuite/tests/atomic-locs/cmm.ml create mode 100644 testsuite/tests/atomic-locs/record_fields.ml rename testsuite/tests/badly-ordered-deps/{cocinelle.ml => coccinelle.ml} (74%) rename testsuite/tests/badly-ordered-deps/{cocinelle.reference => coccinelle.reference} (100%) create mode 100644 testsuite/tests/basic/eval_order_9.ml create mode 100644 testsuite/tests/basic/eval_order_9.reference create mode 100644 testsuite/tests/compaction/test_compact_manydomains.ml create mode 100644 testsuite/tests/frame-pointers/exceptions.ml create mode 100644 testsuite/tests/frame-pointers/exceptions.reference create mode 100644 testsuite/tests/frame-pointers/qsort.ml create mode 100644 testsuite/tests/frame-pointers/qsort.reference create mode 100644 testsuite/tests/frame-pointers/qsort_.c create mode 100644 testsuite/tests/frame-pointers/stack_realloc.arm64.reference create mode 100644 testsuite/tests/frame-pointers/stack_realloc2.arm64.reference create mode 100644 testsuite/tests/lazy/lazy10.ml create mode 100644 testsuite/tests/lazy/lazy10.reference create mode 100644 testsuite/tests/lazy/lazy9.ml create mode 100644 testsuite/tests/lazy/lazy9.reference create mode 100644 testsuite/tests/letrec-compilation/nested2.ml create mode 100644 testsuite/tests/lib-array/test_iarray.ml create mode 100644 testsuite/tests/lib-channels/close_during_flush.ml create mode 100644 testsuite/tests/lib-channels/close_during_flush.reference create mode 100644 testsuite/tests/lib-char/test.ml create mode 100644 testsuite/tests/lib-char/test.reference create mode 100644 testsuite/tests/lib-format/format_text.ml create mode 100644 testsuite/tests/lib-format/unicode.ml create mode 100644 testsuite/tests/lib-pair/test.ml create mode 100644 testsuite/tests/lib-pair/test.reference create mode 100644 testsuite/tests/lib-pqueue/test.ml create mode 100644 testsuite/tests/lib-pqueue/test.reference create mode 100644 testsuite/tests/lib-runtime-events/test_timestamp_monotonic.ml create mode 100644 testsuite/tests/lib-sys/signal.ml create mode 100644 testsuite/tests/lib-sys/signal.reference create mode 100644 testsuite/tests/lib-unix/common/sigwait.ml create mode 100644 testsuite/tests/native-debugger/gdb-script create mode 100644 testsuite/tests/native-debugger/gdb_test.py create mode 100755 testsuite/tests/native-debugger/has_gdb.sh create mode 100755 testsuite/tests/native-debugger/has_lldb.sh create mode 100644 testsuite/tests/native-debugger/linux-gdb-amd64.ml create mode 100644 testsuite/tests/native-debugger/linux-gdb-amd64.reference create mode 100644 testsuite/tests/native-debugger/linux-gdb-arm64.ml create mode 100644 testsuite/tests/native-debugger/linux-gdb-arm64.reference create mode 100644 testsuite/tests/native-debugger/linux-gdb-riscv.ml create mode 100644 testsuite/tests/native-debugger/linux-gdb-riscv.reference create mode 100644 testsuite/tests/native-debugger/linux-lldb-amd64.ml create mode 100644 testsuite/tests/native-debugger/linux-lldb-amd64.reference create mode 100644 testsuite/tests/native-debugger/linux-lldb-arm64.ml create mode 100644 testsuite/tests/native-debugger/linux-lldb-arm64.reference create mode 100644 testsuite/tests/native-debugger/lldb-script create mode 100755 testsuite/tests/native-debugger/lldb_test.py create mode 100644 testsuite/tests/native-debugger/macos-lldb-amd64.ml create mode 100644 testsuite/tests/native-debugger/macos-lldb-amd64.reference create mode 100644 testsuite/tests/native-debugger/macos-lldb-arm64.ml create mode 100644 testsuite/tests/native-debugger/macos-lldb-arm64.reference create mode 100644 testsuite/tests/native-debugger/meander.ml create mode 100644 testsuite/tests/native-debugger/meander_c.c create mode 100644 testsuite/tests/native-debugger/sanitize.awk create mode 100755 testsuite/tests/native-debugger/sanitize.sh create mode 100644 testsuite/tests/parse-errors/bigarray_index_labels.compilers.reference create mode 100644 testsuite/tests/parse-errors/bigarray_index_labels.ml create mode 100644 testsuite/tests/parse-errors/singleton_labeled_tuple_type.compilers.reference create mode 100644 testsuite/tests/parse-errors/singleton_labeled_tuple_type.ml create mode 100644 testsuite/tests/regression/pr11865/mkroot.ml create mode 100644 testsuite/tests/regression/pr11865/mkroot.reference create mode 100644 testsuite/tests/regression/pr11865/mkroot_stubs.c create mode 100644 testsuite/tests/statmemprof/bigarray.ml create mode 100644 testsuite/tests/statmemprof/bigarray.reference create mode 100644 testsuite/tests/statmemprof/bigarray_stubs.c create mode 100644 testsuite/tests/statmemprof/user_data_regression.ml create mode 100644 testsuite/tests/statmemprof/user_data_regression.reference create mode 100644 testsuite/tests/statmemprof/user_data_regression_stub.c create mode 100644 testsuite/tests/tool-toplevel/constructor_printing.ml create mode 100644 testsuite/tests/typedtree/module_presence.ml create mode 100644 testsuite/tests/typeopt/nested_unboxed.ml create mode 100644 testsuite/tests/typing-extensions/floatarray.ml create mode 100644 testsuite/tests/typing-extensions/iarray.ml create mode 100644 testsuite/tests/typing-labeled-tuples/labeled_tuple_patterns.ml create mode 100644 testsuite/tests/typing-labeled-tuples/labeled_tuples.ml create mode 100644 testsuite/tests/typing-labeled-tuples/labeled_tuples_and_constructors.ml create mode 100644 testsuite/tests/typing-labeled-tuples/labeled_tuples_dsource.ml create mode 100644 testsuite/tests/typing-misc/coerce_principal.ml create mode 100644 testsuite/tests/typing-misc/type_approx.ml create mode 100644 testsuite/tests/typing-poly/pr11544.ml create mode 100644 testsuite/tests/weak-ephe-final/ephe_custom.ml create mode 100644 testsuite/tests/weak-ephe-final/ephe_custom.reference create mode 100644 testsuite/tests/weak-ephe-final/weak_array_par.ml create mode 100644 testsuite/tests/weak-ephe-final/weak_array_par.reference delete mode 100755 tools/ci/actions/check-parsetree-modified.sh create mode 100755 tools/ci/actions/multicoretests.sh create mode 100644 typing/data_types.ml create mode 100644 typing/data_types.mli diff --git a/.depend b/.depend index ad323820..682adc0a 100644 --- a/.depend +++ b/.depend @@ -247,27 +247,36 @@ parsing/ast_helper.cmi : \ parsing/ast_invariants.cmo : \ parsing/syntaxerr.cmi \ parsing/parsetree.cmi \ + parsing/parse.cmi \ parsing/longident.cmi \ + parsing/location.cmi \ parsing/builtin_attributes.cmi \ parsing/asttypes.cmi \ + parsing/ast_mapper.cmi \ parsing/ast_iterator.cmi \ parsing/ast_invariants.cmi parsing/ast_invariants.cmx : \ parsing/syntaxerr.cmx \ parsing/parsetree.cmi \ + parsing/parse.cmx \ parsing/longident.cmx \ + parsing/location.cmx \ parsing/builtin_attributes.cmx \ parsing/asttypes.cmx \ + parsing/ast_mapper.cmx \ parsing/ast_iterator.cmx \ parsing/ast_invariants.cmi parsing/ast_invariants.cmi : \ - parsing/parsetree.cmi + parsing/parsetree.cmi \ + parsing/ast_iterator.cmi parsing/ast_iterator.cmo : \ parsing/parsetree.cmi \ + parsing/longident.cmi \ parsing/location.cmi \ parsing/ast_iterator.cmi parsing/ast_iterator.cmx : \ parsing/parsetree.cmi \ + parsing/longident.cmx \ parsing/location.cmx \ parsing/ast_iterator.cmi parsing/ast_iterator.cmi : \ @@ -437,11 +446,14 @@ parsing/location.cmi : \ utils/format_doc.cmi parsing/longident.cmo : \ utils/misc.cmi \ + parsing/location.cmi \ parsing/longident.cmi parsing/longident.cmx : \ utils/misc.cmx \ + parsing/location.cmx \ parsing/longident.cmi -parsing/longident.cmi : +parsing/longident.cmi : \ + parsing/location.cmi parsing/parse.cmo : \ parsing/syntaxerr.cmi \ parsing/pprintast.cmi \ @@ -632,6 +644,7 @@ typing/ctype.cmo : \ utils/format_doc.cmi \ typing/errortrace.cmi \ typing/env.cmi \ + typing/data_types.cmi \ utils/clflags.cmi \ typing/btype.cmi \ parsing/asttypes.cmi \ @@ -650,6 +663,7 @@ typing/ctype.cmx : \ utils/format_doc.cmx \ typing/errortrace.cmx \ typing/env.cmx \ + typing/data_types.cmx \ utils/clflags.cmx \ typing/btype.cmx \ parsing/asttypes.cmx \ @@ -658,18 +672,39 @@ typing/ctype.cmi : \ typing/types.cmi \ typing/type_immediacy.cmi \ typing/path.cmi \ - parsing/longident.cmi \ parsing/location.cmi \ typing/ident.cmi \ typing/errortrace.cmi \ typing/env.cmi \ + typing/data_types.cmi \ typing/btype.cmi \ parsing/asttypes.cmi +typing/data_types.cmo : \ + typing/types.cmi \ + typing/path.cmi \ + parsing/parsetree.cmi \ + parsing/location.cmi \ + parsing/asttypes.cmi \ + typing/data_types.cmi +typing/data_types.cmx : \ + typing/types.cmx \ + typing/path.cmx \ + parsing/parsetree.cmi \ + parsing/location.cmx \ + parsing/asttypes.cmx \ + typing/data_types.cmi +typing/data_types.cmi : \ + typing/types.cmi \ + typing/path.cmi \ + parsing/parsetree.cmi \ + parsing/location.cmi \ + parsing/asttypes.cmi typing/datarepr.cmo : \ typing/types.cmi \ typing/path.cmi \ parsing/location.cmi \ typing/ident.cmi \ + typing/data_types.cmi \ typing/btype.cmi \ parsing/asttypes.cmi \ typing/datarepr.cmi @@ -678,6 +713,7 @@ typing/datarepr.cmx : \ typing/path.cmx \ parsing/location.cmx \ typing/ident.cmx \ + typing/data_types.cmx \ typing/btype.cmx \ parsing/asttypes.cmx \ typing/datarepr.cmi @@ -685,7 +721,8 @@ typing/datarepr.cmi : \ parsing/unit_info.cmi \ typing/types.cmi \ typing/path.cmi \ - typing/ident.cmi + typing/ident.cmi \ + typing/data_types.cmi typing/env.cmo : \ utils/warnings.cmi \ parsing/unit_info.cmi \ @@ -705,6 +742,7 @@ typing/env.cmo : \ typing/ident.cmi \ utils/format_doc.cmi \ typing/datarepr.cmi \ + typing/data_types.cmi \ file_formats/cmi_format.cmi \ utils/clflags.cmi \ parsing/builtin_attributes.cmi \ @@ -730,6 +768,7 @@ typing/env.cmx : \ typing/ident.cmx \ utils/format_doc.cmx \ typing/datarepr.cmx \ + typing/data_types.cmx \ file_formats/cmi_format.cmx \ utils/clflags.cmx \ parsing/builtin_attributes.cmx \ @@ -749,6 +788,7 @@ typing/env.cmi : \ utils/load_path.cmi \ typing/ident.cmi \ utils/format_doc.cmi \ + typing/data_types.cmi \ file_formats/cmi_format.cmi \ parsing/asttypes.cmi typing/envaux.cmo : \ @@ -838,6 +878,7 @@ typing/gprinttyp.cmo : \ typing/types.cmi \ typing/path.cmi \ parsing/longident.cmi \ + typing/ident.cmi \ utils/format_doc.cmi \ utils/clflags.cmi \ parsing/asttypes.cmi \ @@ -847,6 +888,7 @@ typing/gprinttyp.cmx : \ typing/types.cmx \ typing/path.cmx \ parsing/longident.cmx \ + typing/ident.cmx \ utils/format_doc.cmx \ utils/clflags.cmx \ parsing/asttypes.cmx \ @@ -998,6 +1040,7 @@ typing/includemod.cmx : \ typing/includemod.cmi : \ typing/types.cmi \ typing/typedtree.cmi \ + typing/subst.cmi \ typing/shape.cmi \ typing/path.cmi \ parsing/longident.cmi \ @@ -1010,6 +1053,7 @@ typing/includemod.cmi : \ typing/includemod_errorprinter.cmo : \ typing/types.cmi \ typing/typedtree.cmi \ + typing/subst.cmi \ typing/printtyp.cmi \ typing/primitive.cmi \ typing/path.cmi \ @@ -1029,6 +1073,7 @@ typing/includemod_errorprinter.cmo : \ typing/includemod_errorprinter.cmx : \ typing/types.cmx \ typing/typedtree.cmx \ + typing/subst.cmx \ typing/printtyp.cmx \ typing/primitive.cmx \ typing/path.cmx \ @@ -1055,7 +1100,6 @@ typing/mtype.cmo : \ typing/types.cmi \ typing/subst.cmi \ typing/path.cmi \ - parsing/location.cmi \ typing/ident.cmi \ typing/env.cmi \ typing/ctype.cmi \ @@ -1067,7 +1111,6 @@ typing/mtype.cmx : \ typing/types.cmx \ typing/subst.cmx \ typing/path.cmx \ - parsing/location.cmx \ typing/ident.cmx \ typing/env.cmx \ typing/ctype.cmx \ @@ -1178,6 +1221,7 @@ typing/parmatch.cmo : \ typing/ident.cmi \ utils/format_doc.cmi \ typing/env.cmi \ + typing/data_types.cmi \ typing/ctype.cmi \ typing/btype.cmi \ parsing/asttypes.cmi \ @@ -1199,6 +1243,7 @@ typing/parmatch.cmx : \ typing/ident.cmx \ utils/format_doc.cmx \ typing/env.cmx \ + typing/data_types.cmx \ typing/ctype.cmx \ typing/btype.cmx \ parsing/asttypes.cmx \ @@ -1209,6 +1254,7 @@ typing/parmatch.cmi : \ parsing/parsetree.cmi \ parsing/location.cmi \ typing/env.cmi \ + typing/data_types.cmi \ parsing/asttypes.cmi typing/path.cmo : \ parsing/lexer.cmi \ @@ -1230,6 +1276,7 @@ typing/patterns.cmo : \ parsing/location.cmi \ typing/ident.cmi \ typing/env.cmi \ + typing/data_types.cmi \ typing/ctype.cmi \ parsing/asttypes.cmi \ typing/patterns.cmi @@ -1240,6 +1287,7 @@ typing/patterns.cmx : \ parsing/location.cmx \ typing/ident.cmx \ typing/env.cmx \ + typing/data_types.cmx \ typing/ctype.cmx \ parsing/asttypes.cmx \ typing/patterns.cmi @@ -1248,6 +1296,7 @@ typing/patterns.cmi : \ typing/typedtree.cmi \ parsing/longident.cmi \ typing/ident.cmi \ + typing/data_types.cmi \ parsing/asttypes.cmi typing/persistent_env.cmo : \ utils/warnings.cmi \ @@ -1330,17 +1379,17 @@ typing/primitive.cmi : \ typing/outcometree.cmi \ parsing/location.cmi typing/printpat.cmo : \ - typing/types.cmi \ typing/typedtree.cmi \ typing/ident.cmi \ utils/format_doc.cmi \ + typing/data_types.cmi \ parsing/asttypes.cmi \ typing/printpat.cmi typing/printpat.cmx : \ - typing/types.cmx \ typing/typedtree.cmx \ typing/ident.cmx \ utils/format_doc.cmx \ + typing/data_types.cmx \ parsing/asttypes.cmx \ typing/printpat.cmi typing/printpat.cmi : \ @@ -1413,6 +1462,7 @@ typing/rawprinttyp.cmo : \ typing/types.cmi \ parsing/pprintast.cmi \ typing/path.cmi \ + parsing/longident.cmi \ utils/format_doc.cmi \ parsing/asttypes.cmi \ typing/rawprinttyp.cmi @@ -1420,6 +1470,7 @@ typing/rawprinttyp.cmx : \ typing/types.cmx \ parsing/pprintast.cmx \ typing/path.cmx \ + parsing/longident.cmx \ utils/format_doc.cmx \ parsing/asttypes.cmx \ typing/rawprinttyp.cmi @@ -1528,6 +1579,7 @@ typing/subst.cmi : \ typing/tast_iterator.cmo : \ typing/typedtree.cmi \ parsing/parsetree.cmi \ + parsing/longident.cmi \ parsing/location.cmi \ typing/env.cmi \ parsing/asttypes.cmi \ @@ -1536,6 +1588,7 @@ typing/tast_iterator.cmo : \ typing/tast_iterator.cmx : \ typing/typedtree.cmx \ parsing/parsetree.cmi \ + parsing/longident.cmx \ parsing/location.cmx \ typing/env.cmx \ parsing/asttypes.cmx \ @@ -1549,6 +1602,7 @@ typing/tast_iterator.cmi : \ typing/tast_mapper.cmo : \ typing/typedtree.cmi \ parsing/parsetree.cmi \ + parsing/longident.cmi \ parsing/location.cmi \ typing/env.cmi \ parsing/asttypes.cmi \ @@ -1557,6 +1611,7 @@ typing/tast_mapper.cmo : \ typing/tast_mapper.cmx : \ typing/typedtree.cmx \ parsing/parsetree.cmi \ + parsing/longident.cmx \ parsing/location.cmx \ typing/env.cmx \ parsing/asttypes.cmx \ @@ -1680,6 +1735,7 @@ typing/typecore.cmo : \ typing/errortrace_report.cmi \ typing/errortrace.cmi \ typing/env.cmi \ + typing/data_types.cmi \ typing/ctype.cmi \ file_formats/cmt_format.cmi \ utils/clflags.cmi \ @@ -1717,6 +1773,7 @@ typing/typecore.cmx : \ typing/errortrace_report.cmx \ typing/errortrace.cmx \ typing/env.cmx \ + typing/data_types.cmx \ typing/ctype.cmx \ file_formats/cmt_format.cmx \ utils/clflags.cmx \ @@ -1736,6 +1793,7 @@ typing/typecore.cmi : \ typing/ident.cmi \ typing/errortrace.cmi \ typing/env.cmi \ + typing/data_types.cmi \ parsing/asttypes.cmi typing/typedecl.cmo : \ utils/warnings.cmi \ @@ -1768,6 +1826,7 @@ typing/typedecl.cmo : \ typing/errortrace_report.cmi \ typing/errortrace.cmi \ typing/env.cmi \ + typing/data_types.cmi \ typing/ctype.cmi \ utils/config.cmi \ utils/clflags.cmi \ @@ -1809,6 +1868,7 @@ typing/typedecl.cmx : \ typing/errortrace_report.cmx \ typing/errortrace.cmx \ typing/env.cmx \ + typing/data_types.cmx \ typing/ctype.cmx \ utils/config.cmx \ utils/clflags.cmx \ @@ -1832,7 +1892,6 @@ typing/typedecl.cmi : \ parsing/location.cmi \ typing/includecore.cmi \ typing/ident.cmi \ - utils/format_doc.cmi \ typing/errortrace.cmi \ typing/env.cmi \ parsing/asttypes.cmi @@ -1956,6 +2015,7 @@ typing/typedtree.cmo : \ parsing/location.cmi \ typing/ident.cmi \ typing/env.cmi \ + typing/data_types.cmi \ parsing/asttypes.cmi \ typing/typedtree.cmi typing/typedtree.cmx : \ @@ -1969,6 +2029,7 @@ typing/typedtree.cmx : \ parsing/location.cmx \ typing/ident.cmx \ typing/env.cmx \ + typing/data_types.cmx \ parsing/asttypes.cmx \ typing/typedtree.cmi typing/typedtree.cmi : \ @@ -1982,6 +2043,7 @@ typing/typedtree.cmi : \ parsing/location.cmi \ typing/ident.cmi \ typing/env.cmi \ + typing/data_types.cmi \ parsing/asttypes.cmi typing/typemod.cmo : \ utils/warnings.cmi \ @@ -2120,7 +2182,6 @@ typing/types.cmo : \ typing/path.cmi \ parsing/parsetree.cmi \ utils/misc.cmi \ - parsing/longident.cmi \ parsing/location.cmi \ utils/local_store.cmi \ typing/ident.cmi \ @@ -2134,7 +2195,6 @@ typing/types.cmx : \ typing/path.cmx \ parsing/parsetree.cmi \ utils/misc.cmx \ - parsing/longident.cmx \ parsing/location.cmx \ utils/local_store.cmx \ typing/ident.cmx \ @@ -2147,11 +2207,11 @@ typing/types.cmi : \ typing/primitive.cmi \ typing/path.cmi \ parsing/parsetree.cmi \ - parsing/longident.cmi \ parsing/location.cmi \ typing/ident.cmi \ parsing/asttypes.cmi typing/typetexp.cmo : \ + utils/warnings.cmi \ typing/types.cmi \ typing/typedtree.cmi \ typing/printtyp.cmi \ @@ -2175,6 +2235,7 @@ typing/typetexp.cmo : \ parsing/ast_helper.cmi \ typing/typetexp.cmi typing/typetexp.cmx : \ + utils/warnings.cmx \ typing/types.cmx \ typing/typedtree.cmx \ typing/printtyp.cmx \ @@ -2204,7 +2265,6 @@ typing/typetexp.cmi : \ parsing/parsetree.cmi \ parsing/longident.cmi \ parsing/location.cmi \ - utils/format_doc.cmi \ typing/errortrace.cmi \ typing/env.cmi \ parsing/asttypes.cmi @@ -2943,10 +3003,12 @@ asmcomp/cmm_helpers.cmi : \ asmcomp/cmm_invariants.cmo : \ utils/numbers.cmi \ asmcomp/cmm.cmi \ + middle_end/backend_var.cmi \ asmcomp/cmm_invariants.cmi asmcomp/cmm_invariants.cmx : \ utils/numbers.cmx \ asmcomp/cmm.cmx \ + middle_end/backend_var.cmx \ asmcomp/cmm_invariants.cmi asmcomp/cmm_invariants.cmi : \ asmcomp/cmm.cmi @@ -4383,6 +4445,7 @@ lambda/lambda.cmo : \ typing/ident.cmi \ typing/env.cmi \ lambda/debuginfo.cmi \ + utils/config.cmi \ utils/clflags.cmi \ parsing/asttypes.cmi \ lambda/lambda.cmi @@ -4395,6 +4458,7 @@ lambda/lambda.cmx : \ typing/ident.cmx \ typing/env.cmx \ lambda/debuginfo.cmx \ + utils/config.cmx \ utils/clflags.cmx \ parsing/asttypes.cmx \ lambda/lambda.cmi @@ -4417,6 +4481,7 @@ lambda/matching.cmo : \ typing/primitive.cmi \ typing/predef.cmi \ typing/patterns.cmi \ + typing/path.cmi \ typing/parmatch.cmi \ utils/misc.cmi \ parsing/longident.cmi \ @@ -4425,6 +4490,7 @@ lambda/matching.cmo : \ typing/ident.cmi \ typing/env.cmi \ lambda/debuginfo.cmi \ + typing/data_types.cmi \ utils/clflags.cmi \ typing/btype.cmi \ parsing/asttypes.cmi \ @@ -4440,6 +4506,7 @@ lambda/matching.cmx : \ typing/primitive.cmx \ typing/predef.cmx \ typing/patterns.cmx \ + typing/path.cmx \ typing/parmatch.cmx \ utils/misc.cmx \ parsing/longident.cmx \ @@ -4448,6 +4515,7 @@ lambda/matching.cmx : \ typing/ident.cmx \ typing/env.cmx \ lambda/debuginfo.cmx \ + typing/data_types.cmx \ utils/clflags.cmx \ typing/btype.cmx \ parsing/asttypes.cmx \ @@ -4640,6 +4708,7 @@ lambda/translcore.cmo : \ utils/format_doc.cmi \ typing/env.cmi \ lambda/debuginfo.cmi \ + typing/data_types.cmi \ utils/config.cmi \ utils/clflags.cmi \ typing/btype.cmi \ @@ -4667,6 +4736,7 @@ lambda/translcore.cmx : \ utils/format_doc.cmx \ typing/env.cmx \ lambda/debuginfo.cmx \ + typing/data_types.cmx \ utils/config.cmx \ utils/clflags.cmx \ typing/btype.cmx \ @@ -4763,7 +4833,6 @@ lambda/translobj.cmi : \ typing/ident.cmi \ typing/env.cmi lambda/translprim.cmo : \ - typing/types.cmi \ typing/typeopt.cmi \ typing/typedtree.cmi \ typing/primitive.cmi \ @@ -4782,7 +4851,6 @@ lambda/translprim.cmo : \ parsing/asttypes.cmi \ lambda/translprim.cmi lambda/translprim.cmx : \ - typing/types.cmx \ typing/typeopt.cmx \ typing/typedtree.cmx \ typing/primitive.cmx \ @@ -4872,6 +4940,7 @@ file_formats/cmt_format.cmo : \ parsing/lexer.cmi \ typing/ident.cmi \ typing/env.cmi \ + typing/data_types.cmi \ utils/config.cmi \ utils/compression.cmi \ file_formats/cmi_format.cmi \ @@ -4895,6 +4964,7 @@ file_formats/cmt_format.cmx : \ parsing/lexer.cmx \ typing/ident.cmx \ typing/env.cmx \ + typing/data_types.cmx \ utils/config.cmx \ utils/compression.cmx \ file_formats/cmi_format.cmx \ @@ -4951,6 +5021,7 @@ middle_end/closure/closure.cmo : \ typing/env.cmi \ lambda/debuginfo.cmi \ middle_end/convert_primitives.cmi \ + utils/config.cmi \ middle_end/compilenv.cmi \ utils/clflags.cmi \ middle_end/clambda_primitives.cmi \ @@ -4973,6 +5044,7 @@ middle_end/closure/closure.cmx : \ typing/env.cmx \ lambda/debuginfo.cmx \ middle_end/convert_primitives.cmx \ + utils/config.cmx \ middle_end/compilenv.cmx \ utils/clflags.cmx \ middle_end/clambda_primitives.cmx \ @@ -5162,6 +5234,7 @@ middle_end/flambda/closure_conversion.cmo : \ middle_end/flambda/flambda.cmi \ lambda/debuginfo.cmi \ middle_end/convert_primitives.cmi \ + utils/config.cmi \ middle_end/compilation_unit.cmi \ middle_end/flambda/base_types/closure_origin.cmi \ middle_end/flambda/base_types/closure_id.cmi \ @@ -5190,6 +5263,7 @@ middle_end/flambda/closure_conversion.cmx : \ middle_end/flambda/flambda.cmx \ lambda/debuginfo.cmx \ middle_end/convert_primitives.cmx \ + utils/config.cmx \ middle_end/compilation_unit.cmx \ middle_end/flambda/base_types/closure_origin.cmx \ middle_end/flambda/base_types/closure_id.cmx \ @@ -7202,6 +7276,7 @@ driver/pparse.cmo : \ utils/clflags.cmi \ utils/ccomp.cmi \ parsing/ast_mapper.cmi \ + parsing/ast_iterator.cmi \ parsing/ast_invariants.cmi \ driver/pparse.cmi driver/pparse.cmx : \ @@ -7216,6 +7291,7 @@ driver/pparse.cmx : \ utils/clflags.cmx \ utils/ccomp.cmx \ parsing/ast_mapper.cmx \ + parsing/ast_iterator.cmx \ parsing/ast_invariants.cmx \ driver/pparse.cmi driver/pparse.cmi : \ @@ -7237,6 +7313,7 @@ toplevel/expunge.cmx : \ toplevel/expunge.cmi toplevel/expunge.cmi : toplevel/genprintval.cmo : \ + typing/untypeast.cmi \ typing/types.cmi \ parsing/syntaxerr.cmi \ typing/printtyp.cmi \ @@ -7248,15 +7325,19 @@ toplevel/genprintval.cmo : \ typing/oprint.cmi \ utils/misc.cmi \ parsing/longident.cmi \ + parsing/location.cmi \ parsing/lexer.cmi \ typing/ident.cmi \ utils/format_doc.cmi \ typing/env.cmi \ typing/datarepr.cmi \ + typing/data_types.cmi \ typing/ctype.cmi \ typing/btype.cmi \ + parsing/asttypes.cmi \ toplevel/genprintval.cmi toplevel/genprintval.cmx : \ + typing/untypeast.cmx \ typing/types.cmx \ parsing/syntaxerr.cmx \ typing/printtyp.cmx \ @@ -7268,13 +7349,16 @@ toplevel/genprintval.cmx : \ typing/oprint.cmx \ utils/misc.cmx \ parsing/longident.cmx \ + parsing/location.cmx \ parsing/lexer.cmx \ typing/ident.cmx \ utils/format_doc.cmx \ typing/env.cmx \ typing/datarepr.cmx \ + typing/data_types.cmx \ typing/ctype.cmx \ typing/btype.cmx \ + parsing/asttypes.cmx \ toplevel/genprintval.cmi toplevel/genprintval.cmi : \ typing/types.cmi \ @@ -7283,8 +7367,13 @@ toplevel/genprintval.cmi : \ typing/env.cmi toplevel/topcommon.cmo : \ parsing/unit_info.cmi \ + typing/typemod.cmi \ typing/typedtree.cmi \ + typing/typecore.cmi \ bytecomp/symtable.cmi \ + typing/shape_reduce.cmi \ + typing/shape.cmi \ + typing/printtyped.cmi \ parsing/printast.cmi \ typing/predef.cmi \ parsing/pprintast.cmi \ @@ -7299,6 +7388,7 @@ toplevel/topcommon.cmo : \ parsing/location.cmi \ utils/load_path.cmi \ parsing/lexer.cmi \ + typing/includemod.cmi \ typing/ident.cmi \ toplevel/genprintval.cmi \ utils/format_doc.cmi \ @@ -7314,8 +7404,13 @@ toplevel/topcommon.cmo : \ toplevel/topcommon.cmi toplevel/topcommon.cmx : \ parsing/unit_info.cmx \ + typing/typemod.cmx \ typing/typedtree.cmx \ + typing/typecore.cmx \ bytecomp/symtable.cmx \ + typing/shape_reduce.cmx \ + typing/shape.cmx \ + typing/printtyped.cmx \ parsing/printast.cmx \ typing/predef.cmx \ parsing/pprintast.cmx \ @@ -7330,6 +7425,7 @@ toplevel/topcommon.cmx : \ parsing/location.cmx \ utils/load_path.cmx \ parsing/lexer.cmx \ + typing/includemod.cmx \ typing/ident.cmx \ toplevel/genprintval.cmx \ utils/format_doc.cmx \ @@ -7375,6 +7471,7 @@ toplevel/topdirs.cmo : \ typing/ident.cmi \ typing/env.cmi \ bytecomp/dll.cmi \ + typing/data_types.cmi \ typing/ctype.cmi \ utils/config.cmi \ driver/compenv.cmi \ @@ -7401,6 +7498,7 @@ toplevel/topdirs.cmx : \ typing/ident.cmx \ typing/env.cmx \ bytecomp/dll.cmx \ + typing/data_types.cmx \ typing/ctype.cmx \ utils/config.cmx \ driver/compenv.cmx \ @@ -7462,22 +7560,33 @@ toplevel/toploop.cmi : \ toplevel/topmain.cmi : toplevel/topprinters.cmo : \ typing/types.cmi \ + typing/printtyp.cmi \ typing/predef.cmi \ typing/path.cmi \ + parsing/longident.cmi \ typing/ident.cmi \ + typing/env.cmi \ typing/ctype.cmi \ + typing/btype.cmi \ parsing/asttypes.cmi \ toplevel/topprinters.cmi toplevel/topprinters.cmx : \ typing/types.cmx \ + typing/printtyp.cmx \ typing/predef.cmx \ typing/path.cmx \ + parsing/longident.cmx \ typing/ident.cmx \ + typing/env.cmx \ typing/ctype.cmx \ + typing/btype.cmx \ parsing/asttypes.cmx \ toplevel/topprinters.cmi toplevel/topprinters.cmi : \ - typing/types.cmi + typing/types.cmi \ + typing/path.cmi \ + parsing/longident.cmi \ + typing/env.cmi toplevel/topstart.cmo : \ toplevel/topmain.cmi \ toplevel/topstart.cmi @@ -7493,16 +7602,11 @@ toplevel/trace.cmi : \ toplevel/byte/topeval.cmo : \ utils/warnings.cmi \ typing/types.cmi \ - typing/typemod.cmi \ typing/typedtree.cmi \ - typing/typecore.cmi \ lambda/translmod.cmi \ toplevel/topcommon.cmi \ bytecomp/symtable.cmi \ lambda/simplif.cmi \ - typing/shape_reduce.cmi \ - typing/shape.cmi \ - typing/printtyped.cmi \ typing/printtyp.cmi \ lambda/printlambda.cmi \ bytecomp/printinstr.cmi \ @@ -7515,7 +7619,6 @@ toplevel/byte/topeval.cmo : \ bytecomp/meta.cmi \ parsing/location.cmi \ utils/load_path.cmi \ - typing/includemod.cmi \ typing/ident.cmi \ typing/env.cmi \ bytecomp/emitcode.cmi \ @@ -7529,16 +7632,11 @@ toplevel/byte/topeval.cmo : \ toplevel/byte/topeval.cmx : \ utils/warnings.cmx \ typing/types.cmx \ - typing/typemod.cmx \ typing/typedtree.cmx \ - typing/typecore.cmx \ lambda/translmod.cmx \ toplevel/topcommon.cmx \ bytecomp/symtable.cmx \ lambda/simplif.cmx \ - typing/shape_reduce.cmx \ - typing/shape.cmx \ - typing/printtyped.cmx \ typing/printtyp.cmx \ lambda/printlambda.cmx \ bytecomp/printinstr.cmx \ @@ -7551,7 +7649,6 @@ toplevel/byte/topeval.cmx : \ bytecomp/meta.cmx \ parsing/location.cmx \ utils/load_path.cmx \ - typing/includemod.cmx \ typing/ident.cmx \ typing/env.cmx \ bytecomp/emitcode.cmx \ @@ -7632,16 +7729,11 @@ toplevel/byte/trace.cmi : \ toplevel/native/topeval.cmo : \ utils/warnings.cmi \ typing/types.cmi \ - typing/typemod.cmi \ typing/typedtree.cmi \ - typing/typecore.cmi \ lambda/translmod.cmi \ toplevel/native/tophooks.cmi \ toplevel/topcommon.cmi \ lambda/simplif.cmi \ - typing/shape_reduce.cmi \ - typing/shape.cmi \ - typing/printtyped.cmi \ typing/printtyp.cmi \ lambda/printlambda.cmi \ typing/predef.cmi \ @@ -7665,16 +7757,11 @@ toplevel/native/topeval.cmo : \ toplevel/native/topeval.cmx : \ utils/warnings.cmx \ typing/types.cmx \ - typing/typemod.cmx \ typing/typedtree.cmx \ - typing/typecore.cmx \ lambda/translmod.cmx \ toplevel/native/tophooks.cmx \ toplevel/topcommon.cmx \ lambda/simplif.cmx \ - typing/shape_reduce.cmx \ - typing/shape.cmx \ - typing/printtyped.cmx \ typing/printtyp.cmx \ lambda/printlambda.cmx \ typing/predef.cmx \ @@ -8053,10 +8140,12 @@ tools/ocamlcp.cmi : tools/ocamlcp_common.cmo : \ driver/main_args.cmi \ driver/compenv.cmi \ + utils/clflags.cmi \ tools/ocamlcp_common.cmi tools/ocamlcp_common.cmx : \ driver/main_args.cmx \ driver/compenv.cmx \ + utils/clflags.cmx \ tools/ocamlcp_common.cmi tools/ocamlcp_common.cmi : \ driver/main_args.cmi @@ -8099,12 +8188,14 @@ tools/ocamlprof.cmo : \ parsing/parsetree.cmi \ parsing/parse.cmi \ parsing/location.cmi \ + utils/clflags.cmi \ tools/ocamlprof.cmi tools/ocamlprof.cmx : \ utils/warnings.cmx \ parsing/parsetree.cmi \ parsing/parse.cmx \ parsing/location.cmx \ + utils/clflags.cmx \ tools/ocamlprof.cmi tools/ocamlprof.cmi : tools/ocamltex.cmo : \ @@ -8333,6 +8424,7 @@ debugger/debugger_lexer.cmi : \ debugger/debugger_parser.cmo : \ debugger/parser_aux.cmi \ parsing/longident.cmi \ + parsing/location.cmi \ debugger/int64ops.cmi \ debugger/input_handling.cmi \ debugger/debugcom.cmi \ @@ -8340,6 +8432,7 @@ debugger/debugger_parser.cmo : \ debugger/debugger_parser.cmx : \ debugger/parser_aux.cmi \ parsing/longident.cmx \ + parsing/location.cmx \ debugger/int64ops.cmx \ debugger/input_handling.cmx \ debugger/debugcom.cmx \ @@ -8461,7 +8554,6 @@ debugger/int64ops.cmx : \ debugger/int64ops.cmi : debugger/loadprinter.cmo : \ parsing/unit_info.cmi \ - typing/types.cmi \ toplevel/topprinters.cmi \ bytecomp/symtable.cmi \ debugger/printval.cmi \ @@ -8474,12 +8566,11 @@ debugger/loadprinter.cmo : \ utils/format_doc.cmi \ typing/env.cmi \ otherlibs/dynlink/dynlink.cmi \ - typing/ctype.cmi \ + debugger/debugcom.cmi \ file_formats/cmo_format.cmi \ debugger/loadprinter.cmi debugger/loadprinter.cmx : \ parsing/unit_info.cmx \ - typing/types.cmx \ toplevel/topprinters.cmx \ bytecomp/symtable.cmx \ debugger/printval.cmx \ @@ -8492,10 +8583,11 @@ debugger/loadprinter.cmx : \ utils/format_doc.cmx \ typing/env.cmx \ otherlibs/dynlink/dynlink.cmx \ - typing/ctype.cmx \ + debugger/debugcom.cmx \ file_formats/cmo_format.cmi \ debugger/loadprinter.cmi debugger/loadprinter.cmi : \ + toplevel/topprinters.cmi \ parsing/longident.cmi \ otherlibs/dynlink/dynlink.cmi debugger/main.cmo : \ @@ -8966,7 +9058,7 @@ ocamldoc/odoc_ast.cmo : \ ocamldoc/odoc_class.cmi \ parsing/location.cmi \ typing/ident.cmi \ - typing/btype.cmi \ + typing/data_types.cmi \ parsing/asttypes.cmi \ ocamldoc/odoc_ast.cmi ocamldoc/odoc_ast.cmx : \ @@ -8990,7 +9082,7 @@ ocamldoc/odoc_ast.cmx : \ ocamldoc/odoc_class.cmx \ parsing/location.cmx \ typing/ident.cmx \ - typing/btype.cmx \ + typing/data_types.cmx \ parsing/asttypes.cmx \ ocamldoc/odoc_ast.cmi ocamldoc/odoc_ast.cmi : \ @@ -9926,6 +10018,53 @@ ocamltest/builtin_variables.cmx : \ ocamltest/builtin_variables.cmi ocamltest/builtin_variables.cmi : \ ocamltest/variables.cmi +ocamltest/debugger_actions.cmo : \ + ocamltest/result.cmi \ + ocamltest/ocamltest_stdlib.cmi \ + ocamltest/ocaml_variables.cmi \ + ocamltest/ocaml_directories.cmi \ + ocamltest/ocaml_commands.cmi \ + utils/misc.cmi \ + ocamltest/environments.cmi \ + ocamltest/debugger_variables.cmi \ + ocamltest/debugger_flags.cmi \ + utils/clflags.cmi \ + ocamltest/builtin_variables.cmi \ + ocamltest/actions_helpers.cmi \ + ocamltest/actions.cmi \ + ocamltest/debugger_actions.cmi +ocamltest/debugger_actions.cmx : \ + ocamltest/result.cmx \ + ocamltest/ocamltest_stdlib.cmx \ + ocamltest/ocaml_variables.cmx \ + ocamltest/ocaml_directories.cmx \ + ocamltest/ocaml_commands.cmx \ + utils/misc.cmx \ + ocamltest/environments.cmx \ + ocamltest/debugger_variables.cmx \ + ocamltest/debugger_flags.cmx \ + utils/clflags.cmx \ + ocamltest/builtin_variables.cmx \ + ocamltest/actions_helpers.cmx \ + ocamltest/actions.cmx \ + ocamltest/debugger_actions.cmi +ocamltest/debugger_actions.cmi : \ + ocamltest/actions.cmi +ocamltest/debugger_flags.cmo : \ + ocamltest/ocaml_directories.cmi \ + ocamltest/debugger_flags.cmi +ocamltest/debugger_flags.cmx : \ + ocamltest/ocaml_directories.cmx \ + ocamltest/debugger_flags.cmi +ocamltest/debugger_flags.cmi : +ocamltest/debugger_variables.cmo : \ + ocamltest/variables.cmi \ + ocamltest/debugger_variables.cmi +ocamltest/debugger_variables.cmx : \ + ocamltest/variables.cmx \ + ocamltest/debugger_variables.cmi +ocamltest/debugger_variables.cmi : \ + ocamltest/variables.cmi ocamltest/environments.cmo : \ ocamltest/variables.cmi \ ocamltest/ocamltest_stdlib.cmi \ @@ -9940,11 +10079,13 @@ ocamltest/filecompare.cmo : \ ocamltest/run_command.cmi \ ocamltest/ocamltest_stdlib.cmi \ ocamltest/ocamltest_config.cmi \ + utils/misc.cmi \ ocamltest/filecompare.cmi ocamltest/filecompare.cmx : \ ocamltest/run_command.cmx \ ocamltest/ocamltest_stdlib.cmx \ ocamltest/ocamltest_config.cmx \ + utils/misc.cmx \ ocamltest/filecompare.cmi ocamltest/filecompare.cmi : ocamltest/main.cmo : \ @@ -10254,12 +10395,18 @@ ocamltest/options.cmo : \ ocamltest/variables.cmi \ ocamltest/translate.cmi \ ocamltest/tests.cmi \ + utils/misc.cmi \ + driver/compmisc.cmi \ + utils/clflags.cmi \ ocamltest/actions.cmi \ ocamltest/options.cmi ocamltest/options.cmx : \ ocamltest/variables.cmx \ ocamltest/translate.cmx \ ocamltest/tests.cmx \ + utils/misc.cmx \ + driver/compmisc.cmx \ + utils/clflags.cmx \ ocamltest/actions.cmx \ ocamltest/options.cmi ocamltest/options.cmi : \ @@ -10478,17 +10625,20 @@ testsuite/tools/parsecmmaux.cmo : \ parsing/location.cmi \ lambda/lambda.cmi \ lambda/debuginfo.cmi \ + asmcomp/cmm.cmi \ middle_end/backend_var.cmi \ testsuite/tools/parsecmmaux.cmi testsuite/tools/parsecmmaux.cmx : \ parsing/location.cmx \ lambda/lambda.cmx \ lambda/debuginfo.cmx \ + asmcomp/cmm.cmx \ middle_end/backend_var.cmx \ testsuite/tools/parsecmmaux.cmi testsuite/tools/parsecmmaux.cmi : \ parsing/location.cmi \ lambda/debuginfo.cmi \ + asmcomp/cmm.cmi \ middle_end/backend_var.cmi otherlibs/dynlink/byte/dynlink.cmo : \ otherlibs/dynlink/dynlink_types.cmi \ diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..8291bf70 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,13 @@ +root = true + +[*] +charset = utf-8 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.ml*] +indent_style = space + +[*.{c,h,h.in,sh,ac,m4}] +indent_style = space +indent_size = 2 diff --git a/.gitattributes b/.gitattributes index b1796970..73dc7d13 100644 --- a/.gitattributes +++ b/.gitattributes @@ -17,7 +17,10 @@ * text=auto # It is not possible to wrap lines lines in .gitattributes files -.gitattributes typo.long-line=may typo.utf8 +.gitattributes typo.long-line=may typo.non-ascii +.gitmodules typo.long-line=may typo.tab=may + +.editorconfig typo.missing-header=may # Binary files /boot/ocamlc binary @@ -52,18 +55,17 @@ tools/mantis2gh_stripped.csv typo.missing-header META.in typo.missing-header # Hyperlinks and other markup features cause long lines -*.adoc typo.long-line=may typo.very-long-line=may -*.md typo.long-line=may typo.very-long-line=may +*.adoc typo.long-line=may typo.very-long-line=may typo.non-ascii=may +*.md typo.long-line=may typo.very-long-line=may typo.non-ascii=may # Github templates and scripts lack headers, have long lines /.github/** typo.missing-header typo.long-line=may typo.very-long-line=may +/.github/workflows/*.yml typo.non-ascii=may /.mailmap typo.long-line typo.missing-header typo.non-ascii -/CONTRIBUTING.md typo.non-ascii=may -/README.adoc typo.non-ascii=may -/README.win32.adoc typo.non-ascii=may -/Changes typo.utf8 typo.missing-header -/release-info/News typo.utf8 typo.missing-header +/CONTRIBUTING.md typo.non-ascii +/Changes typo.non-ascii typo.missing-header +/release-info/News typo.non-ascii typo.missing-header /LICENSE typo.very-long-line typo.missing-header # tools/ci/appveyor/appveyor_build.cmd only has missing-header because # dra27 too lazy to update check-typo to interpret Cmd-style comments! @@ -81,8 +83,8 @@ Makefile* typo.makefile-whitespace=may asmcomp/*/emit.mlp typo.tab=may typo.long-line=may # Unicode character used for graphical debugging and box drawing -typing/gprinttyp.mli typo.utf8 -typing/gprinttyp.ml typo.utf8 +typing/gprinttyp.mli typo.non-ascii +typing/gprinttyp.ml typo.non-ascii # The build-aux directory contains bundled files so do not check it build-aux typo.prune @@ -105,23 +107,24 @@ otherlibs/unix/stat_win32.c typo.long-line otherlibs/unix/symlink_win32.c typo.long-line # Some Unicode characters here and there -utils/misc.ml typo.utf8 +utils/misc.ml typo.non-ascii runtime/sak.c typo.non-ascii -stdlib/hashbang typo.white-at-eol typo.missing-lf - testsuite/tests/** typo.missing-header typo.long-line=may testsuite/tests/lib-bigarray-2/bigarrf.f typo.tab linguist-language=Fortran testsuite/tests/lib-unix/win-stat/fakeclock.c typo.missing-header=false testsuite/tests/misc-unsafe/almabench.ml typo.long-line -testsuite/tests/parsing/latin9.ml typo.utf8 typo.very-long-line -testsuite/tests/parsing/comments.ml typo.utf8 -testsuite/tests/tool-ocamldoc/Latin9.ml typo.utf8 -testsuite/tests/parsetree/source.ml typo.utf8 -testsuite/tests/typing-unicode/*.ml typo.utf8 -testsuite/tests/tool-toplevel/strings.ml typo.utf8 -testsuite/tests/win-unicode/*.ml typo.utf8 -testsuite/tests/unicode/見.ml typo.utf8 +testsuite/tests/parsing/latin9.ml typo.non-ascii typo.very-long-line +testsuite/tests/parsing/comments.ml typo.non-ascii +testsuite/tests/tool-ocamldoc/Latin9.ml typo.non-ascii +testsuite/tests/parsetree/source.ml typo.non-ascii +testsuite/tests/typing-unicode/*.ml typo.non-ascii +testsuite/tests/tool-toplevel/strings.ml typo.non-ascii +testsuite/tests/win-unicode/*.ml typo.non-ascii +testsuite/tests/unicode/見.ml typo.non-ascii +testsuite/tests/lib-format/unicode.ml typo.non-ascii +testsuite/tests/lib-string/test_string.ml typo.non-ascii +testsuite/tests/lib-uchar/test.ml typo.non-ascii testsuite/tests/lexing/reject_bad_encoding.ml typo.prune testsuite/tests/asmgen/immediates.cmm typo.very-long-line testsuite/tests/generated-parse-errors/errors.* typo.very-long-line @@ -152,7 +155,7 @@ tools/magic typo.missing-header /boot/menhir/** typo.long-line=may typo.very-long-line=may /boot/menhir/** typo.missing-header=may /boot/menhir/** typo.white-at-eol=may -/boot/menhir/** typo.utf8=may +/boot/menhir/** typo.non-ascii=may # Line-ending specifications, for Windows interoperability *.sh text eol=lf @@ -181,12 +184,10 @@ aclocal.m4 typo.tab -linguist-vendored linguist-language=M4Sugar configure.ac text eol=lf # These scripts are all parts of autoconf and are tagged linguist-generated # to suppress inclusion in PR diffs. -build-aux/compile linguist-generated text eol=lf build-aux/config.guess linguist-generated text eol=lf build-aux/config.sub linguist-generated text eol=lf build-aux/install-sh linguist-generated text eol=lf build-aux/ltmain.sh linguist-generated text eol=lf -build-aux/missing linguist-generated text eol=lf build-aux/*.m4 linguist-vendored build-aux/ocaml_version.m4 -linguist-vendored linguist-language=M4Sugar ocamltest/OCAMLTEST.org typo.long-line=may typo.missing-header diff --git a/.github/workflows/build-cross.yml b/.github/workflows/build-cross.yml new file mode 100644 index 00000000..6d2ba59e --- /dev/null +++ b/.github/workflows/build-cross.yml @@ -0,0 +1,273 @@ +name: Cross compilers + +on: + pull_request: + types: [opened, synchronize, reopened, labeled, unlabeled] + workflow_dispatch: + +# Restrict the GITHUB_TOKEN +permissions: {} + +# See build.yml +concurrency: + group: ${{ github.workflow }}-${{ github.ref }}-${{ github.event_name == 'pull_request' || github.sha }} + cancel-in-progress: true + +env: + res: 0 + TESTDIR: >- + C:\Бактріан🐫 + STR_UTF8: >- + "C:\\Бактріан🐫" + STR_UTF16: >- + L"C:\\\x0411\x0430\x043a\x0442\x0440\x0456\x0430\x043d\xd83d\xdc2b" + EXAMPLE_PROGRAM: | + let _ = + Printf.printf "Version: %s\nOS: %s\nUnix: %b\nWin: %b\nCygwin: %b\n" + Sys.ocaml_version Sys.os_type Sys.unix Sys.win32 Sys.cygwin + COMPLIBS_PROG_X86_64: | + let _ = + Printf.printf "allow_unaligned_access = %b\n" Arch.allow_unaligned_access; + Printf.printf "win64 = %b\n" Arch.win64 + COMPLIBS_PROG_AARCH64: | + let _ = + Printf.printf "allow_unaligned_access = %b\n" Arch.allow_unaligned_access; + Printf.printf "macosx = %b\n" Arch.macosx + +jobs: + non-cross: + if: contains(github.event.pull_request.labels.*.name, 'run-crosscompiler-tests') + runs-on: ubuntu-latest + steps: + - name: Checkout OCaml + uses: actions/checkout@v4 + with: + persist-credentials: false + - name: Configure, build and install OCaml + run: | + PREFIX="$HOME/.local" + echo "$PREFIX/bin" >> "$GITHUB_PATH" + set -x + ./configure --disable-warn-error --disable-ocamldoc \ + --disable-ocamltest --disable-stdlib-manpages \ + --disable-dependency-generation --prefix="$PREFIX" || res=$? + if ! [ "$res" = 0 ]; then cat config.log; exit "$res"; fi + make -j + make install + cd "$HOME" + tar caf /tmp/ocaml.tar.zst .local + - name: Upload Artifact + uses: actions/upload-artifact@v4 + with: + name: non-cross-ocaml + path: /tmp/ocaml.tar.zst + retention-days: 1 + + cross-windows: + runs-on: ubuntu-latest + needs: non-cross + steps: + - name: Download Artifact + uses: actions/download-artifact@v4 + with: + name: non-cross-ocaml + - name: Install non-cross OCaml and set up environment + run: | + set -x + tar xaf ocaml.tar.zst -C "$HOME" + rm -f ocaml.tar.zst + echo "$HOME/.local/bin" >> "$GITHUB_PATH" + sudo apt-get update -y + sudo apt-get install -y gcc-mingw-w64-x86-64 + - name: Checkout OCaml + uses: actions/checkout@v4 + with: + submodules: true + persist-credentials: false + - name: Configure, build and install Linux-to-Windows OCaml + run: | + set -x + ./configure --prefix="$HOME/cross" --target=x86_64-w64-mingw32 \ + TARGET_LIBDIR="$TESTDIR" || res=$? + if ! [ "$res" = 0 ]; then cat config.log; exit "$res"; fi + # The OOM-killer may be triggered if the number of parallel + # jobs isn't limited. + make crossopt -j$(nproc) + make installcross + ln -sr "$HOME/cross/bin/flexlink.opt.exe" "$HOME/.local/bin/flexlink" + - name: Show opt.opt configuration + run: | + set -x + $HOME/cross/bin/ocamlopt.opt.exe -config + cat runtime/build_config.h + - name: Cross compile a small program + run: | + printf %s "$EXAMPLE_PROGRAM$COMPLIBS_PROG_X86_64" > example.ml + set -x + cat example.ml + $HOME/cross/bin/ocamlopt.opt.exe -I $HOME/cross/lib/ocaml/compiler-libs/ ocamlcommon.cmxa ocamloptcomp.cmxa example.ml -o example.exe -verbose + - name: Upload Artifact + uses: actions/upload-artifact@v4 + with: + name: windows-executable + path: example.exe + retention-days: 1 + - name: Test cross sak + run: | + printf %s "$STR_UTF16" > utf16.ref + printf %s "$STR_UTF8" > utf8.ref + set -x + runtime/sak encode-C-utf16-literal "$TESTDIR" > utf16 + git diff --no-index utf16.ref utf16 + runtime/sak encode-C-utf8-literal "$TESTDIR" > utf8 + git diff --no-index utf8.ref utf8 + + run-windows: + runs-on: windows-latest + needs: cross-windows + steps: + - name: Download Artifact + uses: actions/download-artifact@v4 + with: + name: windows-executable + - name: Run example program + run: | + .\example.exe + + cross-arm-linux: + runs-on: ubuntu-latest + needs: non-cross + steps: + - name: Download Artifact + uses: actions/download-artifact@v4 + with: + name: non-cross-ocaml + - name: Install non-cross OCaml and set up environment + run: | + set -x + tar xaf ocaml.tar.zst -C "$HOME" + rm -f ocaml.tar.zst + echo "$HOME/.local/bin" >> "$GITHUB_PATH" + sudo apt-get update -y + sudo apt-get install -y gcc-aarch64-linux-gnu qemu-user + - name: Checkout OCaml + uses: actions/checkout@v4 + with: + submodules: true + persist-credentials: false + - name: Configure, build and install Linux-to-Windows OCaml + run: | + set -x + ./configure --prefix="$HOME/cross" --target=aarch64-linux-gnu \ + || res=$? + if ! [ "$res" = 0 ]; then cat config.log; exit "$res"; fi + make crossopt -j + make installcross + - name: Show opt.opt configuration + run: | + set -x + $HOME/cross/bin/ocamlopt.opt -config + cat runtime/build_config.h + - name: Cross compile a small program + run: | + printf %s "$EXAMPLE_PROGRAM$COMPLIBS_PROG_AARCH64" > example.ml + set -x + cat example.ml + $HOME/cross/bin/ocamlopt.opt -I $HOME/cross/lib/ocaml/compiler-libs/ ocamlcommon.cmxa ocamloptcomp.cmxa example.ml -o example -verbose + - name: Run the small example program + run: | + set -x + qemu-aarch64 -L /usr/aarch64-linux-gnu example + - name: Test cross sak + run: | + printf %s "$STR_UTF16" > utf16.ref + printf %s "$STR_UTF8" > utf8.ref + set -x + runtime/sak encode-C-utf16-literal "$TESTDIR" > utf16 + git diff --no-index utf16.ref utf16 + runtime/sak encode-C-utf8-literal "$TESTDIR" > utf8 + git diff --no-index utf8.ref utf8 + + cross-android: + runs-on: ubuntu-latest + needs: non-cross + steps: + - name: Download Artifact + uses: actions/download-artifact@v4 + with: + name: non-cross-ocaml + - name: Install non-cross OCaml + run: | + set -x + tar xaf ocaml.tar.zst -C "$HOME" + rm -f ocaml.tar.zst + echo "$HOME/.local/bin" >> "$GITHUB_PATH" + - name: Restore the Android NDK from cache + uses: actions/cache/restore@v4 + id: cache + with: + path: | + /home/runner/android + key: android-ndk + - name: Download the Android NDK + run: | + set -x + mkdir -p "$HOME/android" + cd "$HOME/android" + wget --no-verbose https://dl.google.com/android/repository/android-ndk-r27b-linux.zip + unzip android-ndk-r27b-linux.zip + rm android-ndk-r27b-linux.zip + if: steps.cache.outputs.cache-hit != 'true' + - name: Save the Android NDK to cache + uses: actions/cache/save@v4 + with: + path: | + /home/runner/android + key: android-ndk + if: steps.cache.outputs.cache-hit != 'true' + - name: Checkout OCaml + uses: actions/checkout@v4 + with: + persist-credentials: false + - name: Configure, build and install Linux-to-Android OCaml + env: + TARGET: x86_64-linux-android21 + TOOLDIR: android-ndk-r27b/toolchains/llvm/prebuilt/linux-x86_64/bin + run: | + DIR="$HOME/android/$TOOLDIR" + set -x + # Hack around the fact that pthread_cancel isn't available on Android + # So the result program should _not_ be run with cleanup on exit + # (so no `c=1` in `OCAMLRUNPARAM`) + ./configure --prefix="$HOME/cross" --target=$TARGET \ + TARGET_LIBDIR="/dummy/directory" \ + CC="$DIR/clang --target=$TARGET" \ + CPPFLAGS='-Dpthread_cancel=assert' \ + AR="$DIR/llvm-ar" \ + PARTIALLD="$DIR/ld -r" \ + RANLIB="$DIR/llvm-ranlib" \ + STRIP="$DIR/llvm-strip" || res=$? + if ! [ "$res" = 0 ]; then cat config.log; exit "$res"; fi + make crossopt -j + make installcross + - name: Show opt.opt configuration + run: | + set -x + $HOME/cross/bin/ocamlopt.opt -config + cat runtime/build_config.h + - name: Cross compile a small program + run: | + printf %s "$EXAMPLE_PROGRAM" > example.ml + set -x + cat example.ml + $HOME/cross/bin/ocamlopt.opt example.ml -o example -verbose + file example + - name: Run example + uses: reactivecircus/android-emulator-runner@v2 + with: + api-level: 21 + arch: x86_64 + disable-animations: true + script: | + adb push example /data/local/tmp/example + adb shell /data/local/tmp/example diff --git a/.github/workflows/build-msvc.yml b/.github/workflows/build-msvc.yml index ecc762f8..9e130132 100644 --- a/.github/workflows/build-msvc.yml +++ b/.github/workflows/build-msvc.yml @@ -16,33 +16,76 @@ on: # Fully print commands executed by Make # MAKEFLAGS: V=1 +defaults: + run: + shell: bash -eo pipefail -o igncr {0} + jobs: + config: + runs-on: ubuntu-latest + outputs: + matrix: ${{ steps.matrix.outputs.result}} + skip-testsuite: ${{ steps.skip.outputs.result }} + steps: + - name: Compute matrix for the "build" job + id: matrix + uses: actions/github-script@v7 + with: + script: | + // # Always test cl and clang-cl + let compilers = ['cl', 'clang-cl']; + // # Also test i686 MSVC + let include = [ + {cc: 'cl', arch: 'i686'}]; + // # If this is a pull request, see if the PR has the + // # 'CI: Full matrix' label. This is done using an API request, + // # rather than from context.payload.pull_request.labels, since we + // # want the _current_ list of labels. This allows the labelling to + // # be changed, and then forcing a re-run of the workflow, rather + // # than having labelling triggering a fresh workflow event (which + // # is wasteful). + if (context.payload.pull_request) { + const { data: labels } = + await github.rest.issues.listLabelsOnIssue({...context.repo, issue_number: context.payload.pull_request.number}); + if (labels.some(label => label.name === 'CI: Full matrix')) { + console.log('Full matrix requested'); + // # Test Cygwin as well + compilers.push('gcc'); + // # Test bytecode-only Cygwin + include.push({cc: 'gcc', arch: 'x86_64', config_arg: '--disable-native-compiler'}); + } + } + return {config_arg: [''], arch: ['x86_64'], cc: compilers, include: include}; + - name: Determine if the testsuite should be skipped + id: skip + uses: actions/github-script@v7 + with: + script: | + let skip_testsuite = false; + if (context.payload.pull_request) { + const { data: labels } = + await github.rest.issues.listLabelsOnIssue({...context.repo, issue_number: context.payload.pull_request.number}); + skip_testsuite = labels.some(label => label.name === 'CI: Skip testsuite'); + } + console.log('Skip testsuite: ' + skip_testsuite); + return skip_testsuite; + build: permissions: {} runs-on: windows-latest - timeout-minutes: 60 + needs: config + + timeout-minutes: ${{ matrix.cc == 'gcc' && 90 || 60 }} - name: ${{ matrix.cc == 'cl' && 'MSVC' || 'clang-cl' }} ${{ matrix.x86_64 && '64 bits' || '32 bits' }} + name: ${{ matrix.cc == 'cl' && 'MSVC' || matrix.cc == 'gcc' && 'Cygwin' || 'clang-cl' }} ${{ matrix.arch }} ${{ matrix.config_arg != '' && format('({0})', matrix.config_arg) || '' }} strategy: - matrix: - x86_64: [true, false] - cc: [cl, clang-cl] - exclude: - - cc: clang-cl - x86_64: false + matrix: ${{ fromJSON(needs.config.outputs.matrix) }} + fail-fast: true steps: - - name: Save pristine PATH - run: | - echo "PRISTINE_PATH=${env:Path}" >> "${env:GITHUB_ENV}" - - - name: Set up MSVC - uses: ilammy/msvc-dev-cmd@v1 - with: - arch: ${{ matrix.x86_64 && 'x64' || 'x86' }} - name: Fetch OCaml uses: actions/checkout@v4 @@ -51,8 +94,6 @@ jobs: - name: Restore Cygwin cache uses: actions/cache/restore@v4 - env: - PATH: ${{ env.PRISTINE_PATH }} with: path: | C:\cygwin-packages @@ -61,78 +102,93 @@ jobs: - name: Install Cygwin uses: cygwin/cygwin-install-action@v3 with: - packages: make,bash,mingw64-x86_64-gcc-core + packages: make,${{ matrix.cc != 'gcc' && 'mingw64-x86_64-' || 'gcc-fortran,' }}gcc-core install-dir: 'D:\cygwin' - name: Save Cygwin cache uses: actions/cache/save@v4 - env: - PATH: ${{ env.PRISTINE_PATH }} with: path: | C:\cygwin-packages key: cygwin-packages + - name: Set up MSVC + uses: ilammy/msvc-dev-cmd@v1 + with: + arch: ${{ matrix.arch == 'x86_64' && 'x64' || 'x86' }} + if: matrix.cc != 'gcc' + - name: Compute a key to cache configure results - shell: bash + id: autoconf-cache-key env: - HOST: ${{ matrix.x86_64 && 'x86_64-pc-windows' || 'i686-pc-windows' }} - CC: ${{ matrix.cc }} - run: >- - echo "AUTOCONF_CACHE_KEY=$HOST-$CC-$({ cat configure; uname; } | sha1sum | cut -c 1-7)" >> $GITHUB_ENV + HOST: ${{ format('{0}-pc-{1}', matrix.arch, (matrix.cc == 'gcc' && 'cygwin' || 'windows')) }} + run: | + echo "key=${{ env.HOST }}-${{ matrix.cc }}-${{ hashFiles('configure') }}" >> $GITHUB_OUTPUT - name: Restore Autoconf cache uses: actions/cache/restore@v4 with: path: | config.cache - key: ${{ env.AUTOCONF_CACHE_KEY }} + key: ${{ steps.autoconf-cache-key.outputs.key }} - - name: Build OCaml - shell: bash + - name: Configure tree env: - HOST: ${{ matrix.x86_64 && 'x86_64-pc-windows' || 'i686-pc-windows' }} - CC: ${{ matrix.cc }} - run: >- - eval $(tools/msvs-promote-path) ; - if ! ./configure --cache-file=config.cache --host=$HOST CC=$CC ; then - rm -rf config.cache ; - failed=0 ; - ./configure --cache-file=config.cache --host=$HOST CC=$CC \ - || failed=$?; - if ((failed)) ; then cat config.log ; exit $failed ; fi ; - fi ; - make -j || failed=$? ; - if ((failed)) ; then make -j1 V=1 ; exit $failed ; fi ; - runtime/ocamlrun ocamlc -config ; - # Don't add indentation or comments, it breaks Bash on - # Windows when the yaml text block scalar is processed as a - # single line. + CONFIG_ARGS: >- + --cache-file=config.cache + --prefix "${{ matrix.cc != 'gcc' && '$PROGRAMFILES/Бактріан🐫' || '$(cygpath "$PROGRAMFILES/Бактріан🐫")'}}" + ${{ matrix.cc != 'gcc' && format('--host={0}-pc-windows', matrix.arch) || '' }} + ${{ matrix.cc != 'gcc' && format('CC={0}', matrix.cc) || '' }} + ${{ matrix.config_arg }} + run: | + eval $(tools/msvs-promote-path) + if ! ./configure ${{ env.CONFIG_ARGS }} ; then + rm -rf config.cache + failed=0 + ./configure ${{ env.CONFIG_ARGS }} || failed=$? + if ((failed)) ; then + echo + echo "::group::config.log content ($(wc -l config.log) lines)" + cat config.log + echo '::endgroup::' + exit $failed + fi + fi - name: Save Autoconf cache uses: actions/cache/save@v4 with: path: | config.cache - key: ${{ env.AUTOCONF_CACHE_KEY }} - - - name: Assemble backend with MinGW GASM and compare - shell: bash - run: >- - x86_64-w64-mingw32-gcc -c -I./runtime -I ./flexdll -D__USE_MINGW_ANSI_STDIO=0 -DUNICODE -D_UNICODE -DWINDOWS_UNICODE=1 -DCAMLDLLIMPORT= -DIN_CAML_RUNTIME -DNATIVE_CODE -DTARGET_amd64 -DMODEL_default -DSYS_mingw64 -o runtime/amd64.o runtime/amd64.S ; - dumpbin /disasm:nobytes runtime/amd64nt.obj > runtime/amd64nt.dump ; - awk -f tools/ci/actions/canonicalize-dumpbin.awk runtime/amd64nt.dump runtime/amd64nt.dump > runtime/amd64nt.canonical ; - dumpbin /disasm:nobytes runtime/amd64.o > runtime/amd64.dump ; - awk -f tools/ci/actions/canonicalize-dumpbin.awk runtime/amd64.dump runtime/amd64.dump > runtime/amd64.canonical ; - git diff --no-index -- runtime/amd64*.canonical ; - wc -l runtime/amd64*.dump runtime/amd64*.canonical ; + key: ${{ steps.autoconf-cache-key.outputs.key }} + + - name: Build OCaml + run: | + eval $(tools/msvs-promote-path) + make -j || failed=$? + if ((failed)) ; then make -j1 V=1 ; exit $failed ; fi + test -e runtime/libcamlrun.lib || tools/check-symbol-names runtime/*.a otherlibs/*/lib*.a + runtime/ocamlrun ocamlc -config + + - name: Assemble backend with mingw-w64 GASM and compare + run: | + x86_64-w64-mingw32-gcc -c -I./runtime -I ./flexdll -D__USE_MINGW_ANSI_STDIO=0 -DUNICODE -D_UNICODE -DWINDOWS_UNICODE=1 -DCAMLDLLIMPORT= -DIN_CAML_RUNTIME -DNATIVE_CODE -DTARGET_amd64 -DMODEL_default -DSYS_mingw64 -o runtime/amd64.o runtime/amd64.S + dumpbin /disasm:nobytes runtime/amd64nt.obj > runtime/amd64nt.dump + awk -f tools/ci/actions/canonicalize-dumpbin.awk runtime/amd64nt.dump runtime/amd64nt.dump > runtime/amd64nt.canonical + dumpbin /disasm:nobytes runtime/amd64.o > runtime/amd64.dump + awk -f tools/ci/actions/canonicalize-dumpbin.awk runtime/amd64.dump runtime/amd64.dump > runtime/amd64.canonical + git diff --no-index -- runtime/amd64*.canonical + wc -l runtime/amd64*.dump runtime/amd64*.canonical # ^ The final wc is there to make sure that the canonical files are # reasonable cleaned-up versions of the raw dumpbins and not simply # empty - if: matrix.x86_64 + if: endsWith(matrix.arch, '64') && matrix.cc != 'gcc' - name: Run the test suite - shell: bash - run: >- - eval $(tools/msvs-promote-path) ; - make -j tests ; + if: ${{ needs.config.outputs.skip-testsuite != 'true' }} + run: | + eval $(tools/msvs-promote-path) + make tests + + - name: Install the compiler + run: make install diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f65cfb05..215a37b2 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -34,7 +34,7 @@ jobs: # We then upload the compiler tree as a build artifact to enable re-use in # subsequent jobs. build: - runs-on: 'ubuntu-latest' + runs-on: 'ubuntu-24.04' outputs: manual_changed: ${{ steps.manual.outputs.manual_changed }} steps: @@ -59,7 +59,7 @@ jobs: '${{ github.event.repository.full_name }}' - name: Configure tree run: | - MAKE_ARG=-j CONFIG_ARG='--enable-flambda --enable-cmm-invariants --enable-dependency-generation --enable-native-toplevel' OCAMLRUNPARAM=b,v=0 bash -xe tools/ci/actions/runner.sh configure + MAKE_ARG=-j CONFIG_ARG='--enable-flambda --enable-cmm-invariants --enable-codegen-invariants --enable-dependency-generation --enable-native-toplevel' OCAMLRUNPARAM=b,v=0 bash -xe tools/ci/actions/runner.sh configure - name: Build run: | MAKE_ARG=-j bash -xe tools/ci/actions/runner.sh build @@ -80,18 +80,19 @@ jobs: # minor heap. normal: name: ${{ matrix.name }} - needs: build - runs-on: ubuntu-latest + needs: [build, config] + runs-on: ubuntu-24.04 strategy: matrix: include: - id: normal name: normal - dependencies: texlive-latex-extra texlive-fonts-recommended texlive-luatex hevea sass + dependencies: texlive-latex-extra texlive-fonts-recommended texlive-luatex hevea sass gdb lldb - id: debug name: extra (debug) - id: debug-s4096 name: extra (debug-s4096) + fail-fast: true steps: - name: Download Artifact uses: actions/download-artifact@v4 @@ -104,20 +105,21 @@ jobs: - name: Packages if: matrix.dependencies != '' run: | - sudo apt-get update -y && sudo apt-get install -y ${{ matrix.dependencies }} + sudo apt-get update -y + sudo apt-get install -y ${{ matrix.dependencies }} - name: Run the testsuite - if: matrix.id == 'normal' + if: ${{ matrix.id == 'normal' && needs.config.outputs.skip-testsuite != 'true' }} run: | MAKE_ARG=-j OCAMLRUNPARAM=b,v=0 bash -xe tools/ci/actions/runner.sh test - name: Run the testsuite (debug runtime) - if: matrix.id == 'debug' + if: ${{ matrix.id == 'debug' && needs.config.outputs.skip-testsuite != 'true' }} env: OCAMLRUNPARAM: v=0,V=1 USE_RUNTIME: d run: | bash -cxe "SHOW_TIMINGS=1 tools/ci/actions/runner.sh test" - name: Run the testsuite (s=4096, debug runtime) - if: matrix.id == 'debug-s4096' + if: ${{ matrix.id == 'debug-s4096' && needs.config.outputs.skip-testsuite != 'true' }} env: OCAMLRUNPARAM: s=4096,v=0 USE_RUNTIME: d @@ -142,40 +144,97 @@ jobs: run: | MAKE_ARG=-j OCAMLRUNPARAM=b,v=0 bash -xe tools/ci/actions/runner.sh other-checks -# MacOS build+testsuite run, and Linux O0 run. +# macOS build+testsuite run, and other Linux configurations (-O0, etc.) + config: + runs-on: ubuntu-latest + outputs: + jobs: ${{ steps.jobs.outputs.result }} + skip-testsuite: ${{ steps.skip.outputs.result }} + steps: + - name: Compute matrix for the "others" job + id: jobs + uses: actions/github-script@v7 + with: + script: | + // # Default jobs: Linux -O0, Linux arm64 & macOS + let jobs = [ + {name: 'linux-O0', os: 'ubuntu-latest', + config_arg: "CFLAGS='-O0'"}, + {name: 'linux-arm64', os: 'ubuntu-24.04-arm'}, + {name: 'macos-x86_64', os: 'macos-13'}, + {name: 'macos-arm64', os: 'macos-15'}]; + // # If this is a pull request, see if the PR has the + // # 'CI: Full matrix' label. This is done using an API request, + // # rather than from context.payload.pull_request.labels, since we + // # want the _current_ list of labels. This allows the labelling to + // # be changed, and then forcing a re-run of the workflow, rather + // # than having labelling triggering a fresh workflow event (which + // # is wasteful). + if (context.payload.pull_request) { + const { data: labels } = + await github.rest.issues.listLabelsOnIssue({...context.repo, issue_number: context.payload.pull_request.number}); + if (labels.some(label => label.name === 'CI: Full matrix')) { + console.log('Full matrix requested'); + // # Add "static" and "minimal" jobs + jobs = jobs.concat([ + {name: 'static', os: 'ubuntu-latest', + config_arg: '--disable-shared'}, + {name: 'minimal', os: 'ubuntu-latest', + config_arg: '--disable-native-compiler --disable-shared --disable-debug-runtime --disable-instrumented-runtime --disable-systhreads --disable-str-lib --disable-unix-lib --disable-ocamldoc'}]); + } + } + return jobs; + - name: Determine if the testsuite should be skipped + id: skip + uses: actions/github-script@v7 + with: + script: | + let skip_testsuite = false; + if (context.payload.pull_request) { + const { data: labels } = + await github.rest.issues.listLabelsOnIssue({...context.repo, issue_number: context.payload.pull_request.number}); + skip_testsuite = labels.some(label => label.name === 'CI: Skip testsuite'); + } + console.log('Skip testsuite: ' + skip_testsuite); + return skip_testsuite; + others: name: ${{ matrix.name }} + needs: config runs-on: ${{ matrix.os }} strategy: matrix: - include: - - name: linux-O0 - os: ubuntu-latest - config_arg: CFLAGS='-O0' - - name: macos-x86_64 - os: macos-13 - - name: macos-arm64 - os: macos-14 + include: ${{ fromJSON(needs.config.outputs.jobs) }} + fail-fast: true steps: - name: Checkout uses: actions/checkout@v4 with: persist-credentials: false - - name: OS Dependencies - if: runner.os == 'macOS' - run: brew install parallel + - name: macOS Dependencies + if: startsWith(matrix.os, 'macos-') + run: | + brew install parallel + # Allows starting up lldb from a remote terminal + # Note: in order to start lldb, the user must also be in + # one of these groups: "admin" or "_developer". + sudo DevToolsSecurity --enable + spctl developer-mode enable-terminal + # Select latest supported version + sudo xcode-select -s /Applications/Xcode_${{ matrix.os == 'macos-13' && '15.2' || '16.3' }}.app/Contents/Developer + lldb --version - name: configure tree run: | - CONFIG_ARG='${{ matrix.config_arg }}' MAKE_ARG=-j bash -xe tools/ci/actions/runner.sh configure + CONFIG_ARG='--enable-codegen-invariants ${{ matrix.config_arg }}' MAKE_ARG=-j bash -xe tools/ci/actions/runner.sh configure - name: Build run: | MAKE_ARG=-j bash -xe tools/ci/actions/runner.sh build - name: Run the testsuite - if: ${{ matrix.name != 'linux-O0' }} + if: ${{ matrix.name != 'linux-O0' && needs.config.outputs.skip-testsuite != 'true' }} run: | bash -c 'SHOW_TIMINGS=1 tools/ci/actions/runner.sh test' - name: Run the testsuite (linux-O0) - if: ${{ matrix.name == 'linux-O0' }} + if: ${{ matrix.name == 'linux-O0' && needs.config.outputs.skip-testsuite != 'true' }} env: OCAMLRUNPARAM: v=0,V=1 USE_RUNTIME: d @@ -186,13 +245,14 @@ jobs: i386: runs-on: ubuntu-latest + needs: config container: image: debian:12 options: --platform linux/i386 --user root steps: - name: OS Dependencies run: | - apt-get update + apt-get update -y apt-get install -y git gcc make parallel adduser --disabled-password --gecos '' ocaml - name: Checkout @@ -206,5 +266,6 @@ jobs: run: | MAKE_ARG=-j su ocaml -c "bash -xe tools/ci/actions/runner.sh build" - name: Run the testsuite + if: ${{ needs.config.outputs.skip-testsuite != 'true' }} run: | su ocaml -c "bash -xe tools/ci/actions/runner.sh test" diff --git a/.github/workflows/hygiene.yml b/.github/workflows/hygiene.yml index db21dd49..dd39db60 100644 --- a/.github/workflows/hygiene.yml +++ b/.github/workflows/hygiene.yml @@ -47,20 +47,6 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} if: github.event_name == 'pull_request' - - name: Parsetree updated - run: >- - tools/ci/actions/check-parsetree-modified.sh - '${{ github.event.pull_request.issue_url }}' - '${{ github.ref }}' - 'pull_request' - '${{ github.event.pull_request.base.ref }}' - '${{ github.event.pull_request.base.sha }}' - '${{ github.event.pull_request.head.ref }}' - '${{ github.event.pull_request.head.sha }}' - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - if: github.event_name == 'pull_request' - - name: configure correctly generated run: >- tools/ci/actions/check-configure.sh @@ -81,6 +67,7 @@ jobs: if: ${{ always() }} - name: check-typo revered + id: revered run: >- tools/ci/actions/check-typo.sh '${{ github.ref }}' @@ -98,9 +85,11 @@ jobs: - name: check-typo on whole tree run: tools/check-typo if: >- - github.event_name == 'push' - && (startsWith(github.event.ref, 'refs/heads/4.') - || github.event.ref == 'refs/heads/trunk') + ((github.event_name == 'push' + && (github.event.ref == 'refs/heads/trunk' + || startsWith(github.event.ref, 'refs/heads/4.') + || startsWith(github.event.ref, 'refs/heads/5.'))) + || steps.revered.outputs.full_check_needed == 'true') && always() - name: Check that labelled/unlabelled .mli files are in sync diff --git a/.github/workflows/multicoretests.yml b/.github/workflows/multicoretests.yml new file mode 100644 index 00000000..2bc8b4cc --- /dev/null +++ b/.github/workflows/multicoretests.yml @@ -0,0 +1,73 @@ +# Run the multicoretests testsuite if PR is labelled with run-multicoretests +name: Run multicoretests testsuite +on: + pull_request: + types: [opened, synchronize, reopened, labeled, unlabeled] + +# Restrict the GITHUB_TOKEN +permissions: {} + +# See build.yml +concurrency: + group: ${{ github.workflow }}-${{ github.ref }}-${{ github.event_name == 'pull_request' || github.sha }} + cancel-in-progress: true + +jobs: + multicoretests: + if: contains(github.event.pull_request.labels.*.name, 'run-multicoretests') + runs-on: 'ubuntu-latest' + strategy: + matrix: + include: + - profile: dev + ocamlrunparam: b + - profile: debug-runtime + ocamlrunparam: b,s=4096 + steps: + - name: Checkout OCaml + uses: actions/checkout@v4 + with: + path: ocaml + persist-credentials: false + - name: Configure, build and install OCaml + run: | + bash -xe ocaml/tools/ci/actions/multicoretests.sh ocaml + - name: Checkout multicoretests + uses: actions/checkout@v4 + with: + repository: ocaml-multicore/multicoretests + ref: 0.8 + path: multicoretests + persist-credentials: false + - name: Checkout QCheck + uses: actions/checkout@v4 + with: + repository: c-cube/qcheck + ref: v0.25 + path: multicoretests/qcheck + persist-credentials: false + - name: Checkout dune + uses: actions/checkout@v4 + with: + repository: ocaml/dune + ref: 3.18.0 + path: dune + persist-credentials: false + - name: Build and install dune + run: | + bash -xe ocaml/tools/ci/actions/multicoretests.sh dune + - name: Show the configuration + run: | + bash ocaml/tools/ci/actions/multicoretests.sh show_config + - name: Build the test suite + env: + DUNE_PROFILE: ${{ matrix.profile }} + OCAMLRUNPARAM: ${{ matrix.ocamlrunparam }} + run: | + bash -xe ocaml/tools/ci/actions/multicoretests.sh build + - name: Run the multicore test suite + env: + DUNE_PROFILE: ${{ matrix.profile }} + OCAMLRUNPARAM: ${{ matrix.ocamlrunparam }} + run: | + bash -xe ocaml/tools/ci/actions/multicoretests.sh testsuite diff --git a/.github/workflows/parsetree-change.yml b/.github/workflows/parsetree-change.yml new file mode 100644 index 00000000..b953969c --- /dev/null +++ b/.github/workflows/parsetree-change.yml @@ -0,0 +1,39 @@ +name: Parsetree Updated + +on: + pull_request: + paths: + - 'parsing/parsetree.mli' + - 'parsing/asttypes.mli' + - 'parsing/location.mli' + - 'parsing/longident.mli' + - 'parsing/parse.mli' + - 'parsing/pprintast.mli' + +jobs: + comment-and-label: + if: ${{! contains(github.event.pull_request.labels.*.name, 'parsetree-change')}} + permissions: + pull-requests: write + runs-on: ubuntu-latest + steps: + - name: Notify ppxlib maintainers + uses: actions/github-script@v7 + with: + script: | + github.rest.issues.createComment({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + body: 'CC @ocaml/ppxlib-dev' + }) + - name: Label PR + uses: actions/github-script@v7 + with: + script: | + github.rest.issues.addLabels({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + labels: ['parsetree-change'] + }) diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml deleted file mode 100644 index bed161e3..00000000 --- a/.github/workflows/stale.yml +++ /dev/null @@ -1,18 +0,0 @@ -name: "Close stale issues" -on: - schedule: - - cron: "15 4 * * 1,3,5" - -jobs: - stale: - runs-on: ubuntu-latest - permissions: - issues: write - steps: - - uses: actions/stale@v8 - with: - repo-token: ${{ secrets.GITHUB_TOKEN }} - stale-issue-message: 'This issue has been open one year with no activity. Consequently, it is being marked with the "stale" label. What this means is that the issue will be automatically closed in 30 days unless more comments are added or the "stale" label is removed. Comments that provide new information on the issue are especially welcome: is it still reproducible? did it appear in other contexts? how critical is it? etc.' - days-before-stale: 366 - days-before-close: 30 - exempt-issue-labels: 'bug' diff --git a/.github/workflows/tsan.yml b/.github/workflows/tsan.yml index 92e15011..33273977 100644 --- a/.github/workflows/tsan.yml +++ b/.github/workflows/tsan.yml @@ -33,7 +33,9 @@ jobs: with: persist-credentials: false - name: Install libunwind - run: sudo apt install -y libunwind-dev + run: | + sudo apt-get update -y + sudo apt-get install -y libunwind-dev # This temporary workaround reduces the number of random bits for the base # address of vma regions for mmap allocation, to avoid the # "FATAL: ThreadSanitizer: unexpected memory mapping" TSan error. @@ -85,7 +87,8 @@ jobs: - name: Packages if: matrix.dependencies != '' run: | - sudo apt-get update -y && sudo apt-get install -y ${{ matrix.dependencies }} + sudo apt-get update -y + sudo apt-get install -y ${{ matrix.dependencies }} - name: Run the testsuite if: matrix.id == 'normal' # Run testsuite with 30-minute timeout per test diff --git a/.gitignore b/.gitignore index 5cec3896..e72adc79 100644 --- a/.gitignore +++ b/.gitignore @@ -30,7 +30,7 @@ *.exe.manifest .DS_Store *.out -*.out.dSYM +*.dSYM/ *.swp _ocamltest _ocamltestd diff --git a/.gitmodules b/.gitmodules index d69d2a4d..7420fbaa 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,8 @@ [submodule "flexdll"] - path = flexdll - url = https://github.com/ocaml/flexdll.git + path = flexdll + url = https://github.com/ocaml/flexdll.git + shallow = true [submodule "winpthreads"] - path = winpthreads - url = https://github.com/ocaml/winpthreads.git + path = winpthreads + url = https://github.com/ocaml/winpthreads.git + shallow = true diff --git a/.mailmap b/.mailmap index 1159a14b..32ddba8d 100644 --- a/.mailmap +++ b/.mailmap @@ -141,6 +141,7 @@ Samuel Hym B. Szilvasy Hazem Elmasry Hazem Elmasry +T. Kinsart # These contributors prefer to be referred to pseudonymously whitequark diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5a13617b..05acc62a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -92,6 +92,22 @@ page](https://github.com/orgs/ocaml/teams/ocaml-dev/members), plus Anil as co-owner of the github/ocaml/ organization. Oddly enough, Github does not make the page publicly accessible. --> +### OCaml Language Committee + +Sometimes, consensus or decisions might be elusive during the review process, or +you might feel that some of the proposed design choices might warrant a wider +discussion. + +For those situations, we are experimenting with a new OCaml Language Committee +as a collegial instance for shepherding deliberations on the evolution of the +OCaml language and its standard library in a timely fashion. + +If you think that your PR or issue might be a good fit for consideration by the +OCaml Language Committee (see +https://github.com/ocaml/RFCs/blob/master/Committee.md for a more detailed +description), you just have to mention it to the current chair (@Octachron) in +the PR or issue. + ### Releases For more information about when and how new releases are published, see [the release introduction](release-info/introduction.md). diff --git a/Changes b/Changes index 971216bb..383f471f 100644 --- a/Changes +++ b/Changes @@ -1,3 +1,756 @@ +OCaml 5.4.0 +--------------- + +(Changes that can break existing programs are marked with a "*") + +### Language features: + +- #13097: added immutable arrays (`'a iarray` type, Iarray stdlib module) + (Antal Spector-Zabusky and Olivier Nicole, review by Gabriel Scherer, + Jeremy Yallop and Vincent Laviron) + +- #13340: Array literal syntax [| e1; ...; en |] can now be used to + denote values of type `'a array` and `'a iarray` and `floatarray`, + both in expressions and patterns. The compiler disambiguates each + case by using contextual type information (assuming `'a array` + by default). + (Nicolás Ojeda Bär, review by Richard Eisenberg, Jeremy Yallop, Jacques + Garrigue, and Gabriel Scherer) + +- #13498: Tuple fields are now optionally labeled: + `(x:42, y:0)` and `let (~x, ~y) = ... in ...`. + (Ryan Tjoa and Chris Casinghino, review by Gabriel Scherer, Chris Casinghino, + and Leo White) + +- RFCs#39, #13404: atomic record fields + `{ ...; mutable readers : int [@atomic]; ... }` + `Atomic.Loc.fetch_and_add [%atomic.loc data.readers] 1` + (Clément Allain and Gabriel Scherer, review by KC Sivaramakrishnan, + Basile Clément and Olivier Nicole) + +### Standard library: + +* #14124: Do not raise Invalid_argument on negative List.{drop,take}. + (Daniel Bünzli, review by Gabriel Scherer, Nicolás Ojeda Bär) + +- #13696: Add Result.product and Result.Syntax: + `let open Result.Syntax in let* x = ... in ...` + (Daniel Bünzli, review by Gabriel Scherer, Nicolás Ojeda Bär) + +- #12871: Add the Pqueue module to the stdlib. It implements priority queues. + (Jean-Christophe Filliâtre, review by Daniel Bünzli, Léo Andrès and + Gabriel Scherer) + +- #13760: Add String.{edit_distance,spellcheck} + (Daniel Bünzli, review by wikku, Nicolás Ojeda Bär, Gabriel Scherer and + Florian Angeletti) + +- #13753, #13755: Add Stdlib.Repr: + Repr.phys_equal and Repr.compare are more explicit than (==) and `compare`. + (Kate Deplaix, Thomas Blanc and Léo Andrès, review by Gabriel Scherer, + Florian Angeletti, Nicolás Ojeda Bär, Daniel Bünzli and Jeremy Yallop) + +- #13695: Add Stdlib.Char.Ascii + (Daniel Bünzli, review by by Nicolás Ojeda Bär and Jeremy Yallop) + + +- #13720: Add Result.{get_ok',error_to_failure} + (Daniel Bünzli, review by wikku, Gabriel Scherer, Nicolás Ojeda Bär, + Vincent Laviron and hirrolot) + +- #13885: Add Dynarray.{exists2, for_all2}. + (T. Kinsart, review by Daniel Bünzli, Gabriel Scherer, and Nicolás Ojeda Bär) + +* #13862: Make List.sort_uniq keep the first occurrences of duplicates. + (Benoît Jubin, review by Nicolás Ojeda Bär, Gabriel Scherer) + +- #13836: Add [Float.]Array.{equal,compare}. + (Daniel Bünzli, review by Nicolás Ojeda Bär and Gabriel Scherer) + +- #13796: Add Uchar.utf_8_decode_length_of_byte and + Uchar.max_utf_8_decode_length. + (Daniel Bünzli, review by Nicolás Ojeda Bär and Florian Angeletti) + +- #13768: Add Either.get_left and Either.get_right + (T. Kinsart, review by Nicolás Ojeda Bär and Florian Angeletti) + +* #13570, #13794: Format, add an out_width function to Format device for + approximating unicode width. + (Florian Angeletti, review by Nicolás Ojeda Bär, Daniel Bünzli, + and Gabriel Scherer) + +- #13731: Add Either.retract + (Daniel Bünzli, review by Nicolás Ojeda Bär and David Allsopp) + +- #13729: Add Seq.filteri + (T. Kinsart, review by Nicolás Ojeda Bär and Daniel Bünzli) + +- #13721: Add Result.retract + (Daniel Bünzli, review by Gabriel Scherer, Nicolás Ojeda Bär and + David Allsopp) + +- #13310: Add Stdlib.Pair + (Victoire Noizet, review by Nicolás Ojeda Bär, Daniel Bünzli, Xavier Van de + Woestyne, Jeremy Yallop and Florian Angeletti) + +- #13662: Add eager boolean operations Bool.logand, Bool.logor, Bool.logxor + (Jeremy Yallop, review by Nicolás Ojeda Bär) + +- #13463, #13572: Avoid raising Queue.empty in Format when it is used + concurrently, raise a specific exception instead. + (Chritophe Raffalli, review by Gabriel Scherer and Daniel Bünzli) + +- #13620: Avoid copying the string in String.concat, String.sub and + String.split_on_char when the full string is returned. + (Christophe Raffalli, review by Nicolás Ojeda Bär and Gabriel Scherer and + Hugo Heuzard) + +- #13727: Reimplement Sys.getenv_opt not to use exceptions internally, meaning + that the current backtrace is preserved when Sys.getenv_opt returns None. + (David Allsopp, review by Nicolás Ojeda Bär, Josh Berdine and Gabriel Scherer) + +- #13737: Avoid closure allocations in Weak.Make.add when resizing the + table + (Vincent Laviron, review by Gabriel Scherer and Daniel Bünzli) + +- #13740: Improve performance of Weak.find_aux + (Josh Berdine, review by Gabriel Scherer) + +- #13782: Improve performance and type safety of Type.Id by using + [%extension_constructor] instead of Obj.Extension_constructor.of_val. + (Basile Clément, review by Vincent Laviron and Nicolás Ojeda Bär) + +- #13589: Expose Sys.io_buffer_size, the size of internal buffers used by the + runtime system and the `unix` library. + (Yves Ndiaye and Nicolás Ojeda Bär, review by Daniel Bünzli and Nicolás Ojeda + Bär) + +- #13569: add a `Format.format_text` which adds break hints to format literals. + (Florian Angeletti, review by Nicolás Ojeda Bär, Daniel Bünzli, + and Gabriel Scherer) + +- #13578: On Windows, use the OS CSPRNG to seed the Stdlib.Random generator. + (Antonin Décimo, review by Miod Vallat, Nicolás Ojeda Bär, and Xavier Leroy) + +- #13859: Fix Weak.get_copy not darkening custom blocks + (Josh Berdine, review by Stephen Dolan) + +- #13909: Add `Dynarray.unsafe_to_iarray` + (Olivier Nicole, review by Daniel Bünzli, Stefan Muenzel and Gabriel Scherer, + request by Daniel Bünzli) + +- #13932: Add List.singleton and Seq.singleton + (David Allsopp, tariffs applied by Nicolás Ojeda Bär and Gabriel Scherer) + +* #13843: Add signal definitions for SIGIO and SIGWINCH. Introduces a + type alias for signal int, signal_to_string to convert OCaml signal numbers + to their POSIX equivalent names, and signal_of_int/signal_to_int for + converting between OCaml and platform signal numbers. (Reported in #13825) + (Tim McGilchrist, review by David Allsopp, Nicolás Ojeda Bär, Daniel Bünzli + Jan Midtgaard and Miod Vallat) + +### Runtime system: + +- #13500: Add frame pointers support for ARM64 on Linux and macOS. + (Tim McGilchrist, review by KC Sivaramakrishnan, Fabrice Buoro + and Miod Vallat) + +- #12964: Reintroduce "memory cleanup upon exit" mode. The cleanup will + however be incomplete if not all domains have been joined when the main + domain terminates. + (Miod Vallat, review by KC Sivaramakrishnan, feedback from Nick Barnes + and Gabriel Scherer) + +- #13582: Enable software prefetching support for ARM64, s390x, PPC64 and RiscV. + Used during GC marking and sweeping to speed up both operations by + prefetching data. + (Tim McGilchrist, review by Nick Barnes, Antonin Décimo, + Stephen Dolan and Miod Vallat) + + +- #13675: Make Unix.map_file memory show up in Gc.Memprof. + (Stephen Dolan, review by Guillaume Munch-Maccagnoni and Gabriel Scherer) + +- #13785: Add `Runtime_events.Timestamp.get_current`. + (Simon Cruanes) + +- #13774: Fix for inaccurate live blocks/words stats in compaction. + (Sadiq Jaffer, report by KC Sivaramakrishnan and Jan Midtgaard, review by + Gabriel Scherer) + +- #13773: Ensure that shared pool owners are correctly set on pool adoption. + (Stephen Dolan, review by Sadiq Jaffer and Gabriel Scherer) + +* #11449, #13497: Add caml_stat_char_array_{to,of}_os functions allowing + conversion of string data which may contain NUL characters. Correct + implementation of caml_stat_strdup_to_utf16 to raise Out_of_memory instead of + returning of NULL (the behaviour of caml_stat_strdup_to_os was inconsistent + between Unix/Windows). + (David Allsopp, review by Nick Barnes, Antonin Décimo and Miod Vallat) + +- #13352: Concurrency refactors and cleanups. + (Antonin Décimo, review by Gabriel Scherer, David Allsopp, and Miod Vallat) + +- #13437: Stop using GetProcAddress to load functions that were not + available in older, now unsupported Windows versions. + (Antonin Décimo, review by Nicolás Ojeda Bär and David Allsopp) + +- #13470: Constify some function parameters, flags tables, and some + pointers in C code (take 3). + (Antonin Décimo, review by Stephen Dolan and Miod Vallat) + +- #13492: Parse the CAML_LD_LIBRARY_PATH environment variable for the + shared_libs_path item in `ocamlrun -config` in addition to displaying the + entries found in ld.conf. + (David Allsopp, review by Stephen Dolan) + +- #13496: Add missing .type and .size directives to main frametable to silence + warnings from the linker when using libasmrun_shared on amd64 and power. The + other backends already carried these directives. + (David Allsopp, review by Tim McGilchrist and Miod Vallat) + +- #13354: Use C99 flexible array member syntax everywhere. + (Antonin Décimo, review by Miod Vallat, Gabriel Scherer, and Xavier Leroy) + +- #11865, #13584: Fix a deadlock triggered by deleting C roots from C finalisers + (Stephen Dolan, report by Timothy Bourke, review by Mark Shinwell and Damien + Doligez) + +- #13613: Functions from caml/skiplist.h and caml/lf_skiplist.h no longer raise + Out_of_memory exceptions that the runtime could not handle. + (Guillaume Munch-Maccagnoni, review by Stephen Dolan) + +- #13575, #13635: Maintain OCaml frame pointers correctly even when using + C libraries that do not support them. + (Stephen Dolan and David Allsopp, report by Thomas Leonard, review by Tim + McGilchrist and Fabrice Buoro) + +- #13643: Allow values reachable from ephemeron keys to be collected by minor GC + (Stephen Dolan, review by François Bobot) + +- #13701: optimize `caml_continuation_use` based on #12735 + (Hugo Heuzard, review by KC Sivaramakrishnan) + +- #13227, #13714: Review of locking in the multicore runtime. Fix + deadlocks in runtime events and potential deadlocks with named + values. + (Guillaume Munch-Maccagnoni, review by Gabriel Scherer, tests by + Jan Midtgaard) + +- #13736: Fix major GC pacing bug triggered by synchronous collections. + (Nick Barnes, review by Damien Doligez and Tim McGilchrist) + +- #13827: Avoid re-marking ephemerons with trivial data. + (Stephen Dolan, review by Nick Barnes and Josh Berdine, benchmarking by + Nicolás Ojeda Bär) + +- #13300, #13861: introduce `Gc.ramp_up` to explicitly mark ramp-up + phases of memory consumption and avoid GC overwork. Ramp-up behaviors + are worse with OCaml 5 than with OCaml 4 due to higher sensitivity + to excessive pacing computations. Indicating ramp-up explicitly eliminates + the main known slowdown of OCaml 5 (relative to OCaml 4) for Coq/Rocq. + (Gabriel Scherer, review by Damien Doligez and Guillaume Munch-Maccagnoni, + report by Emilio Jesús Gallego Arias and Olivier Nicole) + +- #14057: Don't update memprof too early at the end of a minor GC. + (Nick Barnes, review by Damien Doligez). + +### Code generation and optimizations: + +- #13262, #14074: fix performance issue on Apple Silicon macOS by emitting + `stlr` instead of `dmb ishld; str`. + (KC Sivaramakrishnan, report by François Pottier, analysis by Frédéric Bour, + Xavier Leroy, Miod Vallat, Gabriel Scherer and Stephen Dolan, review by Miod + Vallat, Vincent Laviron and Xavier Leroy) + +* #13050, #14104, #14143: Use '$' instead of '.' to separate module names + in symbol names on macOS and Windows (including the Cygwin backend). + This changes mangling of OCaml identifiers on those operating systems from + `camlModule.name_NNN` to `camlModule$name_NNN`. Additionally it + changes the encoding of special characters from $xx (two hex digits) + to $$xx (two dollar signs followed by two hex digits). + (Tim McGilchrist, with contributions from Xavier Leroy, + reviewed by Xavier Leroy, Miod Vallat, Gabriel Scherer, + Nick Barnes and Hugo Heuzard) + +- #13807: Allow unaligned memory accesses on ARM64. + (Matthew Else, review by Xavier Leroy) + + +- #13565: less tagging in switches compiled to affine transformations + by ocamlopt. + (Gabriel Scherer and Clément Allain, review by Vincent Laviron, + report by Vesa Karvonen) + +- #13672 Avoid register stall on conversion instructions on amd64. + (Pierre Chambart, review by Gabriel Scherer and Xavier Leroy, + report by Patrick Nicodemus) + +- #13667: (originally #11162) Fix instr_size computation on arm64. + (Stephen Dolan and Tim McGilchrist, review by Xavier Leroy + and David Allsopp) + +- #13758: Propagate more value kinds in Flambda to allow more unboxing + (Vincent Laviron, review by Pierre Chambart) + +- #13759: Propagate more type information from clambda to cmm. + (Pierre Chambart, review by Gabriel Scherer) + +- #13735: Follow the behaviour of the C compiler to decide whether to emit the + `.size` and `.type` directives and the `.note.GNU-stack` section + (Samuel Hym, review by Miod Vallat, Antonin Décimo and Gabriel Scherer) + +### Other libraries: + +* #13435: On Windows, use system calls for `Filename.get_temp_dir_name` instead + of directly reading the environment, which in particular improves the security + of OCaml processes running in the SYSTEM security context by mitigating + privileged file operation attacks. For all other processes running with the + default environment (where `TEMP` is set), there is no discernible change. + (Antonin Décimo, review by Nicolás Ojeda Bär and David Allsopp) + +- #13504, #13625, #14223: Add `Thread.set_current_thread_name`. + (Romain Beauxis, review by Gabriel Scherer and Antonin Décimo) + +* #13376: Allow Dynlink.loadfile_private to load bytecode libraries with + internal dependencies + (Vincent Laviron, report by Stéphane Glondu, review by Nicolás Ojeda Bär + and Xavier Leroy) + +- #13429: add `Unix.sigwait`, a binding to the `sigwait` system call; + implement `Thread.wait_signal` using `Unix.sigwait`, and + `Thread.sigmask` using `Unix.sigprocmask`. + (Xavier Leroy, review by Antonin Décimo, Gabriel Scherer, Miod Vallat) + +- #13442, #13452: Fix Unix.getgroups for users belonging to more than 32 groups + when using musl + (Kate Deplaix, review by Gabriel Scherer, Antonin Décimo, Anil Madhavapeddy) + +- #13576: Introduce internal helpers to convert between time representations. + On Windows, prevent erroneously waiting for an unbounded time in Unix.select + if more than 64 file descriptors per lists are watched, or if watching + non-socket file descriptors, and a timeout longer than $2^{32}$ milliseconds + is used. Cap the timeout to $2^{32}$ milliseconds. + (Antonin Décimo, review by Gabriel Scherer and Miod Vallat) + +- #13921: Set cloexec correctly on CRT file descriptors created by the Unix + library on Windows. The inheritance on the underlying Win32 handles was + correctly set, but the book-keeping for the CRT was leaking the value of + non-inherited handles which combined with re-use of HANDLE values within + processes could appear to make a CRT file descriptor "re-open". + (David Allsopp, review by Nicolás Ojeda Bär) + +### Tools: + +- #13686: Fix Python debugger extensions (for LLDB and GDB) to restore + functionality broken by #13272 in 5.3. + (Nick Barnes, review by Tim McGilchrist Gabriel Scherer) + +- #12019: ocamlc: add `align_double` and `align_int64` to `ocamlc -config` + output. + (Romain Beauxis, review by David Allsopp) + +- #12642, #13536, #14184, #14192: in the toplevel, print shorter paths for + constructors and labels when only some modules along their path are open. + (Gabriel Scherer, review by Florian Angeletti) + +- #13199, #13485, #13665, #13762, #13965: Support running native debuggers in + ocamltest. + (Tim McGilchrist, Sebastien Hinderer, David Allsopp, Antonin Décimo, review by + Sebastien Hinderer, Gabriel Scherer, Antonin Décimo, and Tim McGilchrist) + +- #13764, #13779: add missing "-keywords" flag to ocamldep and ocamlprof + (Florian Angeletti, report by Prashanth Mundkur, review by Gabriel Scherer) + +- #13877: ocamldoc, add a `-latex-escape-underscore` flag to control the + escaping of `_` underscore in latex references (in order to be able to match + odoc behaviour). + (Florian Angeletti, review by Gabriel Scherer) + +- #13906: Add support for a `multicore` tag in ocamltest and use it for + tests that fail on mono-core systems. + (Stéphane Glondu, review by Nicolás Ojeda Bär) + +### Manual and documentation: + +- #13751: Document support for profiling with Linux perf and frame pointers. + (Tim McGilchrist, review by Gabriel Scherer and Miod Vallat) + +- #12452: Add examples to Stdlib.Fun documentation. + (Hazem ElMasry, review by Florian Angeletti and Gabriel Scherer) + +- #13924: Document how to put [@deprecated] on let bindings, constructors, etc + in the manual + (Valentin Gatien-Baron, review by Florian Angeletti) + + +- #13694: Fix name for caml_hash_variant in the C interface. + (Michael Hendricks) + +- #13732: Document that custom finalizers must not access the OCaml heap, etc. + (Josh Berdine, review by Stephen Dolan and Guillaume Munch-Maccagnoni) + +### Type system + +* #13830: fail rather than silently create abstract module types when avoiding + (i.e. hiding) signature items, as in: + ```ocaml + module N = struct + open (struct type t = A | B end) + module type T = sig type u = t * int end + end + ``` + Before, it was succeeding with `module N : sig module type T end`, now it + fails. Similarly for anonymous functor calls (of the form `F(struct ... end)) + (Clement Blaudeau, review by Gabriel Scherer) + +### Compiler user-interface and warnings: + +- #13817: align spellchecking hints with the possibly misspelled identifier/ + Error: Unbound type constructor "aray" + Hint: Did you mean "array"? + (Florian Angeletti, suggestion by Daniel Bünzli, review by Gabriel Scherer) + +- #13587: Enable native backend on x86_64 GNU/Hurd. + (Samuel Thibault, review by Antonin Décimo, Sébastien Hinderer and Miod + Vallat) + +- #13663: Improve the error message when GADT parameter variance cannot be + checked. + (Stefan Muenzel, review by Gabriel Scherer and Florian Angeletti) + +- #13646: Improve the error messages when a recursive module type + references another recursive module type. + (Stefan Muenzel, review by Florian Angeletti and Gabriel Scherer) + +- #13702, #13865: Specialized error messages for functors appearing in contexts + where non-functors were expected `module A: sig ... end = Set.Make` + (and the reverse) + (Florian Angeletti, report by Jeremy Yallop, review by Gabriel Scherer) + +- #13788, #13813: Keep the module context in spellchecking hints. + `Fun.protact` now prompts `Did you mean "Fun.protect?"` rather than + `Did you mean "protect?"`. + (Florian Angeletti, suggestion by Daniel Bünzli, review by Gabriel Scherer) + + +- #13428: support dump=[source | parsetree | lambda | ... | cmm | ...] + in OCAMLRUNPARAM + (Gabriel Scherer, review by Vincent Laviron) + +- #13493: Clearer error message in ocamlc for conflicting link options for + C stubs when shared libraries are not available. + (David Allsopp, review by Gabriel Scherer) + +- #13563, lighter inline code styling for output without bold support: inline + code is no longer printed as "..." to avoid confusion with OCaml strings. + (Florian Angeletti, review by Richard Eisenberg) + +- #13568, composable formatting for warning and alert messages + (Florian Angeletti, review by Richard Eisenberg) + +- #13601: Enable natdynlink on x86_64 GNU/Hurd + (Samuel Thibault, review by Sébastien Hinderer) + +- #13809: Distinguish `(module M : S)` and `(module M) : (module S)` and + change locations of error messages when `S` is ill-typed in `(module S)` + (Samuel Vivien, review by Florian Angeletti and Gabriel Scherer) + +- #13814, 13898: Add an `unused-type-declaration` warning when using + a `t as 'a` with no other occurences of `'a` + (Samuel Vivien, review by Florian Angeletti, Kate Deplaix) + +- #13818: better delimited hints in error message + (Florian Angeletti, review by Gabriel Scherer) + +### Internal/compiler-libs changes: + +- #13539, #13776: Use nanosleep instead of usleep or select, if available. + (Antonin Décimo, review by Miod Vallat and Gabriel Scherer) + +- #13748: Add a .editorconfig file for basic editor auto-configuration. + (Antonin Décimo, review by Gabriel Scherer and David Allsopp) + +- #13302, #14236: Store locations of longidents components + (Ulysse Gérard and Jules Aguillon, review by Jules Aguillon + and Florian Angeletti) + + +- #13314: Comment the code of Translclass + (Vincent Laviron and Nathanaëlle Courant, review by Olivier Nicole) + +- #13362: reimplement Floatarray.concat in C (`caml_floatarray_concat`), + matching the implementation of Array.concat. + (Gabriel Scherer, review by Nicolás Ojeda Bär) + +- #13624: Added location to exception definitions and type extensions + (Samuel Vivien, review by Gabriel Scherer) + +- #13425: undocumented -dmatchcomp flag for the debug + output of the pattern-matching compiler + (Gabriel Scherer, review by Vincent Laviron and Nicolás Ojeda Bär) + +- #13460: introduce a variant of all predefined types + (Gabriel Scherer, review by Ulysse Gérard and Florian Angeletti) + +- #13457, #13537: Annotate alloc/free open/close pairs of functions + with compiler attributes for static analysis. + (Antonin Décimo, review by Gabriel Scherer and Florian Angeletti) + +- #13464: Use generic types in call to `subtype`. This improves + inference of type-directed disambiguation in principal mode. + (Richard Eisenberg, review by Jacques Garrigue) + +- #13606: Fix Numbers.Int_base.compare + (Mark Shinwell, review by Vincent Laviron) + +- #13612: Refactor `type_application` + (Ulysse Gérard, Leo White, review by Antonin Décimo, Gabriel Scherer, + Samuel Vivien, Florian Angeletti and Jacques Garrigue) + +- #13744: Refactor in `collect_apply_args` + (Samuel Vivien, review by Florian Angeletti and Gabriel Scherer) + +- #13787: a new -dcanonical-ids option to show canonicalized identifier stamps + in -d{lambda,cmm,...} outputs. + (Gabriel Scherer, review by Vincent Laviron and David Allsopp, + suggested by David Allsopp) + +- #13820: Add a new option -i-variance to print the variance of every + type parameter; bivariance is printed as `+-`, and for consistency, + parser is modified too to accept `+-` and `-+` as `type_variance`. + (Takafumi Saikawa and Jacques Garrigue, review by Florian Angeletti) + +- #13828: Apply BUILD_PATH_PREFIX_MAP to Sys.argv.(0) before storing it in .cmt + and .cmti files. + (David Allsopp, review by Daniel Bünzli and Gabriel Scherer) + +- #13848: Add all paths components to the cmt files indexes + (Ulysse Gérard, review by Florian Angeletti) + +- #13854: Make the parser set loc_ghost more correctly, for `keyword%extension` + syntax + (Valentin Gatien-Baron, review by Florian Angeletti) + +- #13856: Add a new indirection in types AST called `package` that stores the + content of a `Tpackage` node + (Samuel Vivien, review by Florian Angeletti) + +- #13866: Modified occurence check that prevents recursive types for it to see + the checked type as a graph rather than a tree + (Samuel Vivien, report by Didier Remy, review by Florian Angeletti + and Jacques Garrigue) + +- #13884 Correctly index modules in constructors and labels paths + (Ulysse Gérard, review by Florian Angeletti) + +- #13946: refactor the #install_printer code in the debugger and toplevel + (Pierre Boutillier, review by Gabriel Scherer and Florian Angeletti) + +- #13952: check and document the correctness of `caml_domain_alone ()`. + (Gabriel Scherer, review by KC Sivaramakrishnan, report by Olivier Nicole) + +- #13971: Keep generalized structure from patterns when typing `let` + (Leo White, review by Samuel Vivien and Florian Angeletti) + +* #13972: Renamed the `-no-alias-deps` flag internal representation to + `no_alias_deps` instead of `transparent_modules`. + (Clement Blaudeau, review by Gabriel Scherer) + +### Build system: + +* #13526, #13789, #13804: Simplify the build of cross compilers + This replaces the configure `--with-target-bindir` option by an equivalent + `TARGET_BINDIR` variable + (Samuel Hym, review by Miod Vallat, Xavier Leroy, Antonin Décimo and Sébastien + Hinderer) + + +- #13431: Simplify github action responsible for flagging PRs with + the `parsetree-changes` label and extend it to mention the @ppxlib-dev + team. + (Nathan Rebours, review by Florian Angeletti) + +- #13494: Use native symlinks on Windows for the OCaml installation, reducing + disk usage considerably. + (David Allsopp, review by Nicolás Ojeda Bär and Gabriel Scherer) + +- #13789: Strictly validate the host and target triplets when building for the + Windows ports to be *-*-cygwin, *-w64-mingw32* or *-pc-windows. Other Cygwin + variants used to be rejected - other MSVC and mingw-w64 variants are now + rejected too. + (David Allsopp, review by Antonin Décimo and Gabriel Scherer) + +### Bug fixes: + +- #13819: Fix field initialisation bug in runtime events subsystem. + (Nick Barnes, review by Gabriel Scherer). + +- #13977: Pass `-fPIC` when compiling C files using `ocamlopt`. This was a + regression in OCaml 5.3. + (Nicolás Ojeda Bär, review by Daniel Bünzli and Gabriel Scherer) + +- #13957: Allow 'effect' as attribute id. + (Pieter Goetschalckx, review by Nicolás Ojeda Bär and Florian Angeletti) + +- #13691 #13895: Make four globals underlying Gc.control atomic to avoid C data + races against them. + (Jan Midtgaard, review by Miod Vallat, Sadiq Jaffer and Antonin Décimo) + +- #13454: Output a correct trace of the C_CALLN bytecode. + (Miod Vallat, review by Antonin Décimo) + +- #13595: Use x19 as Canonical Frame Address (CFA) register. This would cause + backtraces to be truncated when calling no alloc C code. + (Tim McGilchrist, report by Nick Barnes, review by Nick Barnes) + +* #13605: Fix ungenerated constraints when they where impossible due to polyvars + issues + (Samuel Vivien, review by Florian Angeletti, Richard Eisenberg + and Jacques Garrigue) + +- #13677, #13679: domain.c: remove backup_thread_running to simplify + concurrent state updates to the backup thread status. + (Gabriel Scherer, review by Jan Midtgaard and Miod Vallat, + report by Jan Midtgaard) + +- #13896, #14098: ocamldoc, do not wrap module description in a paragraph tag + inside the table of modules + (Florian Angeletti, report by John Whitington, review by Gabriel Scherer) + +- #13703: wrong explanation for some polymorphic-variant subtyping errors + (Gabriel Scherer, review by Jacques Garrigue, + report by Wiktor Kuchta and Richard Eisenberg) + +- #13710: Support unicode identifiers in comments. + (Pieter Goetschalckx, review by Florian Angeletti and Gabriel Scherer) + +- #13763: Track type of variables bound by as-patterns + (Leo White, review by Gabriel Scherer, port by Vincent Laviron) + +- #13778, #13811: do not warn for unused type declarations when the type is used + in a first-class module type (`module S with type t = int)`. + (Florian Angeletti, report by Nicolás Ojeda Bär, review by Gabriel Scherer) + +- #13790: Fix bytecode-only build of Cygwin when flexlink is being bootstrapped + with the compiler. + (David Allsopp, review by Antonin Décimo and Miod Vallat) + +- #13812: Add forgotten check about the validity of the type variable name on + the right-hand side of `_ as _`. + (Samuel Vivien, review by Gabriel Scherer) + +- #13845: Fix bug in untypeast/pprintast for value bindings with polymorphic + type annotations. + (Chris Casinghino, review by Florian Angeletti and Gabriel Scherer) + +- #13930, #13933: Fix bugs in recursive values definitions involving + lazy values that have already been evaluated. + (Gabriel Scherer, review by Vincent Laviron, report by Vincent Laviron) + +- #13867: Fix bug with some recursive bindings of lazy values. + (Guillaume Bury and Vincent Laviron, review by Stefan Muenzel + and Gabriel Scherer) + +- #13931: fix bugs in nested recursive value definitions. + (Gabriel Scherer, review by Vincent Laviron, + report by Vincent Laviron) + +- #13875, #13878: Add dedicated constructor for mutable variable access in + Cmm to prevent bugs linked to incorrect handling of coeffects. + (Vincent Laviron, review by Gabriel Scherer) + +- #13880: Make object stat counters atomic + (Dimitris Mostrous, review by Gabriel Scherer and Nicolás Ojeda Bär) + +- #13172, #13829: Fix a missing check of illegal recursive module-type + definitions + (Clement Blaudeau, review by Florian Angeletti) + +- #13541, #13777: Using C++11 `thread_local` causes name-mangling + issues when linking with flexlink on Cygwin. + (Antonin Décimo and David Allsopp, report by Kate Deplaix) + +* #13874, #13882: Make evaluation order consistent for applications when using + the non-flambda native compiler + (Vincent Laviron, report by Jean-Marie Madiot, review by Gabriel Scherer) + +- #13942: Fix assertion on empty array case + (Olivier Nicole, review by Gabriel Scherer) + +- #13950: Avoid tearing in `Array.sub` + (Gabriel Scherer and Olivier Nicole, report by Jan Midtgaard, review by + Gabriel Scherer) + +- #13928, #13944: Fix handling of excessively nested unboxed types + (Vincent Laviron, review by Gabriel Scherer) + +- #13987: Remove a spurious TSan report in case of benign data race between + major GC read and write from the mutator (fixes #13427) + (Olivier Nicole, report by Thomas Leonard, review by Gabriel Scherer) + +- #14007, #14015: Fix memory corruption when an exception is raised during + demarshaling. + (Benoît Vaugon, review by David Allsopp and Gabriel Scherer) + +- #14025: fix data race between compaction and domain termination + (Gabriel Scherer, review by Jan Midtgaard, + report by Jan Midtgaard) + +- #13956 Fix a regression introduced in #13308 triggering wrong unused warnings. + (Ulysse Gérard, review by Florian Angeletti) + +- #14070: also point to label mismatches in error messages for labelled tuples + (Florian Angeletti, review by Gabriel Scherer) + +- #14088, #14091: fix non-deterministic code generation in + matching.ml (backport of rescript-lang/rescript#7557) + (Christiano Calgano, review by Gabriel Scherer and Vincent Laviron) + +- #14105: Fix a loop in Pprintast that could result in a hang when printing + constructor `(::)` in isolation. + (Ulysse Gérard, review by Nicolás Ojeda Bär and Florian Angeletti) + +- #14108: toplevel, fix a typo in directive type mismatch + (Florian Angeletti, review by Gabriel Scherer) + +- #13586, #14093: Fix closing an out_channel during flush + (Stephen Dolan, report by Jan Midtgaard, investigation by Nick Roberts, + review by Antonin Décimo and Miod Vallat) + +- #14101, #14139: define atomic helper types inside `caml/misc.h` to improve + header compatibility with C++ + (Florian Angeletti, report by Kate Deplaix, review by Gabriel Scherer) + +- #14135: Fix a rare internal typechecker error when combining recursive + modules, polymorphic fields or methods, and constrained type parameters. + (Florian Angeletti, review by Gabriel Scherer) + +- #14169: runtime, fix cache miss within the stack fragments cache + (Florian Angeletti, review by Gabriel Scherer) + +- #14196, #14197: ocamlprof: do not instrument unreachable clauses + (Gabriel Scherer, review by Nicolás Ojeda Bär, report by Ali Caglayan) + +- #14200, #14202 : bad variance check with private aliases + (Jacques Garrigue, report and review by Stephen Dolan) + +- #14061, #14209: fix a memory-ordering bug in Weak.set that could + result in uninitialized memory seen by Weak.get on another domain. + (Damien Doligez, review by Gabriel Scherer) + +- #14214, #14221: fix a confused error message for module inclusions, + functor error messages were missing some type equalities potentially leading + to nonsensical "type t is not compatible with type t" submessage + (Florian Angeletti, report by Basile Clément, review by Gabriel Scherer) + +- #14238: Fix certain variadic macros in misc.h which could trigger C warnings + under certain conditions in prerelease versions of OCaml 5.4. + (Antonin Décimo, review by Nicolás Ojeda Bär) + +- #14287: Bugfix for GC root mishandling in memprof.c + (Stephen Dolan, review by Leo White) + OCaml 5.3.0 (8 January 2025) ---------------------------- @@ -15,9 +768,6 @@ OCaml 5.3.0 (8 January 2025) ### Language features: -- #12828, #13283: Add short syntax for dependent functor types `(X:A) -> ...` - (Jeremy Yallop, review by Nicolás Ojeda Bär and Gabriel Scherer) - - #12309, #13158: Add syntax support for deep effect handlers (Leo White, Tom Kelly, Anil Madhavapeddy, KC Sivaramakrishnan, Xavier Leroy and Florian Angeletti, review by the same, Hugo Heuzard, and Ulysse Gérard) @@ -27,6 +777,10 @@ OCaml 5.3.0 (8 January 2025) (Xavier Leroy and Florian Angeletti, review by Daniel Bünzli and Jules Aguillon) + +- #12828, #13283: Add short syntax for dependent functor types `(X:A) -> ...` + (Jeremy Yallop, review by Nicolás Ojeda Bär and Gabriel Scherer) + ### Type system - #11891, #12507: Allow to name new locally abstract types in constructor type @@ -35,6 +789,13 @@ OCaml 5.3.0 (8 January 2025) ### Runtime system: +- #11911, #12923: Multicore statistical memory profiling. + This restores a notable OCaml 4 feature that was missing + in OCaml 5. + (Nick Barnes, review by Stephen Dolan, Jacques-Henri Jourdan + and Guillaume Munch-Maccagnoni). + + - #13419: Fix memory bugs in runtime events system. (B. Szilvasy and Nick Barnes, review by Miod Vallat, Nick Barnes, Tim McGilchrist, and Gabriel Scherer) @@ -53,12 +814,6 @@ OCaml 5.3.0 (8 January 2025) (KC Sivaramakrishnan, review by Guillaume Munch-Maccagnoni, Miod Vallat, Gabriel Scherer, David Allsopp, request by Zachary Yedidia). -- #11911, #12923: Multicore statistical memory profiling. - This restores a notable OCaml 4 feature that was missing - in OCaml 5. - (Nick Barnes, review by Stephen Dolan, Jacques-Henri Jourdan - and Guillaume Munch-Maccagnoni). - - #12579: OS-based Synchronisation for Stop-the-World Sections (B. Szilvasy, review by Miod Vallat, Nick Barnes, Olivier Nicole, Gabriel Scherer and Damien Doligez) @@ -148,8 +903,9 @@ OCaml 5.3.0 (8 January 2025) (Xavier Leroy, report by Jan Midtgaard, analysis by Stephen Dolan, review by Miod Vallat) -- #13407: Add Runtime_events.EV_EMPTY_MINOR - (Thomas Leonard) +- #13407: Add Runtime_events.EV_EMPTY_MINOR. + (Thomas Leonard, review by KC Sivaramakrishnan, Sadiq Jaffer and + Gabriel Scherer) - #13522: Confirm runtime events ring is still active after callback. (KC Sivaramakrishnan, review by Sadiq Jaffer and Miod Vallat) @@ -186,6 +942,11 @@ OCaml 5.3.0 (8 January 2025) ### Standard library: +- #12885: move Dynarray to an unboxed representation + (Gabriel Scherer, suggestions by Vincent Laviron, + review by Olivier Nicole and Simon Cruanes, Yann Leray, Alain Frisch) + + - #12884: Add `Queue.drop` (Léo Andrès, review by Nicolás Ojeda Bär and Gabriel Scherer) @@ -203,10 +964,6 @@ OCaml 5.3.0 (8 January 2025) (Kate Deplaix and Oscar Butler-Aldridge, review by Nicolás Ojeda Bär, Craig Ferguson and Gabriel Scherer) -- #12885: move Dynarray to an unboxed representation - (Gabriel Scherer, suggestions by Vincent Laviron, - review by Olivier Nicole and Simon Cruanes, Yann Leray, Alain Frisch) - - #13047: Add Sys.poll_actions to (only) run pending runtime actions. (Nick Barnes, review by Gabriel Scherer, Guillaume Munch-Maccagnoni, and Vincent Laviron) @@ -225,8 +982,8 @@ OCaml 5.3.0 (8 January 2025) - #13197: Dynarray.blit, which allows to extend the destination dynarray (0 <= dst_pos <= dst_length). - (Gabriel Scherer, report by Hazem Elmasry, - review by Olivier Nicole, Hazem Elmasry and Nicolás Ojeda Bär) + (Gabriel Scherer, report by Hazem ElMasry, + review by Olivier Nicole, Hazem ElMasry and Nicolás Ojeda Bär) * #13240: Add Uchar.seeded_hash, Change Uchar.hash implementation. Previously, Uchar.hash was aliased to Uchar.to_int. If you need that behavior, @@ -335,7 +1092,7 @@ OCaml 5.3.0 (8 January 2025) - #13469, #13474, #13535: Document that [Hashtbl.create n] creates a hash table with a default minimal size, even if [n] is very small or negative. - (Antonin Décimo, Nick Bares, report by Nikolaus Huber and Jan Midtgaard, + (Antonin Décimo, Nick Barnes, report by Nikolaus Huber and Jan Midtgaard, review by Florian Angeletti, Anil Madhavapeddy, Gabriel Scherer, and Miod Vallat) @@ -399,6 +1156,16 @@ OCaml 5.3.0 (8 January 2025) ### Internal/compiler-libs changes: +- #13286: Distinguish unique identifiers `Shape.Uid.t` according to their + provenance: either an implementation or an interface. + (Ulysse Gérard, review by Florian Angeletti and Leo White) + +- #13308: keep track of relations between declaration in the cmt files. This is + useful information for external tools for navigation and analysis purposis. + (Ulysse Gérard, Florian Angeletti, review by Florian Angeletti and Gabriel + Scherer) + + - #11129, #11148: enforce that ppxs do not produce `parsetree`s with an empty list of universally quantified type variables (`. int -> int` instead of `'a . int -> int'`) @@ -445,7 +1212,7 @@ OCaml 5.3.0 (8 January 2025) - #13067: rework volatile memory access rules under TSan to consider properly aligned smaller-than-register read operations as atomic, which gets rid of false positives on s390x - (Miod Vallat, review by Fabien Buoro) + (Miod Vallat, review by Fabrice Buoro) - #13162: Use quoted strings to clarify code being generated. (Antonin Décimo, review by Miod Vallat and Gabriel Scherer) @@ -467,18 +1234,9 @@ OCaml 5.3.0 (8 January 2025) (Oleg Kiselyov, Gabriel Scherer and Florian Angeletti, review by Jeremy Yallop) -- #13286: Distinguish unique identifiers `Shape.Uid.t` according to their - provenance: either an implementation or an interface. - (Ulysse Gérard, review by Florian Angeletti and Leo White) - - #13289: Use C99 for loop to reduce the scope of the for loop iterator. (Antonin Décimo, review by Miod Vallat and Gabriel Scherer) -- #13308: keep track of relations between declaration in the cmt files. This is - useful information for external tools for navigation and analysis purposis. - (Ulysse Gérard, Florian Angeletti, review by Florian Angeletti and Gabriel - Scherer) - - #13336: compiler-libs, split the `Printtyp` in three to only keep "user-friendly" functions in the `Printtyp` module. (Florian Angeletti, review by Gabriel Scherer) @@ -669,7 +1427,7 @@ OCaml 5.3.0 (8 January 2025) - #13495, #13514: Fix typechecker crash while typing objects (Jacques Garrigue, report by Nicolás Ojeda Bär, review by - Nicolas Ojeda Bär, Gabriel Scherer, Stephen Dolan, Florian Angeletti) + Nicolás Ojeda Bär, Gabriel Scherer, Stephen Dolan, Florian Angeletti) - #13391, #13551: fix a printing bug with `-dsource` when using raw literal inside a locally abstract type constraint @@ -908,8 +1666,7 @@ OCaml 5.2.0 (13 May 2024) - #12769: Unify MSVC and MinGW-w64 code paths, by always using WinAPI directly. - (David Allsopp, Antonin Décimo, and Samuel Hym, review by Nicolas - Ojeda Bar) + (David Allsopp, Antonin Décimo, and Samuel Hym, review by Nicolás Ojeda Bär) - #11911, #12382, #12383: Restore statmemprof functionality in part (backtrace buffers, per-thread and per-domain data structures, @@ -1035,7 +1792,7 @@ OCaml 5.2.0 (13 May 2024) * #12455: `Array.make_matrix dimx dimy f` now raises `Invalid_argument` when `dimx = 0 && dimy < 0` This was already specified but not enforced. - (Glen Mével, report by Jeremy Yallop, review by Nicolas Ojeda Bar) + (Glen Mével, report by Jeremy Yallop, review by Nicolás Ojeda Bär) - #12459: Add `Random.int_in_range`, `Random.int32_in_range`, `Random.int64_in_range`, `Random.nativeint_in_range`, @@ -1690,7 +2447,7 @@ OCaml 5.1.0 (14 September 2023) `Seq.find_mapi`, `Seq.find_index`, `Array.find_mapi`, `Array.find_index`, `Float.Array.find_opt`, `Float.Array.find_index`, `Float.Array.find_map`, `Float.Array.find_mapi`. - (Tima Kinsart, review by Daniel Bünzli and Nicolás Ojeda Bär) + (T. Kinsart, review by Daniel Bünzli and Nicolás Ojeda Bär) - #11410: Add Set.to_list, Map.to_list, Map.of_list, `Map.add_to_list: key -> 'a -> 'a list t -> 'a list t`. diff --git a/HACKING.adoc b/HACKING.adoc index 0107e9ce..ab0337c2 100644 --- a/HACKING.adoc +++ b/HACKING.adoc @@ -188,14 +188,14 @@ has excellent documentation. Makefile.common:: common Makefile definitions README.adoc:: general information on the compiler distribution README.win32.adoc:: general information on the Windows ports of OCaml - VERSION:: version string. Run `make configure` after changing. + VERSION:: version string. Run `tools/autogen` after changing. asmcomp/:: native-code compiler and linker boot/:: bootstrap compiler - build-aux/: autotools support scripts + build-aux/:: autotools support scripts bytecomp/:: bytecode compiler and linker compilerlibs/:: the OCaml compiler as a library configure:: configure script - configure.ac: autoconf input file + configure.ac:: autoconf input file debugger/:: source-level replay debugger driver/:: driver code for the compilers flexdll/:: git submodule -- see link:README.win32.adoc[] @@ -237,6 +237,16 @@ the original commit in the commit message. git cherry-pick -x -m 1 ---- +=== Code style + +Keep the style of the code you’re modifying. We don’t enforce the use of +automated formatters. For OCaml code, +https://github.com/OCamlPro/ocp-indent[ocp-indent] has been used. +We use https://editorconfig.org/[EditorConfig] for simple styling. Lots of +editors support EditorConfig +https://editorconfig.org/#pre-installed[out-of-the-box], or with +https://editorconfig.org/#download[plugins]. + [#opam-switch] === Testing with `opam` @@ -575,14 +585,41 @@ runs much faster than a full `./tools/check-typo`, typically instantly. You can also setup a git commit-hook to automatically run `check-typo` on the changes you commit, by copying the file -`tools/pre-commit-githook` to `.git/hooks/pre-commit`. If changes in a commit -alter the `configure` script, the hook also checks that committed `configure` -script is up-to-date. +`tools/pre-commit-githook` to `.git/hooks/pre-commit`. If changes in a +commit alter the `configure` script, the hook also checks that the +committed `configure` script is up-to-date. Some files need special rules to opt out of `check-typo` checks; this is specified in the `.gitattributes` file at the root of the repository, using `typo.foo` attributes. +===== Regenerating the `configure` script + +The `configure` script may be regenerated by running `tools/autogen`, +with GNU Autoconf installed. + +If you're using a version of GNU Autoconf that differs from our CI, +then the generated `configure` script might differ too. The latest +Ubuntu LTS packages may be used as a reasonable base to generate this +file. Using a Docker image with GNU Autoconf installed, and `git +rebase --exec`, one can properly regenerate the `configure` script for +each commit in a branch. + +[source,sh] +---- +docker build -t ocaml-make-configure:latest - <<'EOF' +# syntax=docker/dockerfile:1 +FROM ubuntu:latest +RUN rm -f /etc/apt/apt.conf.d/docker-clean; echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' > /etc/apt/apt.conf.d/keep-cache +RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ + --mount=type=cache,target=/var/lib/apt,sharing=locked \ + apt update && apt-get --no-install-recommends install -y autoconf make +WORKDIR /mnt +ENTRYPOINT ["tools/autogen"] +EOF +git rebase trunk --exec "docker run --rm -it -v $PWD:/mnt ocaml-make-configure:latest" +---- + ==== GitHub's Continuous Integration: GitHub Actions and AppVeyor The scripts that are run on GitHub Actions are described in @@ -630,6 +667,24 @@ the following environment variables, which should be set in link:appveyor.yml[]: - `CYGWIN_DIST`. Default: `64`. Either `64` or `32`, selects 32-bit or 64-bit Cygwin as the build environment. +==== GitHub Actions Continuous Integration (CI) + +We use GitHub Actions workflows to test the OCaml compiler and runtime +in various settings. Some tests are not run by default and are +triggered by setting a label on the pull request. See below: + +- `CI: Full matrix`: expands the test matrix considerably with additional + configurations; useful for PRs which affect the "systems" side of the + compiler; +- `CI: Skip testsuite`: turns the tesuite *off* for a PR, which can be useful + for PRs which do not affect the compiler _at all_ or while a specific failure + is being investigated; +- `run-crosscompiler-tests`: build various cross-compilers and test them; +- `run-thread-sanitizer`: build the distribution with the Thread + Sanitizer (TSAN), and run the whole testsuite instrumented with TSAN; +- `run-multicoretests`: run an extensive testsuite convering multicore + features. + ==== INRIA's Continuous Integration (CI) INRIA provides a Jenkins continuous integration service that OCaml diff --git a/INSTALL.adoc b/INSTALL.adoc index bf17760d..69435c8e 100644 --- a/INSTALL.adoc +++ b/INSTALL.adoc @@ -198,3 +198,59 @@ and sanity checks that could help you pinpoint the problem. requirements for mathematical accuracy, numerical precision, and proper handling of mathematical corner cases and error conditions may need to consider running their code on a platform with better C99 support. + +== (experimental) Building a cross compiler + +A cross compiler is a compiler that runs on some machine, named the _host_, but +generates code for a different machine, named the _target_. To build a cross +compiler you first need to have a non-cross compiler of the same version +installed in your `$PATH`. You can install that standard non-cross compiler by +any means, for instance using `opam` or compiling it manually from source. Note +though that the version of the non-cross compiler must match the version of the +cross compiler since the cross compiler will be compiled by the non-cross +compiler: the cross compiler will combine code compiled from source with the +non-cross runtime (the build of the cross compiler will build only the runtime +for the target machine). + +To start the build of the cross compiler, call `configure` with the `target` +triplet, possibly setting where the library will be installed on the target by +setting the `TARGET_LIBDIR` variable. For instance, with the GCC MinGW cross +compiler installed, one may use: + +.... +./configure --prefix=$PWD/cross --target=x86_64-w64-mingw32 TARGET_LIBDIR='C:\somedir' ... +make crossopt -j +make installcross +.... + +Notes: + +* It is advisable to choose a `prefix` that will not end up in installing the + cross compiler in your `$PATH`: `ocamlopt` should always invoke the standard + non-cross compiler, not the cross one. To call the cross compiler, you will + just use its full path or add temporarily its installation directory to your + `$PATH`. +* The cross compiler to Windows needs `flexdll` to link the binaries. A simple + way to get it is to use the `flexdll` submodule (`git submodule update --init` + if needed) and let the `crossopt` target bootstrap `flexdll`. + +=== Using the cross compiler + +If you have built a cross compiler to a Unix target, you can simply run as +usual: + +.... +cross/bin/ocamlopt.opt -o test test.ml +.... + +If you have built a Unix-to-Windows cross compiler, you must first make sure +that `ocamlopt` can find the `flexlink` executable in `$PATH` when it needs to +link. Boostrapping `flexdll` builds a `flexlink.exe` (note the `.exe`!), so you +can: + +.... +ln -s flexlink.exe cross/bin/flexlink +(export PATH="$PWD/cross/bin:$PATH"; ocamlopt.opt.exe -o test.exe test.ml) +.... + +or any other possibility to make sure `ocamlopt` can invoke `flexlink`. diff --git a/Makefile b/Makefile index f7fffdce..4ce5da65 100644 --- a/Makefile +++ b/Makefile @@ -119,6 +119,7 @@ typing_SOURCES = \ typing/outcometree.mli \ typing/shape.mli typing/shape.ml \ typing/types.mli typing/types.ml \ + typing/data_types.mli typing/data_types.ml \ typing/rawprinttyp.mli typing/rawprinttyp.ml \ typing/gprinttyp.mli typing/gprinttyp.ml \ typing/btype.mli typing/btype.ml \ @@ -644,9 +645,10 @@ flexlink.byte$(EXE): $(FLEXDLL_SOURCES) OCAMLOPT='$(value BOOT_OCAMLC) $(USE_RUNTIME_PRIMS) $(USE_STDLIB)' \ flexlink.exe support cp $(FLEXDLL_SOURCE_DIR)/flexlink.exe $@ + cp $(addprefix $(FLEXDLL_SOURCE_DIR)/, $(FLEXDLL_OBJECTS)) $(ROOTDIR) partialclean:: - rm -f flexlink.byte flexlink.byte.exe + rm -f flexlink.byte flexlink.byte.exe flexdll_*.o flexdll_*.obj $(BYTE_BINDIR)/flexlink$(EXE): \ boot/ocamlrun$(EXE) flexlink.byte$(EXE) | $(BYTE_BINDIR) @@ -654,7 +656,6 @@ $(BYTE_BINDIR)/flexlink$(EXE): \ # Start with a copy to ensure that the result is always executable cp boot/ocamlrun$(EXE) $@ cat flexlink.byte$(EXE) >> $@ - cp $(addprefix $(FLEXDLL_SOURCE_DIR)/, $(FLEXDLL_OBJECTS)) $(BYTE_BINDIR) partialclean:: rm -f $(BYTE_BINDIR)/flexlink $(BYTE_BINDIR)/flexlink.exe @@ -672,8 +673,9 @@ ifeq "$(BOOTSTRAPPING_FLEXDLL)" "true" # The recipe for runtime/ocamlruns$(EXE) also produces runtime/primitives boot/ocamlrun$(EXE): runtime/ocamlruns$(EXE) -$(foreach runtime, ocamlrun ocamlrund ocamlruni, \ - $(eval runtime/$(runtime)$(EXE): | $(BYTE_BINDIR)/flexlink$(EXE))) +$(foreach runtime, ocamlrun$(EXE) ocamlrund$(EXE) ocamlruni$(EXE) \ + libcamlrun_shared$(EXT_DLL) libasmrun_shared$(EXT_DLL), \ + $(eval runtime/$(runtime): | $(BYTE_BINDIR)/flexlink$(EXE))) tools/checkstack$(EXE): | $(BYTE_BINDIR)/flexlink$(EXE) else @@ -715,9 +717,9 @@ compare: # The core system has to be rebuilt after bootstrap anyway, so strip ocamlc # and ocamllex, which means the artefacts should be identical. mv ocamlc$(EXE) ocamlc.tmp - $(OCAMLRUN) tools/stripdebug -all ocamlc.tmp ocamlc$(EXE) + $(OCAMLRUN) tools/stripdebug$(EXE) -all ocamlc.tmp ocamlc$(EXE) mv lex/ocamllex$(EXE) ocamllex.tmp - $(OCAMLRUN) tools/stripdebug -all ocamllex.tmp lex/ocamllex$(EXE) + $(OCAMLRUN) tools/stripdebug$(EXE) -all ocamllex.tmp lex/ocamllex$(EXE) rm -f ocamllex.tmp ocamlc.tmp @if $(CMPCMD) boot/ocamlc ocamlc$(EXE) \ && $(CMPCMD) boot/ocamllex lex/ocamllex$(EXE); \ @@ -745,7 +747,7 @@ promote-cross: promote-common # Promote the newly compiled system to the rank of bootstrap compiler # (Runs on the new runtime, produces code for the new runtime) .PHONY: promote -promote: PROMOTE = $(OCAMLRUN) tools/stripdebug -all +promote: PROMOTE = $(OCAMLRUN) tools/stripdebug$(EXE) -all promote: promote-common rm -f boot/ocamlrun$(EXE) cp runtime/ocamlrun$(EXE) boot/ocamlrun$(EXE) @@ -884,7 +886,6 @@ flexlink.opt$(EXE): \ cp $(FLEXDLL_SOURCE_DIR)/flexlink.exe $@ rm -f $(OPT_BINDIR)/flexlink$(EXE) cd $(OPT_BINDIR); $(LN) $(call ROOT_FROM, $(OPT_BINDIR))/$@ flexlink$(EXE) - cp $(addprefix $(BYTE_BINDIR)/, $(FLEXDLL_OBJECTS)) $(OPT_BINDIR) else @@ -1372,7 +1373,7 @@ runtime/caml/opnames.h : runtime/caml/instruct.h $(V_GEN)tr -d '\r' < $< | \ sed -e '/\/\*/d' \ -e '/^#/d' \ - -e 's/enum /static char * names_of_/' \ + -e 's/enum /static char const * const names_of_/' \ -e 's/{$$/[] = {/' \ -e 's/\([[:upper:]][[:upper:]_0-9]*\)/"\1"/g' > $@ @@ -1383,24 +1384,18 @@ runtime/caml/jumptbl.h : runtime/caml/instruct.h sed -n -e '/^ /s/ \([A-Z]\)/ \&\&lbl_\1/gp' \ -e '/^}/q' > $@ -# These are provided as a temporary shim to allow cross-compilation systems -# to supply a host C compiler and different flags and a linking macro. -SAK_CC ?= $(CC) -SAK_CFLAGS ?= $(OC_CFLAGS) $(CFLAGS) $(OC_CPPFLAGS) $(CPPFLAGS) -SAK_LINK ?= $(MKEXE_VIA_CC) +$(SAK): runtime/sak.c runtime/caml/misc.h runtime/caml/config.h + $(V_MKEXE)$(call SAK_BUILD,$@,$<) -$(SAK): runtime/sak.$(O) - $(V_MKEXE)$(call SAK_LINK,$@,$^) - -runtime/sak.$(O): runtime/sak.c runtime/caml/misc.h runtime/caml/config.h - $(V_CC)$(SAK_CC) $(SAK_CFLAGS) $(OUTPUTOBJ)$@ -c $< - -C_LITERAL = $(shell $(SAK) encode-C-literal '$(1)') +C_LITERAL = $(shell $(SAK) $(ENCODE_C_LITERAL) '$(1)') runtime/build_config.h: $(ROOTDIR)/Makefile.config $(SAK) - $(V_GEN)echo '/* This file is generated from $(ROOTDIR)/Makefile.config */' > $@ && \ - echo '#define OCAML_STDLIB_DIR $(call C_LITERAL,$(LIBDIR))' >> $@ && \ - echo '#define HOST "$(HOST)"' >> $@ + $(V_GEN){ \ + echo '/* This file is generated from $(ROOTDIR)/Makefile.config */'; \ + printf '#define OCAML_STDLIB_DIR %s\n' \ + '$(call C_LITERAL,$(TARGET_LIBDIR))'; \ + echo '#define HOST "$(HOST)"'; \ + } > $@ ## Runtime libraries and programs @@ -1922,7 +1917,10 @@ ocamltest_ocaml_PLUGIN = \ ocaml_compilers.mli ocaml_compilers.ml \ ocaml_toplevels.mli ocaml_toplevels.ml \ ocaml_actions.mli ocaml_actions.ml \ - ocaml_tests.mli ocaml_tests.ml + ocaml_tests.mli ocaml_tests.ml \ + debugger_flags.mli debugger_flags.ml \ + debugger_variables.mli debugger_variables.ml \ + debugger_actions.mli debugger_actions.ml \ ocamltest_SOURCES = $(addprefix ocamltest/, \ $(ocamltest_CORE) $(ocamltest_ocaml_PLUGIN) \ @@ -2049,6 +2047,8 @@ manpages: $(MAKE) -C api_docgen man partialclean:: + rm -f ocamldoc/ocamldoc ocamldoc/ocamldoc.exe + rm -f ocamldoc/ocamldoc.opt ocamldoc/ocamldoc.opt.exe rm -f ocamldoc/\#*\# rm -f ocamldoc/*.cm[aiotx] ocamldoc/*.cmxa ocamldoc/*.cmti \ ocamldoc/*.a ocamldoc/*.lib ocamldoc/*.o ocamldoc/*.obj @@ -2802,8 +2802,7 @@ ifeq "$(INSTALL_BYTECODE_PROGRAMS)" "true" flexlink.byte$(EXE) "$(INSTALL_BINDIR)" endif # ifeq "$(INSTALL_BYTECODE_PROGRAMS)" "true" $(MKDIR) "$(INSTALL_FLEXDLLDIR)" - $(INSTALL_DATA) $(addprefix $(BYTE_BINDIR)/, $(FLEXDLL_OBJECTS)) \ - "$(INSTALL_FLEXDLLDIR)" + $(INSTALL_DATA) $(FLEXDLL_OBJECTS) "$(INSTALL_FLEXDLLDIR)" endif # ifeq "$(BOOTSTRAPPING_FLEXDLL)" "true" $(INSTALL_DATA) Makefile.config "$(INSTALL_LIBDIR)" $(INSTALL_DATA) $(DOC_FILES) "$(INSTALL_DOCDIR)" @@ -2968,6 +2967,11 @@ endif include .depend +# Include the cross-compiler recipes only when relevant +ifneq "$(HOST)" "$(TARGET)" +include Makefile.cross +endif + Makefile.config Makefile.build_config: config.status config.status: @echo "Please refer to the installation instructions:" diff --git a/Makefile.build_config.in b/Makefile.build_config.in index ae649dce..3d48c38c 100644 --- a/Makefile.build_config.in +++ b/Makefile.build_config.in @@ -99,6 +99,14 @@ OC_DLL_LDFLAGS=@oc_dll_ldflags@ MKEXE_VIA_CC=$(CC) @mkexe_via_cc_ldflags@ @mkexe_via_cc_extra_cmd@ +# How to build sak +SAK_BUILD=@SAK_BUILD@ +# How to invoke sak +SAK=@SAK@ + +# sak command to encode C literals +ENCODE_C_LITERAL=@encode_C_literal@ + # Which tool to use to display differences between files DIFF=@DIFF@ # Which flags to pass to the diff tool @@ -128,6 +136,9 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ datarootdir = @datarootdir@ DOCDIR=@docdir@ +### Where to look for the standard library on target +TARGET_LIBDIR=@TARGET_LIBDIR@ + unix_directory = @unix_directory@ unix_library = @unix_library@ @@ -166,6 +177,8 @@ OC_NATIVE_COMPFLAGS = @oc_native_compflags@ OC_NATIVE_LINKFLAGS = -g +BUILD_TRIPLET = @build@ + # Platform-dependent command to create symbolic links LN = @ln@ diff --git a/Makefile.common b/Makefile.common index 1e6a7eff..2680f5d3 100644 --- a/Makefile.common +++ b/Makefile.common @@ -141,9 +141,29 @@ ifeq "$(BOOTSTRAPPING_FLEXDLL)" "true" ifeq "$(filter $(REAL_ROOT_DIR)/$(BYTE_BINDIR), $(subst :, ,$(PATH)))" "" export PATH := \ $(REAL_ROOT_DIR)/$(OPT_BINDIR):$(REAL_ROOT_DIR)/$(BYTE_BINDIR):$(PATH) + # $(BUILD_COMPANY_SYSTEM) is the last two parts of $(BUILD_TRIPLET) + BUILD_TRIPLET_FIELDS := $(subst -,$(SPACE),$(BUILD_TRIPLET)) + BUILD_COMPANY_SYSTEM := $(subst $(SPACE),-,$\ + $(wordlist 2, $(words $(BUILD_TRIPLET_FIELDS)), $(BUILD_TRIPLET_FIELDS))) + # Use the FLEXDIR environment variable to tell flexlink where the support + # objects are located. Passing this location using -I would defeat the whole + # purpose of the PATH-trick (bootstrapped flexlink is indistinguishable from + # an installed flexlink). flexlink also looks for the objects in the same + # directory as the executable, but this is slightly irritating as it requires + # copying them to both byte/bin/ and opt/bin/ but also doesn't work if + # opt/bin/flexlink.exe is a symlink to flexlink.opt.exe, as flexlink can end + # up looking in the directory for the target of the symlink, rather than the + # symlink itself. +ifeq "" "$(filter pc-msys pc-cygwin%, $(BUILD_COMPANY_SYSTEM))" + export FLEXDIR := $(REAL_ROOT_DIR) +else + export FLEXDIR := $(shell cygpath -w "$(REAL_ROOT_DIR)") endif - undefine REAL_ROOT_DIR + undefine BUILD_TRIPLET_FIELDS + undefine BUILD_COMPANY_SYSTEM endif + undefine REAL_ROOT_DIR +endif # ifeq "$(BOOTSTRAPPING_FLEXDLL)" "true" # List of other libraries ALL_OTHERLIBS = dynlink str systhreads unix runtime_events @@ -223,8 +243,6 @@ OCAMLYACCFLAGS ?= --strict -v %.ml %.mli: %.mly $(V_OCAMLYACC)$(OCAMLYACC) $(OCAMLYACCFLAGS) $< -SAK = $(ROOTDIR)/runtime/sak$(EXE) - # Used with the Microsoft toolchain to merge generated manifest files into # executables if_file_exists = ( test ! -f $(1) || $(2) && rm -f $(1) ) @@ -455,7 +473,7 @@ endef # OCAML_LIBRARY # Installing a bytecode executable, with debug information removed define INSTALL_STRIPPED_BYTE_PROG -$(OCAMLRUN) $(ROOTDIR)/tools/stripdebug $(1) $(1).tmp \ +$(OCAMLRUN) $(ROOTDIR)/tools/stripdebug$(EXE) $(1) $(1).tmp \ && $(INSTALL_PROG) $(1).tmp $(2) \ && rm $(1).tmp endef # INSTALL_STRIPPED_BYTE_PROG @@ -467,3 +485,12 @@ endef # INSTALL_STRIPPED_BYTE_PROG # boot/ as part of coldstart. See read_runtime_launch_info in # bytecomp/bytelink.ml for further details. HEADER_NAME = runtime-launch-info + +ifeq "$(UNIX_OR_WIN32)" "win32" +# Ensure that no command can create Cygwin symbolic links by ensuring that +# symlink(2) will fail if native NTFS symlinks aren't available. +export CYGWIN := $(strip \ + $(filter-out winsymlinks winsymlinks:%, $(CYGWIN)) winsymlinks:nativestrict) +export MSYS := $(strip \ + $(filter-out winsymlinks winsymlinks:%, $(MSYS)) winsymlinks:nativestrict) +endif diff --git a/Makefile.config.in b/Makefile.config.in index e432851c..f6473a49 100644 --- a/Makefile.config.in +++ b/Makefile.config.in @@ -46,7 +46,7 @@ BINDIR=@bindir@ datarootdir=@datarootdir@ -### Where to install the standard library +### Where to install the standard library on host LIBDIR=@libdir@ ### Where to install the stub code for the standard library @@ -166,7 +166,7 @@ BYTECODE_CFLAGS=@bytecode_cflags@ BYTECODE_CPPFLAGS=@bytecode_cppflags@ ZSTD_LIBS=@zstd_libs@ BYTECCLIBS=@zstd_libs@ @cclibs@ -EXE=@exeext@ +EXE=@EXEEXT@ OUTPUTEXE=@outputexe@$(EMPTY) SUPPORTS_SHARED_LIBRARIES=@supports_shared_libraries@ MKSHAREDLIBRPATH=@mksharedlibrpath@ @@ -186,7 +186,7 @@ NATIVECCLIBS=@cclibs@ SYSTHREAD_SUPPORT=@systhread_support@ STRIP=@STRIP@ PACKLD=@PACKLD@$(EMPTY) -CCOMPTYPE=@ccomptype@ +CCOMPTYPE=@ccomp_type@ TOOLCHAIN=@toolchain@ CMXS=@cmxs@ @@ -210,6 +210,7 @@ HOST=@host@ FLAMBDA=@flambda@ WITH_FLAMBDA_INVARIANTS=@flambda_invariants@ WITH_CMM_INVARIANTS=@cmm_invariants@ +WITH_CODEGEN_INVARIANTS=@codegen_invariants@ FORCE_SAFE_STRING=true DEFAULT_SAFE_STRING=true WINDOWS_UNICODE=@windows_unicode@ diff --git a/Makefile.cross b/Makefile.cross new file mode 100644 index 00000000..b0a21c3d --- /dev/null +++ b/Makefile.cross @@ -0,0 +1,115 @@ +#************************************************************************** +#* * +#* OCaml * +#* * +#* Samuel Hym, Tarides * +#* * +#* Copyright 2024 Tarides * +#* * +#* All rights reserved. This file is distributed under the terms of * +#* the GNU Lesser General Public License version 2.1, with the * +#* special exception on linking described in the file LICENSE. * +#* * +#************************************************************************** + +# Recipes to build a cross compiler (_not_ cross-compiling the compiler), aka +# generating code that will run on `target`, assuming that a non-cross OCaml +# compiler (so targetting our build machine) of the same version is available in +# $PATH + +# As the cross compiler will be linked with the _build_ version of +# libcomprmarsh, we cannot rely on the detection of zstd done during `configure` +# (as it would have detected the _target_ version). So we recover the flags to +# link with zstd of the non-cross compiler. +# Note that the shell call is a variable that is used only once, so it doesn't +# have to be lazier. +HOST_ZSTD_LIBS=ZSTD_LIBS=$(shell ocamlopt -config-var compression_c_libraries) + +# The build system adds various include directories which pertain to the current +# tree, including -I runtime, which is necessary for -custom executables. +# ocamltest is always a -custom executable, but some others (ocamldoc; the +# debugger, etc.) are only -custom in specific circumstances. It is therefore +# fiddly to change this in the main build system, so we perform a slightly +# different trick by ensuring that "+" is the first entry in VPATH. This will +# put the host compiler's standard library (and consequently its runtime +# objects) well above the .a files found with -I runtime. For now, this seems +# the least nefarious way of ensuring that the bytecode compiler has the C +# headers in runtime/caml available without breaking builds with an external +# ocamlopt. +VPATH := + $(VPATH) + +CROSS_OVERRIDES=OCAMLRUN=ocamlrun NEW_OCAMLRUN=ocamlrun \ + BOOT_OCAMLLEX=ocamllex OCAMLYACC=ocamlyacc +CROSS_COMPILER_OVERRIDES=$(CROSS_OVERRIDES) CAMLC=ocamlc CAMLOPT=ocamlopt \ + BEST_OCAMLC=ocamlc BEST_OCAMLOPT=ocamlopt BEST_OCAMLLEX=ocamllex +CROSS_COMPILERLIBS_OVERRIDES=$(CROSS_OVERRIDES) CAMLC=ocamlc \ + CAMLOPT="$(ROOTDIR)/ocamlopt.opt$(EXE) $(STDLIBFLAGS)" + +ifeq "$(BOOTSTRAPPING_FLEXDLL)" "true" +# Declare flexlink to be an 'old' file, so that make doesn't try to rebuild it +# with the build rules in `Makefile`; its build is driven by the `cross-flexdll` +# recipe provided here instead +OLDS := -o $(BYTE_BINDIR)/flexlink$(EXE) +else +OLDS := +endif + +# The compiler libs that should be rebuilt for target (they are first built for +# host as part of the .opt compilers) +CROSSCOMPILERLIBS := $(addprefix compilerlibs/,$(addsuffix .cmxa,\ + ocamlcommon ocamlmiddleend ocamlbytecomp ocamloptcomp ocamltoplevel)) + +.PHONY: crossopt +ifeq "$(BOOTSTRAPPING_FLEXDLL)" "true" +crossopt: cross-flexdll + $(MAKE) runtime-all $(OLDS) +else +# In that case, $(OLDS) is empty, we can depend directly on runtime-all +crossopt: runtime-all +endif + $(MAKE) ocamlc $(TOOLS_BYTECODE_TARGETS) expunge$(EXE) \ + $(CROSS_COMPILER_OVERRIDES) $(OLDS) + $(MAKE) library $(CROSS_OVERRIDES) $(OLDS) + $(MAKE) ocamlyacc $(CROSS_OVERRIDES) $(OLDS) + $(MAKE) ocamllex $(CROSS_COMPILER_OVERRIDES) $(OLDS) + $(MAKE) ocaml $(CROSS_COMPILER_OVERRIDES) $(OLDS) + $(MAKE) dynlink-all $(CROSS_OVERRIDES) $(OLDS) + $(MAKE) -C otherlibs all $(CROSS_OVERRIDES) $(OLDS) + $(MAKE) runtimeopt $(OLDS) + $(MAKE) ocamlc.opt ocamlopt.opt $(TOOLS_NATIVE_TARGETS) \ + $(CROSS_COMPILER_OVERRIDES) "$(HOST_ZSTD_LIBS)" $(OLDS) + $(MAKE) libraryopt $(CROSS_OVERRIDES) $(OLDS) + $(MAKE) otherlibrariesopt ocamltoolsopt $(CROSS_OVERRIDES) $(OLDS) + $(MAKE) tools-allopt.opt $(CROSS_COMPILER_OVERRIDES) $(OLDS) + # We now build the compiler libs again, but for target this time + rm -f $(ocamlcommon_NCOBJS) $(ocamlmiddleend_NCOBJS) \ + $(ocamlbytecomp_NCOBJS) $(ocamloptcomp_NCOBJS) \ + $(ocamltoplevel_NCOBJS) $(CROSSCOMPILERLIBS) + $(MAKE) $(CROSSCOMPILERLIBS) $(CROSS_COMPILERLIBS_OVERRIDES) $(OLDS) + +.PHONY: cross-flexdll +cross-flexdll: | $(BYTE_BINDIR) $(OPT_BINDIR) + rm -f $(FLEXDLL_SOURCE_DIR)/flexlink.exe + $(MAKE) -C $(FLEXDLL_SOURCE_DIR) $(FLEXLINK_BUILD_ENV) \ + NATDYNLINK=false LINKFLAGS= flexlink.exe support + $(LN) $(FLEXDLL_SOURCE_DIR)/flexlink.exe flexlink.opt.exe + $(LN) flexlink.opt.exe flexlink.byte.exe + cp flexlink.byte.exe $(BYTE_BINDIR)/flexlink + cd $(BYTE_BINDIR) && $(LN) flexlink flexlink.exe + cp $(addprefix $(FLEXDLL_SOURCE_DIR)/, $(FLEXDLL_OBJECTS)) $(ROOTDIR) + cp flexlink.opt.exe $(OPT_BINDIR)/flexlink + cd $(OPT_BINDIR) && $(LN) flexlink flexlink.exe + +INSTALL_OVERRIDES=build_ocamldoc=false WITH_DEBUGGER= OCAMLRUN=ocamlrun + +.PHONY: installcross +installcross: + # Create dummy files to keep `install` happy + touch \ + $(addprefix toplevel/, \ + $(foreach ext,cmi cmt cmti cmx, native/nat__dummy__.$(ext)) \ + all__dummy__.cmx topstart.o native/tophooks.cmi) + $(LN) `command -v ocamllex` lex/ocamllex.opt$(EXE) + $(LN) `command -v ocamlyacc` yacc/ocamlyacc.opt$(EXE) + # Real installation + $(MAKE) install $(INSTALL_OVERRIDES) diff --git a/Makefile.dev b/Makefile.dev index 1e1eab9a..6c7734b5 100644 --- a/Makefile.dev +++ b/Makefile.dev @@ -21,6 +21,14 @@ SOURCE_FILES=$(shell git ls-files '*.ml' '*.mli' | grep -v boot/menhir/parser) AST_FILES=$(addsuffix .ast,$(SOURCE_FILES)) +# Note: some shells do not support command-lines that contain the full +# list of source files ("too many argument"). We ensure that +# AST_FILES is only passed inside a shell command in explicit targets +# from this Makefile, and not in targets common to other makefiles +# that would be executed unconditionally. We previously had +# a `partialclean::` target performing `clean-all-asts` and that +# resulted in annoying failures for some users, see #13817. + build-all-asts: # Recursive invocation ensures that `git ls-files` is not executed on every # invocation of make @@ -44,5 +52,6 @@ CAMLC_DPARSETREE := \ list-all-asts: @for f in $(AST_FILES); do echo "'$$f'"; done -partialclean:: +.PHONY: clean-all-asts +clean-all-asts: @rm -f $(AST_FILES) diff --git a/README.adoc b/README.adoc index 7e622fcd..d97e2cfe 100644 --- a/README.adoc +++ b/README.adoc @@ -12,7 +12,7 @@ performance degradations on our issue tracker. ==== |===== -| Branch `trunk` | Branch `5.2` | Branch `5.1` | Branch `5.0` | Branch `4.14` +| Branch `trunk` | Branch `5.3` | Branch `5.2` | Branch `5.1` | Branch `4.14` | image:https://github.com/ocaml/ocaml/workflows/Build/badge.svg?branch=trunk["Github CI Build Status (trunk branch)", link="https://github.com/ocaml/ocaml/actions?query=workflow%3ABuild"] @@ -20,6 +20,10 @@ performance degradations on our issue tracker. link="https://github.com/ocaml/ocaml/actions?query=workflow%3AHygiene"] image:https://ci.appveyor.com/api/projects/status/github/ocaml/ocaml?branch=trunk&svg=true["AppVeyor Build Status (trunk branch)", link="https://ci.appveyor.com/project/avsm/ocaml"] +| image:https://github.com/ocaml/ocaml/workflows/Build/badge.svg?branch=5.3["Github CI Build Status (5.3 branch)", + link="https://github.com/ocaml/ocaml/actions?query=workflow%3ABuild"] + image:https://ci.appveyor.com/api/projects/status/github/ocaml/ocaml?branch=5.3&svg=true["AppVeyor Build Status (5.3 branch)", + link="https://ci.appveyor.com/project/avsm/ocaml"] | image:https://github.com/ocaml/ocaml/workflows/Build/badge.svg?branch=5.2["Github CI Build Status (5.2 branch)", link="https://github.com/ocaml/ocaml/actions?query=workflow%3ABuild"] image:https://ci.appveyor.com/api/projects/status/github/ocaml/ocaml?branch=5.2&svg=true["AppVeyor Build Status (5.2 branch)", @@ -28,10 +32,6 @@ performance degradations on our issue tracker. link="https://github.com/ocaml/ocaml/actions?query=workflow%3ABuild"] image:https://ci.appveyor.com/api/projects/status/github/ocaml/ocaml?branch=5.1&svg=true["AppVeyor Build Status (5.1 branch)", link="https://ci.appveyor.com/project/avsm/ocaml"] -| image:https://github.com/ocaml/ocaml/workflows/Build/badge.svg?branch=5.0["Github CI Build Status (5.0 branch)", - link="https://github.com/ocaml/ocaml/actions?query=workflow%3ABuild"] - image:https://ci.appveyor.com/api/projects/status/github/ocaml/ocaml?branch=5.0&svg=true["AppVeyor Build Status (5.0 branch)", - link="https://ci.appveyor.com/project/avsm/ocaml"] | image:https://github.com/ocaml/ocaml/workflows/Build/badge.svg?branch=4.14["Github CI Build Status (4.14 branch)", link="https://github.com/ocaml/ocaml/actions?query=workflow%3ABuild"] image:https://ci.appveyor.com/api/projects/status/github/ocaml/ocaml?branch=4.14&svg=true["AppVeyor Build Status (4.14 branch)", diff --git a/VERSION b/VERSION index ba316f95..71fa3dd8 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ -5.3.0 +5.4.0 # Starting with OCaml 4.14, although the version string that appears above is # still correct and this file can thus still be used to figure it out, diff --git a/aclocal.m4 b/aclocal.m4 index 7353e09a..3d9cd79b 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -30,6 +30,7 @@ m4_include([build-aux/lt~obsolete.m4]) # Macros from the autoconf macro archive m4_include([build-aux/ax_check_compile_flag.m4]) m4_include([build-aux/ax_func_which_gethostbyname_r.m4]) +m4_include([build-aux/ax_prog_cc_for_build.m4]) m4_include([build-aux/ax_pthread.m4]) # OCaml version @@ -94,11 +95,12 @@ AC_DEFUN([OCAML_SIGNAL_HANDLERS_SEMANTICS], [ ) ]) +dnl $1: extra CFLAGS AC_DEFUN([OCAML_CC_SUPPORTS_TREE_VECTORIZE], [ AC_MSG_CHECKING( [whether the C compiler supports __attribute__((optimize("tree-vectorize")))]) saved_CFLAGS="$CFLAGS" - CFLAGS="-Werror $CFLAGS" + CFLAGS="$1 $CFLAGS" AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[__attribute__((optimize("tree-vectorize"))) void f(void) {}]], @@ -306,7 +308,7 @@ AC_DEFUN([OCAML_TEST_FLEXLINK], [ # flexlink can cope. The reverse test is unnecessary (a Cygwin-compiled # flexlink can read anything). mv conftest.$ac_objext conftest1.$ac_objext - AS_CASE([$4],[*-pc-cygwin], + AS_CASE([$4],[*-*-cygwin], [ln -s conftest1.$ac_objext conftest2.$ac_objext], [cp conftest1.$ac_objext conftest2.$ac_objext]) @@ -369,27 +371,27 @@ AC_DEFUN([OCAML_TEST_WINPTHREADS_PTHREAD_H], [ OCAML_CC_RESTORE_VARIABLES ]) -AC_DEFUN([OCAML_HOST_IS_EXECUTABLE], [ - AC_MSG_CHECKING([whether host executables can be run in the build]) +AC_DEFUN([OCAML_TARGET_IS_EXECUTABLE], [ + AC_MSG_CHECKING([whether target executables can be run in the build]) old_cross_compiling="$cross_compiling" cross_compiling='no' AC_RUN_IFELSE( [AC_LANG_PROGRAM], [AC_MSG_RESULT([yes]) - host_runnable=true], + target_runnable=true], [AC_MSG_RESULT([no]) - host_runnable=false], + target_runnable=false], # autoconf displays a warning if this parameter is missing, but # cross-compilation mode was disabled above. [assert=false]) cross_compiling="$old_cross_compiling" ]) -# This is AC_RUN_IFELSE but taking $host_runnable into account (i.e. if the +# This is AC_RUN_IFELSE but taking $target_runnable into account (i.e. if the # program can be run, then it is run) AC_DEFUN([OCAML_RUN_IFELSE], [ old_cross_compiling="$cross_compiling" - AS_IF([test "x$host_runnable" = 'xtrue'], [cross_compiling='no']) + AS_IF([test "x$target_runnable" = 'xtrue'], [cross_compiling='no']) AC_RUN_IFELSE([$1],[$2],[$3],[$4]) cross_compiling="$old_cross_compiling" ]) @@ -457,7 +459,7 @@ AC_DEFUN([OCAML_C99_CHECK_FMA], [ AS_CASE([$enable_imprecise_c99_float_ops,$target], [no,*], [hard_error=true], [yes,*], [hard_error=false], - [*,x86_64-w64-mingw32*|*,x86_64-*-cygwin*], [hard_error=false], + [*,x86_64-w64-mingw32*|*,x86_64-*-cygwin], [hard_error=false], [hard_error=true]) AS_IF([test x"$hard_error" = "xtrue"], [AC_MSG_ERROR(m4_normalize([ @@ -466,7 +468,7 @@ AC_DEFUN([OCAML_C99_CHECK_FMA], [ [AC_MSG_WARN(m4_normalize([ fma does not work; emulation enabled]))])], [AS_CASE([$target], - [x86_64-w64-mingw32*|x86_64-*-cygwin*], + [x86_64-w64-mingw32*|x86_64-*-cygwin], [AC_MSG_RESULT([cross-compiling; assume not])], [AC_MSG_RESULT([cross-compiling; assume yes]) AC_DEFINE([HAS_WORKING_FMA], [1])])]) @@ -525,6 +527,78 @@ AC_DEFUN([OCAML_CC_SUPPORTS_ATOMIC], [ OCAML_CC_RESTORE_VARIABLES ]) +# Detects whether the C compiler generates an explicit .note.GNU-stack section +# to mark the stack as non-executable, so that we can follow suit +AC_DEFUN([OCAML_WITH_NONEXECSTACK_NOTE], + [AC_REQUIRE([AC_PROG_FGREP])dnl + AC_CACHE_CHECK([if $CC generates a .note.GNU-stack section], + [ocaml_cv_prog_cc_nonexecstack_note], + [OCAML_CC_SAVE_VARIABLES + + # We write the assembly into the .$ac_objext file as AC_COMPILE_IFELSE + # assumes an error if such a file doesn't exist after compiling + CFLAGS="$CFLAGS -S -o conftest.$ac_objext" + + ocaml_cv_prog_cc_nonexecstack_note=no + AC_COMPILE_IFELSE([AC_LANG_SOURCE], + [AS_IF([$FGREP .note.GNU-stack conftest.$ac_objext >/dev/null], + [ocaml_cv_prog_cc_nonexecstack_note=yes])]) + OCAML_CC_RESTORE_VARIABLES]) + + AS_IF([test "x$ocaml_cv_prog_cc_nonexecstack_note" = xyes], + [with_nonexecstack_note=true + AC_DEFINE([WITH_NONEXECSTACK_NOTE], [1])], + [with_nonexecstack_note=false]) +]) + +AC_DEFUN([OCAML_ASM_SIZE_TYPE_DIRECTIVES], + [AC_REQUIRE([AC_PROG_GREP])dnl + AC_CACHE_CHECK([if $CC generates .size and .type asm directives], + [ocaml_cv_prog_cc_asm_size_type_directives], + [OCAML_CC_SAVE_VARIABLES + + # We write the assembly into the .$ac_objext file as AC_COMPILE_IFELSE + # assumes an error if such a file doesn't exist after compiling + CFLAGS="$CFLAGS -S -o conftest.$ac_objext" + + ocaml_cv_prog_cc_asm_size_type_directives=no + AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ +int feat_detect_obj; +int feat_detect_func(void) { + return 42; +} + ]])], + [asm_type_obj_directive=no + asm_type_func_directive=no + asm_size_func_directive=no + # We do not look for a .size directive for the object as it is not + # generated in that simple case for instance by the compiler + # powerpc64le-linux-gnu-gcc 14.2 which emits instead an .lcomm directive + AS_IF([$GREP '\.type.*feat_detect_obj' conftest.$ac_objext >/dev/null], + [asm_type_obj_directive=yes]) + AS_IF([$GREP '\.type.*feat_detect_func' conftest.$ac_objext >/dev/null], + [asm_type_func_directive=yes]) + AS_IF([$GREP '\.size.*feat_detect_func' conftest.$ac_objext >/dev/null], + [asm_size_func_directive=yes]) + AS_CASE([m4_join([,],[$asm_type_obj_directive],[$asm_type_func_directive], + [$asm_size_func_directive])], + [yes,yes,yes], + [ocaml_cv_prog_cc_asm_size_type_directives=yes], + [no,no,no], + [ocaml_cv_prog_cc_asm_size_type_directives=no], + [ocaml_cv_prog_cc_asm_size_type_directives=unconclusive])]) + OCAML_CC_RESTORE_VARIABLES]) + + AS_CASE([$ocaml_cv_prog_cc_asm_size_type_directives], + [yes], + [asm_size_type_directives=true + AC_DEFINE([ASM_SIZE_TYPE_DIRECTIVES], [1])], + [no], + [asm_size_type_directives=false], + [AC_MSG_WARN([found inconsistent results for .size and .type directives]) + asm_size_type_directives=false]) +]) + AC_DEFUN([OCAML_CC_SUPPORTS_LABELS_AS_VALUES], [ AC_CACHE_CHECK([whether $CC supports the labels as values extension], [ocaml_cv_prog_cc_labels_as_values], @@ -543,3 +617,27 @@ AC_DEFUN([OCAML_CC_SUPPORTS_LABELS_AS_VALUES], [ [Define if the C compiler supports the labels as values extension.]) fi ]) + +AC_DEFUN([OCAML_CHECK_LN_ON_WINDOWS], [ + AC_MSG_CHECKING([for a workable solution for ln -sf]) + AS_IF([m4_normalize(MSYS=winsymlinks:nativestrict + CYGWIN=winsymlinks:nativestrict + ln -sf configure conftestLink 2>/dev/null)], + [ln='ln -sf'], + [ln='cp -pf'] + ) + AC_MSG_RESULT([$ln]) +]) + +AC_DEFUN([OCAML_CHECK_WINDOWS_TRIPLET], [ + AS_CASE([$1], + [i686-*-cygwin|x86_64-*-cygwin],[], + [*-*-cygwin*], + [AC_MSG_ERROR([unknown Cygwin variant])], + [i686-w64-mingw32*|x86_64-w64-mingw32*],[], + [*-*-mingw*], + [AC_MSG_ERROR([unknown mingw-w64 variant])], + [i686-pc-windows|x86_64-pc-windows],[], + [*-pc-windows*], + [AC_MSG_ERROR([unknown MSVC variant])]) +]) diff --git a/api_docgen/Ocaml_operators.mld b/api_docgen/Ocaml_operators.mld index a7a35e6d..5a034d7e 100644 --- a/api_docgen/Ocaml_operators.mld +++ b/api_docgen/Ocaml_operators.mld @@ -9,27 +9,42 @@ are also listed as references. % Note: the tables below should be kept in sync with the one in % manual/src/refman/expr.etex . % -\begin{tabular}{cc} +\begin{tabular}{|l|c|} \hline Operator class & Associativity \\ \hline -$!\ldots$ $\tilde{}\ldots$ & -- \\ -$.\cdots()$ $.\cdots[]$ $.\cdots$\textbraceleft\textbraceright& -- \\ -\#\ldots & left \\ +\verb"!"\ldots\quad \verb"~"\ldots\quad & -- \\ +\verb"."$\cdots$\verb"()"\quad + \verb"."$\cdots$\verb"[]"\quad + \verb"."$\cdots$\verb"{}" & -- \\ +\verb"#"\ldots & left \\ function application & left \\ -- -. & -- \\ -$**\ldots$ lsl lsr asr & right \\ -$*\ldots$ /\ldots \%\ldots mod land lor lxor & left \\ -+\ldots -\ldots & left \\ -:: & right \\ -@\ldots \textasciicircum\ldots & right \\ -=\ldots <\ldots >\ldots |\ldots \&\ldots \$\ldots != & left \\ -\& \&\& & right \\ -or || & right \\ -, & -- \\ -<- := & right \\ -if & -- \\ -; & right \\ +\verb"-"\quad \verb"-." \quad (prefix) & -- \\ +\verb"**"\ldots\quad + \verb"lsl"\quad \verb"lsr"\quad \verb"asr" & right \\ +\verb"*"\ldots\quad + \verb"/"\ldots\quad + \verb"%"\ldots\quad + \verb"mod"\quad + \verb"land"\quad + \verb"lor"\quad + \verb"lxor" & left \\ +\verb"+"\ldots\quad \verb"-"\ldots & left \\ +\verb"::" & right \\ +\verb"@"\ldots\quad \verb"^"\ldots & right \\ +\verb"="\ldots\quad + \verb"<"\ldots\quad + \verb">"\ldots\quad + \verb"|"\ldots\quad + \verb"&"\ldots\quad + \verb"$"\ldots\quad + \verb"!="\ldots & left \\ +\verb"&"\quad \verb"&&" & right \\ +\verb"or"\quad \verb"||" & right \\ +\verb"," & -- \\ +\verb"<-"\quad \verb":=" & right \\ +\verb"if" & -- \\ +\verb";" & right \\ \hline \end{tabular} %} diff --git a/api_docgen/ocamldoc/Makefile b/api_docgen/ocamldoc/Makefile index 5b1f8946..058f88c2 100644 --- a/api_docgen/ocamldoc/Makefile +++ b/api_docgen/ocamldoc/Makefile @@ -89,6 +89,7 @@ build/latex/Stdlib.tex: $(ALL_COMPILED_DOC) | build/latex $(V_OCAMLDOC)$(OCAMLDOC_RUN) -latex -o build/latex/all.tex \ -hide Stdlib -lib Stdlib $(DOC_ALL_INCLUDES) \ -sepfiles \ + -latex-escape-underscore "false" \ -latextitle "1,subsection*" \ -latextitle "2,subsubsection*" \ -latex-type-prefix "TYP" \ diff --git a/asmcomp/afl_instrument.ml b/asmcomp/afl_instrument.ml index 6d23311c..a2ed4191 100644 --- a/asmcomp/afl_instrument.ml +++ b/asmcomp/afl_instrument.ml @@ -98,7 +98,7 @@ and instrument = function (* these are base cases and have no logging *) | Cconst_int _ | Cconst_natint _ | Cconst_float _ | Cconst_symbol _ | Creturn_addr - | Cvar _ as c -> c + | Cvar _ | Cvar_mut _ as c -> c let instrument_function c dbg = with_afl_logging c dbg diff --git a/asmcomp/amd64/emit.mlp b/asmcomp/amd64/emit.mlp index 23f5b452..f57f3db6 100644 --- a/asmcomp/amd64/emit.mlp +++ b/asmcomp/amd64/emit.mlp @@ -550,7 +550,7 @@ let emit_instr env fallthrough i = cfi_def_cfa_register "rbx"; (* NB: gdb has asserts on contiguous stacks that mean it will not unwind through this unless we were to tag this - calling frame with cfi_signal_frame in it's definition. *) + calling frame with cfi_signal_frame in its definition. *) I.mov (domain_field Domainstate.Domain_c_stack) rsp; emit_call func; @@ -568,7 +568,7 @@ let emit_instr env fallthrough i = | Lop(Iload { memory_chunk; addressing_mode; _ }) -> let dest = res i 0 in begin match memory_chunk with - | Word_int | Word_val -> + | Word_int | Word_val | Sixtyfour -> I.mov (addressing addressing_mode QWORD i 0) dest | Byte_unsigned -> I.movzx (addressing addressing_mode BYTE i 0) dest @@ -583,13 +583,14 @@ let emit_instr env fallthrough i = | Thirtytwo_signed -> I.movsxd (addressing addressing_mode DWORD i 0) dest | Single -> + I.xorpd dest dest; (* avoid partial register stall *) I.cvtss2sd (addressing addressing_mode REAL4 i 0) dest | Double -> I.movsd (addressing addressing_mode REAL8 i 0) dest end | Lop(Istore(chunk, addr, _)) -> begin match chunk with - | Word_int | Word_val -> + | Word_int | Word_val | Sixtyfour -> I.mov (arg i 0) (addressing addr QWORD i 1) | Byte_unsigned | Byte_signed -> I.mov (arg8 i 0) (addressing addr BYTE i 1) @@ -703,6 +704,7 @@ let emit_instr env fallthrough i = | Lop(Iaddf | Isubf | Imulf | Idivf as floatop) -> instr_for_floatop floatop (arg i 1) (res i 0) | Lop(Ifloatofint) -> + I.xorpd (res i 0) (res i 0); (* avoid partial register stall *) I.cvtsi2sd (arg i 0) (res i 0) | Lop(Iintoffloat) -> I.cvttsd2si (arg i 0) (res i 0) @@ -941,14 +943,12 @@ let fundecl fundecl = end; end; cfi_endproc (); - begin match system with - | S_gnu | S_linux -> + if Config.asm_size_type_directives then begin D.type_ (emit_symbol fundecl.fun_name) "@function"; D.size (emit_symbol fundecl.fun_name) (ConstSub ( ConstThis, ConstLabel (emit_symbol fundecl.fun_name))) - | _ -> () end (* Emission of data *) @@ -1078,12 +1078,13 @@ let end_assembly() = efa_string = (fun s -> D.bytes (s ^ "\000")) }; - if system = S_linux || system = S_freebsd || system = S_netbsd || system = S_openbsd then begin + if Config.asm_size_type_directives then begin let frametable = emit_symbol (Compilenv.make_symbol (Some "frametable")) in + D.type_ frametable "@object"; D.size frametable (ConstSub (ConstThis, ConstLabel frametable)) end; - if system = S_linux || system = S_freebsd then + if Config.with_nonexecstack_note then (* Mark stack as non-executable, PR#4564 *) D.section [".note.GNU-stack"] (Some "") [ "%progbits" ]; diff --git a/asmcomp/arm64/arch.ml b/asmcomp/arm64/arch.ml index 8ffc9030..731e9a4c 100644 --- a/asmcomp/arm64/arch.ml +++ b/asmcomp/arm64/arch.ml @@ -74,7 +74,7 @@ let size_addr = 8 let size_int = 8 let size_float = 8 -let allow_unaligned_access = false +let allow_unaligned_access = true (* Behavior of division *) diff --git a/asmcomp/arm64/emit.mlp b/asmcomp/arm64/emit.mlp index f59a5aed..c8213106 100644 --- a/asmcomp/arm64/emit.mlp +++ b/asmcomp/arm64/emit.mlp @@ -45,23 +45,11 @@ let label_prefix = let emit_label lbl = emit_string label_prefix; emit_int lbl -(* Symbols *) - -let emit_symbol s = - if macosx then emit_string "_"; - Emitaux.emit_symbol s - (* Object types *) -let emit_symbol_type emit_lbl_or_sym lbl_or_sym ty = - if not macosx then begin - ` .type {emit_lbl_or_sym lbl_or_sym}, %{emit_string ty}\n` - end - - -let emit_symbol_size sym = - if not macosx then begin - ` .size {emit_symbol sym}, .-{emit_symbol sym}\n` +let emit_label_type lbl ty = + if Config.asm_size_type_directives then begin + ` .type {emit_label lbl}, {emit_string ty}\n` end (* Output a pseudo-register *) @@ -82,10 +70,14 @@ let emit_wreg = function {loc = Reg r} -> emit_string int_reg_name_w.(r) | _ -> fatal_error "Emit.emit_wreg" +let fp = Config.with_frame_pointers + let initial_stack_offset f = - 8 * f.fun_num_stack_slots.(0) + - 8 * f.fun_num_stack_slots.(1) + - (if f.fun_frame_required then 8 else 0) + 8 * f.fun_num_stack_slots.(0) + (* Local int variables *) + 8 * f.fun_num_stack_slots.(1) + (* Local float variables *) + (if f.fun_frame_required then + 8 + (if fp then 8 else 0) (* Return address plus optional Frame Pointer *) + else 0) let frame_size env = let sz = @@ -98,10 +90,9 @@ let slot_offset env loc cl = assert (n >= 0); frame_size env + n | Local n -> - env.stack_offset + - (if cl = 0 - then n * 8 - else env.f.fun_num_stack_slots.(0) * 8 + n * 8) + if cl = 0 + then env.stack_offset + n * 8 + else env.stack_offset + (env.f.fun_num_stack_slots.(0) + n) * 8 | Outgoing n -> assert (n >= 0); n @@ -271,13 +262,16 @@ let emit_stack_adjustment n = (* Deallocate the stack frame and reload the return address before a return or tail call *) - let output_epilogue env f = let n = frame_size env in - if env.f.fun_frame_required then - ` ldr x30, [sp, #{emit_int (n-8)}]\n`; if n > 0 then emit_stack_adjustment n; + if env.f.fun_frame_required then + if fp then ( + ` ldp x29, x30, [sp, #-16]\n`; + ) else ( + ` ldr x30, [sp, #-8]\n`; + ); f(); (* reset CFA back because function body may continue *) if n > 0 then cfi_adjust_cfa_offset n @@ -293,7 +287,7 @@ let rec emit_addimm rd rs n = let nl = n land 0xFFF and nh = n land 0xFFF_000 in ` add {emit_reg rd}, {emit_reg rs}, #{emit_int nh}\n`; if nl <> 0 then - ` add {emit_reg rd}, {emit_reg rd}, #{emit_int nl}\n` + ` add {emit_reg rd}, {emit_reg rd}, #{emit_int nl}\n` end and emit_subimm rd rs n = @@ -401,7 +395,7 @@ let max_out_of_line_code_offset ~num_call_gc ~num_check_bound = max_offset end -module BR = Branch_relaxation.Make (struct +module Size = struct (* CR-someday mshinwell: B and BL have +/- 128Mb ranges; for the moment we assume we will never exceed this. It would seem to be most likely to occur for branches between functions; in this case, the linker should be @@ -443,12 +437,27 @@ module BR = Branch_relaxation.Make (struct let offset_pc_at_branch = 0 + let addsub_size n = + let m = abs n in + assert (m < 0x1_000_000); + let ml = m land 0xFFF and mh = m land 0xFFF_000 in + max 1 ((if mh <> 0 then 1 else 0) + + (if ml <> 0 then 1 else 0)) + + let stack_adj_size n = + (* see emit_stack_adjustment *) + addsub_size n + let prologue_size f = - (if initial_stack_offset f > 0 then 2 else 0) - + (if f.fun_frame_required then 1 else 0) + let stk = initial_stack_offset f in + (if stk > 0 then stack_adj_size (-stk) else 0) + + (if f.fun_frame_required then (if fp then 2 else 1) else 0) let epilogue_size f = - if f.fun_frame_required then 3 else 2 + let stk = initial_stack_offset f in + (if stk > 0 then stack_adj_size stk else 0) + + (if f.fun_frame_required then 1 else 0) + + 1 let instr_size f = function | Lend -> 0 @@ -456,7 +465,8 @@ module BR = Branch_relaxation.Make (struct | Lop (Imove | Ispill | Ireload) -> 1 | Lop (Iconst_int n) -> num_instructions_for_intconst n - | Lop (Iconst_float _) -> 2 + | Lop (Iconst_float f) -> + if f = 0L || is_immediate_float f then 1 else 2 | Lop (Iconst_symbol _) -> 2 | Lop (Icall_ind) -> 1 | Lop (Icall_imm _) -> 1 @@ -466,30 +476,37 @@ module BR = Branch_relaxation.Make (struct | Lop (Iextcall {alloc; stack_ofs} ) -> if stack_ofs > 0 then 5 else if alloc then 3 - else 7 - | Lop (Istackoffset _) -> 2 + else 5 + | Lop (Istackoffset n) -> stack_adj_size (-n) | Lop (Iload { memory_chunk; addressing_mode; is_atomic }) -> let based = match addressing_mode with Iindexed _ -> 0 | Ibased _ -> 1 and barrier = if is_atomic then 1 else 0 and single = match memory_chunk with Single -> 2 | _ -> 1 in based + barrier + single | Lop (Istore (memory_chunk, addressing_mode, assignment)) -> - let based = match addressing_mode with Iindexed _ -> 0 | Ibased _ -> 1 - and barrier = - match memory_chunk, assignment with - | (Word_int | Word_val), true -> 1 + let based = + match addressing_mode with + | Iindexed _ -> 0 + | Ibased _ -> 1 + and pre_store = + match memory_chunk, assignment, macosx, addressing_mode with + | (Word_int | Word_val), true, true, Iindexed 0 -> 0 + | (Word_int | Word_val), true, true, _ -> 1 (* Compute dest address *) + | (Word_int | Word_val), true, false, _ -> 1 (* Barrier instruction *) | _ -> 0 - and single = match memory_chunk with Single -> 2 | _ -> 1 in - based + barrier + single + and store = match memory_chunk with Single -> 2 | _ -> 1 in + based + pre_store + store | Lop (Ialloc _) when f.fun_fast -> 5 | Lop (Ispecific (Ialloc_far _)) when f.fun_fast -> 6 - | Lop (Ipoll _) -> 3 - | Lop (Ispecific (Ipoll_far _)) -> 4 + | Lop (Ipoll {return_label=None}) -> 3 + | Lop (Ipoll {return_label=Some _}) -> 4 + | Lop (Ispecific (Ipoll_far {return_label=None})) -> 4 + | Lop (Ispecific (Ipoll_far {return_label=Some _})) -> 5 | Lop (Ialloc { bytes = num_bytes; _ }) | Lop (Ispecific (Ialloc_far { bytes = num_bytes; _ })) -> begin match num_bytes with - | 16 | 24 | 32 -> 1 - | _ -> 1 + num_instructions_for_intconst (Nativeint.of_int num_bytes) + | 16 | 24 | 32 -> 2 + | _ -> 2 + num_instructions_for_intconst (Nativeint.of_int num_bytes) end | Lop (Iintop (Icomp _)) -> 2 | Lop (Icompf _) -> 2 @@ -502,6 +519,7 @@ module BR = Branch_relaxation.Make (struct | Lop (Ispecific (Ishiftcheckbound_far _)) -> 3 | Lop (Iintop Imod) -> 2 | Lop (Iintop Imulh) -> 1 + | Lop (Iintop_imm ((Iadd|Isub), n)) -> addsub_size n | Lop (Iintop _) -> 1 | Lop (Iintop_imm _) -> 1 | Lop (Ifloatofint | Iintoffloat | Iabsf | Inegf | Ispecific Isqrtf) -> 1 @@ -535,7 +553,7 @@ module BR = Branch_relaxation.Make (struct + begin match lbl1 with None -> 0 | Some _ -> 1 end + begin match lbl2 with None -> 0 | Some _ -> 1 end | Lswitch jumptbl -> 3 + Array.length jumptbl - | Lentertrap -> 0 + | Lentertrap -> if fp then 1 else 0 | Ladjust_trap_depth _ -> 0 | Lpushtrap _ -> 3 | Lpoptrap -> 1 @@ -562,7 +580,8 @@ module BR = Branch_relaxation.Make (struct | Ishiftcheckbound { shift; } -> Lop (Ispecific (Ishiftcheckbound_far { shift; })) | _ -> assert false -end) +end +module BR = Branch_relaxation.Make (Size) (* Output the assembly code for allocation. *) @@ -667,19 +686,42 @@ let name_for_float_comparison = function | CFge -> "ge" | CFnge -> "lt" -(* Output the assembly code for an instruction *) +(* Output a release store [stlr] of register [src] at address [base + addr]. + Since [stlr] does not support addressing modes, we compute [base + addr] + explicitly. *) +let emit_stlr src base addr = + assert macosx; + let dest_reg = + match addr with + | Iindexed 0 -> base + | Iindexed ofs -> + ` add {emit_reg reg_tmp1}, {emit_reg base}, #{emit_int ofs}\n`; + reg_tmp1 + | Ibased _ -> assert false (* Ibased is not emitted under macOS *) + in + ` stlr {emit_reg src}, [{emit_reg dest_reg}]\n` +(* Output the assembly code for an instruction *) let emit_instr env i = emit_debug_info i.dbg; match i.desc with | Lend -> () | Lprologue -> let n = frame_size env in - if n > 0 then - emit_stack_adjustment (-n); if env.f.fun_frame_required then begin - cfi_offset ~reg:30 (* return address *) ~offset:(-8); - ` str x30, [sp, #{emit_int (n-8)}]\n` + if fp then ( + ` stp x29, x30, [sp, #-16]\n`; + cfi_offset ~reg:29 (* frame pointer *) ~offset:(-16); + cfi_offset ~reg:30 (* return address *) ~offset:(-8) + ) else ( + ` str x30, [sp, #-8]\n`; + cfi_offset ~reg:30 (* return address *) ~offset:(-8) + ); + end; + if n > 0 then begin + emit_stack_adjustment (-n); + if env.f.fun_frame_required && fp then + ` add x29, sp, #{emit_int (n-16)}\n`; end | Lop(Imove | Ispill | Ireload) -> let src = i.arg.(0) and dst = i.res.(0) in @@ -747,18 +789,15 @@ let emit_instr env i = ` bl {emit_symbol "caml_c_call"}\n`; `{record_frame env i.live (Dbg_other i.dbg)}\n` end else begin - (* Push frame pointer (x29) onto stack and restore later. *) - ` str x29, [sp, -16]!\n`; - (* Store OCaml stack in the frame pointer register. *) - ` mov x29, sp\n`; + (* Store OCaml stack in x19 register and restore later. *) + ` mov x19, sp\n`; cfi_remember_state (); - cfi_def_cfa_register ~reg:29; + cfi_def_cfa_register ~reg:19; let offset = Domainstate.(idx_of_field Domain_c_stack) * 8 in ` ldr {emit_reg reg_tmp1}, [{emit_reg reg_domain_state_ptr}, {emit_int offset}]\n`; ` mov sp, {emit_reg reg_tmp1}\n`; ` bl {emit_symbol func}\n`; - ` mov sp, x29\n`; - ` ldr x29, [sp], 16\n`; + ` mov sp, x19\n`; cfi_restore_state () end | Lop(Istackoffset n) -> @@ -791,9 +830,10 @@ let emit_instr env i = | Single -> ` ldr s7, {emit_addressing addressing_mode base}\n`; ` fcvt {emit_reg dst}, s7\n` - | Word_int | Word_val -> + | Sixtyfour | Word_int | Word_val -> if is_atomic then begin assert (addressing_mode = Iindexed 0); + assert (not (memory_chunk = Sixtyfour)); ` dmb ishld\n`; ` ldar {emit_reg dst}, [{emit_reg i.arg.(0)}]\n` end else @@ -803,7 +843,7 @@ let emit_instr env i = end | Lop(Istore(size, addr, assignment)) -> (* NB: assignments other than Word_int and Word_val do not follow the - Multicore OCaml memory model and so do not emit a barrier *) + Multicore OCaml memory model and so do not emit a barrier *) let src = i.arg.(0) in let base = match addr with @@ -822,10 +862,22 @@ let emit_instr env i = | Single -> ` fcvt s7, {emit_reg src}\n`; ` str s7, {emit_addressing addr base}\n`; - | Word_int | Word_val -> - (* memory model barrier for non-initializing store *) - if assignment then ` dmb ishld\n`; + | Sixtyfour -> ` str {emit_reg src}, {emit_addressing addr base}\n` + | Word_int | Word_val -> + begin match assignment, macosx with + | true, true -> + (* Release store for assignments on macOS. See + https://github.com/ocaml/ocaml/issues/13262. *) + emit_stlr src base addr + | true, false -> + (* Memory model barrier for assignments. *) + ` dmb ishld\n`; + ` str {emit_reg src}, {emit_addressing addr base}\n` + | _, _ -> + (* Initializing store *) + ` str {emit_reg src}, {emit_addressing addr base}\n` + end | Double -> ` str {emit_reg src}, {emit_addressing addr base}\n` end @@ -1026,7 +1078,10 @@ let emit_instr env i = done *) | Lentertrap -> - () + if fp then begin + let delta = (frame_size env) - 16 (* return address + frame pointer *) in + ` add x29, sp, #{emit_int delta}\n` + end | Ladjust_trap_depth { delta_traps } -> (* each trap occupies 16 bytes on the stack *) let delta = 16 * delta_traps in @@ -1058,8 +1113,37 @@ let emit_instr env i = (* Emission of an instruction sequence *) -let rec emit_all env i = - if i.desc = Lend then () else (emit_instr env i; emit_all env i.next) +(* for debugging instr_size errors *) +let emit_instr_debug env i = + let lbl = new_label () in + `{emit_label lbl}:\n`; + emit_instr env i; + let sz = Size.instr_size env.f i.desc * 4 in + ` .ifne (. - {emit_label lbl}) - {emit_int sz}\n`; + ` .error \"Emit.instr_size: instruction length mismatch\"\n`; + ` .endif\n` + +let rec emit_all env lbl_start acc i = + let debug = Config.with_codegen_invariants in + match i.desc with + | Lend -> + if debug then begin + (* acc measures in units of 32-bit instructions *) + let sz = acc * 4 in + ` .ifne (. - {emit_label lbl_start}) - {emit_int sz}\n`; + ` .error \"Emit.instr_size: instruction length mismatch\"\n`; + ` .endif\n`; + end + else + () + | _ -> + if debug then emit_instr_debug env i else emit_instr env i; + emit_all env lbl_start (acc + Size.instr_size env.f i.desc) i.next + +let emit_all env i = + let lbl = new_label () in + `{emit_label lbl}:\n`; + emit_all env lbl 0 i (* Emission of a function declaration *) @@ -1068,7 +1152,7 @@ let fundecl fundecl = emit_named_text_section fundecl.fun_name; ` .align 3\n`; ` .globl {emit_symbol fundecl.fun_name}\n`; - emit_symbol_type emit_symbol fundecl.fun_name "function"; + emit_type_directive fundecl.fun_name "%function"; (* Dynamic stack checking *) let stack_threshold_size = Config.stack_threshold * 8 in (* bytes *) let max_frame_size = frame_size env + fundecl.fun_extra_stack_used in @@ -1119,8 +1203,8 @@ let fundecl fundecl = assert (List.length env.bound_error_sites = num_check_bound); cfi_endproc(); - emit_symbol_type emit_symbol fundecl.fun_name "function"; - emit_symbol_size fundecl.fun_name; + emit_type_directive fundecl.fun_name "%function"; + emit_size_directive fundecl.fun_name; emit_literals env (* Emission of data *) @@ -1193,10 +1277,10 @@ let end_assembly () = `{emit_symbol lbl}:\n`; emit_frames { efa_code_label = (fun lbl -> - emit_symbol_type emit_label lbl "function"; + emit_label_type lbl "%function"; ` .quad {emit_label lbl}\n`); efa_data_label = (fun lbl -> - emit_symbol_type emit_label lbl "object"; + emit_label_type lbl "%object"; ` .quad {emit_label lbl}\n`); efa_8 = (fun n -> ` .byte {emit_int n}\n`); efa_16 = (fun n -> ` .short {emit_int n}\n`); @@ -1207,11 +1291,6 @@ let end_assembly () = ` .long {emit_label lbl} - . + {emit_int32 ofs}\n`); efa_def_label = (fun lbl -> `{emit_label lbl}:\n`); efa_string = (fun s -> emit_string_directive " .asciz " s) }; - emit_symbol_type emit_symbol lbl "object"; - emit_symbol_size lbl; - begin match Config.system with - | "linux" -> - (* Mark stack as non-executable *) - ` .section .note.GNU-stack,\"\",%progbits\n` - | _ -> () - end + emit_type_directive lbl "%object"; + emit_size_directive lbl; + emit_nonexecstack_note () diff --git a/asmcomp/arm64/proc.ml b/asmcomp/arm64/proc.ml index 78845f33..1f6a8797 100644 --- a/asmcomp/arm64/proc.ml +++ b/asmcomp/arm64/proc.ml @@ -248,9 +248,9 @@ let stack_ptr_dwarf_register_number = 31 (* Registers destroyed by operations *) let destroyed_at_c_noalloc_call = - (* x19-x28, d8-d15 preserved *) + (* x20-x28, d8-d15 preserved *) Array.of_list (List.map phys_reg - [0;1;2;3;4;5;6;7;8;9;10;11;12;13;14;15; + [0;1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16; 100;101;102;103;104;105;106;107; 116;117;118;119;120;121;122;123; 124;125;126;127;128;129;130;131]) diff --git a/asmcomp/arm64/selection.ml b/asmcomp/arm64/selection.ml index b6ecfd9f..de517258 100644 --- a/asmcomp/arm64/selection.ml +++ b/asmcomp/arm64/selection.ml @@ -32,7 +32,7 @@ let is_offset chunk n = n land 1 = 0 && n lsr 1 < 0x1000 | Thirtytwo_unsigned | Thirtytwo_signed | Single -> n land 3 = 0 && n lsr 2 < 0x1000 - | Word_int | Word_val | Double -> + | Sixtyfour | Word_int | Word_val | Double -> n land 7 = 0 && n lsr 3 < 0x1000) let is_logical_immediate n = diff --git a/asmcomp/cmm.ml b/asmcomp/cmm.ml index d1abd096..f322f33f 100644 --- a/asmcomp/cmm.ml +++ b/asmcomp/cmm.ml @@ -142,6 +142,7 @@ type memory_chunk = | Sixteen_signed | Thirtytwo_unsigned | Thirtytwo_signed + | Sixtyfour | Word_int | Word_val | Single @@ -177,6 +178,7 @@ type expression = | Cconst_float of float * Debuginfo.t | Cconst_symbol of string * Debuginfo.t | Cvar of Backend_var.t + | Cvar_mut of Backend_var.t | Clet of Backend_var.With_provenance.t * expression * expression | Clet_mut of Backend_var.With_provenance.t * machtype * expression * expression @@ -266,6 +268,7 @@ let iter_shallow_tail f = function | Cconst_float _ | Cconst_symbol _ | Cvar _ + | Cvar_mut _ | Cassign _ | Ctuple _ | Cop _ @@ -303,6 +306,7 @@ let rec map_tail f = function | Cconst_float _ | Cconst_symbol _ | Cvar _ + | Cvar_mut _ | Cassign _ | Ctuple _ | Creturn_addr @@ -340,6 +344,7 @@ let map_shallow f = function | Cconst_float _ | Cconst_symbol _ | Cvar _ + | Cvar_mut _ | Creturn_addr as c -> c diff --git a/asmcomp/cmm.mli b/asmcomp/cmm.mli index c64f2c9f..175ad81e 100644 --- a/asmcomp/cmm.mli +++ b/asmcomp/cmm.mli @@ -132,11 +132,12 @@ type memory_chunk = | Sixteen_signed | Thirtytwo_unsigned | Thirtytwo_signed - | Word_int (* integer or pointer outside heap *) - | Word_val (* pointer inside heap or encoded int *) + | Sixtyfour (* 64-bit integer whose accesses do not follow OCaml + relaxed memory model *) + | Word_int (* Integer or pointer outside heap *) + | Word_val (* Pointer inside heap or encoded int *) | Single - | Double (* word-aligned 64-bit float - see PR#10433 *) + | Double (* Word-aligned 64-bit float. See PR#10433. *) and operation = Capply of machtype @@ -178,6 +179,7 @@ and expression = | Cconst_float of float * Debuginfo.t | Cconst_symbol of string * Debuginfo.t | Cvar of Backend_var.t + | Cvar_mut of Backend_var.t | Clet of Backend_var.With_provenance.t * expression * expression | Clet_mut of Backend_var.With_provenance.t * machtype * expression * expression diff --git a/asmcomp/cmm_helpers.ml b/asmcomp/cmm_helpers.ml index c99c39bc..3d614409 100644 --- a/asmcomp/cmm_helpers.ml +++ b/asmcomp/cmm_helpers.ml @@ -32,11 +32,6 @@ let bind_load name arg fn = | Cop(Cload _, [Cvar _], _) -> fn arg | _ -> bind name arg fn -let bind_nonvar name arg fn = - match arg with - Cconst_int _ | Cconst_natint _ | Cconst_symbol _ -> fn arg - | _ -> let id = V.create_local name in Clet(VP.create id, arg, fn (Cvar id)) - let caml_black = Nativeint.shift_left (Nativeint.of_int 3) 8 (* cf. runtime/caml/gc.h *) @@ -106,11 +101,19 @@ let alloc_boxedintnat_header dbg = Cconst_natint (boxedintnat_header, dbg) let max_repr_int = max_int asr 1 let min_repr_int = min_int asr 1 +let tag_const (n : int) : nativeint = + Nativeint.(add (shift_left (of_int n) 1) 1n) + +let untag_const (n : nativeint) : int = + if Nativeint.(logand n 1n <> 1n) then + Misc.fatal_error + "Cmm_helpers.untag_const was called on an non-tagged constant"; + Nativeint.(to_int (shift_right n 1)) + let int_const dbg n = if n <= max_repr_int && n >= min_repr_int then Cconst_int((n lsl 1) + 1, dbg) - else Cconst_natint - (Nativeint.add (Nativeint.shift_left (Nativeint.of_int n) 1) 1n, dbg) + else Cconst_natint (tag_const n, dbg) let natint_const_untagged dbg n = if n > Nativeint.of_int max_int @@ -119,7 +122,7 @@ let natint_const_untagged dbg n = else Cconst_int (Nativeint.to_int n, dbg) let cint_const n = - Cint(Nativeint.add (Nativeint.shift_left (Nativeint.of_int n) 1) 1n) + Cint(tag_const n) let targetint_const n = Targetint.add (Targetint.shift_left (Targetint.of_int n) 1) @@ -641,8 +644,8 @@ let field_address ptr n dbg = then ptr else Cop(Cadda, [ptr; Cconst_int(n * size_addr, dbg)], dbg) -let get_field_gen mutability ptr n dbg = - Cop(Cload {memory_chunk=Word_val; mutability; is_atomic=false}, +let get_field_gen ?(memory_chunk=Word_val) mutability ptr n dbg = + Cop(Cload {memory_chunk; mutability; is_atomic=false}, [field_address ptr n dbg], dbg) let get_field_codepointer mutability ptr n dbg = @@ -741,6 +744,9 @@ let array_indexing ?typ log2size ptr ofs dbg = Cop(add, [Cop(add, [ptr; lsl_const ofs (log2size - 1) dbg], dbg); Cconst_int((-1) lsl (log2size - 1), dbg)], dbg) +let field_address_computed ptr ofs dbg = + array_indexing log2_size_addr ptr ofs dbg + let addr_array_ref arr ofs dbg = Cop(mk_load_mut Word_val, [array_indexing log2_size_addr arr ofs dbg], dbg) @@ -944,9 +950,9 @@ let bigarray_word_kind : Lambda.bigarray_kind -> memory_chunk = function | Pbigarray_sint16 -> Sixteen_signed | Pbigarray_uint16 -> Sixteen_unsigned | Pbigarray_int32 -> Thirtytwo_signed - | Pbigarray_int64 -> Word_int - | Pbigarray_caml_int -> Word_int - | Pbigarray_native_int -> Word_int + | Pbigarray_int64 -> Sixtyfour + | Pbigarray_caml_int -> Sixtyfour + | Pbigarray_native_int -> Sixtyfour | Pbigarray_complex32 -> Single | Pbigarray_complex64 -> Double @@ -1190,7 +1196,7 @@ let unaligned_set_32 ptr idx newval dbg = let unaligned_load_64 ptr idx dbg = if Arch.allow_unaligned_access - then Cop(mk_load_mut Word_int, [add_int ptr idx dbg], dbg) + then Cop(mk_load_mut Sixtyfour, [add_int ptr idx dbg], dbg) else let cconst_int i = Cconst_int (i, dbg) in let v1 = Cop(mk_load_mut Byte_unsigned, [add_int ptr idx dbg], dbg) in @@ -1228,7 +1234,7 @@ let unaligned_load_64 ptr idx dbg = let unaligned_set_64 ptr idx newval dbg = if Arch.allow_unaligned_access - then Cop(Cstore (Word_int, Assignment), [add_int ptr idx dbg; newval], dbg) + then Cop(Cstore (Sixtyfour, Assignment), [add_int ptr idx dbg; newval], dbg) else let cconst_int i = Cconst_int (i, dbg) in let v1 = @@ -1369,13 +1375,93 @@ let simplif_primitive p : Clambda_primitives.primitive = let transl_isout h arg dbg = tag_int (Cop(Ccmpa Clt, [h ; arg], dbg)) dbg +(* Operations on OCaml values *) + +let add_int_caml arg1 arg2 dbg = + decr_int (add_int arg1 arg2 dbg) dbg + +(* Unary primitive delayed to reuse add_int_caml *) +let offsetint n arg dbg = + if Misc.no_overflow_lsl n 1 then + add_const arg (n lsl 1) dbg + else + add_int_caml arg (int_const dbg n) dbg + +let sub_int_caml arg1 arg2 dbg = + incr_int (sub_int arg1 arg2 dbg) dbg + +let mul_int_caml arg1 arg2 dbg = + (* decrementing the non-constant part helps when the multiplication is + followed by an addition; + for example, using this trick compiles (100 * a + 7) into + (+ ( * a 100) -85) + rather than + (+ ( * 200 (>>s a 1)) 15) + *) + match arg1, arg2 with + | Cconst_int _ as c1, c2 -> + incr_int (mul_int (untag_int c1 dbg) (decr_int c2 dbg) dbg) dbg + | c1, c2 -> + incr_int (mul_int (decr_int c1 dbg) (untag_int c2 dbg) dbg) dbg + +let div_int_caml is_safe arg1 arg2 dbg = + tag_int(div_int (untag_int arg1 dbg) + (untag_int arg2 dbg) is_safe dbg) dbg + +let mod_int_caml is_safe arg1 arg2 dbg = + tag_int(mod_int (untag_int arg1 dbg) + (untag_int arg2 dbg) is_safe dbg) dbg + +let and_int_caml arg1 arg2 dbg = + Cop(Cand, [arg1; arg2], dbg) + +let or_int_caml arg1 arg2 dbg = + Cop(Cor, [arg1; arg2], dbg) + +let xor_int_caml arg1 arg2 dbg = + Cop(Cor, [Cop(Cxor, [ignore_low_bit_int arg1; + ignore_low_bit_int arg2], dbg); + Cconst_int (1, dbg)], dbg) + +let lsl_int_caml arg1 arg2 dbg = + incr_int(lsl_int (decr_int arg1 dbg) + (untag_int arg2 dbg) dbg) dbg + +let lsr_int_caml arg1 arg2 dbg = + Cop(Cor, [lsr_int arg1 (untag_int arg2 dbg) dbg; + Cconst_int (1, dbg)], dbg) + +let asr_int_caml arg1 arg2 dbg = + Cop(Cor, [asr_int arg1 (untag_int arg2 dbg) dbg; + Cconst_int (1, dbg)], dbg) + +let int_comp_caml cmp arg1 arg2 dbg = + tag_int(Cop(Ccmpi cmp, + [arg1; arg2], dbg)) dbg + (* Build an actual switch (ie jump table) *) +type switch_arg = Tagged of expression | Untagged of expression + +(** This function takes a switch on immedate values, + for example: + int 0: 1 + int 1: 3 + int 2: 5 + + It tries to perform two optimizations: + - If the switch implements an affine function [x -> a*x + b], + produce the affine expression [a * arg + b]. In particular, when + a=1 and b=0, return the argument [arg] unchanged. + - If the switch only has constant right-hand-sides (but is not an + affine function), produce a table lookup. +*) let make_switch arg cases actions dbg = + (* We only apply those optimizations if the right-hand-side is + made of valid OCaml constants. In particular, if all machine + integers appearing in the right-hand-side are tagged (least bit 1). *) let extract_uconstant = function - (* Constant integers loaded from a table should end in 1, - so that Cload never produces untagged integers *) | Cconst_int (n, _), _dbg when (n land 1) = 1 -> Some (Cint (Nativeint.of_int n)) | Cconst_natint (n, _), _dbg @@ -1390,10 +1476,27 @@ let make_switch arg cases actions dbg = if length >= 2 then begin match const_actions.(cases.(0)), const_actions.(cases.(1)) with - | Cint v0, Cint v1 -> - let slope = Nativeint.sub v1 v0 in + | Cint n0, Cint n1 -> + (* The right-hand-sides are tagged, so we can translate them + back to OCaml integers without loss of information, to + compute the offset and slope on OCaml integers. + + For example, consider the identity function on OCaml integers + 0 -> 0 + 1 -> 1 + 2 -> 2 + If we computed the slope with native integers on the + right-hand-side, we would see + 0 -> 1n + 1 -> 3n + 2 -> 5n + and compute offset=1n, slope=2n. + We want offset=0, slope=1 instead. + *) + let v0, v1 = untag_const n0, untag_const n1 in + let slope = v1 - v0 in let check i = function - | Cint v -> v = Nativeint.(add (mul (of_int i) slope) v0) + | Cint n -> untag_const n = (slope * i + v0) | _ -> false in if Misc.Stdlib.Array.for_alli @@ -1405,29 +1508,42 @@ let make_switch arg cases actions dbg = end else None in - let make_table_lookup ~cases ~const_actions arg dbg = + let make_switch ~arg_untagged ~cases ~actions = + (* We need an untagged argument here. *) + Cswitch (arg_untagged, cases, actions, dbg) + in + let make_table_lookup ~arg_tagged ~cases ~const_actions = + (* We need a tagged argument here, to call a [*_array_ref] helper. *) let table = Compilenv.new_const_symbol () in Cmmgen_state.add_constant table (Const_table (Local, Array.to_list (Array.map (fun act -> const_actions.(act)) cases))); - addr_array_ref (Cconst_symbol (table, dbg)) (tag_int arg dbg) dbg + (* Constant integers loaded from a table are tagged, + so that Cload never produces untagged integers. *) + addr_array_ref (Cconst_symbol (table, dbg)) arg_tagged dbg in - let make_affine_computation ~offset ~slope arg dbg = - (* In case the resulting integers are an affine function of the index, we - don't emit a table, and just compute the result directly *) - add_int - (mul_int arg (natint_const_untagged dbg slope) dbg) - (natint_const_untagged dbg offset) - dbg + let make_affine_computation ~arg_tagged ~offset ~slope = + (* Asking for a tagged argument here does not introduce extra tagging, + as any (tag_int ..) logic around the argument will be undone by + [mul_int_caml]. *) + add_int_caml + (mul_int_caml (int_const dbg slope) arg_tagged dbg) + (int_const dbg offset) dbg + in + let arg_tagged, arg_untagged = + match arg with + | Tagged arg_tagged -> arg_tagged, untag_int arg_tagged dbg + | Untagged arg_untagged -> tag_int arg_untagged dbg, arg_untagged in match Misc.Stdlib.Array.all_somes (Array.map extract_uconstant actions) with | None -> - Cswitch (arg,cases,actions,dbg) + make_switch ~arg_untagged ~cases ~actions | Some const_actions -> match extract_affine ~cases ~const_actions with | Some (offset, slope) -> - make_affine_computation ~offset ~slope arg dbg - | None -> make_table_lookup ~cases ~const_actions arg dbg + make_affine_computation ~arg_tagged ~offset ~slope + | None -> + make_table_lookup ~arg_tagged ~cases ~const_actions module SArgBlocks = struct @@ -1459,7 +1575,7 @@ struct Debuginfo.none) let make_switch dbg arg cases actions = let actions = Array.map (fun expr -> expr, dbg) actions in - make_switch arg cases actions dbg + make_switch (Untagged arg) cases actions dbg let bind arg body = bind "switcher" arg body let make_catch handler = match handler with @@ -1682,7 +1798,8 @@ let cache_public_method meths tag cache dbg = (Clet( VP.create mi, Cop(Cor, - [Cop(Clsr, [Cop(Caddi, [Cvar li; Cvar hi], dbg); cconst_int 1], + [Cop(Clsr, [Cop(Caddi, [Cvar_mut li; Cvar_mut hi], dbg); + cconst_int 1], dbg); cconst_int 1], dbg), @@ -1699,7 +1816,7 @@ let cache_public_method meths tag cache dbg = dbg, Cassign(li, Cvar mi), dbg), Cifthenelse - (Cop(Ccmpi Cge, [Cvar li; Cvar hi], dbg), + (Cop(Ccmpi Cge, [Cvar_mut li; Cvar_mut hi], dbg), dbg, Cexit (raise_num, []), dbg, Ctuple [], dbg)))) @@ -1708,7 +1825,7 @@ let cache_public_method meths tag cache dbg = dbg), Clet ( VP.create tagged, - Cop(Caddi, [lsl_const (Cvar li) log2_size_addr dbg; + Cop(Caddi, [lsl_const (Cvar_mut li) log2_size_addr dbg; cconst_int(1 - 3 * size_addr)], dbg), Csequence(Cop (Cstore (Word_int, Assignment), [cache; Cvar tagged], dbg), Cvar tagged))))) @@ -2153,68 +2270,6 @@ let setfloatfield n init arg1 arg2 dbg = else Cop(Cadda, [arg1; Cconst_int(n * size_float, dbg)], dbg); arg2], dbg)) -let add_int_caml arg1 arg2 dbg = - decr_int (add_int arg1 arg2 dbg) dbg - -(* Unary primitive delayed to reuse add_int_caml *) -let offsetint n arg dbg = - if Misc.no_overflow_lsl n 1 then - add_const arg (n lsl 1) dbg - else - add_int_caml arg (int_const dbg n) dbg - -let sub_int_caml arg1 arg2 dbg = - incr_int (sub_int arg1 arg2 dbg) dbg - -let mul_int_caml arg1 arg2 dbg = - (* decrementing the non-constant part helps when the multiplication is - followed by an addition; - for example, using this trick compiles (100 * a + 7) into - (+ ( * a 100) -85) - rather than - (+ ( * 200 (>>s a 1)) 15) - *) - match arg1, arg2 with - | Cconst_int _ as c1, c2 -> - incr_int (mul_int (untag_int c1 dbg) (decr_int c2 dbg) dbg) dbg - | c1, c2 -> - incr_int (mul_int (decr_int c1 dbg) (untag_int c2 dbg) dbg) dbg - -let div_int_caml is_safe arg1 arg2 dbg = - tag_int(div_int (untag_int arg1 dbg) - (untag_int arg2 dbg) is_safe dbg) dbg - -let mod_int_caml is_safe arg1 arg2 dbg = - tag_int(mod_int (untag_int arg1 dbg) - (untag_int arg2 dbg) is_safe dbg) dbg - -let and_int_caml arg1 arg2 dbg = - Cop(Cand, [arg1; arg2], dbg) - -let or_int_caml arg1 arg2 dbg = - Cop(Cor, [arg1; arg2], dbg) - -let xor_int_caml arg1 arg2 dbg = - Cop(Cor, [Cop(Cxor, [ignore_low_bit_int arg1; - ignore_low_bit_int arg2], dbg); - Cconst_int (1, dbg)], dbg) - -let lsl_int_caml arg1 arg2 dbg = - incr_int(lsl_int (decr_int arg1 dbg) - (untag_int arg2 dbg) dbg) dbg - -let lsr_int_caml arg1 arg2 dbg = - Cop(Cor, [lsr_int arg1 (untag_int arg2 dbg) dbg; - Cconst_int (1, dbg)], dbg) - -let asr_int_caml arg1 arg2 dbg = - Cop(Cor, [asr_int arg1 (untag_int arg2 dbg) dbg; - Cconst_int (1, dbg)], dbg) - -let int_comp_caml cmp arg1 arg2 dbg = - tag_int(Cop(Ccmpi cmp, - [arg1; arg2], dbg)) dbg - let stringref_unsafe arg1 arg2 dbg = tag_int(Cop(mk_load_mut Byte_unsigned, [add_int arg1 (untag_int arg2 dbg) dbg], diff --git a/asmcomp/cmm_helpers.mli b/asmcomp/cmm_helpers.mli index 513b4adf..5c325bd4 100644 --- a/asmcomp/cmm_helpers.mli +++ b/asmcomp/cmm_helpers.mli @@ -24,10 +24,6 @@ val bind : val bind_load : string -> expression -> (expression -> expression) -> expression -(** Same as [bind], but does not treat variables as simple *) -val bind_nonvar : - string -> expression -> (expression -> expression) -> expression - (** Headers *) (** A null header with GC bits set to black *) @@ -203,10 +199,11 @@ val mk_load_atomic : memory_chunk -> operation [n]th field of the block pointed to by [ptr] *) val field_address : expression -> int -> Debuginfo.t -> expression -(** [get_field_gen mut ptr n dbg] returns an expression for the access to the - [n]th field of the block pointed to by [ptr] *) +(** [get_field_gen ?memory_chunk mut ptr n dbg] returns an expression for + the access to the [n]th field of the block pointed to by [ptr]. *) val get_field_gen : - Asttypes.mutable_flag -> expression -> int -> Debuginfo.t -> expression + ?memory_chunk:memory_chunk -> Asttypes.mutable_flag -> expression -> int -> + Debuginfo.t -> expression (** [set_field ptr n newval init dbg] returns an expression for setting the [n]th field of the block pointed to by [ptr] to [newval] *) @@ -214,6 +211,12 @@ val set_field : expression -> int -> expression -> Lambda.initialization_or_assignment -> Debuginfo.t -> expression +(** [field_address_computed ptr ofs dbg] returns an expression for the address + at offset [ofs] (in machine words) of the block pointed to by [ptr]. + The resulting expression is a derived pointer of type [Addr]. *) +val field_address_computed : + expression -> expression -> Debuginfo.t -> expression + (** Load a block's header *) val get_header : expression -> Debuginfo.t -> expression @@ -538,10 +541,12 @@ val bigstring_set : (** [transl_isout h arg dbg] *) val transl_isout : expression -> expression -> Debuginfo.t -> expression +type switch_arg = Tagged of expression | Untagged of expression (** [make_switch arg cases actions dbg] : Generate a Cswitch construct, - or optimize as a static table lookup when possible. *) + or optimize as a static table lookup when possible. +*) val make_switch : - expression -> int array -> (expression * Debuginfo.t) array -> Debuginfo.t -> + switch_arg -> int array -> (expression * Debuginfo.t) array -> Debuginfo.t -> expression (** [transl_int_switch loc arg low high cases default] *) diff --git a/asmcomp/cmm_invariants.ml b/asmcomp/cmm_invariants.ml index 92b605fe..a9ba7a78 100644 --- a/asmcomp/cmm_invariants.ml +++ b/asmcomp/cmm_invariants.ml @@ -14,9 +14,23 @@ [@@@ocaml.warning "-40"] +module V = Backend_var +module VP = Backend_var.With_provenance module Int = Numbers.Int -(* Check a number of continuation-related invariants *) +(* Check a number of invariants around continuation and variable uses *) + +type mutability = Mutable | Immutable + +let equal_mutability m1 m2 = + match m1, m2 with + | Mutable, Mutable | Immutable, Immutable -> true + | Mutable, Immutable | Immutable, Mutable -> false + +let mutability_to_string m = + match m with + | Mutable -> "mutable" + | Immutable -> "immutable" module Env : sig type t @@ -27,10 +41,17 @@ module Env : sig val jump : t -> cont:int -> arg_num:int -> unit + val bind_var : t -> V.t -> mutability -> t + + val bind_params : t -> (VP.t * _) list -> t + + val use_var : t -> V.t -> mutability -> unit + val report : Format.formatter -> bool end = struct type t = { bound_handlers : int Int.Map.t; + bound_variables : mutability V.Map.t; } type error = @@ -38,6 +59,9 @@ end = struct | Multiple_handlers of { cont: int; } | Wrong_arguments_number of { cont: int; handler_args: int; jump_args: int; } + | Unbound_variable of { var : V.t; mut : mutability } + | Wrong_mutability of + { var : V.t; binding_mut : mutability; use_mut : mutability } module Error = struct type t = error @@ -74,13 +98,14 @@ end = struct state.errors <- ErrorSet.empty; { bound_handlers = Int.Map.empty; + bound_variables = V.Map.empty; } let handler t ~cont ~arg_num = if Int.Set.mem cont state.all_handlers then multiple_handler cont; state.all_handlers <- Int.Set.add cont state.all_handlers; let bound_handlers = Int.Map.add cont arg_num t.bound_handlers in - { bound_handlers; } + { t with bound_handlers; } let jump t ~cont ~arg_num = match Int.Map.find cont t.bound_handlers with @@ -89,6 +114,27 @@ end = struct wrong_arguments cont handler_args arg_num | exception Not_found -> unbound_handler cont + let bind_var t var mut = + let bound_variables = V.Map.add var mut t.bound_variables in + { t with bound_variables } + + let bind_params t params = + let bound_variables = + List.fold_left (fun bound_vars (var, _) -> + V.Map.add (VP.var var) Immutable bound_vars) + t.bound_variables params + in + { t with bound_variables } + + let use_var t var use_mut = + match V.Map.find_opt var t.bound_variables with + | Some binding_mut -> + if equal_mutability use_mut binding_mut + then () + else record_error (Wrong_mutability { var; binding_mut; use_mut }) + | None -> + record_error (Unbound_variable { var; mut = use_mut }) + let print_error ppf error = match error with | Unbound_handler { cont } -> @@ -110,6 +156,16 @@ end = struct cont handler_args jump_args + | Unbound_variable { var; mut } -> + Format.fprintf ppf + "Variable %a (%s) was unbound or used outside the scope of its binder" + V.print var (mutability_to_string mut) + | Wrong_mutability { var; binding_mut; use_mut } -> + Format.fprintf ppf + "Variable %a was bound as %s but used as %s" + V.print var + (mutability_to_string binding_mut) + (mutability_to_string use_mut) let print_error_newline ppf error = Format.fprintf ppf "%a@." print_error error @@ -125,15 +181,22 @@ end let rec check env (expr : Cmm.expression) = match expr with | Cconst_int _ | Cconst_natint _ | Cconst_float _ | Cconst_symbol _ - | Cvar _ | Creturn_addr -> + | Creturn_addr -> () - | Clet (_, expr, body) - | Clet_mut (_, _, expr, body) -> + | Cvar id -> + Env.use_var env id Immutable + | Cvar_mut id -> + Env.use_var env id Mutable + | Clet (id, expr, body) -> + check env expr; + check (Env.bind_var env (VP.var id) Immutable) body + | Clet_mut (id, _, expr, body) -> check env expr; - check env body + check (Env.bind_var env (VP.var id) Mutable) body | Cphantom_let (_, _, expr) -> check env expr - | Cassign (_, expr) -> + | Cassign (id, expr) -> + Env.use_var env id Mutable; check env expr | Ctuple exprs -> List.iter (check env) exprs @@ -163,18 +226,21 @@ let rec check env (expr : Cmm.expression) = | Recursive -> env_extended | Nonrecursive -> env in - List.iter (fun (_, _, handler, _) -> check env_handler handler) handlers + List.iter (fun (_, args, handler, _) -> + let env_handler = Env.bind_params env_handler args in + check env_handler handler) + handlers | Cexit (cont, args) -> Env.jump env ~cont ~arg_num:(List.length args) - | Ctrywith (body, _, handler, _) -> + | Ctrywith (body, id, handler, _) -> (* Jumping from inside a trywith body to outside isn't very nice, but it's handled correctly by Linearize, as it happens when compiling match ... with exception ..., for instance, so it is not reported as an error. *) check env body; - check env handler + check (Env.bind_var env (VP.var id) Immutable) handler let run ppf (fundecl : Cmm.fundecl) = - let env = Env.init () in + let env = Env.bind_params (Env.init ()) fundecl.fun_args in check env fundecl.fun_body; Env.report ppf diff --git a/asmcomp/cmmgen.ml b/asmcomp/cmmgen.ml index 8c520809..3c06fcf5 100644 --- a/asmcomp/cmmgen.ml +++ b/asmcomp/cmmgen.ml @@ -39,6 +39,7 @@ type boxed_number = type env = { unboxed_ids : (V.t * boxed_number) V.tbl; + mutable_ids : V.Set.t; notify_catch : (Cmm.expression list -> unit) IntMap.t; environment_param : V.t option; } @@ -61,6 +62,7 @@ type env = { let empty_env = { unboxed_ids = V.empty; + mutable_ids = V.Set.empty; notify_catch = IntMap.empty; environment_param = None; } @@ -79,6 +81,14 @@ let add_unboxed_id id unboxed_id bn env = unboxed_ids = V.add id (unboxed_id, bn) env.unboxed_ids; } +let is_mutable_id id env = + V.Set.mem id env.mutable_ids + +let add_mutable_id id env = + { env with + mutable_ids = V.Set.add id env.mutable_ids; + } + let add_notify_catch n f env = { env with notify_catch = IntMap.add n f env.notify_catch @@ -121,9 +131,14 @@ let min_mut x y = | Immutable,_ | _,Immutable -> Immutable | Mutable,Mutable -> Mutable -let get_field env mut ptr n dbg = +let get_field env imm_or_pointer mut ptr n dbg = let mut = min_mut mut (mut_from_env env ptr) in - get_field_gen mut ptr n dbg + let memory_chunk = + match imm_or_pointer with + | Immediate -> Word_int + | Pointer -> Word_val + in + get_field_gen ~memory_chunk mut ptr n dbg (* Translate structured constants to Cmm data items *) @@ -334,14 +349,32 @@ let is_unboxed_number_cmm ~strict ~kind cmm = aux cmm; !r +let machtype_of_value_kind (value_kind : Lambda.value_kind) = + match value_kind with + | Pgenval + | Pfloatval + | Pboxedintval _ -> + Cmm.typ_val + | Pintval -> + Cmm.typ_int + (* Translate an expression *) let rec transl env e = match e with Uvar id -> begin match is_unboxed_id id env with - | None -> Cvar id - | Some (unboxed_id, bn) -> box_number bn (Cvar unboxed_id) + | None -> + if is_mutable_id id env + then Cvar_mut id + else Cvar id + | Some (unboxed_id, bn) -> + let var = + if is_mutable_id unboxed_id env + then Cvar_mut unboxed_id + else Cvar unboxed_id + in + box_number bn var end | Uconst sc -> transl_constant Debuginfo.none sc @@ -537,8 +570,7 @@ let rec transl env e = | ((Pfield_computed|Psequand | Prunstack | Pperform | Presume | Preperform | Pdls_get - | Patomic_load _ | Patomic_exchange - | Patomic_cas | Patomic_fetch_add + | Patomic_load | Psequor | Pnot | Pnegint | Paddint | Psubint | Pmulint | Pandint | Porint | Pxorint | Plslint | Plsrint | Pasrint | Pintoffloat | Pfloatofint @@ -558,7 +590,7 @@ let rec transl env e = | Pandbint _ | Porbint _ | Pxorbint _ | Plslbint _ | Plsrbint _ | Pasrbint _ | Pbintcomp (_, _) | Pstring_load _ | Pbytes_load _ | Pbytes_set _ | Pbigstring_load _ | Pbigstring_set _ - | Pbbswap _ | Ppoll ), _) + | Pbbswap _ | Ppoll | Pmakelazyblock _ ), _) -> fatal_error "Cmmgen.transl:prim" end @@ -569,7 +601,7 @@ let rec transl env e = can be checked *) if Array.length s.us_index_blocks = 0 then make_switch - (untag_int (transl env arg) dbg) + (Tagged (transl env arg)) s.us_index_consts (Array.map (fun expr -> transl env expr, dbg) s.us_actions_consts) dbg @@ -641,24 +673,26 @@ let rec transl env e = let inc = match dir with Upto -> Caddi | Downto -> Csubi in let raise_num = next_raise_count () in let id_prev = VP.create (V.create_local "*id_prev*") in + let env = add_mutable_id (VP.var id) env in return_unit dbg (Clet_mut (id, typ_int, transl env low, - bind_nonvar "bound" (transl env high) (fun high -> + bind "bound" (transl env high) (fun high -> ccatch (raise_num, [], Cifthenelse - (Cop(Ccmpi tst, [Cvar (VP.var id); high], dbg), + (Cop(Ccmpi tst, [Cvar_mut (VP.var id); high], dbg), dbg, Cexit (raise_num, []), dbg, create_loop (Csequence (remove_unit(transl env body), - Clet(id_prev, Cvar (VP.var id), + Clet(id_prev, Cvar_mut (VP.var id), Csequence (Cassign(VP.var id, - Cop(inc, [Cvar (VP.var id); Cconst_int (2, dbg)], + Cop(inc, [Cvar_mut (VP.var id); + Cconst_int (2, dbg)], dbg)), Cifthenelse (Cop(Ccmpi Ceq, [Cvar (VP.var id_prev); high], @@ -704,12 +738,12 @@ and transl_catch env nfail ids body handler dbg = let body = transl env_body body in let new_env, rewrite, ids = List.fold_right - (fun (id, _kind, u) (env, rewrite, ids) -> + (fun (id, kind, u) (env, rewrite, ids) -> match !u with | No_unboxing | Boxed (_, true) | No_result -> env, (fun x -> x) :: rewrite, - (id, Cmm.typ_val) :: ids + (id, machtype_of_value_kind kind) :: ids | Boxed (bn, false) -> let unboxed_id = V.create_local (VP.name id) in add_unboxed_id (VP.var id) unboxed_id bn env, @@ -795,8 +829,10 @@ and transl_prim_1 env p arg dbg = Popaque -> opaque (transl env arg) dbg (* Heap operations *) - | Pfield(n, _, mut) -> - get_field env mut (transl env arg) n dbg + | Pmakelazyblock tag -> + make_alloc dbg (Lambda.tag_of_lazy_tag tag) [transl env arg] + | Pfield(n, imm_or_pointer, mut) -> + get_field env imm_or_pointer mut (transl env arg) n dbg | Pfloatfield n -> let ptr = transl env arg in box_float dbg (floatfield n ptr dbg) @@ -861,16 +897,11 @@ and transl_prim_1 env p arg dbg = dbg) | Pdls_get -> Cop(Cdls_get, [transl env arg], dbg) - | Patomic_load {immediate_or_pointer = Immediate} -> - Cop(mk_load_atomic Word_int, [transl env arg], dbg) - | Patomic_load {immediate_or_pointer = Pointer} -> - Cop(mk_load_atomic Word_val, [transl env arg], dbg) | Ppoll -> (Csequence (remove_unit (transl env arg), return_unit dbg (Cop(Cpoll, [], dbg)))) | (Pfield_computed | Psequand | Psequor | Prunstack | Presume | Preperform - | Patomic_exchange | Patomic_cas | Patomic_fetch_add | Paddint | Psubint | Pmulint | Pandint | Porint | Pxorint | Plslint | Plsrint | Pasrint | Paddfloat | Psubfloat | Pmulfloat | Pdivfloat @@ -886,7 +917,9 @@ and transl_prim_1 env p arg dbg = | Plslbint _ | Plsrbint _ | Pasrbint _ | Pbintcomp (_, _) | Pbigarrayref (_, _, _, _) | Pbigarrayset (_, _, _, _) | Pbigarraydim _ | Pstring_load _ | Pbytes_load _ | Pbytes_set _ - | Pbigstring_load _ | Pbigstring_set _) + | Pbigstring_load _ | Pbigstring_set _ + | Patomic_load + ) -> fatal_errorf "Cmmgen.transl_prim_1: %a" Printclambda_primitives.primitive p @@ -903,6 +936,12 @@ and transl_prim_2 env p arg1 arg2 dbg = let float_val = transl_unbox_float dbg env arg2 in setfloatfield n init ptr float_val dbg + | Patomic_load -> + let ptr = transl env arg1 in + let ofs = transl env arg2 in + Cop(mk_load_atomic Word_val, + [field_address_computed ptr ofs dbg], dbg) + (* Boolean operations *) | Psequand -> let dbg' = Debuginfo.none in @@ -1054,14 +1093,7 @@ and transl_prim_2 env p arg1 arg2 dbg = tag_int (Cop(Ccmpi cmp, [transl_unbox_int dbg env bi arg1; transl_unbox_int dbg env bi arg2], dbg)) dbg - | Patomic_exchange -> - Cop (Cextcall ("caml_atomic_exchange", typ_val, [], false), - [transl env arg1; transl env arg2], dbg) - | Patomic_fetch_add -> - Cop (Cextcall ("caml_atomic_fetch_add", typ_int, [], false), - [transl env arg1; transl env arg2], dbg) | Prunstack | Pperform | Presume | Preperform | Pdls_get - | Patomic_cas | Patomic_load _ | Pnot | Pnegint | Pintoffloat | Pfloatofint | Pnegfloat | Pabsfloat | Pstringlength | Pbyteslength | Pbytessetu | Pbytessets | Pisint | Pbswap16 | Pint_as_pointer | Popaque | Pread_symbol _ @@ -1071,6 +1103,7 @@ and transl_prim_2 env p arg1 arg2 dbg = | Parraysets _ | Pbintofint _ | Pintofbint _ | Pcvtbint (_, _) | Pnegbint _ | Pbigarrayref (_, _, _, _) | Pbigarrayset (_, _, _, _) | Pbigarraydim _ | Pbytes_set _ | Pbigstring_set _ | Pbbswap _ | Ppoll + | Pmakelazyblock _ -> fatal_errorf "Cmmgen.transl_prim_2: %a" Printclambda_primitives.primitive p @@ -1113,10 +1146,6 @@ and transl_prim_3 env p arg1 arg2 arg3 dbg = bigstring_set size unsafe (transl env arg1) (transl env arg2) (transl_unbox_sized size dbg env arg3) dbg - | Patomic_cas -> - Cop (Cextcall ("caml_atomic_cas", typ_int, [], false), - [transl env arg1; transl env arg2; transl env arg3], dbg) - (* Effects *) | Prunstack -> @@ -1132,7 +1161,7 @@ and transl_prim_3 env p arg1 arg2 arg3 dbg = dbg) | Pperform | Pdls_get | Presume - | Patomic_exchange | Patomic_fetch_add | Patomic_load _ + | Patomic_load | Pfield_computed | Psequand | Psequor | Pnot | Pnegint | Paddint | Psubint | Pmulint | Pandint | Porint | Pxorint | Plslint | Plsrint | Pasrint | Pintoffloat | Pfloatofint | Pnegfloat | Pabsfloat | Paddfloat | Psubfloat @@ -1149,6 +1178,7 @@ and transl_prim_3 env p arg1 arg2 arg3 dbg = | Pxorbint _ | Plslbint _ | Plsrbint _ | Pasrbint _ | Pbintcomp (_, _) | Pbigarrayref (_, _, _, _) | Pbigarrayset (_, _, _, _) | Pbigarraydim _ | Pstring_load _ | Pbytes_load _ | Pbigstring_load _ | Pbbswap _ | Ppoll + | Pmakelazyblock _ -> fatal_errorf "Cmmgen.transl_prim_3: %a" Printclambda_primitives.primitive p @@ -1163,9 +1193,9 @@ and transl_prim_4 env p arg1 arg2 arg3 arg4 dbg = dbg) | Psetfield_computed _ | Pbytessetu | Pbytessets | Parraysetu _ - | Parraysets _ | Pbytes_set _ | Pbigstring_set _ | Patomic_cas + | Parraysets _ | Pbytes_set _ | Pbigstring_set _ | Prunstack | Preperform | Pperform | Pdls_get - | Patomic_exchange | Patomic_fetch_add | Patomic_load _ + | Patomic_load | Pfield_computed | Psequand | Psequor | Pnot | Pnegint | Paddint | Psubint | Pmulint | Pandint | Porint | Pxorint | Plslint | Plsrint | Pasrint | Pintoffloat | Pfloatofint | Pnegfloat | Pabsfloat | Paddfloat | Psubfloat @@ -1182,6 +1212,7 @@ and transl_prim_4 env p arg1 arg2 arg3 arg4 dbg = | Pxorbint _ | Plslbint _ | Plsrbint _ | Pasrbint _ | Pbintcomp (_, _) | Pbigarrayref (_, _, _, _) | Pbigarrayset (_, _, _, _) | Pbigarraydim _ | Pstring_load _ | Pbytes_load _ | Pbigstring_load _ | Pbbswap _ | Ppoll + | Pmakelazyblock _ -> fatal_errorf "Cmmgen.transl_prim_3: %a" Printclambda_primitives.primitive p @@ -1238,19 +1269,27 @@ and transl_let env str kind id exp transl_body = (* N.B. [body] must still be traversed even if [exp] will never return: there may be constant closures inside that need lifting out. *) begin match str, kind with - | Immutable, _ -> Clet(id, cexp, transl_body env) - | Mutable, Pintval -> Clet_mut(id, typ_int, cexp, transl_body env) - | Mutable, _ -> Clet_mut(id, typ_val, cexp, transl_body env) + | Immutable, _ -> + Clet(id, cexp, transl_body env) + | Mutable, Pintval -> + Clet_mut(id, typ_int, cexp, + transl_body (add_mutable_id (VP.var id) env)) + | Mutable, _ -> + Clet_mut(id, typ_val, cexp, + transl_body (add_mutable_id (VP.var id) env)) end | Boxed (boxed_number, false) -> let unboxed_id = V.create_local (VP.name id) in let v = VP.create unboxed_id in let cexp = unbox_number dbg boxed_number cexp in - let body = + let body env = transl_body (add_unboxed_id (VP.var id) unboxed_id boxed_number env) in begin match str, boxed_number with - | Immutable, _ -> Clet (v, cexp, body) - | Mutable, bn -> Clet_mut (v, typ_of_boxed_number bn, cexp, body) + | Immutable, _ -> + Clet (v, cexp, body env) + | Mutable, bn -> + Clet_mut (v, typ_of_boxed_number bn, cexp, + body (add_mutable_id unboxed_id env)) end and make_catch ncatch body handler dbg = match body with @@ -1402,7 +1441,6 @@ and transl_switch dbg env arg index cases = match Array.length cases with let cases = Array.map (transl env) cases in transl_switch_clambda dbg arg index cases - (* Translate a function definition *) let transl_function f = @@ -1422,8 +1460,13 @@ let transl_function f = else [ Reduce_code_size ] in + let fun_args = + List.map (fun (id, value_kind) -> + (id, machtype_of_value_kind value_kind)) + f.params + in Cfunction {fun_name = f.label; - fun_args = List.map (fun (id, _) -> (id, typ_val)) f.params; + fun_args; fun_body = cmm_body; fun_codegen_options; fun_poll = f.poll; diff --git a/asmcomp/emitaux.ml b/asmcomp/emitaux.ml index 306e2492..835e3f4b 100644 --- a/asmcomp/emitaux.ml +++ b/asmcomp/emitaux.ml @@ -35,7 +35,10 @@ let emit_printf fmt = let emit_int32 n = emit_printf "0x%lx" n +let macosx = Config.system = "macosx" + let emit_symbol s = + if macosx then output_char !output_channel '_'; for i = 0 to String.length s - 1 do let c = s.[i] in match c with @@ -45,7 +48,8 @@ let emit_symbol s = if c = Compilenv.symbol_separator then output_char !output_channel c else - Printf.fprintf !output_channel "$%02x" (Char.code c) + Printf.fprintf !output_channel "%s%02x" Compilenv.escape_prefix + (Char.code c) done let emit_string_literal s = @@ -111,6 +115,29 @@ let emit_float64_split_directive directive x = let emit_float32_directive directive x = emit_printf "\t%s\t0x%lx\n" directive x +let emit_size_directive symbol = + if Config.asm_size_type_directives then begin + emit_string "\t.size\t"; + emit_symbol symbol; + emit_string ", . - "; + emit_symbol symbol; + emit_char '\n' + end + +let emit_type_directive symbol ty = + if Config.asm_size_type_directives then begin + emit_string "\t.type\t"; + emit_symbol symbol; + emit_string ", "; + emit_string ty; + emit_char '\n' + end + +let emit_nonexecstack_note () = + if Config.with_nonexecstack_note then begin + emit_string "\t.section .note.GNU-stack,\"\",%progbits\n" + end + (* Record live pointers at call points *) type frame_debuginfo = diff --git a/asmcomp/emitaux.mli b/asmcomp/emitaux.mli index d174fa92..37f1b18f 100644 --- a/asmcomp/emitaux.mli +++ b/asmcomp/emitaux.mli @@ -30,6 +30,19 @@ val emit_float64_directive: string -> int64 -> unit val emit_float64_split_directive: string -> int64 -> unit val emit_float32_directive: string -> int32 -> unit +val emit_size_directive: string -> unit +(** [emit_size_directive symbol] + Emit a [.size] assembler directive for the given [symbol] when it is + supported by the assembler *) + +val emit_type_directive: string -> string -> unit +(** [emit_type_directive symbol typ] + Emit a [.type] assembler directive that [symbol] has type [typ] when it is + supported by the assembler *) + +val emit_nonexecstack_note : unit -> unit +(** Emit a [.note.GNU-stack] section when it is supported by the linker *) + val reset : unit -> unit val reset_debug_info: unit -> unit val emit_debug_info: Debuginfo.t -> unit diff --git a/asmcomp/power/emit.mlp b/asmcomp/power/emit.mlp index f9303ea6..d0c88c28 100644 --- a/asmcomp/power/emit.mlp +++ b/asmcomp/power/emit.mlp @@ -184,7 +184,7 @@ let load_mnemonic = function | Sixteen_signed -> "lha" | Thirtytwo_unsigned -> "lwz" | Thirtytwo_signed -> "lwa" - | Word_int | Word_val -> "ld" + | Word_int | Word_val | Sixtyfour -> "ld" | Single -> "lfs" | Double -> "lfd" @@ -192,7 +192,7 @@ let store_mnemonic = function | Byte_unsigned | Byte_signed -> "stb" | Sixteen_unsigned | Sixteen_signed -> "sth" | Thirtytwo_unsigned | Thirtytwo_signed -> "stw" - | Word_int | Word_val -> "std" + | Word_int | Word_val | Sixtyfour -> "std" | Single -> "stfs" | Double -> "stfd" @@ -480,6 +480,7 @@ module BR = Branch_relaxation.Make (struct | Lreturn -> 2 | Llabel _ -> 0 | Lbranch _ -> 1 + | Lcondbranch (Ifloattest(CFle | CFnle | CFge | CFnge), _) -> 3 | Lcondbranch _ -> 2 | Lcondbranch3(lbl0, lbl1, lbl2) -> 1 + (if lbl0 = None then 0 else 1) @@ -1018,7 +1019,7 @@ let fundecl fundecl = end; (* Function entry point *) ` .globl {emit_symbol fundecl.fun_name}\n`; - ` .type {emit_symbol fundecl.fun_name}, @function\n`; + emit_type_directive fundecl.fun_name "@function"; `{emit_symbol fundecl.fun_name}:\n`; `0: addis 2, 12, (.TOC. - 0b)@ha\n`; ` addi 2, 2, (.TOC. - 0b)@l\n`; @@ -1054,7 +1055,7 @@ let fundecl fundecl = (* Emit the glue code to handle bound errors *) emit_call_bound_errors env; cfi_endproc(); - ` .size {emit_symbol fundecl.fun_name}, . - {emit_symbol fundecl.fun_name}\n`; + emit_size_directive fundecl.fun_name; (* Emit the numeric literals *) if env.float_literals <> [] then begin emit_string rodata_space; @@ -1082,7 +1083,7 @@ let fundecl fundecl = let declare_global_data s = ` .globl {emit_symbol s}\n`; - ` .type {emit_symbol s}, @object\n` + emit_type_directive s "@object" let emit_item = function Cglobal_symbol s -> @@ -1166,8 +1167,9 @@ let end_assembly() = efa_def_label = (fun l -> `{emit_label l}:\n`); efa_string = (fun s -> emit_bytes_directive " .byte " (s ^ "\000")) }; + emit_size_directive lbl; (* Emit the TOC entries *) emit_string toc_space; emit_toctable(); Hashtbl.clear tocref_entries; - ` .section .note.GNU-stack,\"\",%progbits\n` + emit_nonexecstack_note () diff --git a/asmcomp/printcmm.ml b/asmcomp/printcmm.ml index 7f98cc21..755119f1 100644 --- a/asmcomp/printcmm.ml +++ b/asmcomp/printcmm.ml @@ -81,6 +81,7 @@ let chunk = function | Sixteen_signed -> "signed int16" | Thirtytwo_unsigned -> "unsigned int32" | Thirtytwo_signed -> "signed int32" + | Sixtyfour -> "int64" | Word_int -> "int" | Word_val -> "val" | Single -> "float32" @@ -117,10 +118,15 @@ let operation d = function | Capply _ty -> "app" ^ location d | Cextcall(lbl, _ty_res, _ty_args, _alloc) -> Printf.sprintf "extcall \"%s\"%s" lbl (location d) - | Cload {memory_chunk; mutability} -> ( - match mutability with - | Asttypes.Immutable -> Printf.sprintf "load %s" (chunk memory_chunk) - | Asttypes.Mutable -> Printf.sprintf "load_mut %s" (chunk memory_chunk)) + | Cload {memory_chunk; mutability; is_atomic} -> + let op = + ["load"] + @ (match mutability with + | Asttypes.Immutable -> [] + | Asttypes.Mutable -> ["mut"]) + @ (if is_atomic then ["atomic"] else []) + in + Printf.sprintf "%s %s" (String.concat "_" op) (chunk memory_chunk) | Calloc -> "alloc" ^ location d | Cstore (c, init) -> let init = @@ -168,6 +174,7 @@ let rec expr ppf = function | Cconst_float (n, _dbg) -> fprintf ppf "%F" n | Cconst_symbol (s, _dbg) -> fprintf ppf "\"%s\"" s | Cvar id -> V.print ppf id + | Cvar_mut id -> fprintf ppf "!%a" V.print id | Creturn_addr -> fprintf ppf "return_addr" | Clet(id, def, (Clet(_, _, _) as body)) -> let print_binding id ppf def = diff --git a/asmcomp/riscv/NOTES.md b/asmcomp/riscv/NOTES.md index 0f17876b..8f9021f4 100644 --- a/asmcomp/riscv/NOTES.md +++ b/asmcomp/riscv/NOTES.md @@ -13,4 +13,4 @@ Debian architecture name: `riscv64` - https://github.com/riscv-non-isa/riscv-elf-psabi-doc/blob/master/riscv-elf.adoc * Assembly language manual - - https://github.com/riscv/riscv-asm-manual/blob/master/riscv-asm.md + - https://github.com/riscv-non-isa/riscv-asm-manual/blob/main/src/asm-manual.adoc diff --git a/asmcomp/riscv/emit.mlp b/asmcomp/riscv/emit.mlp index 964dc4db..a08d9f9a 100644 --- a/asmcomp/riscv/emit.mlp +++ b/asmcomp/riscv/emit.mlp @@ -339,7 +339,7 @@ let emit_instr env i = at noalloc calls *) ` mv s0, sp\n`; cfi_remember_state (); - cfi_def_cfa_register ~reg:21; + cfi_def_cfa_register ~reg:8; let ofs = Domainstate.(idx_of_field Domain_c_stack) * 8 in ` ld sp, {emit_int ofs}({emit_reg reg_domain_state_ptr})\n`; ` {emit_call func}\n`; @@ -354,7 +354,7 @@ let emit_instr env i = assert (not is_atomic); ` flw {emit_reg i.res.(0)}, {emit_int ofs}({emit_reg i.arg.(0)})\n`; ` fcvt.d.s {emit_reg i.res.(0)}, {emit_reg i.res.(0)}\n` - | Lop(Iload { memory_chunk = Word_int | Word_val; addressing_mode = Iindexed ofs; is_atomic } ) -> + | Lop(Iload { memory_chunk = Sixtyfour | Word_int | Word_val; addressing_mode = Iindexed ofs; is_atomic } ) -> if is_atomic then ` fence rw, rw\n`; ` ld {emit_reg i.res.(0)}, {emit_int ofs}({emit_reg i.arg.(0)})\n`; if is_atomic then ` fence r, rw\n` @@ -368,7 +368,7 @@ let emit_instr env i = | Sixteen_signed -> "lh" | Thirtytwo_unsigned -> "lwu" | Thirtytwo_signed -> "lw" - | Word_int | Word_val | Single -> assert false + | Word_int | Word_val | Single | Sixtyfour -> assert false | Double -> "fld" in ` {emit_string instr} {emit_reg i.res.(0)}, {emit_int ofs}({emit_reg i.arg.(0)})\n` @@ -389,6 +389,7 @@ let emit_instr env i = | Sixteen_unsigned | Sixteen_signed -> "sh" | Thirtytwo_unsigned | Thirtytwo_signed -> "sw" | Word_int | Word_val | Single -> assert false + | Sixtyfour -> "sd" | Double -> "fsd" in ` {emit_string instr} {emit_reg i.arg.(0)}, {emit_int ofs}({emit_reg i.arg.(1)})\n` @@ -619,7 +620,7 @@ let rec emit_all env = function let fundecl fundecl = let env = mk_env fundecl in ` .globl {emit_symbol fundecl.fun_name}\n`; - ` .type {emit_symbol fundecl.fun_name}, @function\n`; + emit_type_directive fundecl.fun_name "@function"; emit_named_text_section fundecl.fun_name; ` .align 2\n`; `{emit_symbol fundecl.fun_name}:\n`; @@ -666,7 +667,7 @@ let fundecl fundecl = end; cfi_endproc(); - ` .size {emit_symbol fundecl.fun_name}, .-{emit_symbol fundecl.fun_name}\n`; + emit_size_directive fundecl.fun_name; (* Emit the float literals *) if env.float_literals <> [] then begin ` {emit_string rodata_space}\n`; @@ -682,7 +683,7 @@ let fundecl fundecl = let declare_global_data s = ` .globl {emit_symbol s}\n`; - ` .type {emit_symbol s}, @object\n` + emit_type_directive s "@object" let emit_item = function | Cglobal_symbol s -> @@ -759,4 +760,6 @@ let end_assembly() = ` .long ({emit_label lbl} - .) + {emit_int32 ofs}\n`); efa_def_label = (fun l -> `{emit_label l}:\n`); efa_string = (fun s -> emit_bytes_directive " .byte " (s ^ "\000")) - } + }; + emit_size_directive lbl; + emit_nonexecstack_note () diff --git a/asmcomp/s390x/emit.mlp b/asmcomp/s390x/emit.mlp index 9959ff15..9382a4e1 100644 --- a/asmcomp/s390x/emit.mlp +++ b/asmcomp/s390x/emit.mlp @@ -384,7 +384,7 @@ let emit_instr env i = cfi_def_cfa_register "%r12"; (* NB: gdb has asserts on contiguous stacks that mean it will not unwind through this unless we were to tag this - calling frame with cfi_signal_frame in it's definition. *) + calling frame with cfi_signal_frame in its definition. *) let offset = Domainstate.(idx_of_field Domain_c_stack) * 8 in ` lg %r15, {emit_int offset}(%r10)\n`; emit_call func; @@ -405,7 +405,7 @@ let emit_instr env i = | Sixteen_signed -> "lgh" | Thirtytwo_unsigned -> "llgf" | Thirtytwo_signed -> "lgf" - | Word_int | Word_val -> "lg" + | Word_int | Word_val | Sixtyfour -> "lg" | Single -> "ley" | Double -> "ldy" in emit_load_store loadinstr addressing_mode i.arg 0 i.res.(0); @@ -421,7 +421,7 @@ let emit_instr env i = Byte_unsigned | Byte_signed -> "stcy" | Sixteen_unsigned | Sixteen_signed -> "sthy" | Thirtytwo_unsigned | Thirtytwo_signed -> "sty" - | Word_int | Word_val -> "stg" + | Word_int | Word_val | Sixtyfour -> "stg" | Single -> assert false | Double -> "stdy" in emit_load_store storeinstr addr i.arg 1 i.arg.(0) @@ -718,7 +718,7 @@ let fundecl fundecl = let env = mk_env fundecl in ` .globl {emit_symbol fundecl.fun_name}\n`; emit_debug_info fundecl.fun_dbg; - ` .type {emit_symbol fundecl.fun_name}, @function\n`; + emit_type_directive fundecl.fun_name "@function"; emit_named_text_section fundecl.fun_name; ` .align 8\n`; `{emit_symbol fundecl.fun_name}:\n`; @@ -763,6 +763,7 @@ let fundecl fundecl = end; cfi_endproc (); + emit_size_directive fundecl.fun_name; (* Emit the numeric literals *) if env.float_literals <> [] || env.int_literals <> [] then begin emit_string rodata_space; @@ -782,7 +783,7 @@ let fundecl fundecl = let declare_global_data s = ` .globl {emit_symbol s}\n`; - ` .type {emit_symbol s}, @object\n` + emit_type_directive s "@object" let emit_item = function Cglobal_symbol s -> @@ -865,5 +866,5 @@ let end_assembly() = efa_def_label = (fun l -> `{emit_label l}:\n`); efa_string = (fun s -> emit_bytes_directive " .byte " (s ^ "\000")) }; - (* Mark stack as non-executable *) - ` .section .note.GNU-stack,\"\",%progbits\n` + emit_size_directive lbl; + emit_nonexecstack_note () diff --git a/asmcomp/selectgen.ml b/asmcomp/selectgen.ml index 8226a39c..fcf3aee9 100644 --- a/asmcomp/selectgen.ml +++ b/asmcomp/selectgen.ml @@ -110,7 +110,7 @@ let size_expr (env:environment) exp = | Cconst_symbol _ -> Arch.size_addr | Cconst_float _ -> Arch.size_float - | Cvar id -> + | Cvar id | Cvar_mut id -> begin try V.Map.find id localenv with Not_found -> @@ -336,7 +336,7 @@ method is_simple_expr = function List.for_all self#is_simple_expr args end | Cassign _ | Cifthenelse _ | Cswitch _ | Ccatch _ | Cexit _ - | Ctrywith _ -> false + | Ctrywith _ | Cvar_mut _ -> false (* Analyses the effects and coeffects of an expression. This is used across a whole list of expressions with a view to determining which expressions @@ -355,6 +355,7 @@ method effects_of exp = match exp with | Cconst_int _ | Cconst_natint _ | Cconst_float _ | Cconst_symbol _ | Cvar _ | Creturn_addr -> EC.none + | Cvar_mut _ -> EC.coeffect_only Coeffect.Read_mutable | Ctuple el -> EC.join_list_map el self#effects_of | Clet (_id, arg, body) | Clet_mut (_id, _, arg, body) -> EC.join (self#effects_of arg) (self#effects_of body) @@ -605,7 +606,7 @@ method emit_expr (env:environment) exp = | Creturn_addr -> let r = self#regs_for typ_int in Some(self#insert_op env Ireturn_addr [||] r) - | Cvar v -> + | Cvar v | Cvar_mut v -> begin try Some(env_find v env) with Not_found -> @@ -1122,7 +1123,7 @@ method emit_tail (env:environment) exp = end | Cop _ | Cconst_int _ | Cconst_natint _ | Cconst_float _ | Cconst_symbol _ - | Cvar _ + | Cvar _ | Cvar_mut _ | Creturn_addr | Cassign _ | Ctuple _ diff --git a/asmcomp/thread_sanitizer.ml b/asmcomp/thread_sanitizer.ml index 362a8953..685bbd7f 100644 --- a/asmcomp/thread_sanitizer.ml +++ b/asmcomp/thread_sanitizer.ml @@ -34,6 +34,7 @@ let bit_size memory_chunk = | Byte_unsigned | Byte_signed -> 8 | Sixteen_unsigned | Sixteen_signed -> 16 | Thirtytwo_unsigned | Thirtytwo_signed -> 32 + | Sixtyfour -> 64 | Word_int | Word_val -> Sys.word_size | Single -> 32 | Double -> 64 @@ -57,7 +58,7 @@ end let machtype_of_memory_chunk = function | Byte_unsigned | Byte_signed | Sixteen_unsigned | Sixteen_signed - | Thirtytwo_unsigned | Thirtytwo_signed | Word_int -> + | Thirtytwo_unsigned | Thirtytwo_signed | Word_int | Sixtyfour -> typ_int | Word_val -> typ_val | Single | Double -> typ_float @@ -154,7 +155,7 @@ let wrap_entry_exit expr = | Cconst_natint (_, _) | Cconst_float (_, _) | Cconst_symbol (_, _) - | Cvar _ | Ctuple _ | Creturn_addr ) as expr -> + | Cvar _ | Cvar_mut _ | Ctuple _ | Creturn_addr ) as expr -> let id = VP.create (V.create_local "res") in Clet (id, expr, Csequence (call_exit, Cvar (VP.var id))) in @@ -285,7 +286,7 @@ let instrument body = Cswitch (aux e, cases, handlers, dbg_none) (* no instrumentation *) | ( Cconst_int _ | Cconst_natint _ | Cconst_float _ | Cconst_symbol _ - | Cvar _ | Creturn_addr ) as c -> + | Cvar _ | Cvar_mut _ | Creturn_addr ) as c -> c in body |> aux |> wrap_entry_exit diff --git a/asmcomp/x86_proc.ml b/asmcomp/x86_proc.ml index b7abe4d3..959559fa 100644 --- a/asmcomp/x86_proc.ml +++ b/asmcomp/x86_proc.ml @@ -82,12 +82,8 @@ let string_of_symbol prefix s = Buffer.add_string b prefix; String.iter (fun c -> - (* FIXME: using $ to prefix escaped characters can make names - ambiguous if the symbol separator is also set to $; a different - escape prefix should be used in this case, if this ever causes - problems in the real world. *) if is_special_char c then - Printf.bprintf b "$%02x" (Char.code c) + Printf.bprintf b "%s%02x" Compilenv.escape_prefix (Char.code c) else Buffer.add_char b c ) diff --git a/boot/menhir/menhirLib.ml b/boot/menhir/menhirLib.ml index ee7f581f..8cc924e3 100644 --- a/boot/menhir/menhirLib.ml +++ b/boot/menhir/menhirLib.ml @@ -3834,5 +3834,5 @@ module MakeEngineTable (T : TableFormat.TABLES) = struct end end module StaticVersion = struct -let require_20231231 = () +let require_20240715 = () end diff --git a/boot/menhir/menhirLib.mli b/boot/menhir/menhirLib.mli index 2156459d..870b50eb 100644 --- a/boot/menhir/menhirLib.mli +++ b/boot/menhir/menhirLib.mli @@ -1793,5 +1793,5 @@ module MakeEngineTable and type nonterminal = int end module StaticVersion : sig -val require_20231231: unit +val require_20240715: unit end diff --git a/boot/menhir/parser.ml b/boot/menhir/parser.ml index 5dc3ac7e..93187f1d 100644 --- a/boot/menhir/parser.ml +++ b/boot/menhir/parser.ml @@ -2,7 +2,7 @@ (* This generated code requires the following version of MenhirLib: *) let () = - MenhirLib.StaticVersion.require_20231231 + MenhirLib.StaticVersion.require_20240715 module MenhirBasics = struct @@ -20,7 +20,7 @@ module MenhirBasics = struct | VAL | UNDERSCORE | UIDENT of ( -# 848 "parsing/parser.mly" +# 836 "parsing/parser.mly" (string) # 26 "parsing/parser.ml" ) @@ -32,7 +32,7 @@ module MenhirBasics = struct | THEN | STRUCT | STRING of ( -# 835 "parsing/parser.mly" +# 823 "parsing/parser.mly" (string * Location.t * string option) # 38 "parsing/parser.ml" ) @@ -45,12 +45,12 @@ module MenhirBasics = struct | RBRACKET | RBRACE | QUOTED_STRING_ITEM of ( -# 839 "parsing/parser.mly" +# 827 "parsing/parser.mly" (string * Location.t * string * Location.t * string option) # 51 "parsing/parser.ml" ) | QUOTED_STRING_EXPR of ( -# 837 "parsing/parser.mly" +# 825 "parsing/parser.mly" (string * Location.t * string * Location.t * string option) # 56 "parsing/parser.ml" ) @@ -58,7 +58,7 @@ module MenhirBasics = struct | QUESTION | PRIVATE | PREFIXOP of ( -# 821 "parsing/parser.mly" +# 809 "parsing/parser.mly" (string) # 64 "parsing/parser.ml" ) @@ -68,7 +68,7 @@ module MenhirBasics = struct | PERCENT | OR | OPTLABEL of ( -# 814 "parsing/parser.mly" +# 802 "parsing/parser.mly" (string) # 74 "parsing/parser.ml" ) @@ -89,12 +89,12 @@ module MenhirBasics = struct | MATCH | LPAREN | LIDENT of ( -# 797 "parsing/parser.mly" +# 785 "parsing/parser.mly" (string) # 95 "parsing/parser.ml" ) | LETOP of ( -# 779 "parsing/parser.mly" +# 767 "parsing/parser.mly" (string) # 100 "parsing/parser.ml" ) @@ -114,39 +114,39 @@ module MenhirBasics = struct | LBRACE | LAZY | LABEL of ( -# 784 "parsing/parser.mly" +# 772 "parsing/parser.mly" (string) # 120 "parsing/parser.ml" ) | INT of ( -# 783 "parsing/parser.mly" +# 771 "parsing/parser.mly" (string * char option) # 125 "parsing/parser.ml" ) | INITIALIZER | INHERIT | INFIXOP4 of ( -# 777 "parsing/parser.mly" +# 765 "parsing/parser.mly" (string) # 132 "parsing/parser.ml" ) | INFIXOP3 of ( -# 776 "parsing/parser.mly" +# 764 "parsing/parser.mly" (string) # 137 "parsing/parser.ml" ) | INFIXOP2 of ( -# 775 "parsing/parser.mly" +# 763 "parsing/parser.mly" (string) # 142 "parsing/parser.ml" ) | INFIXOP1 of ( -# 774 "parsing/parser.mly" +# 762 "parsing/parser.mly" (string) # 147 "parsing/parser.ml" ) | INFIXOP0 of ( -# 773 "parsing/parser.mly" +# 761 "parsing/parser.mly" (string) # 152 "parsing/parser.ml" ) @@ -154,7 +154,7 @@ module MenhirBasics = struct | IN | IF | HASHOP of ( -# 832 "parsing/parser.mly" +# 820 "parsing/parser.mly" (string) # 160 "parsing/parser.ml" ) @@ -167,7 +167,7 @@ module MenhirBasics = struct | FUN | FOR | FLOAT of ( -# 762 "parsing/parser.mly" +# 750 "parsing/parser.mly" (string * char option) # 173 "parsing/parser.ml" ) @@ -182,7 +182,7 @@ module MenhirBasics = struct | EFFECT | DOWNTO | DOTOP of ( -# 778 "parsing/parser.mly" +# 766 "parsing/parser.mly" (string) # 188 "parsing/parser.ml" ) @@ -190,14 +190,14 @@ module MenhirBasics = struct | DOT | DONE | DOCSTRING of ( -# 856 "parsing/parser.mly" +# 844 "parsing/parser.mly" (Docstrings.docstring) # 196 "parsing/parser.ml" ) | DO | CONSTRAINT | COMMENT of ( -# 855 "parsing/parser.mly" +# 843 "parsing/parser.mly" (string * Location.t) # 203 "parsing/parser.ml" ) @@ -208,7 +208,7 @@ module MenhirBasics = struct | COLON | CLASS | CHAR of ( -# 741 "parsing/parser.mly" +# 729 "parsing/parser.mly" (char) # 214 "parsing/parser.ml" ) @@ -221,7 +221,7 @@ module MenhirBasics = struct | ASSERT | AS | ANDOP of ( -# 780 "parsing/parser.mly" +# 768 "parsing/parser.mly" (string) # 227 "parsing/parser.ml" ) @@ -262,8 +262,8 @@ let ghost_loc (startpos, endpos) = { } let mktyp ~loc ?attrs d = Typ.mk ~loc:(make_loc loc) ?attrs d -let mkpat ~loc d = Pat.mk ~loc:(make_loc loc) d -let mkexp ~loc d = Exp.mk ~loc:(make_loc loc) d +let mkpat ~loc ?attrs d = Pat.mk ~loc:(make_loc loc) ?attrs d +let mkexp ~loc ?attrs d = Exp.mk ~loc:(make_loc loc) ?attrs d let mkmty ~loc ?attrs d = Mty.mk ~loc:(make_loc loc) ?attrs d let mksig ~loc d = Sig.mk ~loc:(make_loc loc) d let mkmod ~loc ?attrs d = Mod.mk ~loc:(make_loc loc) ?attrs d @@ -307,6 +307,8 @@ let mkcf ~loc ?attrs ?docs d = let mkrhs rhs loc = mkloc rhs (make_loc loc) let ghrhs rhs loc = mkloc rhs (ghost_loc loc) +let ldot lid lid_loc name loc = Ldot (mkrhs lid lid_loc, mkrhs name loc) + let push_loc x acc = if x.Location.loc_ghost then acc @@ -318,7 +320,7 @@ let reloc_pat ~loc x = let reloc_exp ~loc x = { x with pexp_loc = make_loc loc; pexp_loc_stack = push_loc x.pexp_loc x.pexp_loc_stack } -let reloc_typ ~loc x = +let _reloc_typ ~loc x = { x with ptyp_loc = make_loc loc; ptyp_loc_stack = push_loc x.ptyp_loc x.ptyp_loc_stack } @@ -332,25 +334,14 @@ let mkpatvar ~loc name = mkpat ~loc (Ppat_var (mkrhs name loc)) (* - Ghost expressions and patterns: - expressions and patterns that do not appear explicitly in the - source file they have the loc_ghost flag set to true. - Then the profiler will not try to instrument them and the - -annot option will not try to display their type. + See ./location.mli for when to use a ghost location or not. Every grammar rule that generates an element with a location must make at most one non-ghost element, the topmost one. - - How to tell whether your location must be ghost: - A location corresponds to a range of characters in the source file. - If the location contains a piece of code that is syntactically - valid (according to the documentation), and corresponds to the - AST node, then the location must be real; in all other cases, - it must be ghost. *) -let ghexp ~loc d = Exp.mk ~loc:(ghost_loc loc) d -let ghpat ~loc d = Pat.mk ~loc:(ghost_loc loc) d -let ghtyp ~loc d = Typ.mk ~loc:(ghost_loc loc) d +let ghexp ~loc ?attrs d = Exp.mk ~loc:(ghost_loc loc) ?attrs d +let ghpat ~loc ?attrs d = Pat.mk ~loc:(ghost_loc loc) ?attrs d +let ghtyp ~loc ?attrs d = Typ.mk ~loc:(ghost_loc loc) ?attrs d let ghloc ~loc d = { txt = d; loc = ghost_loc loc } let ghstr ~loc d = Str.mk ~loc:(ghost_loc loc) d let ghsig ~loc d = Sig.mk ~loc:(ghost_loc loc) d @@ -421,7 +412,9 @@ let rec mktailexp nilloc = let open Location in function | e1 :: el -> let exp_el, el_loc = mktailexp nilloc el in let loc = (e1.pexp_loc.loc_start, snd el_loc) in - let arg = ghexp ~loc (Pexp_tuple [e1; ghexp ~loc:el_loc exp_el]) in + let arg = + ghexp ~loc (Pexp_tuple [None, e1; None, ghexp ~loc:el_loc exp_el]) + in ghexp_cons_desc loc arg, loc let rec mktailpat nilloc = let open Location in function @@ -431,7 +424,10 @@ let rec mktailpat nilloc = let open Location in function | p1 :: pl -> let pat_pl, el_loc = mktailpat nilloc pl in let loc = (p1.ppat_loc.loc_start, snd el_loc) in - let arg = ghpat ~loc (Ppat_tuple [p1; ghpat ~loc:el_loc pat_pl]) in + let arg = + ghpat ~loc + (Ppat_tuple ([None, p1; None, ghpat ~loc:el_loc pat_pl], Closed)) + in ghpat_cons_desc loc arg, loc let mkstrexp e attrs = @@ -531,9 +527,12 @@ type ('dot,'index) array_family = { } -let bigarray_untuplify = function - { pexp_desc = Pexp_tuple explist; pexp_loc = _ } -> explist - | exp -> [exp] +let bigarray_untuplify exp = + match exp.pexp_desc with + | Pexp_tuple explist + when List.for_all (fun (l, _) -> Option.is_none l) explist -> + List.map snd explist + | _ -> [exp] let builtin_arraylike_name loc _ ~assign paren_kind n = let opname = if assign then "set" else "get" in @@ -549,8 +548,8 @@ let builtin_arraylike_name loc _ ~assign paren_kind n = | Two -> "Array2" | Three -> "Array3" | Many -> "Genarray" in - Ldot(Lident "Bigarray", submodule_name) in - ghloc ~loc (Ldot(prefix,opname)) + Ldot(mknoloc (Lident "Bigarray"), mknoloc submodule_name) in + ghloc ~loc (Ldot(mknoloc prefix, mknoloc opname)) let builtin_arraylike_index loc paren_kind index = match paren_kind with | Paren | Bracket -> One, [Nolabel, index] @@ -580,7 +579,7 @@ let user_indexing_operator_name loc (prefix,ext) ~assign paren_kind n = String.concat "" ["."; ext; left; mid; right; assign] in let lid = match prefix with | None -> Lident name - | Some p -> Ldot(p,name) in + | Some p -> Ldot(mknoloc p,mknoloc name) in ghloc ~loc lid let user_index loc _ index = @@ -609,9 +608,9 @@ let indexop_unclosed_error loc_s s loc_e = let left, right = paren_to_strings s in unclosed left loc_s right loc_e -let lapply ~loc p1 p2 = +let lapply ~loc p1 loc_p1 p2 loc_p2 = if !Clflags.applicative_functors - then Lapply(p1, p2) + then Lapply(mkrhs p1 loc_p1, mkrhs p2 loc_p2) else raise (Syntaxerr.Error( Syntaxerr.Applicative_path (make_loc loc))) @@ -649,33 +648,28 @@ let wrap_type_annotation ~loc newtypes core_type body = let exp = mk_newtypes newtypes exp in (exp, ghtyp(Ptyp_poly(newtypes, Typ.varify_constructors newtypes core_type))) -let wrap_exp_attrs ~loc body (ext, attrs) = - let ghexp = ghexp ~loc in +let pexp_extension ~id e = Pexp_extension (id, PStr [mkstrexp e []]) + +let mkexp_attrs ~loc desc (ext, attrs) = (* todo: keep exact location for the entire attribute *) - let body = {body with pexp_attributes = attrs @ body.pexp_attributes} in match ext with - | None -> body - | Some id -> ghexp(Pexp_extension (id, PStr [mkstrexp body []])) + | None -> mkexp ~loc ~attrs desc + | Some id -> + mkexp ~loc (pexp_extension ~id (ghexp ~loc ~attrs desc)) -let mkexp_attrs ~loc d attrs = - wrap_exp_attrs ~loc (mkexp ~loc d) attrs - -let wrap_typ_attrs ~loc typ (ext, attrs) = +let mktyp_attrs ~loc desc (ext, attrs) = (* todo: keep exact location for the entire attribute *) - let typ = {typ with ptyp_attributes = attrs @ typ.ptyp_attributes} in match ext with - | None -> typ - | Some id -> ghtyp ~loc (Ptyp_extension (id, PTyp typ)) + | None -> mktyp ~loc ~attrs desc + | Some id -> + mktyp ~loc (Ptyp_extension (id, PTyp (ghtyp ~loc ~attrs desc))) -let wrap_pat_attrs ~loc pat (ext, attrs) = +let mkpat_attrs ~loc desc (ext, attrs) = (* todo: keep exact location for the entire attribute *) - let pat = {pat with ppat_attributes = attrs @ pat.ppat_attributes} in match ext with - | None -> pat - | Some id -> ghpat ~loc (Ppat_extension (id, PPat (pat, None))) - -let mkpat_attrs ~loc d attrs = - wrap_pat_attrs ~loc (mkpat ~loc d) attrs + | None -> mkpat ~loc ~attrs desc + | Some id -> + mkpat ~loc (Ppat_extension (id, PPat (ghpat ~loc ~attrs desc, None))) let wrap_class_attrs ~loc:_ body attrs = {body with pcl_attributes = attrs @ body.pcl_attributes} @@ -684,21 +678,15 @@ let wrap_mod_attrs ~loc:_ attrs body = let wrap_mty_attrs ~loc:_ attrs body = {body with pmty_attributes = attrs @ body.pmty_attributes} -let wrap_str_ext ~loc body ext = - match ext with - | None -> body - | Some id -> ghstr ~loc (Pstr_extension ((id, PStr [body]), [])) - let wrap_mkstr_ext ~loc (item, ext) = - wrap_str_ext ~loc (mkstr ~loc item) ext - -let wrap_sig_ext ~loc body ext = match ext with - | None -> body - | Some id -> ghsig ~loc (Psig_extension ((id, PSig [body]), [])) + | None -> mkstr ~loc item + | Some id -> mkstr ~loc (Pstr_extension ((id, PStr [ghstr ~loc item]), [])) let wrap_mksig_ext ~loc (item, ext) = - wrap_sig_ext ~loc (mksig ~loc item) ext + match ext with + | None -> mksig ~loc item + | Some id -> mksig ~loc (Psig_extension ((id, PSig [ghsig ~loc item]), [])) let mk_quotedext ~loc (id, idloc, str, strloc, delim) = let exp_id = mkloc id idloc in @@ -927,7 +915,7 @@ let mk_directive ~loc name arg = } -# 931 "parsing/parser.ml" +# 919 "parsing/parser.ml" module Tables = struct @@ -1453,22 +1441,22 @@ module Tables = struct Obj.repr () and default_reduction = - (16, "\000\000\000\000\000\000\003L\003K\003J\003I\003H\003\027\003G\003F\003E\003D\003C\003B\003A\003@\003?\003>\003=\003<\003;\003:\0039\0038\0037\0036\0035\003\026\0034\0033\0032\0031\0030\003/\003.\003-\003,\003+\003*\003)\003(\003'\003&\003%\003$\003#\003\"\003!\003 \003\031\003\030\003\029\003\028\000\000\000\000\000\"\000\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\144\001\227\001\206\001\224\001\223\001\222\001\228\001\232\000\000\003\145\001\226\001\225\001\207\001\230\001\221\001\220\001\219\001\218\001\217\001\215\001\231\001\229\000\000\000\000\000\000\001\011\000\000\000\000\001\210\000\000\000\000\000\000\001\212\000\000\000\000\000\000\001\214\001\236\001\233\001\216\001\208\001\234\001\235\000\000\003\143\003\142\003\146\000\000\000\000\000 \001u\000\132\000\000\001\007\001\b\000\000\000\000\000\000\002\005\002\004\000\000\000\000\000\031\000\000\000\000\000\000\000\000\000\000\001\160\000\000\000\000\000\000\000\000\000\000\003\139\000\000\003\134\000\000\000\000\003\136\000\000\003\138\000\000\003\135\003\137\000\000\003\129\000\000\003\128\003|\002}\000\000\003\127\000\000\002~\000\000\000\000\000\000\000\000\000c\000\000\000\000\000a\000\000\000\000\001s\000\000\000\000\000\000\000\000\000\000\000\237\001\129\000\000\000\000\000\000\000\000\000\000\000\000\002f\000\000\000\000\000\000\000\000\000\000\000\000\000^\000\000\000\000\000\000\000\000\000\000\003\b\000\000\002\182\002\183\000\000\002\180\002\181\000\000\000\000\000\000\000\000\000\000\001\155\001\154\000\000\003\006\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\014\000\017\000\016\000\000\000\000\000\000\000\000\000\000\001\146\000\000\000\000\000\000\000\000\000\000\000\000\001\127\000\000\000\000\001\130\001\128\001\136\000:\002\217\000\000\001E\003d\003c\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000`\000\000\001\022\000\000\002\185\002\184\000\000\000\000\000\000\001\240\000\000\000\000\000|\000\000\000\000\000\000\000\000\000\000\001\135\000\000\001\134\000\000\001v\001\133\000\000\001t\000[\000\027\000\000\000\000\001\181\000\024\000\000\000\000\000\000\000\000\000s\000\000\000\000\000\000\000\000\000\000\000\000\003{\000\246\000t\000\135\000u\000\023\000\000\000\000\000\000\000\000\000\028\000\025\000\018\000\000\000v\000r\000\000\000\000\000\000\000\019\000\030\000\000\000\248\002\139\002y\000\000\000y\000\000\002z\000\000\000\000\001\237\000\000\000\000\000\000\000\000\003e\000\000\003f\000\000\000\000\000x\000\000\000\000\000\000\000z\000\000\000{\000\000\000}\000\000\000\000\000~\002o\002n\000\000\000\000\000\000\000\000\000\000\000\000\000\\\000\000\003\r\000_\000b\000]\003\002\003\147\003\003\0028\003\005\000\000\000\000\003\n\002\179\003\012\000\000\000\000\000\000\003\019\003\016\000\000\000\000\000\000\000\000\0024\000\000\000\000\002-\003\025\003\011\000j\000\000\002%\000\000\000\000\000\000\000\000\002)\000\000\002$\000\000\000\000\000\000\000\000\001\183\000\000\000\000\0026\000\000\000\000\000i\000\000\003\020\003\004\000\000\0020\000\000\000\000\003\023\000\000\003\022\003\021\000\000\002+\000\000\000\000\002'\002&\0025\0027\002,\000\000\000h\000\000\003\018\003\017\000\000\003\015\000\000\002\187\002\186\000\000\000\000\002\152\003\014\000\000\000\000\000\000\000\000\001\242\001`\001a\002\189\000\000\002\190\002\188\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001!\001\"\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\249\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\167\000\000\000\000\000\000\000\000\000\000\000\000\003\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003~\000\000\000\000\000\000\000\000\000\000\001\166\000\000\000\000\000\000\001~\001\173\001}\002j\001\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002w\000\000\000\000\002x\002k\000\000\000\000\001\165\001\164\000\000\000\250\000\000\000\000\001\148\000\000\000\000\001\152\000\000\002\t\002\b\000\000\000\000\002\007\002\006\001\151\001\149\000\000\001\153\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\223\001\131\002\228\002\226\000\000\000\000\000\000\002\239\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\001\000\000\003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002C\000\000\000\000\000\000\000\000\000\000\000\000\001\031\002B\001 \000\000\000\000\000\000\000\238\000\000\001#\001$\000\000\000\239\002i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002t\002r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\207\000\000\000\000\000\000\000\000\000\000\003x\000\000\000\000\003w\000\000\000\000\000\000\000\000\001\026\001\025\000\000\001\027\000\000\000\000\000\000\002\236\000\000\000\000\000\000\002\203\002\194\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\148\002\238\002\225\002\224\000\000\000\000\000\210\002\156\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\236\000\000\000\000\000\000\000\000\000\000\000\000\000\209\000\208\000\000\000\000\000\000\000\244\000\243\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003O\000\000\000\000\000\000\000\000\000\000\000\000\001*\000\000\000\000\002q\000\000\000\000\000\000\001)\000\000\000\000\001(\001'\000\000\002\003\000\000\000\000\000\140\003P\002h\000\000\000\000\000\000\000\000\001,\000\000\000\000\001+\000\000\0023\000\000\000\000\002?\000\000\000\000\002A\000\000\000\000\002=\002<\002:\002;\000\000\000\000\000\000\001%\000\000\000\000\001K\000\020\001.\000\000\000\000\000\000\002\205\002\196\000\000\000\000\002\204\002\195\000\000\000\000\000\000\000\000\002\207\002\198\000\000\000\000\002\145\000\000\000\000\002\211\002\202\000\000\000\000\002\209\002\200\002\232\000\000\000\000\000\000\000\000\000\000\002\206\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\210\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\208\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002m\002l\000\206\002\146\000\000\002\197\000\000\000\000\002\201\000\000\000\000\002\199\000\000\000\127\000\128\000\000\000\000\000\000\000\000\000\159\000\158\000\000\000\146\000\000\000\000\001c\000\000\001d\001b\002s\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0016\000\000\000\000\0017\000\000\000\000\000\211\000\000\0019\0018\000\000\000\000\002\240\002\233\000\000\002\249\000\000\002\250\002\248\000\000\002\254\000\000\002\255\002\253\000\000\000\000\002\235\002\234\000\000\000\000\000\000\002Y\000\000\000\000\000\000\000\000\002\155\002X\000\000\002\244\002\243\000\000\000\000\000\000\001\132\000\000\002\215\000\000\002\216\002\214\000\000\002\242\002\241\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\149\002\231\000\000\002\230\002\229\000\000\002\252\002\251\000\145\000\000\000\000\000\000\000\000\000\144\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\138\000\000\000\000\000\000\000\000\000\000\000\142\000\000\001\140\000\000\000\000\000\000\000d\000\000\000\000\000e\000\000\000\000\000\000\000\000\001\175\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\016\000\000\000\000\000n\000\000\001\019\001\017\000\000\000\000\000\000\000\252\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\143\000f\000\000\000\000\002W\000\000\000\000\001-\002\001\000\000\001\029\001\030\0014\000\000\000\000\000\000\000\000\000\000\002\247\000\000\002\246\002\245\002\227\000\000\000\000\000\000\000\000\002\218\000\000\002\220\000\000\002\219\000\000\002\192\002\191\000\000\002\193\000\000\000\000\000\000\000\000\002\213\002\212\000\000\000\000\000\000\000\000\002\023\002\011\000\000\002\021\000\000\002\017\000\000\002\019\000\000\002\r\000\000\000\000\002\015\000\000\002\022\002\n\000\000\002\020\000\000\002\016\000\000\002\018\000\000\002\012\000\000\000\000\002\014\000\000\001\203\000\000\000\000\000\000\001\202\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\171\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001A\003]\000\000\000\000\003\\\000\000\000\000\000\000\000\000\000\000\002H\000\000\000\000\000\000\000\000\000\000\000\000\003b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\185\000\000\002N\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003N\000\000\000\000\002\158\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\205\000\000\000\000\000\000\001\204\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\172\000\000\000\000\000\000\000\000\001\157\000\000\001\156\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001C\002\172\000\000\000\000\001\142\000\000\002\170\000\000\000\000\000\000\002\169\000\000\000\000\001\143\000\000\000\000\000\000\000\000\002\176\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\156\000\000\000\000\000\000\000\138\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000>\000\000\000\000\000\000\000\000\001\180\000\000\001\179\000\000\000\000\000\000\000\000\000A\000\000\000\000\000\000\002U\000\000\002T\000\000\000\000\000\000\000\000\000B\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000G\000\000\000\000\000\000\000H\000F\000\000\000K\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000C\000\000\000J\000I\000\000\000D\000E\000\000\001T\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001?\000Z\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000W\000\000\000Y\000X\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001=\002\177\002\162\000\000\002\168\002\163\002\175\002\174\002\173\002\171\001N\000\000\002\160\000\000\000\000\000\000\000\000\000\000\002f\000\000\000\000\001G\002\164\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\196\001\192\000\000\000\000\000\000\001\001\000\000\000\000\002\\\002f\000\000\000\000\001I\002Z\002[\000\000\000\000\000\000\000\000\000\000\001\199\001\195\001\191\000\000\000\000\001\002\000\000\000\000\001\198\001\194\001\190\001\188\002\165\002\161\002\178\001M\002E\002\159\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\151\000\000\000\000\003\153\000\000\000/\000\000\000\000\003\159\000\000\003\158\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\150\000\000\000\000\003\152\000\000\000\000\000\000\002P\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001r\000\000\000\000\001p\001n\000\000\0000\000\000\000\000\003\162\000\000\003\161\000\000\000\000\000\000\001l\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001q\000\000\000\000\001o\001m\000\000\000\000\000\000\0002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000Q\000\000\000\000\000\000\000\000\000\000\000\000\000,\000\000\000\000\000P\000\000\000*\0011\000\000\0009\000&\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001/\000\000\000O\000N\000\000\000\000\000T\000S\000\000\000\000\001\244\000\000\000.\000\000\000\000\000\000\000-\000\000\000\000\000\000\0001\000\000\000R\000U\000\000\0003\0004\000\000\001V\000\000\000\000\000\000\000\000\000\000\000\000\0007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001;\003`\003W\000\000\000\000\003[\003M\003V\003_\003^\001R\000\000\000\000\003T\000\000\003X\003U\003a\002D\000\000\000\000\003R\000#\003Q\000\000\000\000\000\136\000\000\001\r\000\000\000\000\001Q\001P\000\000\001\145\001\144\000\000\000\000\003\024\003\007\000\000\000;\000\000\000\000\000<\000\000\000\000\002\222\002\221\000\000\000\000\000\149\000\000\000\000\002M\001\006\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\133\000\000\003Z\002a\002b\002]\002_\002^\002`\000\000\000\000\000\000\000\134\000\000\000\000\002f\000\000\001\005\000\000\000\000\000\000\000\000\003Y\000\000\000\131\000\000\000\000\000\000\000\000\001k\001e\000\000\000\000\001f\001\201\000\000\001\200\000\000\000\000\000\247\000\000\000\000\000\000\000\029\000\026\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\197\001\193\000\000\001\189\003z\000\000\002f\000\000\001\004\000\000\000\000\000\000\000\000\002\167\002e\002c\002d\000\000\000\000\000\000\002f\000\000\001\003\000\000\000\000\000\000\000\000\002\166\000\000\001\159\001\158\000\000\000w\000\000\003\154\000\000\000$\000\000\000\000\000\000\000\000\000\157\000\156\000\000\001\t\000\001\000\000\000\000\001\012\000\002\000\000\000\000\000\000\001x\001y\000\003\000\000\000\000\000\000\000\000\001{\001|\001z\000\021\001w\000\022\000\000\002\024\000\000\000\004\000\000\002\025\000\000\000\005\000\000\002\026\000\000\000\000\002\027\000\006\000\000\000\007\000\000\002\028\000\000\000\b\000\000\002\029\000\000\000\t\000\000\002\030\000\000\000\n\000\000\002\031\000\000\000\011\000\000\002 \000\000\000\000\002!\000\012\000\000\000\000\002\"\000\r\000\000\000\000\000\000\000\000\000\000\003m\003h\003i\003l\003j\000\000\003q\000\014\000\000\003p\000\000\001X\000\000\000\000\003n\000\000\003o\000\000\000\000\000\000\000\000\001\\\001]\000\000\000\000\001[\001Z\000\015\000\000\000\000\000\000\003\141\000\000\003\140") + (16, "\000\000\000\000\000\000\003\155\003\154\003\153\003\152\003\151\003i\003\150\003\149\003\148\003\147\003\146\003\145\003\144\003\143\003\142\003\141\003\140\003\139\003\138\003\137\003\136\003\135\003\134\003\133\003\132\003h\003\131\003\130\003\129\003\128\003\127\003~\003}\003|\003{\003z\003y\003x\003w\003v\003u\003t\003s\003r\003q\003p\003o\003n\003m\003l\003k\003j\000\000\000\000\000\"\000\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\223\002\017\001\252\002\014\002\r\002\012\002\018\002\022\000\000\003\224\002\016\002\015\001\253\002\020\002\011\002\n\002\t\002\b\002\007\002\005\002\021\002\019\000\000\000\000\000\000\001\r\000\000\000\000\002\000\000\000\000\000\000\000\002\002\000\000\000\000\000\000\002\004\002\026\002\023\002\006\001\254\002\024\002\025\000\000\003\222\003\221\003\225\000\000\000\000\000 \001\163\000\132\000\000\001\t\001\n\000\000\000\000\000\000\0023\0022\000\000\000\000\000\031\000\000\000\000\000\000\000\000\000\000\001\206\000\000\000\000\000\000\000\000\000\000\003\218\000\000\003\213\000\000\000\000\003\215\000\000\003\217\000\000\003\214\003\216\000\000\003\208\000\000\003\207\003\203\002\207\000\000\003\206\000\000\002\208\000\000\000\000\000\000\000\000\000c\000\000\000\000\000a\000\000\000\000\001\161\000\000\000\000\000\000\000\000\000\000\000\237\001\175\000\000\000\000\000\000\000\000\000\000\000\000\002\184\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\199\000\000\002\030\000\000\000\000\000|\000\000\000\000\000\000\000\000\000\000\001\181\000\000\001\180\000\000\001\164\001\179\000\000\001\162\000[\000\027\000\000\000\000\001\227\000\024\000\000\000\000\000\000\000\000\000\000\000s\000\000\000\000\000\000\003\202\000\018\000t\000\135\000u\000\023\000\000\000v\000r\000\000\000\000\000\000\000\000\000\000\000\000\000\028\000\025\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\019\000\030\000\246\000\248\002\217\002\203\000\000\000y\000\000\002\204\000\000\000\000\002\027\000\000\000\000\000\000\000\000\003\180\000\000\001s\000\000\003\181\000\000\000\000\000x\000\000\000\000\000\000\000z\000\000\000{\000\000\000}\000\000\000\000\000~\002\193\002\192\000\000\000\000\003\198\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\171\002\170\000^\000\000\000\000\000\000\000\000\000\000\003V\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001:\0019\000\000\003\004\003\005\000\000\003\002\003\003\000\000\000\000\000\000\000\000\000\000\001\201\001\200\000\000\003T\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\016\000\017\000\016\000\000\000\000\000\000\000\000\000\000\001\192\000\000\000\000\000\000\000\000\000\000\000\000\001\173\000\000\000\000\001\176\001\174\001\182\000:\003'\003\179\003\178\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001O\001N\000\000\000\000\000`\000\000\001\024\000\000\003\007\003\006\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\\\000\000\003[\000_\000b\000]\003P\003\226\003Q\002`\003S\000\000\000\000\003X\003\001\003Z\000\000\000\000\000\000\003a\003^\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0012\0011\000\000\0010\003g\003Y\000j\000\000\000\000\000\000\000\000\002\\\000\000\000\000\002[\000\000\001Q\002S\002_\002R\002V\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001*\001)\000\000\001(\002\173\000\000\000\000\002W\000\000\000\000\000\000\000\000\000\000\001\229\000\000\000\000\002^\000\000\000\000\000i\000\000\003b\003R\000\000\001;\000\000\000\000\000\000\000\000\000\000\001.\001-\000\000\001,\002\174\000\000\000\000\003e\000\000\003d\003c\000\000\002Y\000\000\000\000\002U\002T\002]\002Z\002\175\000\000\000\000\000h\000\000\003`\003_\000\000\003]\000\000\003\t\003\b\000\000\000\000\002\230\003\\\000\000\000\000\000\000\000\000\002 \001\142\001\143\003\011\000\000\003\012\003\n\000\000\001M\002\183\001R\000\000\000\000\002g\000\000\002b\002c\002f\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001?\001>\000\000\001=\002\179\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001K\001J\000\000\001I\002\182\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001G\001F\000\000\001E\002\181\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001#\001$\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\251\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\213\000\000\000\000\000\000\000\000\000\000\000\000\003\249\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\205\000\000\000\000\000\000\000\000\000\000\001\212\000\000\000\000\000\000\001\172\001\219\001\171\002\188\001\216\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\201\000\000\000\000\002\202\002\189\000\000\000\000\001\211\001\210\000\000\000\252\000\000\000\000\001\194\000\000\000\000\001\198\000\000\0027\0026\000\000\000\000\0025\0024\001\197\001\195\000\000\001\199\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003-\001\177\0032\0030\000\000\000\000\000\000\003=\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003O\000\000\003N\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002k\000\000\000\000\000\000\000\000\000\000\000\000\001!\002j\001\"\000\000\000\000\000\000\000\238\000\000\001%\001&\000\000\000\239\002\187\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\156\002\155\000\000\000\000\000\000\003:\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\227\003<\003/\003.\000\000\000\000\000\000\000\000\000\207\002\196\000\000\000\000\000\000\000\000\000\000\001\028\001\027\000\000\001\029\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\224\000\000\000\000\000\000\000\000\000\000\000\000\002\146\002\145\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\198\000\000\000\000\000\000\000\000\000\210\002\234\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\236\000\000\000\000\000\000\000\000\000\000\000\000\000\209\000\208\000\000\000\000\000\000\000\244\000\243\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\151\002\150\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\158\000\000\000\000\000\000\000\000\000\000\000\000\001X\000\000\000\000\002\195\000\000\000\000\000\000\001W\000\000\000\000\001V\001U\000\000\0021\000\000\000\000\000\140\003\159\002\186\000\000\000\000\000\000\000\000\001Z\000\000\000\000\001Y\000\000\001P\000\000\000\000\000\000\000\000\000\000\001C\001B\000\000\001A\002\180\000\000\000\000\002i\000\000\000\000\002e\002d\001S\000\000\000\000\001y\000\020\001\\\000\000\000\000\000\000\002\223\000\000\003\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\030\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\025\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\027\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\026\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\029\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\031\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\191\002\190\000\206\000\000\000\127\000\128\000\000\000\000\000\000\000\000\000\159\000\158\000\000\003\016\000\000\000\000\003\018\000\000\000\000\003\017\000\000\000\000\000\000\000\000\003\020\000\000\000\000\003\024\000\000\000\000\003\022\0036\000\000\000\000\000\000\000\000\000\000\000\146\000\000\000\000\001\145\000\000\001\146\001\144\002\197\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\019\000\000\000\000\003\023\000\000\000\000\003\021\000\000\000\000\000\000\000\000\000\000\002\161\002\160\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001d\000\000\000\000\001e\000\000\000\000\000\211\000\000\001g\001f\000\000\000\000\003>\0037\000\000\003G\000\000\003H\003F\000\000\003L\000\000\003M\003K\000\000\000\000\0039\0038\000\000\000\000\000\000\002\129\000\000\000\000\000\000\000\000\002\233\002\128\000\000\003B\003A\000\000\000\000\000\000\001\178\000\000\003%\000\000\003&\003$\000\000\003@\003?\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\227\0035\000\000\0034\0033\000\000\003J\003I\000\145\000\000\000\000\000\000\000\000\000\144\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\184\000\000\000\000\000\000\000\000\000\000\000\142\000\000\001\186\000\000\000\000\000\000\000d\000\000\000\000\000e\000\000\000\000\000\000\000\000\001\221\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\018\000\000\000\000\000n\000\000\001\021\001\019\000\000\000\000\000\000\000\254\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\143\000f\000\000\000\000\002\127\000\000\000\000\001[\002/\000\000\001\031\001 \001b\000\000\000\000\000\000\000\000\000\000\003E\000\000\003D\003C\0031\000\000\000\000\000\000\000\000\003(\000\000\003*\000\000\003)\000\000\003\014\003\r\000\000\003\015\000\000\000\000\000\000\000\000\003#\003\"\000\000\000\000\000\000\000\000\002E\0029\000\000\002C\000\000\002?\000\000\002A\000\000\002;\000\000\000\000\002=\000\000\002D\0028\000\000\002B\000\000\002>\000\000\002@\000\000\002:\000\000\000\000\002<\000\000\001\249\000\000\000\000\000\000\001\248\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\217\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001o\003\172\000\000\000\000\003\171\000\000\000\000\000\000\000\000\000\000\002p\000\000\000\000\000\000\000\000\000\000\000\000\003\177\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\231\000\000\002v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\157\000\000\000\000\002\236\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\251\000\000\000\000\000\000\001\250\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\218\000\000\000\000\000\000\000\000\001\203\000\000\001\202\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001q\002\250\000\000\000\000\001\188\000\000\002\248\000\000\000\000\000\000\002\247\000\000\000\000\001\189\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\235\000\000\000\000\000\000\000\138\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000>\000\000\000\000\000\000\000\000\001\226\000\000\001\225\000\000\000\000\000\000\000\000\000A\000\000\000\000\000\000\002}\000\000\002|\000\000\000\000\000\000\000\000\000B\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000G\000\000\000\000\000\000\000H\000F\000\000\000K\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000C\000\000\000J\000I\000\000\000D\000E\000\000\001\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001m\000Z\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000W\000\000\000Y\000X\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001k\002\255\002\240\000\000\002\246\002\241\002\253\002\252\002\251\002\249\001|\000\000\002\238\000\000\000\000\000\000\000\000\000\000\002\184\000\000\000\000\001u\002\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\242\001\238\000\000\000\000\000\000\001\003\000\000\000\000\002\132\002\184\000\000\000\000\001w\002\130\002\131\000\000\000\000\000\000\000\000\000\000\001\245\001\241\001\237\000\000\000\000\001\004\000\000\000\000\001\244\001\240\001\236\001\234\002\243\002\239\003\000\001{\002m\002\237\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\230\000\000\000\000\003\232\000\000\000/\000\000\000\000\003\238\000\000\003\237\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\229\000\000\000\000\003\231\000\000\000\000\000\000\002x\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\160\000\000\000\000\001\158\001\156\000\000\0000\000\000\000\000\003\241\000\000\003\240\000\000\000\000\000\000\001\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\159\000\000\000\000\001\157\001\155\000\000\000\000\000\000\0002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001^\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000Q\000\000\000\000\000\000\000\000\000\000\000\000\000,\000\000\000\000\000P\000\000\000*\001_\000\000\0009\000&\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001]\000\000\000O\000N\000\000\000\000\000T\000S\000\000\000\000\002\"\000\000\000.\000\000\000\000\000\000\000-\000\000\000\000\000\000\0001\000\000\000R\000U\000\000\0003\0004\000\000\001\132\000\000\000\000\000\000\000\000\000\000\000\000\0007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001i\003\175\003\166\000\000\000\000\003\170\003\156\003\165\003\174\003\173\001\128\000\000\000\000\003\163\000\000\003\167\003\164\003\176\002l\000\000\000\000\003\161\000#\003\160\000\000\000\000\000\136\000\000\001\015\000\000\000\000\001\127\001~\000\000\001\191\001\190\000\000\000\000\003f\003U\000\000\0018\002\177\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0016\0015\000\000\0014\002\176\000\000\000\000\000;\000\000\000\000\000<\000\000\000\000\003,\003+\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\166\002\165\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\149\000\000\000\000\002u\001\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\133\000\000\003\169\002\137\002\138\002\133\002\135\002\134\002\136\000\000\000\000\000\000\000\134\000\000\000\000\002\184\000\000\001\007\000\000\000\000\000\000\000\000\003\168\000\000\000\131\000\000\000\000\000\000\000\000\001\153\001\147\000\000\000\000\001\148\001\247\000\000\001\246\000\000\000\000\000\247\000\000\000\000\000\000\000\000\000\249\000\000\000\000\000\000\000\029\000\026\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\243\001\239\000\000\001\235\003\201\000\000\002\184\000\000\001\006\000\000\000\000\000\000\000\000\002\245\002\141\002\139\002\140\000\000\000\000\000\000\002\184\000\000\001\005\000\000\000\000\000\000\000\000\002\244\000\000\001\205\001\204\000\000\000w\000\000\003\233\000\000\000$\000\000\000\000\000\000\000\000\000\157\000\156\000\000\001\011\000\001\000\000\000\000\001\014\000\002\000\000\000\000\000\000\001\166\001\167\000\003\000\000\000\000\000\000\000\000\001\169\001\170\001\168\000\021\001\165\000\022\000\000\002F\000\000\000\004\000\000\002G\000\000\000\005\000\000\002H\000\000\000\000\002I\000\006\000\000\000\007\000\000\002J\000\000\000\b\000\000\002K\000\000\000\t\000\000\002L\000\000\000\n\000\000\002M\000\000\000\011\000\000\002N\000\000\000\000\002O\000\012\000\000\000\000\002P\000\r\000\000\000\000\000\000\000\000\000\000\003\188\003\183\003\184\003\187\003\185\000\000\003\192\000\014\000\000\003\191\000\000\001\134\000\000\000\000\003\189\000\000\003\190\000\000\000\000\000\000\000\000\001\138\001\139\000\000\000\000\001\137\001\136\000\015\000\000\000\000\000\000\003\220\000\000\003\219") and error = - (128, "'\225 \197\138\173\190fz\002\129\252\128\0008\224#a\000E\194\141\190$\250\000\129\240\000\000\024\224}\246D\b/\226*\000\t\131\131\220h\176(4\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\175\235f\245\155\175\190f\255\146\163\252Q\016y\224}\246D\b/\226*\000\t\131\131\220h\176(4\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#a\000E\130\141\190$\250\000\129\240\000\000\024\224}\246D\b/\226*\000\t\131\131\220h\176(4'\225\"\213\138\173\190fz\002\129\252\000\000x\224\000\000\000\000@\000\024\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\024\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\128\000\128\007\224,\004\128\000|D\002\004\001\002\139\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000P\000\000\000\000\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\133\128\179\160\b2\nC\129\131$\014\193\018!\020\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\016 \024\184@\000 \000\000\000\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\002@@@ \024 \128\000\002\000\000\000\000\000\001\002@@\000 \024 \128\000\002\000\000\000\000\000\001\002@@\000 \024 \000\000\002\000\000\000\000\000\196\128*\128\b0\018C\128\002 \014\193\003 \004\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128 \128\b \000B\128\002\000\012@\000 \000\132\128 \128\b \000B\000\002\000\012@\000 \000\003\000\000$\193\004\024\000\128\016\000\000\000\000\000\128\003\000\000$\129\004\024\000\128\016\000\000\000\000\000\128\003\000\000$\129\004\024\000\000\016\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000 \000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000$\128\004\024\000\000\016\000\000\000\000\000\128\002\000\000 \000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000$\128\004\000\000\000\016\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000 \128\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000$\128\004\000\000\000\016\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\132\128\"\130\b \000C\000\002\000\014\192\017 \004\003 \000x\016\000\024\184P\000 \016\002\000\001\000\132\128\"\128\012 \018C\128\002 \012\193\016a\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003 \000p\016\000\024\184P\000 \016\002\000\001\000\003\000\bp\016 \024\184@\000 \000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\197\128\187\128\b2\nC\129\130$\014\192\022a\022\003\000\000`\000\000\024\184@\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000`\000\000\024\184@\000$\000\002\000\000\000\001\000\016\000\000\000\b\000\000\000$\000\000\000@\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000}\246D\b/\226*\000\t\131\131\220h\176(4'\225\"\213\138\173\190fz\002\129\252\000\000x\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000$\193\004\024\000\128\016\000\000\000\000\000\128\003\000\000$\129\004\024\000\128\016\000\000\000\000\000\128\003\000\000$\129\004\024\000\000\016\000\000\000\000\000\128\003\000\000$\128\004\024\000\000\016\000\000\000\000\000\128\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\132\128\"\130\b \002C\000\002 \014\192\016 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002C\000\002 \012\192\016 \004}\246D\b/\226*\000\t\131\131\220h\176(4'\225\"\213\138\173\190fz\002\129\252\000\000x\224#a\000E\194\141\190$\250\000\129\240\000\000\024\224#a\000E\130\141\190$\250\000\129\240\000\000\024\224#a\000E\130\141\190$z\000\129\240\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001!\000D\002\129\152$r\000\0000\000\000\024\192\132\000\000\128@\002\016B\129\128\000\000@\016\000\000\132\000\000\128\000\002\016B\129\128\000\000@\016\000\000\132\000\000\128\000\002\016B\001\128\000\000@\016\000\000\003!\000@\128\004\024$Z\000 4\016\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\131!\136G\224,\028\164Z|d6\020\001\146\203\128\000\b\000\000\000\000\000\002\000\000 \000\000\000\000\131\000\000\000@\000\000\000\128\000\000\000\000\000\000\000\003\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\002@@\000 \024 \000\000\002\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\001\002@@\000\000\016 \128\000\002\000\000\000\000\000\001\002@@\000\000\016 \000\000\002\000\000\000\000\000\167\225 \197\138\173\190f\250\002\129\252@\0008\224\167\225 \197\138\173\190fz\002\129\252@\0008\224\167\225\"\197\138\173\190fz\002\129\252\192\0008\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\002@@@\000\016 \128\000\002\000\000\000\000\128\001\002@@@\000\016 \128\000\002\000\000\000\000\000\001\002@@\000\000\016 \128\000\002\000\000\000\000\000\001\002@@\000\000\016 \000\000\002\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\002@@\000\000\016 \000\000\002\000\000\000\000\000#a\000E\130\141\190$\250\000\129\240\000\000\024\224#a\000E\130\141\190$z\000\129\240\000\000\024\224\001\000\000\000@\000\b\000\128\000\000\000\000\000\000\000\001\000\000\000\000\000\b\000\128\000\000\000\000\000\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\175\235w\253\155\239\190\255\255\147\167\252\210\0169\228\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001!\000D\002\129\152$r\000\0000\000\000\024\192#a\000E\130\141\190$z\000\129\240\000\000\024\224#a\000E\194\141\190$\250\000\129\240\000\000\024\224#a\000E\130\141\190$\250\000\129\240\000\000\024\224#a\000E\130\141\190$z\000\129\240\000\000\024\224\163a\136G\226\173\190\164z|\197\242\004\001\154\235\129!\bD\002\129\152$r\000\0000\000\000\024\192#a\000E\130\141\190$z\000\129\240\000\000\028\224\197\189\187\215\250\191\219\231\247\255l>\237\183\255\207#a\000E\130\141\190$z\000\129\240\000\000\024\224\003!\000@\128\004\024$Z\000 0\000\000\016@\003!\000@\128\004\024$Z\000 4\016\000\020@\003!\002@\128\004\024$Z\000 4\016\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\017\000\000\000\000\000\000\000\000\002\000\000@\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\003\000\000p\016\000\024\184@\000 \000\000\000\001@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\024\184@\000 \000\000\000\000@\003\000\002p\016\000\024\184@\000 \000\000\000\001@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\024\184@\000 \000\000\000\000@\003\000\000p\016\000\024\184@\000 \000\000\000\001@\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\001\000\000\000\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\016\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\024\184@\000 \000\000\000\000@\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\128;\128\b2\002C\129\130$\014\192\022!\022\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\196\128\187\128\b2\002C\129\130$\014\192\022!\022\003\000\000`\000\000\024\184@\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\001\000\000\000\001\000\000\000\000\000\024\024@\000\000\000\000\000\000\000\003\000\000p\016 \024\184@\000 \000\000\000\000\000\003\000\000`\000\000\024\184@\000 \000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\197\128\187\128\b2\nC\129\130$\014\192\022!\022\003\000\000`\000\000\024\184@\000 \000\000\000\000\000\197\128\187\128\b2\nC\129\130$\014\192\022!\022\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\128;\128\b2\002C\129\130$\014\192\022!\020\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\197\128\187\128\b2\nC\129\130$\014\192\022!\022\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\024\184@\000 \000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\004\000\000\000\128\000\004\000\000\000\001\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\002\000\000\000\000\000\128\000\004\000\000\000\001\002\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\002\000\000\000\000\000\128\000\004\000\000\000\001\018\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\128\000\004\000\000\000\001\018\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\128\000\004\000\000\000\001\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\003\000\000p\016\000\024\184@\000 \000\000\000\000@\000\000\002\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\004\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\017\000\000\000\000\000\128\000\000\002\000\000\000\000\128\000\017\000\000\000\000\000\000\000\000\002\000\000\000\000\003!\000@\128\004\024$Z\000 4\016\000\016@\003!\000@\192\004\024$\210\000 0\000\000\016@\003!\000@\128\004\024$\210\000 0\000\000\016@\003!\000@\128\004\024$R\000 0\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\147)\027P\144\020\024$\214\000 2\130\006\213P\000\001\000\000\128\004\000\000\002\000\000 \000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\147)\027P\144\020\024$\222\000 6\145\006\213P\001\000\000\000\000\000\016\004P\000\000\000\000\000\000\000\131!\b@\128\004\024$Z\000 4\016\000\144@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003!\000@\192\004\024$\218\000 4\016\000\016@\003!\000@\128\004\024$\218\000 4\016\000\016@\003!\000@\128\004\024$Z\000 4\016\000\016@\003!\000@\128\004\024$Z\000 0\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\003!\000@\128\004\024$R\000 0\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\147!\027@\128\020\024$\218\000 6\144\004\213P\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\144\000\027\000\000\016\000\000\128\000\000\002\128\004\197\016\003!\000@\128\004\024$Z\000 4\016\000\016@\144\000\027\000\000\016\000\000\128\000\000\002\128\004\197\016\131!\000@\128\004\024$Z\000 4\016\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\144\000\027\000\000\016\000\000\128\000\000\002\128\004\197\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\147!\027@\128\020\024$\218\000 6\144\004\213P\131\161\136G\224,\028\164Z|d6\020\001\146\203\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\b\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\003!\000@\128\004\024$R\000 0\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\000\002\000\000 \000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\000\128\000\000\000\000\004\193\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\131!\000@\128\004\024$Z\000 4\016\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\144\000\027\000\000\016\000\000\128\000\000\002\128\004\197\016\131\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\131!\000@\128\004\024$Z\000 4\016\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\144\000\027\000\000\016\000\000\128\000\000\002\128\004\197\016\128\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\000\128\000\000\000\000\004\129\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003!\002@\128\004\024$Z\000 4\016\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\018\000\000\000\000\000\128\000\000\000\000\004\133\016\131!\002@\128\004\024$Z\000 4\016\000\020@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\017\000\000\000\000\000\128\000\000\000\000\004\129\016\128\000\017\000\000\000\000\000\000\000\000\000\000\000\000\000\131\000\001\000\000\000\b\000\000\000\000\000\000\000\000\000\128\000\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003)\000P\144\004\024$\214\001 2\000\004\209X\000\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\002\000\000@\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\b\000\000\000\000\000\128\000\000\002\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\002\000\000\000\000#a\000E\130\141\190$z\000\129\240\000\000\024\224\003!\004@\200$\024$\218\000 4\000\000\016@\001\002@@@\000\016 \128\000\002\000\000\000\000\128\001\002@@@\000\016 \128\000\002\000\000\000\000\000\001\002@@\000\000\016 \128\000\002\000\000\000\000\000\001\002@@\000\000\016 \000\000\002\000\000\000\000\000\000\000\000\000\000\000\016\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\003\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\001\002@@\000 \024 \000\000\002\000\000\000\000\000\003\002H@\000 \024 \000\000\002\000\000\000\000\000\192\000\b\000\000\016\016\000\128\000\000\000\001\000@\000\000\000\000\000\000\000\016\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\016\000\000\000\000\000\000\000\000\000\001\002@@\000 \024 \000\000\002\000\000\000\000\000\000\000\000\000\000\016\016\000\000\000\000\000\000\000\000\000\001\002@@\000 \024 \000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\128*\128\b0\002C\128\002 \014\192\002 \004\000\128\000\000\000 \000\000\000\000\000\000\000\000\000\000\003\000\000$\128\004\024\000\000\016\000\000\000\000\000\128\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\001\000\000\003\000\000x\016\000\024\184@\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\196\128*\128\b0\002C\128\002 \014\192\002 \020\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\196\128*\128\b0\002C\128\002 \014\192\018 \020\196\128*\128\b0\002C\128\002 \014\192\018 \004\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\002\000\000\000\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\196\128*\128\b0\002C\128\002 \014\192\018 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\001\000\000\001\002@@\000 \024 \000\000\002\000\000\000\000\000\196\128*\128\b0\002C\128\002 \014\192\002 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\001\000\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\196\128*\128\b0\018C\128\002 \014\193\003 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\002@@\000 \024 \000\000\002\000\000\000\000\000\196\128*\128\b0\002C\128\002 \014\192\002 \004\001\002@@\000 \024 \000\000\002\000\000\000\000\000\196\128*\128\b0\002C\128\002 \014\192\002 \004\000\000\000\000\000\000\000\000\000\000\000\002\001\001\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\128*\128\b0\018C\128\002 \014\193\002 \004\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\128*\128\b0\018C\128\002 \014\193\002 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\128*\128\b0\002C\128\002 \014\192\002 \004\000\128\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\128*\128\b0\002C\128\002 \014\192\002 \004\192\000\b\000\000\016\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\b\000\000\016\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\016\000\000\000\000\000\000\000\000\000\001\002@@\000\000\016 \000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\128*\128\b0\018C\128\003 \014\192\002`\004\005\002H@\000\000\016 \000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\016\000\128\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\002@@\000 \024 \000\000\002\000\000\000\000\000\192\000\b\000\000\016\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\128*\128\b0\018C\128\003 \014\193\002`\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\128\001\000\000\000\000\000\000#a\000E\130\141\190$z\000\129\240\000\000\024\224#a\002E\130\141\190$z\000\129\240\000\000\024\224\000\000\000\000\000\000\b\000\000\000\b\000\000\000\000\000\128\000\016\000\000\000\000\000\000\000\b\002\000\000\000\000#a\000E\130\141\190$z\000\129\240\000\000\024\224\001!\000D\002\129\152$r\000\0000\000\000\024\192\192\000\017\000\000\000\000\000\000\000`\002\005\002@\000#a\000E\194\141\190$\250\000\129\240@\000\024\224#a\000E\130\141\190$\250\000\129\240@\000\024\224#a\000E\130\141\190$z\000\129\240@\000\024\224\001!\000DB\129\152$\242\000\0000\000\000\024\192\001!\000D\002\129\152$\242\000\0000\000\000\024\192\001!\000D\002\129\152$r\000\0000\000\000\024\192\001!\000D\002\129\152$r\000\0000\000\000\024\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\197\189\187\215\250\191\218\231\247\255l>\237\183\255\223\001\000\000\000\000\000\024\004p\000\000\000\000\000\000\000\163a\136G\226\173\190\164z|\197\242\004\001\154\235\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\163a\bE\130\141\190$z\000\129\240\000\000\024\224\163a\bE\130\141\190$z\000\129\240\000\000\024\224\129\002@@@\000\016 \128\000\002\000\000\000\000\000\001\002@@\000\000\016 \128\000\002\000\000\000\000\000\001\002@@\000\000\016 \000\000\002\000\000\000\000\000\000\000\000\000\000\000\016\000\128\000\000\000\000\000@\000\129\002@@\000 \024 \000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\b\000\000\016\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\163a\bE\130\141\190$z\000\129\240\000\000\024\224\163a\bE\130\141\190$z\000\129\240\000\000\024\224\131!\b@\128\004\024$Z\000 0\000\000\016@\000\000\000\000\000\000\000\000\128\000\000\002\000\004\193\016\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\002\000\000\000\000#a\000E\130\141\190$z\000\129\240\000\000\024\224#a\000E\194\141\190$\250\000\129\240\000\000\024\224#a\000E\130\141\190$\250\000\129\240\000\000\024\224#a\000E\130\141\190$z\000\129\240\000\000\024\224\003!\000@\192\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$Z\000 4\016\000\017@\003!\000@\128\004\024$Z\000 4\016\000\016@\016\000\000\000\000\016\000\000\128\000\000\000\000\004\129\016#a\000E\130\141\190$z\000\129\240\000\000\024\224\003)\000P\208\004\024$\214\000 0\000\000\016@\003)\000P\144\004\024$\214\000 0\000\000\016@\003)\000P\144\004\024$V\000 0\000\000\016@\002\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003!\000@\128\004\024$Z\000 4\016\000\016@\000\000\b\000\000\000\000\000\128\000\000\002\000\004\193\016\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\b\000\000\000\000\000\128\000\000\002\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\131\161\136G\224,\028\164Z|d6\020\001\146\203\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003!\000@\128\004\024$R\000 0\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003)\000P\144\020\024$V\000 2\000\002P@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000@\000\003\000\000`\000\000\024\184@\000 \000\000\000\000\000\001\000\000\000\000\016\b\000\000\000 \000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000#a\000E\130\141\190$z\000\129\240\000\000\024\224\003!\000@\192\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$Z\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#a\000E\130\141\190$z\000\129\240\000\000\024\224\003!\000@\192\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$Z\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\003!\000@\128\004\024$Z\000 4\016\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003!\000@\192\004\024$\218\000 4\016\000\016@\003!\000@\128\004\024$\218\000 4\016\000\016@\003!\000@\128\004\024$Z\000 4\016\000\016@\000\000\000\000\000\000\000\000\128\000\000\002\000\004\129\016#a\000E\130\141\190$z\000\129\240\000\000\024\224\001!\000DB\129\152$\242\000\0000\000\000\024\192\001!\000D\002\129\152$\242\000\0000\000\000\024\192\001!\000D\002\129\152$r\000\0000\000\000\024\192\196\148\187\131\232>B\195\129\255l\014\237\183\231\015\001!\000D\002\129\152$r\000\0000\000\000\024\192\197\189\187\215\250\191\218\231\247\255l>\237\183\255\223\000\000\000\000\000\000\016\000P\000\000\000\000\000\000\000#a\000E\130\141\190$z\000\129\240\000\000\024\224\003!\000@\192\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$Z\000 4\016\000\017@\128\000\027\000\000\000\000\000\000\000\000\000\000\004\005\000\163a\011E\130\141\190$z\000\129\240\000\000\028\224#a\000E\130\141\190$z\000\129\240\000\000\024\224\003!\000@\192\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$Z\000 4\016\000\017@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\197\189\187\215\250\191\218\231\247\255l>\237\183\255\207\000\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002@\000\131\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\025\000\000\000\000\000\128\000\000\002\000\000\000\000\131\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\025\000\000\000\000\000\128\000\000\002\000\002\000\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\128\000\025\000\000\000\000\000\128\000\000\002\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001!\000D\002\129\152$r\000\0000\000\000\024\192\197\189\187\215\250\191\218\231\247\255l>\237\183\255\223\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\024\000P\000\000\000\000\000\000\000#a\000E\130\141\190$z\000\129\240\000\000\024\224\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#a\000E\130\141\190$z\000\129\240\000\000\024\224\003!\000@\192\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$Z\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\197\189\187\215\250\191\218\231\247\255l>\237\183\255\207\196\148\187\131\232>B\195\129\255l\014\237\183\231\015\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\004#a\000E\130\141\190$z\000\129\240\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#a\000E\130\141\190$z\000\129\240\000\000\024\224\003!\000@\192\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$Z\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#a\000E\130\141\190$z\000\129\240\000\000\024\224\003!\000@\192\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$Z\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\197\189\187\215\250\191\218\231\247\255l>\237\183\255\207\196\148\187\131\232>B\195\129\255l\014\237\183\231\015#a\000E\130\141\190$z\000\129\240\000\000\024\224\003!\000@\192\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$Z\000 4\016\000\017@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\231\245\187\199\234\191\254\231\251\255\173\254\232\183\255\239}\246D\b/\226*\000\t\131\131\220h\176(4#a\000E\130\141\190$z\000\129\240\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#a\000E\130\141\190$z\000\129\240\000\000\024\224\003!\000@\192\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$Z\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#a\000E\130\141\190$z\000\129\240\000\000\024\224\003!\000@\192\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$Z\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#a\000E\130\141\190$z\000\129\240\000\000\024\224\003!\000@\192\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$Z\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#a\000E\130\141\190$z\000\129\240\000\000\024\224\003!\000@\192\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$Z\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#a\000E\130\141\190$z\000\129\240\000\000\024\224\003!\000@\192\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$Z\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#a\000E\130\141\190$z\000\129\240\000\000\024\224\003!\000@\192\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$Z\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#a\000E\130\141\190$z\000\129\240\000\000\024\224\003!\000@\192\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$Z\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#a\000E\130\141\190$z\000\129\240\000\000\024\224\003!\000@\192\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$Z\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#a\000E\130\141\190$z\000\129\240\000\000\024\224\003!\000@\192\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$Z\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#a\000E\130\141\190$z\000\129\240\000\000\024\224\003!\000@\192\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$Z\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#a\000E\130\141\190$z\000\129\240\000\000\024\224\003!\000@\192\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$Z\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#a\000E\130\141\190$z\000\129\240\000\000\024\224\003!\000@\192\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$Z\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#a\000E\130\141\190$z\000\129\240\000\000\024\224\003!\000@\192\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$Z\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#a\000E\130\141\190$z\000\129\240\000\000\024\224\003!\000@\192\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$Z\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#a\000E\130\141\190$z\000\129\240\000\000\024\224\003!\000@\192\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$Z\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#a\000E\130\141\190$z\000\129\240\000\000\024\224\003!\000@\192\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$Z\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#a\000E\130\141\190$z\000\129\240\000\000\024\224\003!\000@\192\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$Z\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#a\000E\130\141\190$z\000\129\240\000\000\024\224\003!\000@\192\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$Z\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#a\000E\130\141\190$z\000\129\240\000\000\024\224\003!\000@\192\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$Z\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#a\000E\130\141\190$z\000\129\240\000\000\024\224\003!\000@\192\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$Z\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\003!\000@\128\004\024$\218\000 0\000\000\016@\003!\000@\128\004\024$Z\000 0\000\000\016@\135\169\"\208\152$\026g\214\003 >\192\006\241T#a\000E\130\141\190$z\000\129\240\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\131\128\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\002\000\000\000\000#a\000E\130\141\190$z\000\129\240\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\001\000\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\002\000\000\000\000#a\000E\130\141\190$z\000\129\240\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000#a\000E\130\141\190$z\000\129\240\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\002@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000#a\000E\130\141\190$z\000\129\240\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\002\000\004\193\016\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\002\000\000\000\000#a\000E\130\141\190$z\000\129\240\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\002\000\004\129\016#a\000E\130\141\190$z\000\129\240\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\131!\000@\128\004\024$Z\000 4\016\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\002\000\004\129\016\131!\000@\128\004\024$Z\000 4\016\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\002\000\004\129\016\131!\000@\128\004\024$Z\000 4\016\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\002\000\004\129\016\128\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\002\000\004\129\016\003!\000@\128\004\024$Z\000 4\016\000\016@\000\000\000\000\000\000\000\000\128\000\000\002\000\004\129\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002C\000\003 \012\192\000 \004\132\128\"\128\b\"\002C\001\131 \012\192\016 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#a\000E\130\141\190$z\000\129\240\000\000\024\224\128\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#a\000E\130\141\190$z\000\129\240\000\000\024\224\128\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\000\000\000\000\000\000\000\000\000\016\000P\000\000\000\000\000\000\000#a\000E\130\141\190$z\000\129\240\000\000\024\224\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\155\003\224\012\000\128\128|\004\002\000\005\134\003\163a\011E\130\141\190$z\000\129\240\000\000\028\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#a\000E\130\141\190$z\000\129\240\000\000\024\224\128\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#a\000E\130\141\190$z\000\129\240\000\000\024\224\128\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001!\000D\002\129\152$r\000\0000\000\000\024\192\197\189\187\215\250\191\218\231\247\255l>\237\183\255\223\000\000\000\000\000\000\016\000P\000\000\000\000\000\000\000#a\000E\130\141\190$z\000\129\240\000\000\024\224\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\197\189\187\215\250\191\219\231\247\255l>\237\183\255\207#a\000E\130\141\190$z\000\129\240\000\000\024\224\003!\000@\192\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$Z\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#a\000E\130\141\190$z\000\129\240\000\000\024\224\128\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\197\189\187\215\250\191\219\231\247\255l>\237\183\255\207#a\000E\130\141\190$z\000\129\240\000\000\024\224\003!\000@\192\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$Z\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#a\000E\130\141\190$z\000\129\240\000\000\024\224\128\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\197\189\187\215\250\191\219\231\247\255l>\237\183\255\207#a\000E\130\141\190$z\000\129\240\000\000\024\224\003!\000@\192\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$Z\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\001\000\000\000\000\000\024\000P\000\000\000\000\000\000\000#a\000E\130\141\190$z\000\129\240\000\000\024\224\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\197\189\187\215\250\191\219\231\247\255l>\237\183\255\207#a\000E\130\141\190$z\000\129\240\000\000\024\224\003!\000@\192\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$Z\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#a\000E\130\141\190$z\000\129\240\000\000\024\224\128\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\197\189\187\215\250\191\219\231\247\255l>\237\183\255\207#a\000E\130\141\190$z\000\129\240\000\000\024\224\003!\000@\192\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$Z\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#a\000E\130\141\190$z\000\129\240\000\000\024\224\128\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\197\189\187\215\250\191\219\231\247\255l>\237\183\255\207#a\000E\130\141\190$z\000\129\240\000\000\024\224\003!\000@\192\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$Z\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\000\000\000\000\000\000\000\000\000\000\000\000\005\000\000\000\000\000\000\000\000\000\016\000P\000\000\000\000\000\000\000#a\000E\130\141\190$z\000\129\240\000\000\024\224\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\197\189\187\215\250\191\219\231\247\255l>\237\183\255\207#a\000E\130\141\190$z\000\129\240\000\000\024\224\003!\000@\192\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$Z\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#a\000E\130\141\190$z\000\129\240\000\000\024\224\128\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\197\189\187\215\250\191\219\231\247\255l>\237\183\255\207#a\000E\130\141\190$z\000\129\240\000\000\024\224\003!\000@\192\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$Z\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#a\000E\130\141\190$z\000\129\240\000\000\024\224\128\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\197\189\187\215\250\191\219\231\247\255l>\237\183\255\207#a\000E\130\141\190$z\000\129\240\000\000\024\224\003!\000@\192\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$Z\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\197\189\187\215\250\191\219\231\247\255l>\237\183\255\207#a\000E\130\141\190$z\000\129\240\000\000\024\224\003!\000@\192\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$Z\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\197\189\187\215\250\191\218\231\247\255l>\237\183\255\223\197\189\187\215\250\191\218\231\247\255,>\232\183\255\207\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#a\000E\130\141\190$z\000\129\240\000\000\024\224\128\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#a\000E\130\141\190$z\000\129\240\000\000\024\224\128\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#a\000E\130\141\190$z\000\129\240\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000#a\000E\130\141\190$z\000\129\240\000\000\024\224\128\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000#a\000E\130\141\190$z\000\129\240\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#a\000E\130\141\190$z\000\129\240\001\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000#a\000E\130\141\190$z\000\129\240\000\000\024\224\003!\000@\192\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$Z\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#a\000E\130\141\190$z\000\129\240\000\000\024\224\003!\000@\192\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$Z\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#a\000E\130\141\190$z\000\129\240\000\000\024\224\003!\000@\192\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$Z\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\002\000\004\129\016#a\000E\130\141\190$z\000\129\240\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\b#a\000E\130\141\190$z\000\129\240\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003!\000@\128\004\024$Z\000 0\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\129!\bD\002\129\152$r\000\0000\000\000\024\192\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#a\000E\130\141\190$z\000\129\240\000\000\028\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#a\002E\130\141\190$z\000\129\240\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001!\000D\002\129\152$r\000\0000\000\000\024\192@\000\000\000\000\000\000\000\000\000`\000\005\000\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\017\000\000\000\000\000\000\000\000\002\000\002@\000\128\000\017\000\000\000\000\000\000\000\000\002\000\000\000\000\128\000\017\000\000\000\000\000\000\000\000\000\000\000\000\000\129\000\001\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000`\000\005\000\000\000\001\000\000\000\000\000\024\004p\000\000\000\000\000\000\000\192\000\017\000\000\000\000\000\000\000`\002\005\002@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\148\187\131\232>B\195\129\255l\014\237\183\231\015\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003!\000@\192\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$Z\000 4\016\000\017@\128\000\017\000\000\000\000\000\000\000\b\000\000\004\001\000\128\000\145\003\224\012\000\128\128|\012\002\000\005\130\003\128\000\016\000\000\000\000\000\000\000\b\000\000\000\000\000\128\000\000\000\000\000\b\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\002@@\000\000\016 \128\000\002\000\000\000\000\000\001\002@@\000\000\016 \000\000\002\000\000\000\000\000\000\000\000\000\000\000\016\000\128\001\000\000\000\000\000\000#a\000E\130\141\190$z\000\129\240\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000\000@\000\000\000\128\000\000\000\000\000\000\000\003\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\002\000\000@\000\001\002@@\000\000\016 \000\000\002\000\000\000\000\000\132\128\"\128\b \018C\128\003 \012\192\000 \004\129\002@@\000 \024 \000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\016\000\000\128\000\000\002\000\000\000\000\001\002@@\000\000\016 \000\000\002\000\000\000\000\000\132\128\"\128\b \018C\128\003 \012\192\000 \004\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000#a\000E\130\141\190$z\000\129\240\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\002\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001 \000\000@\000\016\000\192\000\000\016\000\000\000\000\001 \000\000\000\000\016\000\192\000\000\016\000\000\000\000\001 \000\000\000\000\016\000@\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\128\001\000\000\000\000@\000\003\000\000`\000\000\024\184P\000 \000\000\000\000\000\000\000\000\000\000@\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\001\000\000\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\017\000\000\000\000\000\128\000\004\000\000\000\000\016\000\000\017\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000@\b\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\000\000\000\000\000\128\000\004\000\000\000\000\016\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000@\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000`\000\000\024\184@\000 \000\000\000\000\000\133\128\162\128\b0\nC\128\003 \012\192\016!\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\133\128\162\128\b \nC\128\003 \012\192\016!\004\003\000\000`\000\000\024\184P\000 \000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\001\000\000\000\003\000\000`\000\000\024\184P\000 \000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\003\000\000`\000\000\024\184@\000 \000\000\000\000\000\133\128\"\128\b \nC\128\003 \012\192\016!\004\133\128\162\128\b0\nC\128\003 \012\192\016!\004\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\003\000\000`\000\000\024\184@\000 \000\000\000\000\000\133\128\"\128\b \nC\128\003 \012\192\016!\004\133\128\162\128\b0\nC\128\003 \012\192\016!\004\000\000\000\000\000\000\000\000\128\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000#a\000E\130\141\190$z\000\129\240\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003!\004@\128\004\024$\218\000 0\000\000\016@\003!\004@\128\004\024$Z\000 0\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003!\000@\128\004\024$Z\000 0\000\000\016@\132\128\"\128\b \002C\000\003 \012\192\000 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003!\000@\192\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$Z\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\129\002@@@\000\016 \128\000\002\000\000\000\000\000\001\002@@\000\000\016 \128\000\002\000\000\000\000\000\001\002@@\000\000\016 \000\000\002\000\000\000\000\000\000\000\b\000\000\000\016\000\128\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\129\002@@\000 \024 \000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\b\000\000\016\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\000\002@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003!\000@\128\004\024$Z\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003!\000@\192\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$\218\000 4\016\000\017@\003!\000@\128\004\024$Z\000 4\016\000\017@\128\000\b\000\000\000\000\000\000\000\000\000\000\006A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\129\002@@\000 \024 \000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\b\000\000\016\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\129\002@@\000 \024 \000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\b\000\000\016\000\000\128\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\002@@\000 \024 \000\000\002\000\000\000\000\000@\000\b\000\000\016\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\136\003\224\012\000\128\128|\004\002\000\007\194\003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\129\002@@\000 \024 \000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\b\000\000\016\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\129\002@@\000 \024 \000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\b\000\000\016\000\000\128\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\002@@\000 \024 \000\000\002\000\000\000\000\000@\000\b\000\000\016\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \018C\128\002 \012\192\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\002@@\000\000\016 \128\000\002\000\000\000\000\000\001\002@@\000\000\016 \000\000\002\000\000\000\000\000\132\128\"\128\b \018C\128\002 \012\192\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\128\004\000@\000\000\000\128\000\000\000\000\000\000\000\001\000\000\000@\000\b\000\128\000\000\000\000\000\000\000\001\000\000\000\000\000\b\000\128\000\000\000\000\000\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002C\000\002 \014\192\000 \000\001\002@@\000 \024 \000\000\002\000\000\000\000\000\196\128\"\128\b0\002C\128\002 \012\192\000 \000\132\128\"\128\b \002C\000\002 \012\192\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\004\000\000\000\000\000\128\000\000\000\000\000\000\000\003\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\002\000\000@\000\132\128\"\128\b \002C\000\002 \012\192\000 \004\132\128\"\128\b \002B\000\002 \012\192\000 \004\003\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\002\000\000@\000\132\128\"\128\b \002C\000\002 \012\192\000 \004\132\128\"\128\b \002B\000\002 \012\192\000 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\002\000\000@\000\132\128\"\128\b \002C\000\002 \012\192\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000}\246D\b/\226*\000\t\131\131\220h\176(4'\225\"\213\138\173\190fz\002\129\252\000\000x\224\003!\000@\128\004\024$Z\000 4\016\000\016@\016\000\002\000\000\000\000\000\128\000\000\000\000\004\129\016#a\000E\130\141\190$z\000\129\240\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000}\246D\b/\226*\000\t\131\131\220h\176(4'\225\"\213\138\173\190fz\002\129\252\000\000x\224\001\002@@@\000\016 \128\000\002\000\000\000\000\000\001\002@@\000\000\016 \128\000\002\000\000\000\000\000\001\002@@\000\000\016 \000\000\002\000\000\000\000\000\132\128\"\128\b \018C\128\002 \012\192\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\024\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\024\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\001\000\000\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\132\128\"\128\b\"\002C\129\130 \014\192\016 \000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\129\"\128\b \002C\000\002 \012\192\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002C\000\002 \012\192\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b\"\002C\129\130 \014\192\016 \000\001 \000\000@\000\016\000\192\000\000\016\000\000\000\000\001 \000\000\000\000\016\000\192\000\000\016\000\000\000\000\001 \000\000\000\000\016\000@\000\000\016\000\000\000\000\132\128\"\128\012 \002C\128\002 \014\192\000`\000\001 \000\000\000\000\016\000@\000\000\016\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\128\000\132\128\"\128\b \002C\128\002 \012\193\000!\000\001\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\132\128\"\128\b \002C\128\002 \012\192\000 \000\132\128\"\128\b \002C\000\002 \012\192\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002C\128\002 \012\192\000 \000\132\128\"\128\b \002C\000\002 \012\192\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\128\"\240\024 \024\250@\002 \012\000\000 \000\132\128\"\128\b \000B\000\002\000\012\192\000 \000\001\000\000\000@\000\000\000\128\000\000\000\000\000\000\128\001\000\000\000@\000\000\000\128\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \016C\000\002\000\012\193\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \016C\000\002\000\012\193\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\128\004\000@\000\000\000\128\000\000\000\000\000\000\000\001\000\000\000@\000\b\000\128\000\000\000\000\000\000\000\001\000\000\000\000\000\b\000\128\000\000\000\000\000\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\132\128\"\128\b \000C\000\002\000\014\192\001 \000\001\002@@\000 \024 \000\000\002\000\000\000\000\000\196\128\"\128\b0\000C\128\002\000\012\192\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\004\000\000\000\000\000\128\000\000\000\000\000\000\000\003\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\002\000\001@\000\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \016C\000\002\000\012\193\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\001\002@@\000 \024 \000\000\002\000\000\000\000\000\196\128\"\128\b0\000C\128\002\000\012\192\000 \004\132\128\"\128\b \000B\000\002\000\012\192\000 \004\003\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\001\002@@\000 \024 \000\000\002\000\000\000\000\000\196\128\"\128\b0\000C\128\002\000\012\192\000 \004\132\128\"\128\b \000B\000\002\000\012\192\000 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\002\000\000@\000\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \000C\000\002\000\012\193\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\002@@\000 \024 \000\000\002\000\000\000\000\000\196\128\"\128\b0\000C\128\002\000\012\192\000 \000\132\128\"\128\b \000C\000\002\000\012\192\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\002\000\000@\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\002@@@ \024 \128\000\002\000\000\000\000\000\001\002@@\000 \024 \128\000\002\000\000\000\000\000\001\002@@\000 \024 \000\000\002\000\000\000\000\000\196\128\"\128\b0\000C\128\002\000\012\192\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001 \000\000@\000\016\000\192\000\000\016\000\000\000\000\001 \000\000\000\000\016\000\192\000\000\016\000\000\000\000\001 \000\000\000\000\016\000@\000\000\016\000\000\000\000\132\128\"\128\012 \000C\128\002\000\012\192\000`\000\b\128\000\000@\000\b\000\192\000\000\000\000\000\000\000\b\000\000\000@\000\b\000\192\000\000\000\000\000\000\000\b\000\000\000\000\000\b\000\192\000\000\000\000\000\000\000\b\000\000\000\000\000\b\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000@\000\000\000\000\000\000\000\002\000\000$\128\004\000\000\000\016\000\000\000\000\000\128\000\000\002\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\001\000\000@\002\000\n @\000\000\000\000\000\000\000\132\000\000\128\000\002\016B\128\128\000\000@\016\000\000\132\000\000\128\000\002\016B\000\128\000\000@\016\000\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\b\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\128\000\002\000B\000\128\000\000@\016\000\000\b\000\000\000\000@\b\000\128\000\000\000\000\000\000\000\b\000\000\000\000@\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\132\000\000\128\000\002\000C\128\128\000\000@\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\b\000\000\b\000\128\000\000\000\000\000\000\000\b\000\000\b\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\132\000\000\128\000\002\000C\000\128\000\000@\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000@\002\000\n \192\000\000\000\000\000\000\000\001\000\000@\002\000\n @\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\128\000\000\000\000\000\000\128\001\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\001\000\000\000\001\000\000@\002\000\n @\000\000\000\000\000\000\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\004\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\002\000\000\000\000\000\128\000\000\000\000\004\000\000\000\000\002\000\000\000\000\000\128\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128*\128\b\"\002C\128\130 \014\192\016 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\001\000\000\000\001\000\000@\002\000\n @\000\000\000\000\000\000\000\132\128*\128\b\"\002C\128\130 \014\192\016 \004\132\000\000\128\000\002\000C\128\128\000\000@\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\024\184\192\000 \000\000\000\000\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\002\000\000\000\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\132\000\000\128\000\002\000C\129\128\000\000@\016\000\000\132\000\000\128\000\002\000C\000\128\000\000@\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\128\000\002\000C\000\128\000\000@\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\128\000\002\000B\000\128\000\000@\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002C\128\002 \012\192\000 \004\132\128\"\128\b \002B\000\002 \012\192\000 \004\b\000\000\000\000\000\b\000\192\000\000\000\000\000\000\000\b\000\000\000\000\000\b\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\001\000\000@\002\000\n @\000\000\000\000\000\000\000\132\128\"\128\b \002C\128\002 \012\192\000 \004\132\128\"\128\b \002B\000\002 \012\192\000 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\b\000\192\000\000\000\000\000\000\000\b\000\000\000\000\000\b\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\003\000\000p\018\000\026\184@\000 \000\000\000\000\000\133\128\170\128\b0\bC\128\002 \014\192\000`\004\003\000\000`\000\000\024\184@\000 \000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\003\000\000p\018\000\026\184@\000 \000\000\000\000\000\003\000\000p\016\000\024\184@\000 \000\000\000\001@\000\000\002\000\000\000\000\000\128\000\000\000\000\004\001\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\003\000\000p\018\000\026\184@\000 \000\000\000\000\000\003\000\000`\000\000\024\184@\000 \000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\003\000\000p\018\000\026\184@\000 \000\000\000\000\000\133\128\170\128\b0\bC\128\002 \014\192\000 \004\133\128\170\128\b0\bC\128\002 \014\192\000 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128*\128\b \000C\128\002\000\014\192\000 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \000C\000\002\000\012\192\000 \004\132\128\"\128\b \000B\000\002\000\012\192\000 \004\b\000\000\000\000\000\b\000\192\000\000\000\000\000\000\000\b\000\000\000\000\000\b\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\003\000\000p\018\000\026\184@\000 \000\000\000\000\000\132\128\"\128\b \000C\000\002\000\012\192\000 \004\132\128\"\128\b \000B\000\002\000\012\192\000 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \000B\000\002\000\012\192\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \000C\000\002\000\012\192\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \000B\000\002\000\012\192\000 \004\002\000\000$\128\004\024\000\128\016\000\000\000\000\000\128\002\000\000$\128\004\024\000\000\016\000\000\000\000\000\128\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002C\000\002 \014\192\016 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002C\000\002 \012\192\016 \004\132\128\"\128\b \002B\000\002 \012\192\000 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \000B\000\002\000\012\192\000 \004\002\000\000$\128\004\024\000\128\016\000\000\000\000\000\128\002\000\000$\128\004\024\000\000\016\000\000\000\000\000\128\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\003 \000x\016\000\024\184P\000 \016\002\000\001\000\003\000\002p\016\000\024\184@\000 \000\000\000\001@\000\000\000\000\000@\b\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\133\160\"\128\b \018C@\002 \028\192\016 \004\132\128\"\128\012 \002C\128\002 \012\192\016a\004\132\128\"\128\b \002C\128\002 \012\192\016!\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002C\000\002 \012\192\016!\004\001 \000\000\000\000\016\000@\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \000C\000\002\000\012\192\016 \004\132\128\"\128\b \000B\000\002\000\012\192\000 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002C\128\002 \014\192\016 \004\001 \000\b\000\000\016\000P\000\000\016\002\000\001\000\001 \000\000\000\000\016\000P\000\000\016\002\000\001\000\000\000\000\000\000@\b\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\012 \002C\128\002 \012\192\016a\004\132\128\"\128\b \002C\128\002 \012\192\016!\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\b\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\128\000\000\000\000\000\000\000\b\128\000\000@\000\b\000\192\000\000\000\000\000\000\000\b\000\000\000\000\000\b\000\192\000\000\000\000\000\000\000\b\000\000\000\000\000\b\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\003)\000P\144\004\024$V\000 2\000\000P@\001\000\000@\002\000\026 @\000\000\128\000\000\000\000\132\000\000\128\000\002\016B\129\128\000\000@\016\000\000\132\000\000\128\000\002\016B\001\128\000\000@\016\000\000\132\000\000\128\000\002\000B\001\128\000\000@\016\000\000\b\000\000\000\000@\b\000\128\000\000\000\000\000\000\128\000\000\000\000\000@\b\000\128\000\000\000\000\000\000\000\000\000\000\000\000@\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\002@\000#a\000E\130\141\190$z\000\129\240\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000#a\000E\130\141\190$z\000\129\240\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\128\000\002\000C\001\128\000\000@\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000@\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\132\000\000\128\000\002\000C\129\128\000\000@\016\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\002@\000#a\000E\130\141\190$z\000\129\240\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000#a\000E\130\141\190$z\000\129\240\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\b\000\000\b\000\128\000\000\000\000\000\000\128\000\000\000\b\000\000\b\000\128\000\000\000\000\000\000\000\000\000\000\b\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\003)\000P\144\004\024$V\000 2\000\000P@\003\128\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\002\000\000\000\000#a\000E\130\141\190$z\000\129\240\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000#a\000E\130\141\190$z\000\129\240\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\128\000\002\000C\001\128\000\000@\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\b\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\003)\000P\144\004\024$V\000 2\000\000P@\003\128\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\002\000\000\000\000#a\000E\130\141\190$z\000\129\240\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000#a\000E\130\141\190$z\000\129\240\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#a\000E\130\141\190$\250\000\129\240\000\000\024\224#a\000E\130\141\190$z\000\129\240\000\000\024\224\132\000\000\128\000\002\000C\001\128\000\000@\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000@\002\000\026 \192\000\000\128\000\000\000\128\001\000\000@\002\000\026 \192\000\000\128\000\000\000\000\001\000\000@\002\000\026 @\000\000\128\000\000\000\000\001\000\000@\002\000\026 @\000\000\128\000\000\000\000\003!\004@\200\004\024$\218\000 0\000\000\016@}\246D\b/\226*\000\t\131\131\220h\176(4\003!\004@\128\004\024$\218\000 0\000\000\016@\003!\004@\128\004\024$Z\000 0\000\000\016@\003!\000@\128\004\024$Z\000 0\000\000\016@\000\000\000\000\000\000\000\001\000\001\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\128\000\000\000\000\000\000\128\001\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\001\000\000\000\001\000\000@\002\000\026 @\000\000\128\000\000\000\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\004\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003)\000P\144\004\024$\214\000 0\000\000\016@\003)\000P\144\004\024$V\000 0\000\000\016@\003)\000P\144\020\024$V\000 0\000\000\016@\001\000\000@\002\000\026 @\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\004\001\000\000@\002\000\026 @\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\133\169*\212\026\163\154g\247\130 <\192\016x\212\133\169*\212\026\163\154g\247\130 <\192\016x\212\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128*\128\b\"\002C\129\130 \012\192\016`\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128*\128\b\"\002C\129\130 \012\192\016`\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128*\128\b\"\002C\129\130 \012\192\016`\020\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\001\000\000\000\001\000\000@\002\000\026 @\000\000\128\000\000\000\000\132\128*\128\b\"\002C\129\130 \012\192\016`\020\003!\004@\128\004\024$Z\000 0\000\000\016@\003!\000@\128\004\024$Z\000 0\000\000\016@\000\000\000\000\000\000\000\001\000\001\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\000\128\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\018\000\026\184@\000 \000\000\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\128\000\002\000C\129\128\000\000@\016\000\016\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\128\000\002\000C\001\128\000\000@\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000@\002\000\026 @\000\000\128\000\000\000\000\132\000\000\128\000\002\000C\129\128\000\000@\016\000\016\132\000\000\128\000\002\000C\001\128\000\000@\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\024\184\192\000 \000\000\000\000\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\132\000\000\128\000\002\000C\001\128\000\000@\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\128\000\002\000C\001\128\000\000@\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\128\000\002\000B\001\128\000\000@\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002C\128\002 \012\192\000 \004\003\000\000p\018\000\026\184@\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\001\000\000@\002\000\026 @\000\000\128\000\000\000\000\132\128\"\128\b \002C\128\002 \012\192\000 \004\003)\000P\144\004\024$V\000 2\000\000P@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002C\000\002 \012\192\000 \004\132\128\"\128\b \002B\000\002 \012\192\000 \004\b\000\000\000\000\000\b\000\192\000\000\000\000\000\000\000\b\000\000\000\000\000\b\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\003)\000P\144\004\024$V\000 2\000\000P@\132\128\"\128\b \002C\000\002 \012\192\000 \004\132\128\"\128\b \002B\000\002 \012\192\000 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002B\000\002\000\012\192\000 \000\003!\004@\192\004\024$\218\000 0\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002B\000\002 \012\192\000 \004\132\128\"\128\b \002C\000\002 \012\192\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002B\000\002 \012\192\000 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002C\000\002\000\012\192\000 \000\132\128\"\128\b \002B\000\002\000\012\192\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002B\000\003 \012\192\000 \004\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002C\000\002\000\012\192\000 \000\132\128\"\128\b \002B\000\002\000\012\192\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\128*\128\b0\018C\128\002 \014\192\002 \004\192\000\b\000\000\016\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\128\000\000\000\000\004\193\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\b\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\128\000\002\000B\001\128\000\000@\016\000\000\128\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\131!\000@\128\004\024$Z\000 4\016\000\017@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\001 \000\b\000\000\016\000@\000\000\016\000\000\001\000\001 \000\000\000\000\016\000@\000\000\016\000\000\001\000\001 \000\000\000\000\016\000@\000\000\016\000\000\000\000\132\128\"\128\012 \002C\128\002 \014\192\000a\000\001 \000\000\000\000\016\000@\000\000\016\000\000\000\000\132\128\"\128\b \002C\128\002 \012\192\000!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002C\000\002 \012\192\000!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\012 \002C\128\002 \014\192\000a\000\001 \000\000\000\000\016\000@\000\000\016\000\000\000\000\132\128\"\128\b \002C\128\002 \012\192\000!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\132\128\"\130\b \002C\000\002 \014\192\016 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002C\000\002 \012\192\016 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\001 \000\b\000\000\016\000@\000\000\016\000\000\001\000\001 \000\000\000\000\016\000@\000\000\016\000\000\001\000\132\128\"\128\b \002C\000\002 \012\192\000!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\128\000\004\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\004\000\000\000\000\000\003\000\000`\000\000\024\184\192\000$\000\002\000\000\000\003\000\000`\000\000\024\184@\000$\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\016\000\000\000\b\000\000\000$\000\000\000\000\000\003\000\000`\000\000\024\184@\000$\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\004\000\000\001\000\000\000\000\000\b\000\000\000 \000\000\000\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\b\000\000\000\000\000\128\000\000\000\000\004\000\000\000\000\b\000\000\000\000\000\128\000\000\000\000\004\000\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\b\000\000\000\000\000\128\000\000\000\000\004\000\000\000\000\000\000\000@\b\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002C\128\002 \012\192\016 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003 \000x\016\000\024\184P\000 \016\002\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \000C\000\002\000\012\192\016 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\001 \000\b\000\000\016\000@\000\000\016\000\000\001\000\001 \000\000\000\000\016\000@\000\000\016\000\000\001\000\132\128\"\128\b \000C\000\002\000\012\192\000!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\132\128\"\130\b \000C\000\002\000\014\192\017 \004\003 \000x\016\000\024\184P\000 \016\002\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \000C\000\002\000\012\192\016 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\001 \000\b\000\000\016\000@\000\000\016\000\000\001\000\001 \000\000\000\000\016\000@\000\000\016\000\000\001\000\132\128\"\128\b \000C\000\002\000\012\192\000!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\b\000\000\016\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002C\000\002 \012\192\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#a\000E\130\141\190$z\000\129\240\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000#a\000E\130\141\190$z\000\129\240\000\000\024\224\128\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\128 \128\b \000B\000\002\000\012\128\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001 \000\000\000\000\024\000@\000\000\016\000\000\000\000\128\000\136\007\224,\004\128\000|D\002\004\001\130\139\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\001\000\000\000\001\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\128\000\128\007\224,\004\128\000|D\002\004\001\130\139\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001 \000\000\000\000\016\000@\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#a\000E\130\141\190$z\000\129\240\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\002@@\000\000\016 \000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\128\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\002@@\000 \024 \000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\016\000\000\128\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003!\000@\128\004\024$Z\000 4\016\000\016@\000\000\000\000\000\000\000\000\128\000\000\000\128\004\129\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\001\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000'\225 \197\138\173\190fz\002\161\252\128\0008\224\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\005\161 \128\b \026B\002\002 \028\128\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\128 \128\b \002B\000\002 \012\129\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\128 \128\b \002B\000\002\000\012\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\001\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000'\225 \197\138\173\190fz\002\161\252\128\0008\224'\225 \197\138\173\190fz\002\161\252\128\0008\224\004\128 \128\b \002B\000\002 \012\128\000 \000\004\128 \128\b \002B\000\002 \012\128\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\128 \128\b \002C\000\002 \012\128\000 \000\004\128 \128\b \002B\000\002 \012\128\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\128 \128\b \002C\000\002 \012\128\000 \000\004\128 \128\b \002B\000\002 \012\128\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000") + (128, "'\233 \197\138\173\190f~\002\129\252\128\0008\224#i\000E\194\141\190$\254\000\129\240\000\000\024\224}\246D\b/\226*\000\t\131\131\220x\176(4\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\175\235f\245\155\175\190f\255\146\163\252Q\016y\224}\246D\b/\226*\000\t\131\131\220x\176(4\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#i\000E\130\141\190$\254\000\129\240\000\000\024\224}\246D\b/\226*\000\t\131\131\220x\176(4'\233\"\213\138\173\190f~\002\129\252\000\000x\224\000\000\000\000@\000\024\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\024\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\128\000\128\007\224,\004\128\000|D\002\004\001\002\139\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000P\000\000\000\000\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\133\128\179\160\b2\nC\129\131$\014\193\018!\020\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\016 \024\184@\000 \000\000\000\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\002@@@ \024 \128\000\002\000\000\000\000\000\001\002@@\000 \024 \128\000\002\000\000\000\000\000\001\002@@\000 \024 \000\000\002\000\000\000\000\000\196\128*\128\b0\018C\128\002 \014\193\003 \004\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128 \128\b \000B\128\002\000\012@\000 \000\132\128 \128\b \000B\000\002\000\012@\000 \000\003\000\000$\193\004\024\000\128\016\000\000\000\000\000\128\003\000\000$\129\004\024\000\128\016\000\000\000\000\000\128\003\000\000$\129\004\024\000\000\016\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000 \000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000$\128\004\024\000\000\016\000\000\000\000\000\128\002\000\000 \000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000$\128\004\000\000\000\016\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000 \128\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000$\128\004\000\000\000\016\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\132\128\"\130\b \000C\000\002\000\014\192\017 \004\003 \000x\016\000\024\184P\000 \016\002\000\001\000\132\128\"\128\012 \018C\128\002 \012\193\016a\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003 \000p\016\000\024\184P\000 \016\002\000\001\000\003\000\bp\016 \024\184@\000 \000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\197\128\187\128\b2\nC\129\130$\014\192\022a\022\003\000\000`\000\000\024\184@\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000`\000\000\024\184@\000$\000\002\000\000\000\001\000\016\000\000\000\b\000\000\000$\000\000\000@\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000}\246D\b/\226*\000\t\131\131\220x\176(4'\233\"\213\138\173\190f~\002\129\252\000\000x\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000$\193\004\024\000\128\016\000\000\000\000\000\128\003\000\000$\129\004\024\000\128\016\000\000\000\000\000\128\003\000\000$\129\004\024\000\000\016\000\000\000\000\000\128\003\000\000$\128\004\024\000\000\016\000\000\000\000\000\128\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\132\128\"\130\b \002C\000\002 \014\192\016 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002C\000\002 \012\192\016 \004}\246D\b/\226*\000\t\131\131\220x\176(4'\233\"\213\138\173\190f~\002\129\252\000\000x\224#i\000E\194\141\190$\254\000\129\240\000\000\024\224#i\000E\130\141\190$\254\000\129\240\000\000\024\224#i\000E\130\141\190$~\000\129\240\000\000\024\224\000\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002@\000\131\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\024\184@\000 \000\000\000\001@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\024\184@\000 \000\000\000\000@\003\000\002p\016\000\024\184@\000 \000\000\000\001@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\024\184@\000 \000\000\000\000@\003\000\000p\016\000\024\184@\000 \000\000\000\001@\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\001\000\000\000\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\016\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\024\184@\000 \000\000\000\000@\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\128;\128\b2\002C\129\130$\014\192\022!\022\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\003\000\000`\000\000\024\184@\000 \000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\001\000\000\000\001\000\000\000\000\000\024\024@\000\000\000\000\000\000\000\003\000\000p\016 \024\184@\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\197\128\187\128\b2\nC\129\130$\014\192\022!\022\003\000\000`\000\000\024\184@\000 \000\000\000\000\000\197\128\187\128\b2\nC\129\130$\014\192\022a\022\003\000\000`\000\000\024\184@\000 \000\000\000\000\000\197\128\187\128\b2\nC\129\130$\014\192\022!\022\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\128\187\128\b2\002C\129\130$\014\192\022!\022\003\000\000`\000\000\024\184@\000 \000\000\000\000\000\197\128\187\128\b2\nC\129\130$\014\192\022a\022\003\000\000`\000\000\024\184@\000 \000\000\000\000\000\197\128\187\128\b2\nC\129\130$\014\192\022!\022\197\128\187\128\b2\nC\129\130$\014\192\022!\022\197\128\187\128\b2\nC\129\130$\014\192\022!\022\196\128;\128\b2\002C\129\130$\014\192\022!\020\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\024\184@\000 \000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\004\000\000\000\128\000\004\000\000\000\001\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\002\000\000\000\000\000\128\000\004\000\000\000\001\002\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\002\000\000\000\000\000\128\000\004\000\000\000\001\018\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\175\235w\253\155\239\190\255\255\147\167\252\210\0169\228\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\128\000\004\000\000\000\001\018\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\128\000\004\000\000\000\001\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\003\000\000p\016\000\024\184@\000 \000\000\000\000@\000\000\002\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\004\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\025\000\000\000\000\000\128\000\000\002\000\000\000\000\131\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\025\000\000\000\000\000\128\000\000\002\000\002\000\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\128\000\025\000\000\000\000\000\128\000\000\002\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000#i\000E\130\141\190$~\000\129\240\000\000\024\224\000\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002@\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001!\000D\002\129\152$r\000\0000\000\000\024\192\132\000\000\128@\002\016B\129\128\000\000@\016\000\000\132\000\000\128\000\002\016B\129\128\000\000@\016\000\000\132\000\000\128\000\002\016B\001\128\000\000@\016\000\000\003)\000@\128\004\024$^\000 4\016\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\b\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\003)\000@\128\004\024$^\000 4\018\000\016@\000\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\b\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\131)\136G\224,\028\164^|d6\020\001\146\203\128\000\b\000\000\000\000\000\002\000\000 \000\000\000\000\131\000\000\000@\000\000\000\128\000\000\000\000\000\000\000\003\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\002@@\000 \024 \000\000\002\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\001\002@@\000\000\016 \128\000\002\000\000\000\000\000\001\002@@\000\000\016 \000\000\002\000\000\000\000\000\167\233 \197\138\173\190f\254\002\129\252@\0008\224\167\233 \197\138\173\190f~\002\129\252@\0008\224\167\233\"\197\138\173\190f~\002\129\252\192\0008\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\002@@@\000\016 \128\000\002\000\000\000\000\128\001\002@@@\000\016 \128\000\002\000\000\000\000\000\001\002@@\000\000\016 \128\000\002\000\000\000\000\000\001\002@@\000\000\016 \000\000\002\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\002@@\000\000\016 \000\000\002\000\000\000\000\000#i\000E\130\141\190$\254\000\129\240\000\000\024\224#i\000E\130\141\190$~\000\129\240\000\000\024\224\001\000\000\000@\000\b\000\128\000\000\000\000\000\000\000\001\000\000\000\000\000\b\000\128\000\000\000\000\000\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001!\000D\002\129\152$r\000\0000\000\000\024\192#i\000E\130\141\190$~\000\129\240\000\000\024\224#i\000E\194\141\190$\254\000\129\240\000\000\024\224#i\000E\130\141\190$\254\000\129\240\000\000\024\224#i\000E\130\141\190$~\000\129\240\000\000\024\224\163i\136G\226\173\190\164~|\197\242\004\001\154\235\129!\bD\002\129\152$r\000\0000\000\000\024\192#i\000E\130\141\190$~\000\129\240\000\000\028\224\197\189\187\215\250\191\219\231\247\255l>\237\183\255\207#i\000E\130\141\190$~\000\129\240\000\000\024\224\003)\000@\128\004\024$^\000 0\000\000\016@\000\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\b\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\003)\000@\128\004\024$^\000 0\002\000\016@\000\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\b\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003)\000@\128\004\024$^\000 4\016\000\020@\003)\002@\128\004\024$^\000 4\016\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\017\000\000\000\000\000\000\000\000\002\000\000@\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\128\000\017\000\000\000\000\000\128\000\000\002\000\000\000\000\128\000\017\000\000\000\000\000\000\000\000\002\000\000\000\000\003)\000@\128\004\024$^\000 4\016\000\016@\003!\000@\192\004\024$\210\000 0\000\000\016@\003!\000@\128\004\024$\210\000 0\000\000\016@\003!\000@\128\004\024$R\000 0\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\147)\027P\144\020\024$\214\000 2\130\006\213P\000\001\000\000\128\004\000\000\002\000\000 \000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\147)\027P\144\020\024$\222\000 6\145\006\213P\001\000\000\000\000\000\016\004P\000\000\000\000\000\000\000\131)\b@\128\004\024$^\000 4\016\000\144@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003!\000@\128\004\024$R\000 0\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\003)\000@\128\004\024$^\000 4\018\000\016@\000\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\b\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003!\000@\128\004\024$R\000 0\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003)\000@\192\004\024$\222\000 4\016\000\016@\003)\000@\128\004\024$\222\000 4\016\000\016@\003)\000@\128\004\024$^\000 4\016\000\016@\003!\000@\128\004\024$Z\000 0\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\003!\000@\128\004\024$R\000 0\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\147)\027@\128\020\024$\222\000 6\144\004\213P\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\144\000\027\000\000\016\000\000\128\000\000\002\128\004\197\016\003)\000@\128\004\024$^\000 4\018\000\016@\000\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\b\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003!\000@\128\004\024$R\000 0\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\144\000\027\000\000\016\000\000\128\000\000\002\128\004\197\016\131)\000@\128\004\024$^\000 4\016\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\144\000\027\000\000\016\000\000\128\000\000\002\128\004\197\016\147)\027@\128\020\024$\222\000 6\144\004\213P\131\169\136G\224,\028\164^|d6\020\001\146\203\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\b\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\003!\000@\128\004\024$R\000 0\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\000\002\000\000 \000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\000\128\000\000\000\000\004\193\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\131)\000@\128\004\024$^\000 4\018\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\b\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003!\000@\128\004\024$R\000 0\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\144\000\027\000\000\016\000\000\128\000\000\002\128\004\197\016\131\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\131)\000@\128\004\024$^\000 4\016\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\144\000\027\000\000\016\000\000\128\000\000\002\128\004\197\016\128\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\144\000\027\000\000\016\000\000\128\000\000\002\128\004\197\016\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\000\128\000\000\000\000\004\129\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003)\002@\128\004\024$^\000 4\016\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\018\000\000\000\000\000\128\000\000\000\000\004\133\016\131)\002@\128\004\024$^\000 4\016\000\020@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\017\000\000\000\000\000\128\000\000\000\000\004\129\016\128\000\017\000\000\000\000\000\000\000\000\000\000\000\000\000\131\000\001\000\000\000\b\000\000\000\000\000\000\000\000\000\128\000\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003!\000@\128\004\024$R\000 0\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\002\000\004\129\016\131)\000@\128\004\024$^\000 4\016\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\002\000\004\129\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\002\000\004\129\016\003)\000@\128\004\024$^\000 0\002\000\016@\000\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\b\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003!\000@\128\004\024$R\000 0\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\002\000\004\129\016\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\003)\000@\128\004\024$^\000 0\002\000\016@\000\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\b\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003!\000@\128\004\024$R\000 0\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\002\000\004\129\016\003!\000@\128\004\024$R\000 0\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\003)\000@\128\004\024$^\000 0\002\000\016@\000\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\b\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003!\000@\128\004\024$R\000 0\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\002\000\004\129\016\003)\000P\144\004\024$\214\001 2\000\004\209X\000\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\002\000\000@\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\b\000\000\000\000\000\128\000\000\002\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\002\000\000\000\000#i\000E\130\141\190$~\000\129\240\000\000\024\224\003)\004@\200$\024$\222\000 4\000\000\016@\001\002@@@\000\016 \128\000\002\000\000\000\000\128\001\002@@@\000\016 \128\000\002\000\000\000\000\000\001\002@@\000\000\016 \128\000\002\000\000\000\000\000\001\002@@\000\000\016 \000\000\002\000\000\000\000\000\000\000\000\000\000\000\016\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\003\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\001\002@@\000 \024 \000\000\002\000\000\000\000\000\003\002H@\000 \024 \000\000\002\000\000\000\000\000\192\000\b\000\000\016\016\000\128\000\000\000\001\000@\000\000\000\000\000\000\000\016\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\016\000\000\000\000\000\000\000\000\000\001\002@@\000 \024 \000\000\002\000\000\000\000\000\000\000\000\000\000\016\016\000\000\000\000\000\000\000\000\000\001\002@@\000 \024 \000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\128*\128\b0\002C\128\002 \014\192\002 \004\000\128\000\000\000 \000\000\000\000\000\000\000\000\000\000\003\000\000$\128\004\024\000\000\016\000\000\000\000\000\128\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\001\000\000\003\000\000x\016\000\024\184@\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\196\128*\128\b0\002C\128\002 \014\192\002 \020\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\196\128*\128\b0\002C\128\002 \014\192\018 \020\196\128*\128\b0\002C\128\002 \014\192\018 \004\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\002\000\000\000\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\196\128*\128\b0\002C\128\002 \014\192\018 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\001\000\000\001\002@@\000 \024 \000\000\002\000\000\000\000\000\196\128*\128\b0\002C\128\002 \014\192\002 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\001\000\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\196\128*\128\b0\018C\128\002 \014\193\003 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\002@@\000 \024 \000\000\002\000\000\000\000\000\196\128*\128\b0\002C\128\002 \014\192\002 \004\001\002@@\000 \024 \000\000\002\000\000\000\000\000\196\128*\128\b0\002C\128\002 \014\192\002 \004\000\000\000\000\000\000\000\000\000\000\000\002\001\001\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\128*\128\b0\018C\128\002 \014\193\002 \004\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\128*\128\b0\018C\128\002 \014\193\002 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\128*\128\b0\002C\128\002 \014\192\002 \004\000\128\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\128*\128\b0\002C\128\002 \014\192\002 \004\192\000\b\000\000\016\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\b\000\000\016\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\016\000\000\000\000\000\000\000\000\000\001\002@@\000\000\016 \000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\128*\128\b0\018C\128\003 \014\192\002`\004\005\002H@\000\000\016 \000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\016\000\128\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\002@@\000 \024 \000\000\002\000\000\000\000\000\192\000\b\000\000\016\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\128*\128\b0\018C\128\003 \014\193\002`\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\128\001\000\000\000\000\000\000#i\000E\130\141\190$~\000\129\240\000\000\024\224#i\002E\130\141\190$~\000\129\240\000\000\024\224\000\000\000\000\000\000\b\000\000\000\b\000\000\000\000\000\128\000\016\000\000\000\000\000\000\000\b\002\000\000\000\000#i\000E\130\141\190$~\000\129\240\000\000\024\224\001!\000D\002\129\152$r\000\0000\000\000\024\192\192\000\017\000\000\000\000\000\000\000`\002\005\002@\000#i\000E\194\141\190$\254\000\129\240@\000\024\224#i\000E\130\141\190$\254\000\129\240@\000\024\224#i\000E\130\141\190$~\000\129\240@\000\024\224\001!\000DB\129\152$\242\000\0000\000\000\024\192\001!\000D\002\129\152$\242\000\0000\000\000\024\192\001!\000D\002\129\152$r\000\0000\000\000\024\192\001!\000D\002\129\152$r\000\0000\000\000\024\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\197\189\187\215\250\191\218\231\247\255l>\237\183\255\223\001\000\000\000\000\000\024\004p\000\000\000\000\000\000\000\163i\136G\226\173\190\164~|\197\242\004\001\154\235\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\163i\bE\130\141\190$~\000\129\240\000\000\024\224\163i\bE\130\141\190$~\000\129\240\000\000\024\224\129\002@@@\000\016 \128\000\002\000\000\000\000\000\001\002@@\000\000\016 \128\000\002\000\000\000\000\000\001\002@@\000\000\016 \000\000\002\000\000\000\000\000\000\000\000\000\000\000\016\000\128\000\000\000\000\000@\000\129\002@@\000 \024 \000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\b\000\000\016\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\163i\bE\130\141\190$~\000\129\240\000\000\024\224\163i\bE\130\141\190$~\000\129\240\000\000\024\224\131)\b@\128\004\024$^\000 0\000\000\016@\000\000\000\000\000\000\000\000\128\000\000\002\000\004\193\016\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\002\000\000\000\000#i\000E\130\141\190$~\000\129\240\000\000\024\224\001!\000D\002\129\152$r\000\0000\000\000\024\192\000\000\000\000\000\000\000\000\000\000`\000\005\004\000\000\001!\000D\002\129\152$r\000\0000\000\000\024\192\197\189\187\215\250\191\218\231\247\255l>\237\183\255\223\000\000\000\000\000\000\016\000P\000\000\000\000\000\000\000#i\000E\130\141\190$~\000\129\240\000\000\024\224#i\000E\194\141\190$\254\000\129\240\000\000\024\224#i\000E\130\141\190$\254\000\129\240\000\000\024\224#i\000E\130\141\190$~\000\129\240\000\000\024\224\003)\000@\192\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$^\000 4\016\000\017@\003)\000@\128\004\024$^\000 4\016\000\016@\016\000\000\000\000\016\000\000\128\000\000\000\000\004\129\016#i\000E\130\141\190$~\000\129\240\000\000\024\224\003)\000P\208\004\024$\214\000 0\000\000\016@\003)\000P\144\004\024$\214\000 0\000\000\016@\003)\000P\144\004\024$V\000 0\000\000\016@\002\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003)\000@\128\004\024$^\000 4\016\000\016@\000\000\b\000\000\000\000\000\128\000\000\002\000\004\193\016\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\b\000\000\000\000\000\128\000\000\002\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\131\169\136G\224,\028\164^|d6\020\001\146\203\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003!\000@\128\004\024$R\000 0\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003)\000P\144\020\024$V\000 2\000\002P@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000@\000\003\000\000`\000\000\024\184@\000 \000\000\000\000\000\001\000\000\000\000\016\b\000\000\000 \000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000#i\000E\130\141\190$~\000\129\240\000\000\024\224\003)\000@\192\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$^\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#i\000E\130\141\190$~\000\129\240\000\000\024\224\000\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002@\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001!\000D\002\129\152$r\000\0000\000\000\024\192\196\148\187\131\232>B\195\129\255l\014\237\183\231\015\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\024\000P\000\000\000\000\000\000\000#i\000E\130\141\190$~\000\129\240\000\000\024\224\003)\000@\192\004\024$\222\000 4\016\000\016@\003)\000@\128\004\024$\222\000 4\016\000\016@\003)\000@\128\004\024$^\000 4\016\000\016@\000\000\000\000\000\000\000\000\128\000\000\002\000\004\129\016#i\000E\130\141\190$~\000\129\240\000\000\024\224\001!\000DB\129\152$\242\000\0000\000\000\024\192\001!\000D\002\129\152$\242\000\0000\000\000\024\192\001!\000D\002\129\152$r\000\0000\000\000\024\192\196\148\187\131\232>B\195\129\255l\014\237\183\231\015\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#i\000E\130\141\190$~\000\129\240\000\000\024\224\003)\000@\192\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$^\000 4\016\000\017@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\197\189\187\215\250\191\218\231\247\255l>\237\183\255\207\000\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002@\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001!\000D\002\129\152$r\000\0000\000\000\024\192\197\189\187\215\250\191\218\231\247\255l>\237\183\255\223\001!\000D\002\129\152$r\000\0000\000\000\024\192\197\189\187\215\250\191\218\231\247\255l>\237\183\255\223\000\000\000\000\000\000\016\000P\000\000\000\000\000\000\000#i\000E\130\141\190$~\000\129\240\000\000\024\224\003)\000@\192\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$^\000 4\016\000\017@\128\000\027\000\000\000\000\000\000\000\000\000\000\004\005\000\163i\011E\130\141\190$~\000\129\240\000\000\028\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#i\000E\130\141\190$~\000\129\240\000\000\024\224\000\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002@\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001!\000D\002\129\152$r\000\0000\000\000\024\192\196\148\187\131\232>B\195\129\255l\014\237\183\231\015\003)\000@\192\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$^\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\003)\000@\128\004\024$^\000 4\016\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\197\189\187\215\250\191\218\231\247\255l>\237\183\255\207\196\148\187\131\232>B\195\129\255l\014\237\183\231\015\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\004#i\000E\130\141\190$~\000\129\240\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#i\000E\130\141\190$~\000\129\240\000\000\024\224\003)\000@\192\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$^\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#i\000E\130\141\190$~\000\129\240\000\000\024\224\003)\000@\192\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$^\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\197\189\187\215\250\191\218\231\247\255l>\237\183\255\207\196\148\187\131\232>B\195\129\255l\014\237\183\231\015#i\000E\130\141\190$~\000\129\240\000\000\024\224\003)\000@\192\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$^\000 4\016\000\017@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\231\253\187\199\234\191\254\231\255\255\173\254\232\183\255\239}\246D\b/\226*\000\t\131\131\220x\176(4#i\000E\130\141\190$~\000\129\240\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#i\000E\130\141\190$~\000\129\240\000\000\024\224\003)\000@\192\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$^\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#i\000E\130\141\190$~\000\129\240\000\000\024\224\003)\000@\192\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$^\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#i\000E\130\141\190$~\000\129\240\000\000\024\224\003)\000@\192\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$^\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#i\000E\130\141\190$~\000\129\240\000\000\024\224\003)\000@\192\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$^\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#i\000E\130\141\190$~\000\129\240\000\000\024\224\003)\000@\192\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$^\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#i\000E\130\141\190$~\000\129\240\000\000\024\224\003)\000@\192\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$^\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#i\000E\130\141\190$~\000\129\240\000\000\024\224\003)\000@\192\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$^\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#i\000E\130\141\190$~\000\129\240\000\000\024\224\003)\000@\192\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$^\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#i\000E\130\141\190$~\000\129\240\000\000\024\224\003)\000@\192\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$^\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#i\000E\130\141\190$~\000\129\240\000\000\024\224\003)\000@\192\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$^\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#i\000E\130\141\190$~\000\129\240\000\000\024\224\003)\000@\192\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$^\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#i\000E\130\141\190$~\000\129\240\000\000\024\224\003)\000@\192\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$^\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#i\000E\130\141\190$~\000\129\240\000\000\024\224\003)\000@\192\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$^\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#i\000E\130\141\190$~\000\129\240\000\000\024\224\003)\000@\192\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$^\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#i\000E\130\141\190$~\000\129\240\000\000\024\224\003)\000@\192\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$^\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#i\000E\130\141\190$~\000\129\240\000\000\024\224\003)\000@\192\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$^\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#i\000E\130\141\190$~\000\129\240\000\000\024\224\003)\000@\192\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$^\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#i\000E\130\141\190$~\000\129\240\000\000\024\224\003)\000@\192\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$^\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#i\000E\130\141\190$~\000\129\240\000\000\024\224\000\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002@\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001!\000D\002\129\152$r\000\0000\000\000\024\192\196\148\187\131\232>B\195\129\255l\014\237\183\231\015\003)\000@\192\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$^\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#i\000E\130\141\190$~\000\129\240\000\000\024\224\003)\000@\192\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$^\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\003)\000@\128\004\024$\222\000 0\000\000\016@\003)\000@\128\004\024$^\000 0\000\000\016@\135\169\"\208\152$\026g\214\003 >\192\006\241T#i\000E\130\141\190$~\000\129\240\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\131\128\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\002\000\000\000\000#i\000E\130\141\190$~\000\129\240\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\001\000\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\002\000\000\000\000#i\000E\130\141\190$~\000\129\240\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000#i\000E\130\141\190$~\000\129\240\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\002@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000#i\000E\130\141\190$~\000\129\240\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\002\000\004\193\016\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\002\000\000\000\000#i\000E\130\141\190$~\000\129\240\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\002\000\004\129\016#i\000E\130\141\190$~\000\129\240\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\131)\000@\128\004\024$^\000 0\002\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\b\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003!\000@\128\004\024$R\000 0\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\002\000\004\129\016\131)\000@\128\004\024$^\000 4\016\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\002\000\004\129\016\128\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002C\000\003 \012\192\000 \004\132\128\"\128\b\"\002C\001\131 \012\192\016 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\128\000\155\003\224\012\000\128\128|\004\002\000\005\134\003\163i\011E\130\141\190$~\000\129\240\000\000\028\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\197\189\187\215\250\191\219\231\247\255l>\237\183\255\207#i\000E\130\141\190$~\000\129\240\000\000\024\224\003)\000@\192\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$^\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#i\000E\130\141\190$~\000\129\240\000\000\024\224\128\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\197\189\187\215\250\191\219\231\247\255l>\237\183\255\207#i\000E\130\141\190$~\000\129\240\000\000\024\224\003)\000@\192\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$^\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#i\000E\130\141\190$~\000\129\240\000\000\024\224\128\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\197\189\187\215\250\191\219\231\247\255l>\237\183\255\207#i\000E\130\141\190$~\000\129\240\000\000\024\224\003)\000@\192\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$^\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\001\000\000\000\000\000\024\000P\000\000\000\000\000\000\000#i\000E\130\141\190$~\000\129\240\000\000\024\224\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\197\189\187\215\250\191\219\231\247\255l>\237\183\255\207#i\000E\130\141\190$~\000\129\240\000\000\024\224\003)\000@\192\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$^\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#i\000E\130\141\190$~\000\129\240\000\000\024\224\128\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\197\189\187\215\250\191\219\231\247\255l>\237\183\255\207#i\000E\130\141\190$~\000\129\240\000\000\024\224\003)\000@\192\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$^\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#i\000E\130\141\190$~\000\129\240\000\000\024\224\128\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\197\189\187\215\250\191\219\231\247\255l>\237\183\255\207#i\000E\130\141\190$~\000\129\240\000\000\024\224\003)\000@\192\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$^\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\000\000\000\000\000\000\000\000\000\000\000\000\005\000\000\000\000\000\000\000\000\000\016\000P\000\000\000\000\000\000\000#i\000E\130\141\190$~\000\129\240\000\000\024\224\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\197\189\187\215\250\191\219\231\247\255l>\237\183\255\207#i\000E\130\141\190$~\000\129\240\000\000\024\224\003)\000@\192\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$^\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#i\000E\130\141\190$~\000\129\240\000\000\024\224\128\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\197\189\187\215\250\191\219\231\247\255l>\237\183\255\207#i\000E\130\141\190$~\000\129\240\000\000\024\224\003)\000@\192\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$^\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#i\000E\130\141\190$~\000\129\240\000\000\024\224\128\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\197\189\187\215\250\191\219\231\247\255l>\237\183\255\207#i\000E\130\141\190$~\000\129\240\000\000\024\224\003)\000@\192\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$^\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\197\189\187\215\250\191\219\231\247\255l>\237\183\255\207#i\000E\130\141\190$~\000\129\240\000\000\024\224\003)\000@\192\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$^\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\197\189\187\215\250\191\218\231\247\255l>\237\183\255\223\197\189\187\215\250\191\218\231\247\255,>\232\183\255\207\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#i\000E\130\141\190$~\000\129\240\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000#i\000E\130\141\190$~\000\129\240\000\000\024\224\128\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#i\000E\130\141\190$~\000\129\240\000\000\024\224\128\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#i\000E\130\141\190$~\000\129\240\000\000\024\224\128\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\000\000\000\000\000\000\000\000\000\016\000P\000\000\000\000\000\000\000#i\000E\130\141\190$~\000\129\240\000\000\024\224\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#i\000E\130\141\190$~\000\129\240\000\000\024\224\128\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#i\000E\130\141\190$~\000\129\240\000\000\024\224\128\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003)\000@\192\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$^\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000#i\000E\130\141\190$~\000\129\240\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#i\000E\130\141\190$~\000\129\240\001\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000#i\000E\130\141\190$~\000\129\240\000\000\024\224\003)\000@\192\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$^\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#i\000E\130\141\190$~\000\129\240\000\000\024\224\003)\000@\192\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$^\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015#i\000E\130\141\190$~\000\129\240\000\000\024\224\003)\000@\192\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$^\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#i\000E\130\141\190$~\000\129\240\000\000\024\224\128\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#i\000E\130\141\190$~\000\129\240\000\000\024\224\128\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#i\000E\130\141\190$~\000\129\240\000\000\024\224\000\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002@\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001!\000D\002\129\152$r\000\0000\000\000\024\192\196\148\187\131\232>B\195\129\255l\014\237\183\231\015\003)\000@\192\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$^\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\002\000\004\129\016#i\000E\130\141\190$~\000\129\240\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\b#i\000E\130\141\190$~\000\129\240\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003)\000@\128\004\024$^\000 0\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\129!\bD\002\129\152$r\000\0000\000\000\024\192\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#i\000E\130\141\190$~\000\129\240\000\000\028\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#i\002E\130\141\190$~\000\129\240\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001!\000D\002\129\152$r\000\0000\000\000\024\192@\000\000\000\000\000\000\000\000\000`\000\005\000\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\017\000\000\000\000\000\000\000\000\002\000\002@\000\128\000\017\000\000\000\000\000\000\000\000\002\000\000\000\000\128\000\017\000\000\000\000\000\000\000\000\000\000\000\000\000\129\000\001\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000`\000\005\000\000\000\001\000\000\000\000\000\024\004p\000\000\000\000\000\000\000\192\000\017\000\000\000\000\000\000\000`\002\005\002@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\148\187\131\232>B\195\129\255l\014\237\183\231\015\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003)\000@\192\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$^\000 4\016\000\017@\128\000\017\000\000\000\000\000\000\000\b\000\000\004\001\000\128\000\145\003\224\012\000\128\128|\012\002\000\005\130\003\128\000\016\000\000\000\000\000\000\000\b\000\000\000\000\000\128\000\000\000\000\000\b\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\002@@\000\000\016 \128\000\002\000\000\000\000\000\001\002@@\000\000\016 \000\000\002\000\000\000\000\000\000\000\000\000\000\000\016\000\128\001\000\000\000\000\000\000#i\000E\130\141\190$~\000\129\240\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000\000@\000\000\000\128\000\000\000\000\000\000\000\003\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\002\000\000@\000\001\002@@\000\000\016 \000\000\002\000\000\000\000\000\132\128\"\128\b \018C\128\003 \012\192\000 \004\129\002@@\000 \024 \000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\016\000\000\128\000\000\002\000\000\000\000\001\002@@\000\000\016 \000\000\002\000\000\000\000\000\132\128\"\128\b \018C\128\003 \012\192\000 \004\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000#i\000E\130\141\190$~\000\129\240\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\002\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001 \000\000@\000\016\000\192\000\000\016\000\000\000\000\001 \000\000\000\000\016\000\192\000\000\016\000\000\000\000\001 \000\000\000\000\016\000@\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\128\001\000\000\000\000@\000\003\000\000`\000\000\024\184P\000 \000\000\000\000\000\000\000\000\000\000@\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\001\000\000\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\017\000\000\000\000\000\128\000\004\000\000\000\000\016\000\000\017\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000@\b\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\000\000\000\000\000\128\000\004\000\000\000\000\016\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000@\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000`\000\000\024\184@\000 \000\000\000\000\000\133\128\162\128\b0\nC\128\003 \012\192\016!\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\133\128\162\128\b \nC\128\003 \012\192\016!\004\003\000\000`\000\000\024\184P\000 \000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\001\000\000\000\003\000\000`\000\000\024\184P\000 \000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\003\000\000`\000\000\024\184@\000 \000\000\000\000\000\133\128\"\128\b \nC\128\003 \012\192\016!\004\133\128\162\128\b0\nC\128\003 \012\192\016!\004\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\003\000\000`\000\000\024\184@\000 \000\000\000\000\000\133\128\"\128\b \nC\128\003 \012\192\016!\004\133\128\162\128\b0\nC\128\003 \012\192\016!\004\000\000\000\000\000\000\000\000\128\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000#i\000E\130\141\190$~\000\129\240\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003)\004@\128\004\024$\222\000 0\000\000\016@\003)\004@\128\004\024$^\000 0\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003)\000@\128\004\024$^\000 0\000\000\016@\132\128\"\128\b \002C\000\003 \012\192\000 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003)\000@\192\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$^\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\129\002@@@\000\016 \128\000\002\000\000\000\000\000\001\002@@\000\000\016 \128\000\002\000\000\000\000\000\001\002@@\000\000\016 \000\000\002\000\000\000\000\000\000\000\b\000\000\000\016\000\128\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\129\002@@\000 \024 \000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\b\000\000\016\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\000\002@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003)\000@\128\004\024$^\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003)\000@\192\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$^\000 4\016\000\017@\128\000\b\000\000\000\000\000\000\000\000\000\000\006A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\129\002@@\000 \024 \000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\b\000\000\016\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\129\002@@\000 \024 \000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\b\000\000\016\000\000\128\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\002@@\000 \024 \000\000\002\000\000\000\000\000@\000\b\000\000\016\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\136\003\224\012\000\128\128|\004\002\000\007\194\003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\129\002@@\000 \024 \000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\b\000\000\016\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\129\002@@\000 \024 \000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\b\000\000\016\000\000\128\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\002@@\000 \024 \000\000\002\000\000\000\000\000@\000\b\000\000\016\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \018C\128\002 \012\192\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\002@@\000\000\016 \128\000\002\000\000\000\000\000\001\002@@\000\000\016 \000\000\002\000\000\000\000\000\132\128\"\128\b \018C\128\002 \012\192\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\128\004\000@\000\000\000\128\000\000\000\000\000\000\000\001\000\000\000@\000\b\000\128\000\000\000\000\000\000\000\001\000\000\000\000\000\b\000\128\000\000\000\000\000\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002C\000\002 \014\192\000 \000\001\002@@\000 \024 \000\000\002\000\000\000\000\000\196\128\"\128\b0\002C\128\002 \012\192\000 \000\132\128\"\128\b \002C\000\002 \012\192\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\004\000\000\000\000\000\128\000\000\000\000\000\000\000\003\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\002\000\000@\000\132\128\"\128\b \002C\000\002 \012\192\000 \004\132\128\"\128\b \002B\000\002 \012\192\000 \004\003\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\002\000\000@\000\132\128\"\128\b \002C\000\002 \012\192\000 \004\132\128\"\128\b \002B\000\002 \012\192\000 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\002\000\000@\000\132\128\"\128\b \002C\000\002 \012\192\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000}\246D\b/\226*\000\t\131\131\220x\176(4'\233\"\213\138\173\190f~\002\129\252\000\000x\224\003)\000@\128\004\024$^\000 4\016\000\016@\016\000\002\000\000\000\000\000\128\000\000\000\000\004\129\016#i\000E\130\141\190$~\000\129\240\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000}\246D\b/\226*\000\t\131\131\220x\176(4'\233\"\213\138\173\190f~\002\129\252\000\000x\224\001\002@@@\000\016 \128\000\002\000\000\000\000\000\001\002@@\000\000\016 \128\000\002\000\000\000\000\000\001\002@@\000\000\016 \000\000\002\000\000\000\000\000\132\128\"\128\b \018C\128\002 \012\192\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\024\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\024\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\001\000\000\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\132\128\"\128\b\"\002C\129\130 \014\192\016 \000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\129\"\128\b \002C\000\002 \012\192\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002C\000\002 \012\192\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b\"\002C\129\130 \014\192\016 \000\001 \000\000@\000\016\000\192\000\000\016\000\000\000\000\001 \000\000\000\000\016\000\192\000\000\016\000\000\000\000\001 \000\000\000\000\016\000@\000\000\016\000\000\000\000\132\128\"\128\012 \002C\128\002 \014\192\000`\000\001 \000\000\000\000\016\000@\000\000\016\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\128\000\132\128\"\128\b \002C\128\002 \012\193\000!\000\001\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\132\128\"\128\b \002C\128\002 \012\192\000 \000\132\128\"\128\b \002C\000\002 \012\192\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002C\128\002 \012\192\000 \000\132\128\"\128\b \002C\000\002 \012\192\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\128\"\240\024 \024\250@\002 \012\000\000 \000\132\128\"\128\b \000B\000\002\000\012\192\000 \000\001\000\000\000@\000\000\000\128\000\000\000\000\000\000\128\001\000\000\000@\000\000\000\128\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \016C\000\002\000\012\193\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \016C\000\002\000\012\193\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\128\004\000@\000\000\000\128\000\000\000\000\000\000\000\001\000\000\000@\000\b\000\128\000\000\000\000\000\000\000\001\000\000\000\000\000\b\000\128\000\000\000\000\000\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\132\128\"\128\b \000C\000\002\000\014\192\001 \000\001\002@@\000 \024 \000\000\002\000\000\000\000\000\196\128\"\128\b0\000C\128\002\000\012\192\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\004\000\000\000\000\000\128\000\000\000\000\000\000\000\003\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\002\000\001@\000\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \016C\000\002\000\012\193\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\001\002@@\000 \024 \000\000\002\000\000\000\000\000\196\128\"\128\b0\000C\128\002\000\012\192\000 \004\132\128\"\128\b \000B\000\002\000\012\192\000 \004\003\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\001\002@@\000 \024 \000\000\002\000\000\000\000\000\196\128\"\128\b0\000C\128\002\000\012\192\000 \004\132\128\"\128\b \000B\000\002\000\012\192\000 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\002\000\000@\000\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \000C\000\002\000\012\193\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\002@@\000 \024 \000\000\002\000\000\000\000\000\196\128\"\128\b0\000C\128\002\000\012\192\000 \000\132\128\"\128\b \000C\000\002\000\012\192\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\002\000\000@\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\002@@@ \024 \128\000\002\000\000\000\000\000\001\002@@\000 \024 \128\000\002\000\000\000\000\000\001\002@@\000 \024 \000\000\002\000\000\000\000\000\196\128\"\128\b0\000C\128\002\000\012\192\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001 \000\000@\000\016\000\192\000\000\016\000\000\000\000\001 \000\000\000\000\016\000\192\000\000\016\000\000\000\000\001 \000\000\000\000\016\000@\000\000\016\000\000\000\000\132\128\"\128\012 \000C\128\002\000\012\192\000`\000\b\128\000\000@\000\b\000\192\000\000\000\000\000\000\000\b\000\000\000@\000\b\000\192\000\000\000\000\000\000\000\b\000\000\000\000\000\b\000\192\000\000\000\000\000\000\000\b\000\000\000\000\000\b\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000@\000\000\000\000\000\000\000\002\000\000$\128\004\000\000\000\016\000\000\000\000\000\128\000\000\002\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\001\000\000@\002\000\n @\000\000\000\000\000\000\000\132\000\000\128\000\002\016B\128\128\000\000@\016\000\000\132\000\000\128\000\002\016B\000\128\000\000@\016\000\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\b\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\128\000\002\000B\000\128\000\000@\016\000\000\b\000\000\000\000@\b\000\128\000\000\000\000\000\000\000\b\000\000\000\000@\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\132\000\000\128\000\002\000C\128\128\000\000@\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\b\000\000\b\000\128\000\000\000\000\000\000\000\b\000\000\b\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\132\000\000\128\000\002\000C\000\128\000\000@\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000@\002\000\n \192\000\000\000\000\000\000\000\001\000\000@\002\000\n @\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\128\000\000\000\000\000\000\128\001\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\001\000\000\000\001\000\000@\002\000\n @\000\000\000\000\000\000\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\004\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\002\000\000\000\000\000\128\000\000\000\000\004\000\000\000\000\002\000\000\000\000\000\128\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128*\128\b\"\002C\128\130 \014\192\016 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\001\000\000\000\001\000\000@\002\000\n @\000\000\000\000\000\000\000\132\128*\128\b\"\002C\128\130 \014\192\016 \004\132\000\000\128\000\002\000C\128\128\000\000@\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\024\184\192\000 \000\000\000\000\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\002\000\000\000\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\132\000\000\128\000\002\000C\129\128\000\000@\016\000\000\132\000\000\128\000\002\000C\000\128\000\000@\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\128\000\002\000C\000\128\000\000@\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\128\000\002\000B\000\128\000\000@\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002C\128\002 \012\192\000 \004\132\128\"\128\b \002B\000\002 \012\192\000 \004\b\000\000\000\000\000\b\000\192\000\000\000\000\000\000\000\b\000\000\000\000\000\b\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\001\000\000@\002\000\n @\000\000\000\000\000\000\000\132\128\"\128\b \002C\128\002 \012\192\000 \004\132\128\"\128\b \002B\000\002 \012\192\000 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\b\000\192\000\000\000\000\000\000\000\b\000\000\000\000\000\b\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\003\000\000p\018\000\026\184@\000 \000\000\000\000\000\133\128\170\128\b0\bC\128\002 \014\192\000`\004\003\000\000`\000\000\024\184@\000 \000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\003\000\000p\018\000\026\184@\000 \000\000\000\000\000\003\000\000p\016\000\024\184@\000 \000\000\000\001@\000\000\002\000\000\000\000\000\128\000\000\000\000\004\001\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\003\000\000p\018\000\026\184@\000 \000\000\000\000\000\003\000\000`\000\000\024\184@\000 \000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\003\000\000p\018\000\026\184@\000 \000\000\000\000\000\133\128\170\128\b0\bC\128\002 \014\192\000 \004\133\128\170\128\b0\bC\128\002 \014\192\000 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128*\128\b \000C\128\002\000\014\192\000 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \000C\000\002\000\012\192\000 \004\132\128\"\128\b \000B\000\002\000\012\192\000 \004\b\000\000\000\000\000\b\000\192\000\000\000\000\000\000\000\b\000\000\000\000\000\b\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\003\000\000p\018\000\026\184@\000 \000\000\000\000\000\132\128\"\128\b \000C\000\002\000\012\192\000 \004\132\128\"\128\b \000B\000\002\000\012\192\000 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \000B\000\002\000\012\192\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \000C\000\002\000\012\192\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \000B\000\002\000\012\192\000 \004\002\000\000$\128\004\024\000\128\016\000\000\000\000\000\128\002\000\000$\128\004\024\000\000\016\000\000\000\000\000\128\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002C\000\002 \014\192\016 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002C\000\002 \012\192\016 \004\132\128\"\128\b \002B\000\002 \012\192\000 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \000B\000\002\000\012\192\000 \004\002\000\000$\128\004\024\000\128\016\000\000\000\000\000\128\002\000\000$\128\004\024\000\000\016\000\000\000\000\000\128\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\003 \000x\016\000\024\184P\000 \016\002\000\001\000\003\000\002p\016\000\024\184@\000 \000\000\000\001@\000\000\000\000\000@\b\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\133\160\"\128\b \018C@\002 \028\192\016 \004\132\128\"\128\012 \002C\128\002 \012\192\016a\004\132\128\"\128\b \002C\128\002 \012\192\016!\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002C\000\002 \012\192\016!\004\001 \000\000\000\000\016\000@\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \000C\000\002\000\012\192\016 \004\132\128\"\128\b \000B\000\002\000\012\192\000 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002C\128\002 \014\192\016 \004\001 \000\b\000\000\016\000P\000\000\016\002\000\001\000\001 \000\000\000\000\016\000P\000\000\016\002\000\001\000\000\000\000\000\000@\b\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\012 \002C\128\002 \012\192\016a\004\132\128\"\128\b \002C\128\002 \012\192\016!\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\b\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\128\000\000\000\000\000\000\000\b\128\000\000@\000\b\000\192\000\000\000\000\000\000\000\b\000\000\000\000\000\b\000\192\000\000\000\000\000\000\000\b\000\000\000\000\000\b\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\003)\000P\144\004\024$V\000 2\000\000P@\001\000\000@\002\000\026 @\000\000\128\000\000\000\000\132\000\000\128\000\002\016B\129\128\000\000@\016\000\000\132\000\000\128\000\002\016B\001\128\000\000@\016\000\000\132\000\000\128\000\002\000B\001\128\000\000@\016\000\000\b\000\000\000\000@\b\000\128\000\000\000\000\000\000\128\000\000\000\000\000@\b\000\128\000\000\000\000\000\000\000\000\000\000\000\000@\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\002@\000#i\000E\130\141\190$~\000\129\240\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000#i\000E\130\141\190$~\000\129\240\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\128\000\002\000C\001\128\000\000@\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000@\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\132\000\000\128\000\002\000C\129\128\000\000@\016\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\002@\000#i\000E\130\141\190$~\000\129\240\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000#i\000E\130\141\190$~\000\129\240\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\b\000\000\b\000\128\000\000\000\000\000\000\128\000\000\000\b\000\000\b\000\128\000\000\000\000\000\000\000\000\000\000\b\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\003)\000P\144\004\024$V\000 2\000\000P@\003\128\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\002\000\000\000\000#i\000E\130\141\190$~\000\129\240\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000#i\000E\130\141\190$~\000\129\240\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\128\000\002\000C\001\128\000\000@\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\b\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\003)\000P\144\004\024$V\000 2\000\000P@\003\128\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\002\000\000\000\000#i\000E\130\141\190$~\000\129\240\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000#i\000E\130\141\190$~\000\129\240\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#i\000E\130\141\190$\254\000\129\240\000\000\024\224#i\000E\130\141\190$~\000\129\240\000\000\024\224\132\000\000\128\000\002\000C\001\128\000\000@\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000@\002\000\026 \192\000\000\128\000\000\000\128\001\000\000@\002\000\026 \192\000\000\128\000\000\000\000\001\000\000@\002\000\026 @\000\000\128\000\000\000\000\001\000\000@\002\000\026 @\000\000\128\000\000\000\000\003)\004@\200\004\024$\222\000 0\000\000\016@}\246D\b/\226*\000\t\131\131\220x\176(4\003)\004@\128\004\024$\222\000 0\000\000\016@\003)\004@\128\004\024$^\000 0\000\000\016@\003)\000@\128\004\024$^\000 0\000\000\016@\000\000\000\000\000\000\000\001\000\001\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\128\000\000\000\000\000\000\128\001\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\001\000\000\000\001\000\000@\002\000\026 @\000\000\128\000\000\000\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\004\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003)\000P\144\004\024$\214\000 0\000\000\016@\003)\000P\144\004\024$V\000 0\000\000\016@\003)\000P\144\020\024$V\000 0\000\000\016@\001\000\000@\002\000\026 @\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\004\001\000\000@\002\000\026 @\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\133\169*\212\026\163\154g\247\130 <\192\016x\212\133\169*\212\026\163\154g\247\130 <\192\016x\212\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128*\128\b\"\002C\129\130 \012\192\016`\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128*\128\b\"\002C\129\130 \012\192\016`\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128*\128\b\"\002C\129\130 \012\192\016`\020\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\001\000\000\000\001\000\000@\002\000\026 @\000\000\128\000\000\000\000\132\128*\128\b\"\002C\129\130 \012\192\016`\020\003)\004@\128\004\024$^\000 0\000\000\016@\003)\000@\128\004\024$^\000 0\000\000\016@\000\000\000\000\000\000\000\001\000\001\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\000\128\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\018\000\026\184@\000 \000\000\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\128\000\002\000C\129\128\000\000@\016\000\016\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\128\000\002\000C\001\128\000\000@\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000@\002\000\026 @\000\000\128\000\000\000\000\132\000\000\128\000\002\000C\129\128\000\000@\016\000\016\132\000\000\128\000\002\000C\001\128\000\000@\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\024\184\192\000 \000\000\000\000\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\132\000\000\128\000\002\000C\001\128\000\000@\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\128\000\002\000C\001\128\000\000@\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\128\000\002\000B\001\128\000\000@\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002C\128\002 \012\192\000 \004\003\000\000p\018\000\026\184@\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\001\000\000@\002\000\026 @\000\000\128\000\000\000\000\132\128\"\128\b \002C\128\002 \012\192\000 \004\003)\000P\144\004\024$V\000 2\000\000P@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002C\000\002 \012\192\000 \004\132\128\"\128\b \002B\000\002 \012\192\000 \004\b\000\000\000\000\000\b\000\192\000\000\000\000\000\000\000\b\000\000\000\000\000\b\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\003)\000P\144\004\024$V\000 2\000\000P@\132\128\"\128\b \002C\000\002 \012\192\000 \004\132\128\"\128\b \002B\000\002 \012\192\000 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002B\000\002\000\012\192\000 \000\003)\004@\192\004\024$\222\000 0\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002B\000\002 \012\192\000 \004\132\128\"\128\b \002C\000\002 \012\192\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002B\000\002 \012\192\000 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002C\000\002\000\012\192\000 \000\132\128\"\128\b \002B\000\002\000\012\192\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002B\000\003 \012\192\000 \004\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002C\000\002\000\012\192\000 \000\132\128\"\128\b \002B\000\002\000\012\192\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\128*\128\b0\018C\128\002 \014\192\002 \004\192\000\b\000\000\016\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003!\000@\128\004\024$R\000 0\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\144\000\027\000\000\016\000\000\128\000\000\002\128\004\197\016\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\003)\000@\128\004\024$^\000 4\018\000\016@\000\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\b\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003!\000@\128\004\024$R\000 0\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\144\000\027\000\000\016\000\000\128\000\000\002\128\004\197\016\000\000\b\000\000\000\000\000\128\000\000\000\000\004\193\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\b\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\128\000\002\000B\001\128\000\000@\016\000\000\128\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001!\000D\002\129\152$r\000\0000\000\000\024\192\196\148\187\131\232>B\195\129\255l\014\237\183\231\015\003)\000@\192\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$^\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000#i\000E\130\141\190$~\000\129\240\000\000\024\224\000\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002@\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001!\000D\002\129\152$r\000\0000\000\000\024\192\196\148\187\131\232>B\195\129\255l\014\237\183\231\015\003)\000@\192\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$\222\000 4\016\000\017@\003)\000@\128\004\024$^\000 4\016\000\017@\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\196\148\187\131\232>B\195\129\255,\014\232\183\231\015@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\131)\000@\128\004\024$^\000 4\016\000\017@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\148\187\131\232>B\195\129\255,\014\232\183\231\015\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\001 \000\b\000\000\016\000@\000\000\016\000\000\001\000\001 \000\000\000\000\016\000@\000\000\016\000\000\001\000\001 \000\000\000\000\016\000@\000\000\016\000\000\000\000\132\128\"\128\012 \002C\128\002 \014\192\000a\000\001 \000\000\000\000\016\000@\000\000\016\000\000\000\000\132\128\"\128\b \002C\128\002 \012\192\000!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002C\000\002 \012\192\000!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\012 \002C\128\002 \014\192\000a\000\001 \000\000\000\000\016\000@\000\000\016\000\000\000\000\132\128\"\128\b \002C\128\002 \012\192\000!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\132\128\"\130\b \002C\000\002 \014\192\016 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002C\000\002 \012\192\016 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\001 \000\b\000\000\016\000@\000\000\016\000\000\001\000\001 \000\000\000\000\016\000@\000\000\016\000\000\001\000\132\128\"\128\b \002C\000\002 \012\192\000!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\128\000\004\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\004\000\000\000\000\000\003\000\000`\000\000\024\184\192\000$\000\002\000\000\000\003\000\000`\000\000\024\184@\000$\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\016\000\000\000\b\000\000\000$\000\000\000\000\000\003\000\000`\000\000\024\184@\000$\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\128\000\000\016\b\000\000\000 \000\000\000\000\000\003\000\000`\000\000\024\184@\000 \000\000\000\000\000\196\128\187\128\b2\002C\129\130$\014\192\022!\022\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\004\000\000\001\000\000\000\000\000\b\000\000\000 \000\000\000\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\b\000\000\000\000\000\128\000\000\000\000\004\000\000\000\000\b\000\000\000\000\000\128\000\000\000\000\004\000\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\b\000\000\000\000\000\128\000\000\000\000\004\000\000\000\000\000\000\000@\b\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002C\128\002 \012\192\016 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003 \000x\016\000\024\184P\000 \016\002\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \000C\000\002\000\012\192\016 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\001 \000\b\000\000\016\000@\000\000\016\000\000\001\000\001 \000\000\000\000\016\000@\000\000\016\000\000\001\000\132\128\"\128\b \000C\000\002\000\012\192\000!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\132\128\"\130\b \000C\000\002\000\014\192\017 \004\003 \000x\016\000\024\184P\000 \016\002\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \000C\000\002\000\012\192\016 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\001 \000\b\000\000\016\000@\000\000\016\000\000\001\000\001 \000\000\000\000\016\000@\000\000\016\000\000\001\000\132\128\"\128\b \000C\000\002\000\012\192\000!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\b\000\000\016\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002C\000\002 \012\192\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#i\000E\130\141\190$~\000\129\240\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000#i\000E\130\141\190$~\000\129\240\000\000\024\224\128\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\128 \128\b \000B\000\002\000\012\128\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001 \000\000\000\000\024\000@\000\000\016\000\000\000\000\128\000\136\007\224,\004\128\000|D\002\004\001\130\139\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\001\000\000\000\001\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\128\000\128\007\224,\004\128\000|D\002\004\001\130\139\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001 \000\000\000\000\016\000@\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\024\184@\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#i\000E\130\141\190$~\000\129\240\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\002@@\000\000\016 \000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\128\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\002@@\000 \024 \000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\016\000\000\128\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003)\000@\128\004\024$^\000 4\016\000\016@\000\000\000\000\000\000\000\000\128\000\000\000\128\004\129\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\001\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000'\233 \197\138\173\190f~\002\161\252\128\0008\224\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\005\161 \128\b \026B\002\002 \028\128\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\128 \128\b \002B\000\002 \012\129\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\128 \128\b \002B\000\002\000\012\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\001\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000'\233 \197\138\173\190f~\002\161\252\128\0008\224'\233 \197\138\173\190f~\002\161\252\128\0008\224\004\128 \128\b \002B\000\002 \012\128\000 \000\004\128 \128\b \002B\000\002 \012\128\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\128 \128\b \002C\000\002 \012\128\000 \000\004\128 \128\b \002B\000\002 \012\128\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\128 \128\b \002C\000\002 \012\128\000 \000\004\128 \128\b \002B\000\002 \012\128\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000") and start = 15 and action = - ((16, "n\218x\156sZ\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\021\248sZ\000\000\000\000\021\000sZn\218\003F\005F\001H\169t\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000x\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000O\006P\000P\000\000\001\150\b\136\000\000\000\172\001\166\t\136\000\000\003$\002@\n\136\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\204\000\000\000\000\000\000\002V~\184\000\000\000\000\000\000\002\164\000\000\000\000\131\204\003V\003\"\000\000\000\000\210\208\002\164\000\000t\166\021\000}\136\1702\004n\000\000\021\000\133Tx\028\021\000z\216\000\000\001\022\000\000z\216\001\192\000\000lZ\000\000\001l\000\000\000\000\004B\000\000\002\164\000\000\000\000\000\000\005P\000\000lZ\000\000\006\230\203\134\208p\179~\000\000\209\224\210\208\000\000y\136\194\224\000\000\208\208\026\184~\184sZn\218\000\000\000\000x\028\021\000{Bz\216\007\014\198\242\000\000\2066sZn\218x\156\021\000\000\000\000\000\017\000t\132\021\000\165N\165<\000\000\004\158\000\000\000\000\005h\000\000\000\000t8\022\140\021\188\002\248\000\007\000\000\000\000\002&\000\000}\136\004\150\004t\021\000\023\238\021\000n\218n\218\000\000\000\000\000\000w\206s\178\021\000\023\238\005\190\000\000uV\021\000\132\152\023\228\020\160\007D\000\000\005\226\007V\000\000\000\000\000\000\000\000\000\000\021\000\000\000\000\000\000\000\017\000\000\000x\156\021\000\000\000l\238\191\154~V\001\000\133T\165<\192*\192*\000\000\007D\000\000\000\028\000\000\000\000\022\150\184\004\196\190\000\000\184\004\196\190\000\000\184\004\184\004\003\014\007\004\004\028\000\000\004\228\000\000\006\176\000\000\000\000\007\230\000\000\000\000\000\000\184\004\002\164\000\000\000\000\166\216\184\004\164J\194\224\000\000\t\004\027\214\210\208\194\224\006\188\184\004\000\000\000\000\000\000\000\000\000\000\000\000\127B\194\224\128@\003\014\000\000\000\000\000\000\000F\000\000\000\000\167\156\bD\002\164\000\000\000\000\129>\000\000\000\000\000\000\bJ\000\000\184\004\000\000\001\b\197\216\000\000\184\004\006\b\184\004nv\000\000o\216\000\000\007\b\nJ\000\000\b\192\184\004\n\216\000\000\011\030\000\000\002\128\000\000\000\000\005\224\000\000\000\000\000\000&\212\031(\165\238\1508\193J\021\000\192*?\238@\238\150\244\193J\021\000\192*A\238B\238\151\176\193J\021\000\192*C\238D\238\152l\193J\021\000\192*E\238F\238\153(\193J\021\000\192*G\238H\238\153\228\193J\021\000\192*I\238J\238\021\000\165\001\208\001\252\000\000\014J\000\000\017\180\017@~\184p\154\000\000\020\196sH\017\226\021^\002\248\000\000\014:sH\184\004\014t\003\014\000\000\184\004\tt\nt\000\000\000\000\188\252\000\000\000\000\014fsH\189\128\134\016\000\000\021\000\184\004\014\228\184\004\130\018p\154\000\000\014\198\000\000\000\000p\154\000\000\000\000z\000\000\000\2066\129\b\020J\005\208\011J\017\204\017|sH\2066\129\b\000\000\000\000\020J\005\208\011J\017\226\017p\213\250y\146\194\224\018\014\213\250\184\004\024t\018 \213\250\194\224\018\"\213\250\190>\190\192\000\000\207t\000\000\000\000\172\218\211L\020J\005\208\011J\018 \017\190\213\250\172\218\211L\000\000\000\000\000\000\184\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\172\218\000\000\175\136\021\000r:\018>\198\242\000\000\2066\175\136\000\000\000\000\211z\021\000r:\018D\017\208\208p\211\240\000\252\018\130\000\000\000\000\191 \195\156\021\000\000\000\204\182\021\192\000\000\000\000\172\218\211z\000\000\000\000\000\000\202\230u\148v4\000\252\018\132\000\000\000\000\000\000\195\156\021\000\000\000\000\252\018\144\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\np\012\020J\005\208\011J\018^\192*\127p\021\000\165N{\174\021(\007\180\000\252\018d\007\240\000\000\000\000\018\022\000\000\000\000|j\000\000\006\208\015^\000\000\015J\000\000\018p\018\018\184\004\130\224\018\142\b\234\000\000\000\000\018H\000\000\000\000\021D\000>\015>\000\000\018\158\196\\\214\138\003\170\018:\184\004\015L\000\000\000\000\018P\000\000\000\000\000\000|j\000\000\004\252\015\204\000\000\015p\000\000\018\170\018:~\184\000\000\018\186\196\234\214\210\003\170\018\\\184\004\015\228\000\000\000\000\018x\000\000\000\000\000\000\021\000\000\000|j\000\000\021\"\020\196\127p\127p\197xsZ\021\000\206\212\165<\t\172\000\000\021j\002\248\000\000\015\132\127p\184\004\015\254\007D\000\000\021\000\165<\192\188\127p\015~\127p\000\000o\198p\180\000\000\176\254\000\000\000\000\177\158\000\000\000\000\178>\000\000\015\216\127p\178\222\206\212\165<\t\172\000\000\005\136\000\000\000\000\213\250\014\204\000\000\000\000v4\018\208\000\000|j\000\000\127pv4|j\000\000\021\000\184\004|j\000\000\015J\000\000\000\000|j\000\000\000\000{\174\000\000\207\166\213\250\018\142\127p\207\212\192*\000\000\193\144\210Z\020J\005\208\011J\018\230\192*\193\144\210Z\000\000\000\000\000\000\212>x\240\000\000\000\000\000\000\000\000\000\000\000\000\131\186\193\144\000\000\175\136\000\000\000\000\000\000\000\000\193\144\212>\000\000\000\000\000\000\131\186\019&\000\000\0198\000\000\193\144\212>\000\000\000\000\016J\000\000\000\000\184\136 :\000\000\000\000pl\000\000\184\004\r\170\000\000{\174\016\136\000\000\000\000\019h\198\006\000\000k\238\019B\000\000\000\000\019:\027\166\028\166\021\192\195\156\026T\021\000\000\000\193\144\000\000\000\000\000\000\000\000\000\000\000\000\000\000\198R\026T\021\000\000\000\015\158\198\242\000\000\2066\000\000\019<\027\166\028\166\193\144\000\000\019\\\000\000\004\246\015\004\021\000\210@\000\000\000\000\030\208\213h\000\000\000\000\018\246\000\000\019P\184\004\000\000\016\138\t\014\003\014\000\000\000\000\184\004\007\228\b\228\184\004\t\228\000\252\019~\000\000\000\000\205N\000\000\000\000\208p\000\000\172\218\000\000\019r\027\166\029\178\172\218\000\000\000\000\000\000\000\000\016\158\205 \208p\000\000\172\218\000\000\019t\027\166\029\178\172\218\000\000\016\198\000\000\000\000!\140\000\000\193\144\000\000\019\134\000\000\000\000\018\234\000\000\nR\000\000\000\000\019\006\000\000\000\000\184\004\019\012\000\000\000\000\028\230\169t\019\170\000\000\000\000\000\000\015\004\006\160\172|\019\176\000\000\000\000\000\000\000\000\000\000\000\000\0194\000\000\026T\000\000\0196\000\000\184\004\000\000\016R\000\000\000\000\019D\000\000\000\000\003\014\000\000\012\254\000\000\000\000\000\000\015\240\000\000\023\238\000\000\nF\000\000}\136\000\000\025d\000\000\b\230\000\000\019F\000\000\165<\026\"\000\000\000\000\b\160\019H\000\000\000\000\019>\t\158q\168\002\164\206\b\000\000\000\000\000\000\000\000\000\000\180\208\000\000\000\000\019\238\000\000\179\172\000\000\016\138\019\248\000\000\019\254\000\000r\154r\154\1648\1648\000\000\000\000\193\144\1648\000\000\000\000\000\000\193\144\1648\019j\000\000\019t\000\000"), (16, "\003\197\003\197\000\006\003F\003J\003\197\002\194\002\198\003\197\002\242\002\146\003\197\001b\003\197\004&\002\254\003\197\007\142\003\197\003\197\003\197\019\230\003\197\003\197\003\197\001\210\001z\t\021\001\138\003\002\003\197\003z\003~\011\154\003\197\005\r\003\197\004*\003\006\007\194\003\166\019\234\003\197\003\197\003\218\003\222\003\197\003\226\003\230\003\197\003\234\003\246\004\002\004\n\007n\004\250\003\197\003\197\002\186\005\r\001*\003\254\003\197\003\197\003\197\b\218\b\222\b\234\b\254\000\238\005\182\003\197\003\197\003\197\003\197\003\197\003\197\003\197\003\197\003\197\tr\bB\003\197\005\r\003\197\003\197\005\r\t~\t\150\n:\005\194\005\198\003\197\003\197\003\197\000\238\003\197\003\197\003\197\000\238\003\197\006\246\000\238\016\226\003\197\001f\003\197\003\197\004%\003\197\003\197\003\197\003\197\003\197\003\197\005\202\b\242\003\197\003\197\003\197\t\n\004\138\nN\006\250\003\197\003\197\003\197\003\197\014E\014E\002\001\n\166\018\138\014E\n\178\014E\014E\004Q\014E\014E\014E\014E\001j\014E\014E\014\t\014E\014E\014E\004E\014E\014E\014E\014E\005\r\014E\000\n\014E\014E\014E\014E\014E\014E\014E\014E\014\t\014E\018\210\014E\005:\014E\014E\014E\014E\014E\014E\014E\014E\006\181\014E\014E\000\238\014E\004\006\014E\014E\014E\002\001\014\017\014E\014E\014E\014E\014E\014E\014E\000\238\014E\014E\014E\014E\014E\014E\014E\014E\014E\014E\014E\014\017\014E\014E\004Q\014E\014E\002R\001\002\001\190\005\r\014E\014E\014E\014E\014E\001r\014E\014E\014E\002V\014E\014E\014\r\014E\014E\001\130\014E\014E\023\"\014E\014E\014E\014E\014E\014E\014E\014E\014E\014E\014E\014E\014E\014\r\005\r\014E\014E\014E\014E\001\153\001\153\001\153\0026\023*\001\153\004M\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\023&\001\153\tA\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\003R\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\tI\001\153\001\153\001\153\001\153\001\146\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\004M\001\153\001\153\001\153\001\153\001\153\005\134\001\153\002B\001\218\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\007J\001\153\001\153\001\153\t\"\001\153\005\250\001\153\001\153\021\146\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\017\230\001\153\001\153\001\153\001\153\001\153\011\177\011\177\005\r\005\r\003V\011\177\001\222\011\177\011\177\004\201\011\177\011\177\011\177\011\177\001\206\011\177\011\177\005\r\011\177\011\177\011\177\005\138\011\177\011\177\011\177\011\177\b\158\011\177\001\198\011\177\011\177\011\177\011\177\011\177\011\177\011\177\011\177\001f\011\177\000\238\011\177\004%\011\177\011\177\011\177\011\177\011\177\011\177\011\177\011\177\007\213\011\177\011\177\000\238\011\177\005.\011\177\011\177\011\177\002\170\000\238\011\177\011\177\011\177\011\177\011\177\011\177\011\177\000\n\011\177\011\177\011\177\011\177\011\177\011\177\011\177\011\177\011\177\011\177\011\177\006\194\011\177\011\177\004\201\011\177\011\177\002\001\002\001\tF\004\230\011\177\011\177\011\177\011\177\011\177\001\234\011\177\011\177\011\177\002\001\011\177\nf\001\182\n\234\011\177\006\213\011\177\011\177\022\246\011\177\011\177\011\177\011\177\011\177\011\177\011\177\011\177\011\177\011\177\011\177\011\177\011\177\001\186\011\177\011\177\011\177\011\177\011\177\004m\004m\001\238\001\002\001\190\004m\019\206\004m\004m\006f\004m\004m\004m\004m\004^\004m\004m\022\254\004m\004m\004m\001\206\004m\004m\004m\004m\018\202\004m\006\189\004m\004m\004m\004m\004m\004m\004m\004m\b\158\004m\002^\004m\t\166\004m\004m\004m\004m\004m\004m\004m\004m\000\238\004m\004m\003\233\004m\002\022\004m\004m\004m\002b\006\213\004m\004m\004m\004m\004m\004m\004m\003\233\004m\004m\004m\004m\004m\004m\004m\004m\004m\004m\004m\014J\n^\n\226\003^\004m\004m\t\170\t\198\007\198\b\005\004m\004m\004m\004m\004m\003b\004m\004m\004m\019\210\004m\nf\019*\n\234\004m\n\166\004m\004m\n\178\004m\004m\004m\004m\004m\004m\004m\004m\004m\004m\004m\004m\004m\b\002\004m\004m\004m\004m\004m\004]\004]\026\158\001\002\001\190\004]\004f\004]\004]\007\174\004]\004]\004]\004]\005\r\004]\004]\007\138\004]\004]\004]\003\030\004]\004]\004]\004]\026\166\004]\r\190\004]\004]\004]\004]\004]\004]\004]\004]\004Z\004]\nj\004]\003\"\004]\004]\004]\004]\004]\004]\004]\004]\t9\004]\004]\016\142\004]\016\154\004]\004]\004]\000\238\002v\004]\004]\004]\004]\004]\004]\004]\027\186\004]\004]\004]\004]\004]\004]\004]\004]\004]\004]\004]\005\r\n^\n\226\nI\004]\004]\005\r\005\r\027\190\004j\004]\004]\004]\004]\004]\003\150\004]\004]\004]\000\238\004]\nf\018*\n\234\004]\r\198\004]\004]\022\182\004]\004]\004]\004]\004]\004]\004]\004]\004]\004]\004]\004]\004]\003*\004]\004]\004]\004]\004]\011\017\011\017\003F\003J\000\238\011\017\005\146\011\017\011\017\007\253\011\017\011\017\011\017\011\017\003.\011\017\011\017\020\206\011\017\011\017\011\017\002z\011\017\011\017\011\017\011\017\005\r\011\017\014i\011\017\011\017\011\017\011\017\011\017\011\017\011\017\011\017\007\138\011\017\nI\011\017\014i\011\017\011\017\011\017\011\017\011\017\011\017\011\017\011\017\nM\011\017\011\017\027\194\011\017\015\006\011\017\011\017\011\017\001f\004%\011\017\011\017\011\017\011\017\011\017\011\017\011\017\000\238\011\017\011\017\011\017\011\017\011\017\011\017\011\017\011\017\011\017\011\017\011\017\018v\011\017\011\017\007j\011\017\011\017\014\166\b\"\003\186\005\r\011\017\011\017\011\017\011\017\011\017\004n\011\017\011\017\011\017\018~\011\017\011\017\b\226\011\017\011\017\004\138\011\017\011\017\026\018\011\017\011\017\011\017\011\017\011\017\011\017\011\017\011\017\011\017\011\017\011\017\011\017\011\017\001\206\005\r\011\017\011\017\011\017\011\017\011!\011!\005J\031\026\001\222\011!\nM\011!\011!\004\190\011!\011!\011!\011!\001\206\011!\011!\026\026\011!\011!\011!\022\198\011!\011!\011!\011!\n-\011!\006\181\011!\011!\011!\011!\011!\011!\011!\011!\007\138\011!\002\134\011!\002\198\011!\011!\011!\011!\011!\011!\011!\011!\003\190\011!\011!\004Z\011!\015.\011!\011!\011!\002\222\007\209\011!\011!\011!\011!\011!\011!\011!\000\238\011!\011!\011!\011!\011!\011!\011!\011!\011!\011!\011!\022V\011!\011!\005\r\011!\011!\003\178\003F\022\n\n-\011!\011!\011!\011!\011!\003\194\011!\011!\011!\022f\011!\011!\022\030\011!\011!\004v\011!\011!\002z\011!\011!\011!\011!\011!\011!\011!\011!\011!\011!\011!\011!\011!\004n\n-\011!\011!\011!\011!\011\025\011\025\t\250\005\r\007\210\011\025\n\001\011\025\011\025\007\182\011\025\011\025\011\025\011\025\005\r\011\025\011\025\007\138\011\025\011\025\011\025\007\218\011\025\011\025\011\025\011\025\000\238\011\025\0072\011\025\011\025\011\025\011\025\011\025\011\025\011\025\011\025\007\138\011\025\004z\011\025\023\002\011\025\011\025\011\025\011\025\011\025\011\025\011\025\011\025\000\238\011\025\011\025\000\238\011\025\015V\011\025\011\025\011\025\005*\005\n\011\025\011\025\011\025\011\025\011\025\011\025\011\025\007A\011\025\011\025\011\025\011\025\011\025\011\025\011\025\011\025\011\025\011\025\011\025\022z\011\025\011\025\007\246\011\025\011\025\025\242\002\198\007A\006\193\011\025\011\025\011\025\011\025\011\025\n\001\011\025\011\025\011\025\022f\011\025\011\025\n\166\011\025\011\025\n\178\011\025\011\025\014\138\011\025\011\025\011\025\011\025\011\025\011\025\011\025\011\025\011\025\011\025\011\025\011\025\011\025\002\014\001v\011\025\011\025\011\025\011\025\011\005\011\005\014\142\001\002\001\190\011\005\004\250\011\005\011\005\b\014\011\005\011\005\011\005\011\005\001\206\011\005\011\005\0076\011\005\011\005\011\005\n\246\011\005\011\005\011\005\011\005\b:\011\005\005.\011\005\011\005\011\005\011\005\011\005\011\005\011\005\011\005\014\154\011\005\001\222\011\005\n\250\011\005\011\005\011\005\011\005\011\005\011\005\011\005\011\005\000\238\011\005\011\005\004Z\011\005\015~\011\005\011\005\011\005\002\170\014\158\011\005\011\005\011\005\011\005\011\005\011\005\011\005\007I\011\005\011\005\011\005\011\005\011\005\011\005\011\005\011\005\011\005\011\005\011\005\t\237\011\005\011\005\026:\011\005\011\005\003\190\005n\007I\030\n\011\005\011\005\011\005\011\005\011\005\030\"\011\005\011\005\011\005\n\166\011\005\011\005\n\178\011\005\011\005\004\174\011\005\011\005\0112\011\005\011\005\011\005\011\005\011\005\011\005\011\005\011\005\011\005\011\005\011\005\011\005\011\005\000\238\001\134\011\005\011\005\011\005\011\005\011\r\011\r\001\002\001\190\016\194\011\r\n\005\011\r\011\r\b\146\011\r\011\r\011\r\011\r\006\"\011\r\011\r\007\138\011\r\011\r\011\r\002\234\011\r\011\r\011\r\011\r\r\138\011\r\b\226\011\r\011\r\011\r\011\r\011\r\011\r\011\r\011\r\005%\011\r\t\237\011\r\030\214\011\r\011\r\011\r\011\r\011\r\011\r\011\r\011\r\000\238\011\r\011\r\004Z\011\r\015\162\011\r\011\r\011\r\005f\0182\011\r\011\r\011\r\011\r\011\r\011\r\011\r\007Q\011\r\011\r\011\r\011\r\011\r\011\r\011\r\011\r\011\r\011\r\011\r\t\233\011\r\011\r\005%\011\r\011\r\b\158\015\226\007Q\003\186\011\r\011\r\011\r\011\r\011\r\n\005\011\r\011\r\011\r\000\238\011\r\011\r\000\238\011\r\011\r\b\030\011\r\011\r\016\198\011\r\011\r\011\r\011\r\011\r\011\r\011\r\011\r\011\r\011\r\011\r\011\r\011\r\000\238\001\150\011\r\011\r\011\r\011\r\011\t\011\t\005v\031\159\tn\011\t\014\178\011\t\011\t\022\230\011\t\011\t\011\t\011\t\006r\011\t\011\t\030\218\011\t\011\t\011\t\014\254\011\t\011\t\011\t\011\t\014\182\011\t\n)\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\005~\011\t\t\233\011\t\015\002\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\000\238\011\t\011\t\000\238\011\t\015\198\011\t\011\t\011\t\007B\007Z\011\t\011\t\011\t\011\t\011\t\011\t\011\t\006\170\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\r\178\011\t\011\t\r\206\011\t\011\t\007b\019\142\006\174\002!\011\t\011\t\011\t\011\t\011\t\b\158\011\t\011\t\011\t\005.\011\t\011\t\022\190\011\t\011\t\006\130\011\t\011\t\000\238\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\014\222\b\214\011\t\011\t\011\t\011\t\011\021\011\021\002\198\b\006\000\238\011\021\005.\011\021\011\021\000\238\011\021\011\021\011\021\011\021\015N\011\021\011\021\014\226\011\021\011\021\011\021\n\246\011\021\011\021\011\021\011\021\006\218\011\021\014\206\011\021\011\021\011\021\011\021\011\021\011\021\011\021\011\021\015R\011\021\014\014\011\021\015z\011\021\011\021\011\021\011\021\011\021\011\021\011\021\011\021\014\210\011\021\011\021\017\166\011\021\015\242\011\021\011\021\011\021\n\158\n\206\011\021\011\021\011\021\011\021\011\021\011\021\011\021\014\178\011\021\011\021\011\021\011\021\011\021\011\021\011\021\011\021\011\021\011\021\011\021\015&\011\021\011\021\014\138\011\021\011\021\017R\007F\015\238\007V\011\021\011\021\011\021\011\021\011\021\b\158\011\021\011\021\011\021\014\154\011\021\011\021\015*\011\021\011\021\015\158\011\021\011\021\000\238\011\021\011\021\011\021\011\021\011\021\011\021\011\021\011\021\011\021\011\021\011\021\011\021\011\021\015\194\018^\011\021\011\021\011\021\011\021\011%\011%\007\150\017Z\014\206\011%\015&\011%\011%\017\170\011%\011%\011%\011%\014\222\011%\011%\017\130\011%\011%\011%\014\254\011%\011%\011%\011%\016\018\011%\016\150\011%\011%\011%\011%\011%\011%\011%\011%\0166\011%\017n\011%\016\138\011%\011%\011%\011%\011%\011%\011%\011%\004Z\011%\011%\016\170\011%\016\022\011%\011%\011%\017r\015N\011%\011%\011%\011%\011%\011%\011%\017\254\011%\011%\011%\011%\011%\011%\011%\011%\011%\011%\011%\022\018\011%\011%\016\162\011%\011%\017\150\001\206\003\190\002\158\011%\011%\011%\011%\011%\031\127\011%\011%\011%\017\218\011%\011%\004j\011%\011%\029\022\011%\011%\017\154\011%\011%\011%\011%\011%\011%\011%\011%\011%\011%\011%\011%\011%\017\222\018F\011%\011%\011%\011%\011\029\011\029\018:\018\n\021\150\011\029\017\134\011\029\011\029\t\194\011\029\011\029\011\029\011\029\016\174\011\029\011\029\018J\011\029\011\029\011\029\000\238\011\029\011\029\011\029\011\029\018\014\011\029\r\190\011\029\011\029\011\029\011\029\011\029\011\029\011\029\011\029\018\002\011\029\019\178\011\029\023.\011\029\011\029\011\029\011\029\011\029\011\029\011\029\011\029\002\158\011\029\011\029\018\186\011\029\016:\011\029\011\029\011\029\t\218\r\190\011\029\011\029\011\029\011\029\011\029\011\029\011\029\r\190\011\029\011\029\011\029\011\029\011\029\011\029\011\029\011\029\011\029\011\029\011\029\023n\011\029\011\029\018\246\011\029\011\029\018>\0049\022Z\tE\011\029\011\029\011\029\011\029\011\029\002\198\011\029\011\029\011\029\023\202\011\029\011\029\027\202\011\029\011\029\018\230\011\029\011\029\023b\011\029\011\029\011\029\011\029\011\029\011\029\011\029\011\029\011\029\011\029\011\029\011\029\011\029\027\206\022\250\011\029\011\029\011\029\011\029\011\157\011\157\023\154\n\006\bV\011\157\006\197\011\157\011\157\0192\011\157\011\157\011\157\011\157\006~\011\157\011\157\021R\011\157\011\157\011\157\029\206\011\157\011\157\011\157\011\157\bV\011\157\019\182\011\157\011\157\011\157\011\157\011\157\011\157\011\157\011\157\028\n\011\157\023v\011\157\026\030\011\157\011\157\011\157\011\157\011\157\011\157\011\157\011\157\000\238\011\157\011\157\004Z\011\157\016V\011\157\011\157\011\157\026Z\026\170\011\157\011\157\011\157\011\157\011\157\011\157\011\157\023\206\011\157\011\157\011\157\011\157\011\157\011\157\011\157\011\157\011\157\011\157\011\157\023\182\011\157\011\157\t9\011\157\011\157\001\206\005\161\026\022\006\185\011\157\011\157\011\157\011\157\011\157\n\162\011\157\011\157\011\157\014q\011\157\011\157\000\238\011\157\011\157\031\022\011\157\011\157\t=\011\157\011\157\011\157\011\157\011\157\011\157\011\157\011\157\011\157\011\157\011\157\011\157\011\157\n\202\n\214\011\157\011\157\011\157\011\157\004Y\004Y\026\162\029\154\026z\004Y\028\014\004Y\004Y\n\230\004Y\004Y\004Y\004Y\027f\004Y\004Y\027>\004Y\004Y\004Y\027J\004Y\004Y\004Y\004Y\014}\004Y\r\170\004Y\004Y\004Y\004Y\004Y\004Y\004Y\004Y\028\238\004Y\014\170\004Y\bV\004Y\004Y\004Y\004Y\004Y\004Y\004Y\004Y\000\238\004Y\004Y\014\198\004Y\014\214\004Y\004Y\004Y\027\158\r\138\004Y\004Y\004Y\004Y\004Y\004Y\004Y\029\"\004Y\004Y\004Y\004Y\004Y\004Y\004Y\004Y\004Y\004Y\004Y\026\218\n^\n\226\bV\004Y\004Y\001\206\005%\031\143\030\006\004Y\004Y\004Y\004Y\004Y\bV\004Y\004Y\004Y\030\166\004Y\nf\r\218\n\234\004Y\000\238\004Y\004Y\023v\004Y\004Y\004Y\004Y\004Y\004Y\004Y\004Y\004Y\004Y\004Y\004Y\004Y\r\242\004Y\004Y\004Y\004Y\004Y\0021\0021\016\186\030z\002\234\0021\028\242\002\198\0021\031_\002\146\0021\n\154\0021\016\214\002\254\0021\016\246\0021\0021\0021\018\150\0021\0021\0021\001\210\018\190\n\210\004\022\003\002\0021\0021\0021\0021\0021\n\218\0021\029&\003\006\014\246\003\166\018\218\0021\0021\0021\0021\0021\003\226\003\230\0021\030\022\003\246\001\190\015\030\0021\015F\0021\0021\002\186\018\222\019\006\003\254\0021\0021\0021\b\218\b\222\b\234\030\170\014\234\005\182\0021\0021\0021\0021\0021\0021\0021\0021\0021\019\026\n^\n\226\019:\0021\0021\019J\019^\019\138\019\242\005\194\005\198\0021\0021\0021\019\250\0021\0021\0021\020\006\0021\014\242\021J\015n\0021\021^\0021\0021\021b\0021\0021\0021\0021\0021\0021\005\202\b\242\0021\0021\0021\t\n\004\138\006\214\022&\0021\0021\0021\0021\011\133\011\133\022>\022\206\022\210\011\133\023\n\002\198\011\133\023\014\002\146\011\133\011\133\011\133\0236\002\254\011\133\023:\011\133\011\133\011\133\023R\011\133\011\133\011\133\001\210\023\254\011\133\024\002\003\002\011\133\011\133\011\133\011\133\011\133\011\133\011\133\024&\003\006\015\230\003\166\024*\011\133\011\133\011\133\011\133\011\133\003\226\003\230\011\133\024:\003\246\001\190\016\n\011\133\016.\011\133\011\133\002\186\024J\024V\003\254\011\133\011\133\011\133\b\218\b\222\b\234\024\138\011\133\005\182\011\133\011\133\011\133\011\133\011\133\011\133\011\133\011\133\011\133\024\142\011\133\011\133\024\222\011\133\011\133\025\006\025\n\025\026\025j\005\194\005\198\011\133\011\133\011\133\025\138\011\133\011\133\011\133\025\202\011\133\011\133\025\238\011\133\011\133\025\254\011\133\011\133\026&\011\133\011\133\011\133\011\133\011\133\011\133\005\202\b\242\011\133\011\133\011\133\t\n\004\138\026*\0266\011\133\011\133\011\133\011\133\011\129\011\129\026F\026b\026r\011\129\026\134\002\198\011\129\026\178\002\146\011\129\011\129\011\129\026\182\002\254\011\129\026\194\011\129\011\129\011\129\026\210\011\129\011\129\011\129\001\210\026\230\011\129\027\218\003\002\011\129\011\129\011\129\011\129\011\129\011\129\011\129\0282\003\006\028Z\003\166\028\206\011\129\011\129\011\129\011\129\011\129\003\226\003\230\011\129\028\214\003\246\001\190\029.\011\129\029>\011\129\011\129\002\186\029J\029\174\003\254\011\129\011\129\011\129\b\218\b\222\b\234\029\194\011\129\005\182\011\129\011\129\011\129\011\129\011\129\011\129\011\129\011\129\011\129\029\242\011\129\011\129\029\250\011\129\011\129\0302\030Z\030\146\030\194\005\194\005\198\011\129\011\129\011\129\030\206\011\129\011\129\011\129\030\227\011\129\011\129\030\243\011\129\011\129\031\006\011\129\011\129\031\"\011\129\011\129\011\129\011\129\011\129\011\129\005\202\b\242\011\129\011\129\011\129\t\n\004\138\031?\031O\011\129\011\129\011\129\011\129\002\133\002\133\031k\031\191\031\219\002\133\031\230\002\198\002\133 \027\002\146\002\133\n\154\002\133 /\002\254\002\133 7\002\133\002\133\002\133 s\002\133\002\133\002\133\001\210 {\n\210\000\000\003\002\002\133\002\133\002\133\002\133\002\133\n\218\002\133\000\000\003\006\000\000\003\166\005\r\002\133\002\133\002\133\002\133\002\133\003\226\003\230\002\133\000\000\003\246\001\190\000\000\002\133\000\000\002\133\002\133\002\186\000\000\000\000\003\254\002\133\002\133\002\133\b\218\b\222\b\234\000\000\014\234\005\182\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\005u\000\000\002\133\000\000\002\133\002\133\000\000\005\r\000\000\005\r\005\194\005\198\002\133\002\133\002\133\000\000\002\133\002\133\002\133\007\022\002\133\000\238\005\r\005u\002\133\005\r\002\133\002\133\005\r\002\133\002\133\002\133\002\133\002\133\002\133\005\202\b\242\002\133\002\133\002\133\t\n\004\138\000\000\005\r\002\133\002\133\002\133\002\133\005\r\007\194\005\r\000\000\005\r\005\r\005\r\005\r\005\r\005\r\005\r\005\r\005\r\000\000\005\r\005\r\000\238\005\r\005\r\005\r\020B\005\r\005\r\005\r\005\r\005\r\005\r\005\r\005\r\005\r\000\000\005\r\005\r\000\000\000\238\005\r\005\r\005\r\005\r\005\r\005\r\005\r\005\r\bB\005\r\005\r\005\r\005\r\005\r\000\238\005\r\005\r\005\r\005\r\005\r\005\r\005\r\005\r\005\r\005\r\005\r\005\r\005\r\005\r\000\238\005\r\005\r\005\r\005\r\005\r\005\r\005\r\005\r\000\000\000\000\005\r\000\000\000\000\005\r\005\r\005\r\000\238\005\r\000\000\000\238\005\r\005\r\005\r\005\r\005\r\005\r\005\r\005\r\005\r\001*\bN\005\r\005\r\000\238\005\r\002\001\002\001\005\r\018\178\bV\005\r\002\146\005\r\000\000\000\000\020F\000\238\bZ\000\000\005\r\005\r\005\r\000\238\000\000\005\r\005\r\005\r\005\r\020\030\000\129\005\r\000\129\000\n\000\129\000\129\000\129\000\129\000\129\000\129\000\129\000\000\000\129\027\006\000\129\000\129\025\226\000\129\000\129\020\"\000\000\000\129\000\129\018\182\000\129\000\129\000\129\000\129\000\000\000\129\026R\000\129\000\129\000\000\002\001\000\129\000\129\018\194\000\129\000\129\000\129\007\225\000\129\023V\000\129\000\129\000\129\000\129\000\129\0272\000\129\000\129\000\129\000\129\000\129\000\000\000\000\000\129\000\129\000\000\007\225\000\129\000\129\005\198\000\129\000\129\000\129\000\129\000\129\000\129\000\129\000\129\000\129\000\000\007u\000\129\000\000\005y\000\129\007\217\000\129\000\000\000\129\007\026\002\198\000\000\000\129\000\129\000\129\000\129\000\129\000\129\000\129\000\129\007u\000\000\000\000\000\129\007\217\000\129\005y\000\000\007\217\000\222\000\000\000\000\000\000\000\129\n\026\020&\000\000\000\000\0206\000\129\000\129\000\129\000\129\000\000\n.\000\129\000\129\000\129\000\129\002}\002}\007\225\000\000\000\000\002}\003\178\002\198\002}\000\000\002\146\002}\b\230\002}\000\000\002\254\002}\000\000\002}\002}\002}\003\030\002}\002}\002}\001\210\000\000\000\000\000\000\003\002\002}\002}\002}\002}\002}\000\000\002}\000\000\003\006\000\000\003\166\003\"\002}\002}\002}\002}\002}\003\226\003\230\002}\007\217\003\246\b\238\000\000\002}\000\000\002}\002}\002\186\000\000\000\000\003\254\002}\002}\002}\b\218\b\222\b\234\000\000\0042\005\182\002}\002}\002}\002}\002}\002}\002}\002}\002}\007\194\n^\n\226\000\000\002}\002}\000\000\000\000\000\000\000\000\005\194\005\198\002}\002}\002}\000\000\002}\002}\002}\b\138\002}\nf\000\000\n\234\002}\000\000\002}\002}\000\000\002}\002}\002}\002}\002}\002}\005\202\b\242\002}\002}\002}\t\n\004\138\bB\002\198\002}\002}\002}\002}\002\145\002\145\002\001\002\001\000\000\002\145\002\001\002\198\002\145\000\000\000\000\002\145\000\000\002\145\003j\000\238\002\145\003\146\002\145\002\145\002\145\000\000\002\145\002\145\002\145\001\210\000\000\000\000\000\n\000\n\002\145\002\145\002\145\002\145\002\145\017\182\002\145\000\000\000\000\n\238\003\178\000\000\002\145\002\145\002\145\002\145\002\145\002\001\000\000\002\145\007\129\003\154\000\000\014\130\002\145\014\146\002\145\002\145\002\186\002\001\002\001\002\001\002\145\002\145\002\145\000\000\000\000\000\000\000\000\000\000\007\129\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\007\194\n^\n\226\000\000\002\145\002\145\007\130\002\001\000\000\t\233\000\000\000\000\002\145\002\145\002\145\000\000\002\145\002\145\002\145\020z\002\145\nf\000\000\n\234\002\145\000\000\002\145\002\145\b\205\002\145\002\145\002\145\002\145\002\145\002\145\n^\n\226\002\145\002\145\002\145\003*\003\190\bB\000\000\002\145\002\145\002\145\002\145\002\141\002\141\000\000\000\238\000\000\002\141\000\000\nf\002\141\n\234\b\205\002\141\003.\002\141\000\000\000\238\002\141\000\000\002\141\002\141\002\141\000\000\002\141\002\141\002\141\b\205\006e\000\000\b\205\tf\002\141\002\141\002\141\002\141\002\141\b\205\002\141\t&\001\190\b\205\000\000\000\000\002\141\002\141\002\141\002\141\002\141\017v\t\233\002\141\000\000\017\138\017\158\017\174\002\141\000\000\002\141\002\141\n-\t\146\007\194\020~\002\141\002\141\002\141\002\001\000\000\000\000\000\000\006e\b\170\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\000\000\n^\n\226\000\000\002\141\002\141\022\014\000\000\006e\000\000\b\174\000\n\002\141\002\141\002\141\000\000\002\141\002\141\002\141\016\222\002\141\nf\bB\n\234\002\141\000\000\002\141\002\141\012\t\002\141\002\141\002\141\002\141\002\141\002\141\000\000\000\000\002\141\002\141\002\141\000\238\b\158\002\001\000\238\002\141\002\141\002\141\002\141\002\129\002\129\000\000\000\000\000\000\002\129\000\238\000\000\002\129\000\000\012\t\002\129\000\000\002\129\000\000\000\000\002\129\000\000\002\129\002\129\002\129\000\000\002\129\002\129\002\129\012\t\000\000\031\175\012\t\014\006\002\129\002\129\002\129\002\129\002\129\012\t\002\129\006\146\000\000\012\t\006J\000\000\002\129\002\129\002\129\002\129\002\129\006\178\000\000\002\129\021\190\006\190\000\000\000\000\002\129\b\178\002\129\002\129\002\198\000\000\000\000\002\146\002\129\002\129\002\129\000\000\000\000\000\000\007\193\000\000\000\000\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\000\000\n^\n\226\000\000\002\129\002\129\000\000\007\030\000\000\000\000\000\238\007\193\002\129\002\129\002\129\000\000\002\129\002\129\002\129\000\000\002\129\nf\021\138\n\234\002\129\000\000\002\129\002\129\005\201\002\129\002\129\002\129\002\129\002\129\002\129\000\000\018\194\002\129\002\129\002\129\005\201\003\190\031\203\000\000\002\129\002\129\002\129\002\129\002)\002)\000\000\000\000\000\000\002)\000\000\006\146\002)\000\000\006J\002)\000\000\002)\005\198\000\000\002)\006\178\002)\002)\002)\006\190\002)\002)\002)\005\201\000\000\000\000\000\000\021\022\002)\002)\002)\002)\002)\000\000\002)\t&\017\234\000\000\000\000\000\000\002)\002)\002)\002)\002)\017v\t\025\002)\000\000\017\138\017\158\017\174\002)\005\201\002)\002)\005\201\000\000\000\000\000\000\002)\002)\002)\000\000\000\000\000\000\000\000\000\000\000\000\002)\002)\002)\002)\002)\002)\002)\002)\002)\ne\000\000\002)\000\000\002)\002)\002\182\002\198\000\000\000\000\000\238\000\000\002)\002)\002)\000\000\002)\002)\002)\t9\002)\000\000\t9\ne\002)\002\001\002)\002)\000\000\n\026\002)\002)\002)\002)\002)\000\000\000\000\002)\002)\n.\026Z\000\000\000\000\004n\002)\002)\002)\002)\n\029\n\029\000\000\000\000\003\178\n\029\000\n\006\146\n\029\000\000\006J\n\029\000\000\n\029\000\000\t9\n\029\006\178\n\029\n\029\n\029\006\190\n\029\n\029\n\029\002\001\000\000\000\000\000\000\t9\n\029\n\029\n\029\n\029\n\029\000\000\n\029\002\001\002\001\004\178\004z\000\000\n\029\n\029\n\029\n\029\n\029\0046\004B\n\029\000\000\000\000\000\000\004N\n\029\t9\n\029\n\029\000\000\000\000\000\000\000\000\n\029\n\029\n\029\000\000\000\000\000\000\na\000\000\000\000\n\029\n\029\n\029\n\029\n\029\n\029\n\029\n\029\n\029\000\000\000\000\n\029\t9\n\029\n\029\000\000\017\202\000\000\000\000\000\238\na\n\029\n\029\n\029\000\000\n\029\n\029\n\029\018\178\n\029\000\000\002\146\000\000\n\029\000\000\n\029\n\029\000\000\n\026\n\029\n\029\n\029\n\029\n\029\000\000\000\000\n\029\n\029\n.\nJ\000\000\000\000\002\254\n\029\n\029\n\029\n\029\002\137\002\137\000\000\002\014\000\000\002\137\002\146\006\146\002\137\000\000\006J\002\137\003\026\002\137\000\000\018\182\002\137\006\178\002\137\002\137\002\137\006\190\002\137\002\137\002\137\003&\000\000\000\000\000\000\018\194\002\137\002\137\002\137\002\137\002\137\000\000\002\137\000\000\b~\007\194\000\000\000\000\002\137\002\137\002\137\002\137\002\137\030\254\001\222\002\137\005\182\000\000\000\000\000\000\002\137\005\198\002\137\002\137\b\130\000\000\000\000\018\194\002\137\002\137\002\137\000\000\000\000\000\000\000\000\000\000\005\194\002\137\002\137\002\137\002\137\002\137\002\137\002\137\002\137\002\137\000\000\bB\002\137\029R\002\137\002\137\000\000\005\198\000\000\000\000\000\000\000\000\002\137\002\137\002\137\005\202\002\137\002\137\002\137\000\000\002\137\000\000\000\238\000\000\002\137\018\178\002\137\002\137\002\146\011\002\002\137\002\137\002\137\002\137\002\137\r\213\000\000\002\137\002\137\002\137\000\000\000\000\b\186\007\194\002\137\002\137\002\137\002\137\n\r\n\r\002\001\002\001\020\166\n\r\r\213\r\213\n\r\000\000\r\213\n\r\000\000\n\r\b\190\000\000\n\r\002\001\n\r\n\r\n\r\018\182\n\r\n\r\n\r\002\001\002\001\021\230\000\000\000\n\n\r\n\r\n\r\n\r\n\r\018\194\n\r\bB\000\000\000\000\002\001\000\000\n\r\n\r\n\r\n\r\n\r\007\233\000\000\n\r\000\000\000\238\000\n\000\000\n\r\000\000\n\r\n\r\000\238\000\000\002\001\005\198\n\r\n\r\n\r\000\000\007\233\000\000\000\000\000\000\007\233\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\007\194\r\213\n\r\002\001\n\r\n\r\000\000\000\000\000\000\0256\000\000\000\000\n\r\n\r\n\r\000\000\n\r\n\r\n\r\tR\n\r\000\000\000\000\000\000\n\r\000\000\n\r\n\r\000\000\n\026\n\r\n\r\n\r\n\r\n\r\r\209\000\000\n\r\n\r\n.\001\206\000\000\bB\002\198\n\r\n\r\n\r\n\r\003\193\003\193\000\000\007\233\029\226\003\193\r\209\r\209\003\193\000\000\r\209\003\193\000\000\003\193\000\000\000\238\011B\000\000\003\193\011\150\003\193\000\000\003\193\003\193\003\193\000\000\000\000\000\000\n\026\007\245\011\170\011\242\012\n\011\194\012\"\000\000\003\193\002\170\n.\015r\003\178\000\000\003\193\003\193\012:\012R\003\193\000\000\007\245\003\193\000\000\000\238\007\245\015\150\003\193\015\186\012j\003\193\000\000\000\000\000\000\000\000\003\193\003\193\000\238\000\000\000\000\004\230\000\000\000\000\005\165\003\193\003\193\011Z\011\218\012\130\012\154\012\202\003\193\003\193\007\194\r\209\003\193\000\000\003\193\012\226\000\000\000\000\000\000\000\000\000\238\000\000\003\193\003\193\012\250\000\000\003\193\003\193\003\193\019\222\003\193\000\000\000\000\000\000\003\193\000\000\003\193\003\193\000\000\rZ\003\193\rr\012\178\003\193\003\193\000\000\000\000\003\193\r\018\003\193\014\026\003\190\bB\005\166\003\193\003\193\r*\rB\002\233\002\233\000\000\000\000\000\000\002\233\000\000\014\"\002\233\000\000\014.\002\233\000\000\002\233\000\000\000\238\002\233\014:\002\233\002\233\002\233\014F\002\233\002\233\002\233\000\000\000\000\000\000\000\000\007\225\002\233\002\233\002\233\002\233\002\233\000\000\002\233\005\254\028\254\007\194\000\000\000\000\002\233\002\233\002\233\002\233\002\233\004\014\007\225\002\233\000\000\006\234\007\225\004\026\002\233\000\000\002\233\002\233\029\002\000\000\000\000\000\000\002\233\002\233\002\233\000\000\000\000\000\000\000\000\000\000\000\000\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\007\194\bB\002\233\000\000\002\233\002\233\000\000\000\000\000\000\000\000\000\238\000\000\002\233\002\233\002\233\000\000\002\233\002\233\002\233\0202\002\233\000\000\000\238\000\000\002\233\000\000\002\233\002\233\000\000\n\026\002\233\002\233\002\233\002\233\002\233\007\194\000\000\002\233\002\233\n.\b\197\000\000\bB\b\230\002\233\002\233\002\233\002\233\002\229\002\229\000\000\000\000\000\000\002\229\020N\b\197\002\229\000\000\006J\002\229\000\000\002\229\000\000\000\238\002\229\b\197\002\229\002\229\002\229\b\197\002\229\002\229\002\229\000\000\000\000\000\000\007\194\bB\002\229\002\229\002\229\002\229\002\229\000\000\002\229\000\000\000\000\007\194\000\000\000\000\002\229\002\229\002\229\002\229\002\229\020j\000\000\002\229\000\238\000\000\000\000\000\000\002\229\000\000\002\229\002\229\020\134\000\000\000\000\000\000\002\229\002\229\002\229\000\000\000\000\000\000\000\000\000\000\bB\002\229\002\229\011Z\002\229\002\229\002\229\002\229\002\229\002\229\007\194\bB\002\229\000\000\002\229\002\229\000\000\000\000\000\000\000\000\b\225\000\238\002\229\002\229\002\229\000\000\002\229\002\229\002\229\030\178\002\229\000\000\000\238\000\000\002\229\000\000\002\229\002\229\000\000\002\229\002\229\002\229\002\229\002\229\002\229\000\000\000\000\002\229\002\229\002\229\b\225\000\000\bB\000\000\002\229\002\229\002\229\002\229\002\185\002\185\000\000\000\000\000\000\002\185\000\000\b\225\002\185\000\000\006J\002\185\000\000\002\185\000\000\000\238\002\185\b\225\002\185\002\185\002\185\b\225\002\185\002\185\002\185\000\000\000\000\000\000\000\000\000\000\002\185\002\185\002\185\002\185\002\185\000\000\002\185\000\000\000\000\000\000\000\000\000\000\002\185\002\185\002\185\002\185\002\185\000\000\000\000\002\185\000\000\000\000\000\000\000\000\002\185\000\000\002\185\002\185\000\000\000\000\000\000\000\000\002\185\002\185\002\185\000\000\000\000\000\000\000\000\000\000\000\000\002\185\002\185\002\185\002\185\002\185\002\185\002\185\002\185\002\185\000\000\000\000\002\185\000\000\002\185\002\185\000\000\000\000\000\000\000\000\000\238\000\000\002\185\002\185\002\185\000\000\002\185\002\185\002\185\000\000\002\185\000\000\000\000\000\000\002\185\000\000\002\185\002\185\000\000\n\026\002\185\002\185\002\185\002\185\002\185\000\000\000\000\002\185\002\185\n.\b\253\000\000\000\000\000\000\002\185\002\185\002\185\002\185\002\181\002\181\000\000\000\000\000\000\002\181\000\000\006\146\002\181\000\000\006J\002\181\000\000\002\181\000\000\000\000\002\181\b\253\002\181\002\181\002\181\b\253\002\181\002\181\002\181\000\000\000\000\000\000\000\000\000\000\002\181\002\181\002\181\002\181\002\181\000\000\002\181\000\000\000\000\000\000\000\000\000\000\002\181\002\181\002\181\002\181\002\181\000\000\000\000\002\181\000\000\000\000\000\000\000\000\002\181\000\000\002\181\002\181\000\000\000\000\000\000\000\000\002\181\002\181\002\181\000\000\000\000\000\000\000\000\000\000\000\000\002\181\002\181\011Z\002\181\002\181\002\181\002\181\002\181\002\181\000\000\000\000\002\181\000\000\002\181\002\181\000\000\000\000\000\000\000\000\b\245\000\000\002\181\002\181\002\181\000\000\002\181\002\181\002\181\000\000\002\181\000\000\000\000\000\000\002\181\000\000\002\181\002\181\000\000\002\181\002\181\002\181\002\181\002\181\002\181\000\000\000\000\002\181\002\181\002\181\b\245\000\000\000\000\000\000\002\181\002\181\002\181\002\181\002\209\002\209\000\000\000\000\000\000\002\209\000\000\014^\002\209\000\000\b\245\002\209\000\000\002\209\000\000\000\000\002\209\b\245\002\209\002\209\002\209\b\245\002\209\002\209\002\209\000\000\000\000\000\000\000\000\000\000\002\209\002\209\002\209\002\209\002\209\000\000\002\209\000\000\000\000\000\000\000\000\000\000\002\209\002\209\002\209\002\209\002\209\000\000\000\000\002\209\000\000\000\000\000\000\000\000\002\209\000\000\002\209\002\209\000\000\000\000\000\000\000\000\002\209\002\209\002\209\000\000\000\000\000\000\000\000\000\000\000\000\002\209\002\209\002\209\002\209\002\209\002\209\002\209\002\209\002\209\000\000\000\000\002\209\000\000\002\209\002\209\000\000\000\000\000\000\000\000\000\238\000\000\002\209\002\209\002\209\000\000\002\209\002\209\002\209\000\000\002\209\000\000\000\000\000\000\002\209\000\000\002\209\002\209\000\000\n\026\002\209\002\209\002\209\002\209\002\209\000\000\000\000\002\209\002\209\n.\b\193\000\000\000\000\000\000\002\209\002\209\002\209\002\209\002\205\002\205\000\000\000\000\000\000\002\205\000\000\b\193\002\205\000\000\006J\002\205\000\000\002\205\000\000\000\000\011B\b\193\002\205\002\205\002\205\b\193\002\205\002\205\002\205\000\000\000\000\000\000\000\000\000\000\002\205\002\205\002\205\011\194\002\205\000\000\002\205\000\000\000\000\000\000\000\000\000\000\002\205\002\205\002\205\002\205\002\205\000\000\000\000\002\205\000\000\000\000\000\000\000\000\002\205\000\000\002\205\002\205\000\000\000\000\000\000\000\000\002\205\002\205\002\205\000\000\000\000\000\000\000\000\000\000\000\000\002\205\002\205\011Z\011\218\002\205\002\205\002\205\002\205\002\205\000\000\000\000\002\205\000\000\002\205\002\205\000\000\000\000\000\000\000\000\000\238\000\000\002\205\002\205\002\205\000\000\002\205\002\205\002\205\000\000\002\205\000\000\000\000\000\000\002\205\000\000\002\205\002\205\000\000\002\205\002\205\002\205\002\205\002\205\002\205\000\000\000\000\002\205\002\205\002\205\017F\000\000\000\000\000\000\002\205\002\205\002\205\002\205\002\241\002\241\000\000\000\000\000\000\002\241\000\000\014\"\002\241\000\000\014.\002\241\000\000\002\241\000\000\000\000\002\241\014:\002\241\002\241\002\241\014F\002\241\002\241\002\241\000\000\000\000\000\000\000\000\000\000\002\241\002\241\002\241\002\241\002\241\000\000\002\241\000\000\000\000\000\000\000\000\000\000\002\241\002\241\002\241\002\241\002\241\000\000\000\000\002\241\000\000\000\000\000\000\000\000\002\241\000\000\002\241\002\241\000\000\000\000\000\000\000\000\002\241\002\241\002\241\000\000\000\000\000\000\000\000\000\000\000\000\002\241\002\241\002\241\002\241\002\241\002\241\002\241\002\241\002\241\000\000\000\000\002\241\000\000\002\241\002\241\000\000\000\000\000\000\000\000\000\000\000\000\002\241\002\241\002\241\000\000\002\241\002\241\002\241\000\000\002\241\000\000\000\000\000\000\002\241\000\000\002\241\002\241\000\000\n\026\002\241\002\241\002\241\002\241\002\241\007\221\000\000\002\241\002\241\n.\000\000\000\000\000\000\000\000\002\241\002\241\002\241\002\241\002\237\002\237\000\000\000\000\000\000\002\237\007\221\000\000\002\237\000\000\007\221\002\237\000\000\002\237\000\000\000\000\002\237\000\000\002\237\002\237\002\237\000\000\002\237\002\237\002\237\000\000\000\000\000\000\000\000\000\000\002\237\002\237\002\237\002\237\002\237\000\000\002\237\000\000\000\000\000\000\000\000\000\000\002\237\002\237\002\237\002\237\002\237\000\000\000\000\002\237\000\000\000\238\000\000\000\000\002\237\000\000\002\237\002\237\000\000\000\000\000\000\000\000\002\237\002\237\002\237\000\000\000\000\000\000\000\000\000\000\000\000\002\237\002\237\011Z\002\237\002\237\002\237\002\237\002\237\002\237\000\000\007\221\002\237\000\000\002\237\002\237\000\000\000\000\000\000\000\000\000\000\000\000\002\237\002\237\002\237\000\000\002\237\002\237\002\237\000\000\002\237\000\000\000\000\000\000\002\237\000\000\002\237\002\237\000\000\002\237\002\237\002\237\002\237\002\237\002\237\000\000\000\000\002\237\002\237\002\237\000\000\000\000\000\000\000\000\002\237\002\237\002\237\002\237\002\177\002\177\000\000\000\000\000\000\002\177\000\000\000\000\002\177\000\000\000\000\002\177\000\000\002\177\000\000\000\000\002\177\000\000\002\177\002\177\002\177\000\000\002\177\002\177\002\177\000\000\000\000\000\000\000\000\000\000\002\177\002\177\002\177\002\177\002\177\000\000\002\177\000\000\000\000\000\000\000\000\000\000\002\177\002\177\002\177\002\177\002\177\000\000\000\000\002\177\000\000\000\000\000\000\000\000\002\177\000\000\002\177\002\177\000\000\000\000\000\000\000\000\002\177\002\177\002\177\000\000\000\000\000\000\000\000\000\000\000\000\002\177\002\177\002\177\002\177\002\177\002\177\002\177\002\177\002\177\000\000\000\000\002\177\000\000\002\177\002\177\000\000\000\000\000\000\000\000\000\000\000\000\002\177\002\177\002\177\000\000\002\177\002\177\002\177\000\000\002\177\000\000\000\000\000\000\002\177\000\000\002\177\002\177\000\000\n\026\002\177\002\177\002\177\002\177\002\177\000\000\000\000\002\177\002\177\n.\000\000\000\000\000\000\000\000\002\177\002\177\002\177\002\177\002\173\002\173\000\000\000\000\000\000\002\173\000\000\000\000\002\173\000\000\000\000\002\173\000\000\002\173\000\000\000\000\002\173\000\000\002\173\002\173\002\173\000\000\002\173\002\173\002\173\000\000\000\000\000\000\000\000\000\000\002\173\002\173\002\173\002\173\002\173\000\000\002\173\000\000\000\000\000\000\000\000\000\000\002\173\002\173\002\173\002\173\002\173\000\000\000\000\002\173\000\000\000\000\000\000\000\000\002\173\000\000\002\173\002\173\000\000\000\000\000\000\000\000\002\173\002\173\002\173\000\000\000\000\000\000\000\000\000\000\000\000\002\173\002\173\011Z\002\173\002\173\002\173\002\173\002\173\002\173\000\000\000\000\002\173\000\000\002\173\002\173\000\000\000\000\000\000\000\000\000\000\000\000\002\173\002\173\002\173\000\000\002\173\002\173\002\173\000\000\002\173\000\000\000\000\000\000\002\173\000\000\002\173\002\173\000\000\002\173\002\173\002\173\002\173\002\173\002\173\000\000\000\000\002\173\002\173\002\173\000\000\000\000\000\000\000\000\002\173\002\173\002\173\002\173\002\201\002\201\000\000\000\000\000\000\002\201\000\000\000\000\002\201\000\000\000\000\002\201\000\000\002\201\000\000\000\000\002\201\000\000\002\201\002\201\002\201\000\000\002\201\002\201\002\201\000\000\000\000\000\000\000\000\000\000\002\201\002\201\002\201\002\201\002\201\000\000\002\201\000\000\000\000\000\000\000\000\000\000\002\201\002\201\002\201\002\201\002\201\000\000\000\000\002\201\000\000\000\000\000\000\000\000\002\201\000\000\002\201\002\201\000\000\000\000\000\000\000\000\002\201\002\201\002\201\000\000\000\000\000\000\000\000\000\000\000\000\002\201\002\201\002\201\002\201\002\201\002\201\002\201\002\201\002\201\000\000\000\000\002\201\000\000\002\201\002\201\000\000\000\000\000\000\000\000\000\000\000\000\002\201\002\201\002\201\000\000\002\201\002\201\002\201\000\000\002\201\000\000\000\000\000\000\002\201\000\000\002\201\002\201\000\000\n\026\002\201\002\201\002\201\002\201\002\201\000\000\000\000\002\201\002\201\n.\000\000\000\000\000\000\000\000\002\201\002\201\002\201\002\201\002\197\002\197\000\000\000\000\000\000\002\197\000\000\000\000\002\197\000\000\000\000\002\197\000\000\002\197\000\000\000\000\011B\000\000\002\197\002\197\002\197\000\000\002\197\002\197\002\197\000\000\000\000\000\000\000\000\000\000\002\197\002\197\002\197\011\194\002\197\000\000\002\197\000\000\000\000\000\000\000\000\000\000\002\197\002\197\002\197\002\197\002\197\000\000\000\000\002\197\000\000\000\000\000\000\000\000\002\197\000\000\002\197\002\197\000\000\000\000\000\000\000\000\002\197\002\197\002\197\000\000\000\000\000\000\000\000\000\000\000\000\002\197\002\197\011Z\011\218\002\197\002\197\002\197\002\197\002\197\000\000\000\000\002\197\000\000\002\197\002\197\000\000\000\000\000\000\000\000\000\000\000\000\002\197\002\197\002\197\000\000\002\197\002\197\002\197\000\000\002\197\000\000\000\000\000\000\002\197\000\000\002\197\002\197\000\000\002\197\002\197\002\197\002\197\002\197\002\197\000\000\000\000\002\197\002\197\002\197\000\000\000\000\000\000\000\000\002\197\002\197\002\197\002\197\002\193\002\193\000\000\000\000\000\000\002\193\000\000\000\000\002\193\000\000\000\000\002\193\000\000\002\193\000\000\000\000\002\193\000\000\002\193\002\193\002\193\000\000\002\193\002\193\002\193\000\000\000\000\000\000\000\000\000\000\002\193\002\193\002\193\002\193\002\193\000\000\002\193\000\000\000\000\000\000\000\000\000\000\002\193\002\193\002\193\002\193\002\193\000\000\000\000\002\193\000\000\000\000\000\000\000\000\002\193\000\000\002\193\002\193\000\000\000\000\000\000\000\000\002\193\002\193\002\193\000\000\000\000\000\000\000\000\000\000\000\000\002\193\002\193\002\193\002\193\002\193\002\193\002\193\002\193\002\193\000\000\000\000\002\193\000\000\002\193\002\193\000\000\000\000\000\000\000\000\000\000\000\000\002\193\002\193\002\193\000\000\002\193\002\193\002\193\000\000\002\193\000\000\000\000\000\000\002\193\000\000\002\193\002\193\000\000\n\026\002\193\002\193\002\193\002\193\002\193\000\000\000\000\002\193\002\193\n.\000\000\000\000\000\000\000\000\002\193\002\193\002\193\002\193\002\189\002\189\000\000\000\000\000\000\002\189\000\000\000\000\002\189\000\000\000\000\002\189\000\000\002\189\000\000\000\000\011B\000\000\002\189\002\189\002\189\000\000\002\189\002\189\002\189\000\000\000\000\000\000\000\000\000\000\002\189\002\189\002\189\011\194\002\189\000\000\002\189\000\000\000\000\000\000\000\000\000\000\002\189\002\189\002\189\002\189\002\189\000\000\000\000\002\189\000\000\000\000\000\000\000\000\002\189\000\000\002\189\002\189\000\000\000\000\000\000\000\000\002\189\002\189\002\189\000\000\000\000\000\000\000\000\000\000\000\000\002\189\002\189\011Z\011\218\002\189\002\189\002\189\002\189\002\189\000\000\000\000\002\189\000\000\002\189\002\189\000\000\000\000\000\000\000\000\000\000\000\000\002\189\002\189\002\189\000\000\002\189\002\189\002\189\000\000\002\189\000\000\000\000\000\000\002\189\000\000\002\189\002\189\000\000\002\189\002\189\002\189\002\189\002\189\002\189\000\000\000\000\002\189\002\189\002\189\000\000\000\000\000\000\000\000\002\189\002\189\002\189\002\189\003\017\003\017\000\000\000\000\000\000\003\017\000\000\000\000\003\017\000\000\000\000\003\017\000\000\003\017\000\000\000\000\003\017\000\000\003\017\003\017\003\017\000\000\003\017\003\017\003\017\000\000\000\000\000\000\000\000\000\000\003\017\003\017\003\017\003\017\003\017\000\000\003\017\000\000\000\000\000\000\000\000\000\000\003\017\003\017\003\017\003\017\003\017\000\000\000\000\003\017\000\000\000\000\000\000\000\000\003\017\000\000\003\017\003\017\000\000\000\000\000\000\000\000\003\017\003\017\003\017\000\000\000\000\000\000\000\000\000\000\000\000\003\017\003\017\003\017\003\017\003\017\003\017\003\017\003\017\003\017\000\000\000\000\003\017\000\000\003\017\003\017\000\000\000\000\000\000\000\000\000\000\000\000\003\017\003\017\003\017\000\000\003\017\003\017\003\017\000\000\003\017\000\000\000\000\000\000\003\017\000\000\003\017\003\017\000\000\n\026\003\017\003\017\003\017\003\017\003\017\000\000\000\000\003\017\003\017\n.\000\000\000\000\000\000\000\000\003\017\003\017\003\017\003\017\003\r\003\r\000\000\000\000\000\000\003\r\000\000\000\000\003\r\000\000\000\000\003\r\000\000\003\r\000\000\000\000\011B\000\000\003\r\003\r\003\r\000\000\003\r\003\r\003\r\000\000\000\000\000\000\000\000\000\000\011\170\011\242\012\n\011\194\012\"\000\000\003\r\000\000\000\000\000\000\000\000\000\000\003\r\003\r\012:\012R\003\r\000\000\000\000\003\r\000\000\000\000\000\000\000\000\003\r\000\000\012j\003\r\000\000\000\000\000\000\000\000\003\r\003\r\000\238\000\000\000\000\000\000\000\000\000\000\000\000\003\r\003\r\011Z\011\218\012\130\012\154\012\202\003\r\003\r\000\000\000\000\003\r\000\000\003\r\012\226\000\000\000\000\000\000\000\000\000\000\000\000\003\r\003\r\012\250\000\000\003\r\003\r\003\r\000\000\003\r\000\000\000\000\000\000\003\r\000\000\003\r\003\r\000\000\003\r\003\r\003\r\012\178\003\r\003\r\000\000\000\000\003\r\r\018\003\r\000\000\000\000\000\000\000\000\003\r\003\r\r*\rB\002\225\002\225\000\000\000\000\000\000\002\225\000\000\000\000\002\225\000\000\000\000\002\225\000\000\002\225\000\000\000\000\002\225\000\000\002\225\002\225\002\225\000\000\002\225\002\225\002\225\000\000\000\000\000\000\000\000\000\000\002\225\002\225\002\225\002\225\002\225\000\000\002\225\000\000\000\000\000\000\000\000\000\000\002\225\002\225\002\225\002\225\002\225\000\000\000\000\002\225\000\000\000\000\000\000\000\000\002\225\000\000\002\225\002\225\000\000\000\000\000\000\000\000\002\225\002\225\002\225\000\000\000\000\000\000\000\000\000\000\000\000\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\000\000\000\000\002\225\000\000\002\225\002\225\000\000\000\000\000\000\000\000\000\000\000\000\002\225\002\225\002\225\000\000\002\225\002\225\002\225\000\000\002\225\000\000\000\000\000\000\002\225\000\000\002\225\002\225\000\000\n\026\002\225\002\225\002\225\002\225\002\225\000\000\000\000\002\225\002\225\n.\000\000\000\000\000\000\000\000\002\225\002\225\002\225\002\225\002\221\002\221\000\000\000\000\000\000\002\221\000\000\000\000\002\221\000\000\000\000\002\221\000\000\002\221\000\000\000\000\011B\000\000\002\221\002\221\002\221\000\000\002\221\002\221\002\221\000\000\000\000\000\000\000\000\000\000\002\221\002\221\002\221\011\194\002\221\000\000\002\221\000\000\000\000\000\000\000\000\000\000\002\221\002\221\002\221\002\221\002\221\000\000\000\000\002\221\000\000\000\000\000\000\000\000\002\221\000\000\002\221\002\221\000\000\000\000\000\000\000\000\002\221\002\221\002\221\000\000\000\000\000\000\000\000\000\000\000\000\002\221\002\221\011Z\011\218\002\221\002\221\002\221\002\221\002\221\000\000\000\000\002\221\000\000\002\221\002\221\000\000\000\000\000\000\000\000\000\000\000\000\002\221\002\221\002\221\000\000\002\221\002\221\002\221\000\000\002\221\000\000\000\000\000\000\002\221\000\000\002\221\002\221\000\000\002\221\002\221\002\221\002\221\002\221\002\221\000\000\000\000\002\221\002\221\002\221\000\000\000\000\000\000\000\000\002\221\002\221\002\221\002\221\002\217\002\217\000\000\000\000\000\000\002\217\000\000\000\000\002\217\000\000\000\000\002\217\000\000\002\217\000\000\000\000\002\217\000\000\002\217\002\217\002\217\000\000\002\217\002\217\002\217\000\000\000\000\000\000\000\000\000\000\002\217\002\217\002\217\002\217\002\217\000\000\002\217\000\000\000\000\000\000\000\000\000\000\002\217\002\217\002\217\002\217\002\217\000\000\000\000\002\217\000\000\000\000\000\000\000\000\002\217\000\000\002\217\002\217\000\000\000\000\000\000\000\000\002\217\002\217\002\217\000\000\000\000\000\000\000\000\000\000\000\000\002\217\002\217\002\217\002\217\002\217\002\217\002\217\002\217\002\217\000\000\000\000\002\217\000\000\002\217\002\217\000\000\000\000\000\000\000\000\000\000\000\000\002\217\002\217\002\217\000\000\002\217\002\217\002\217\000\000\002\217\000\000\000\000\000\000\002\217\000\000\002\217\002\217\000\000\n\026\002\217\002\217\002\217\002\217\002\217\000\000\000\000\002\217\002\217\n.\000\000\000\000\000\000\000\000\002\217\002\217\002\217\002\217\002\213\002\213\000\000\000\000\000\000\002\213\000\000\000\000\002\213\000\000\000\000\002\213\000\000\002\213\000\000\000\000\011B\000\000\002\213\002\213\002\213\000\000\002\213\002\213\002\213\000\000\000\000\000\000\000\000\000\000\002\213\002\213\002\213\011\194\002\213\000\000\002\213\000\000\000\000\000\000\000\000\000\000\002\213\002\213\002\213\002\213\002\213\000\000\000\000\002\213\000\000\000\000\000\000\000\000\002\213\000\000\002\213\002\213\000\000\000\000\000\000\000\000\002\213\002\213\002\213\000\000\000\000\000\000\000\000\000\000\000\000\002\213\002\213\011Z\011\218\002\213\002\213\002\213\002\213\002\213\000\000\000\000\002\213\000\000\002\213\002\213\000\000\000\000\000\000\000\000\000\000\000\000\002\213\002\213\002\213\000\000\002\213\002\213\002\213\000\000\002\213\000\000\000\000\000\000\002\213\000\000\002\213\002\213\000\000\002\213\002\213\002\213\002\213\002\213\002\213\000\000\000\000\002\213\002\213\002\213\000\000\000\000\000\000\000\000\002\213\002\213\002\213\002\213\003\001\003\001\000\000\000\000\000\000\003\001\000\000\000\000\003\001\000\000\000\000\003\001\000\000\003\001\000\000\000\000\003\001\000\000\003\001\003\001\003\001\000\000\003\001\003\001\003\001\000\000\000\000\000\000\000\000\000\000\003\001\003\001\003\001\003\001\003\001\000\000\003\001\000\000\000\000\000\000\000\000\000\000\003\001\003\001\003\001\003\001\003\001\000\000\000\000\003\001\000\000\000\000\000\000\000\000\003\001\000\000\003\001\003\001\000\000\000\000\000\000\000\000\003\001\003\001\003\001\000\000\000\000\000\000\000\000\000\000\000\000\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\000\000\000\000\003\001\000\000\003\001\003\001\000\000\000\000\000\000\000\000\000\000\000\000\003\001\003\001\003\001\000\000\003\001\003\001\003\001\000\000\003\001\000\000\000\000\000\000\003\001\000\000\003\001\003\001\000\000\n\026\003\001\003\001\003\001\003\001\003\001\000\000\000\000\003\001\003\001\n.\000\000\000\000\000\000\000\000\003\001\003\001\003\001\003\001\002\253\002\253\000\000\000\000\000\000\002\253\000\000\000\000\002\253\000\000\000\000\002\253\000\000\002\253\000\000\000\000\011B\000\000\002\253\002\253\002\253\000\000\002\253\002\253\002\253\000\000\000\000\000\000\000\000\000\000\011\170\011\242\012\n\011\194\002\253\000\000\002\253\000\000\000\000\000\000\000\000\000\000\002\253\002\253\012:\012R\002\253\000\000\000\000\002\253\000\000\000\000\000\000\000\000\002\253\000\000\002\253\002\253\000\000\000\000\000\000\000\000\002\253\002\253\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\253\002\253\011Z\011\218\012\130\012\154\002\253\002\253\002\253\000\000\000\000\002\253\000\000\002\253\002\253\000\000\000\000\000\000\000\000\000\000\000\000\002\253\002\253\002\253\000\000\002\253\002\253\002\253\000\000\002\253\000\000\000\000\000\000\002\253\000\000\002\253\002\253\000\000\002\253\002\253\002\253\012\178\002\253\002\253\000\000\000\000\002\253\002\253\002\253\000\000\000\000\000\000\000\000\002\253\002\253\002\253\002\253\002\169\002\169\000\000\000\000\000\000\002\169\000\000\000\000\002\169\000\000\000\000\002\169\000\000\002\169\000\000\000\000\002\169\000\000\002\169\002\169\002\169\000\000\002\169\002\169\002\169\000\000\000\000\000\000\000\000\000\000\002\169\002\169\002\169\002\169\002\169\000\000\002\169\000\000\000\000\000\000\000\000\000\000\002\169\002\169\002\169\002\169\002\169\000\000\000\000\002\169\000\000\000\000\000\000\000\000\002\169\000\000\002\169\002\169\000\000\000\000\000\000\000\000\002\169\002\169\002\169\000\000\000\000\000\000\000\000\000\000\000\000\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\000\000\000\000\002\169\000\000\002\169\002\169\000\000\000\000\000\000\000\000\000\000\000\000\002\169\002\169\002\169\000\000\002\169\002\169\002\169\000\000\002\169\000\000\000\000\000\000\002\169\000\000\002\169\002\169\000\000\n\026\002\169\002\169\002\169\002\169\002\169\000\000\000\000\002\169\002\169\n.\000\000\000\000\000\000\000\000\002\169\002\169\002\169\002\169\002\165\002\165\000\000\000\000\000\000\002\165\000\000\000\000\002\165\000\000\000\000\002\165\000\000\002\165\000\000\000\000\011B\000\000\002\165\002\165\002\165\000\000\002\165\002\165\002\165\000\000\000\000\000\000\000\000\000\000\002\165\002\165\002\165\011\194\002\165\000\000\002\165\000\000\000\000\000\000\000\000\000\000\002\165\002\165\002\165\002\165\002\165\000\000\000\000\002\165\000\000\000\000\000\000\000\000\002\165\000\000\002\165\002\165\000\000\000\000\000\000\000\000\002\165\002\165\002\165\000\000\000\000\000\000\000\000\000\000\000\000\002\165\002\165\011Z\011\218\002\165\002\165\002\165\002\165\002\165\000\000\000\000\002\165\000\000\002\165\002\165\000\000\000\000\000\000\000\000\000\000\000\000\002\165\002\165\002\165\000\000\002\165\002\165\002\165\000\000\002\165\000\000\000\000\000\000\002\165\000\000\002\165\002\165\000\000\002\165\002\165\002\165\002\165\002\165\002\165\000\000\000\000\002\165\002\165\002\165\000\000\000\000\000\000\000\000\002\165\002\165\002\165\002\165\002\161\002\161\000\000\000\000\000\000\002\161\000\000\000\000\002\161\000\000\000\000\002\161\000\000\002\161\000\000\000\000\002\161\000\000\002\161\002\161\002\161\000\000\002\161\002\161\002\161\000\000\000\000\000\000\000\000\000\000\002\161\002\161\002\161\002\161\002\161\000\000\002\161\000\000\000\000\000\000\000\000\000\000\002\161\002\161\002\161\002\161\002\161\000\000\000\000\002\161\000\000\000\000\000\000\000\000\002\161\000\000\002\161\002\161\000\000\000\000\000\000\000\000\002\161\002\161\002\161\000\000\000\000\000\000\000\000\000\000\000\000\002\161\002\161\002\161\002\161\002\161\002\161\002\161\002\161\002\161\000\000\000\000\002\161\000\000\002\161\002\161\000\000\000\000\000\000\000\000\000\000\000\000\002\161\002\161\002\161\000\000\002\161\002\161\002\161\000\000\002\161\000\000\000\000\000\000\002\161\000\000\002\161\002\161\000\000\n\026\002\161\002\161\002\161\002\161\002\161\000\000\000\000\002\161\002\161\n.\000\000\000\000\000\000\000\000\002\161\002\161\002\161\002\161\002\157\002\157\000\000\000\000\000\000\002\157\000\000\000\000\002\157\000\000\000\000\002\157\000\000\002\157\000\000\000\000\011B\000\000\002\157\002\157\002\157\000\000\002\157\002\157\002\157\000\000\000\000\000\000\000\000\000\000\011\170\011\242\012\n\011\194\002\157\000\000\002\157\000\000\000\000\000\000\000\000\000\000\002\157\002\157\012:\012R\002\157\000\000\000\000\002\157\000\000\000\000\000\000\000\000\002\157\000\000\002\157\002\157\000\000\000\000\000\000\000\000\002\157\002\157\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\157\002\157\011Z\011\218\012\130\012\154\002\157\002\157\002\157\000\000\000\000\002\157\000\000\002\157\002\157\000\000\000\000\000\000\000\000\000\000\000\000\002\157\002\157\002\157\000\000\002\157\002\157\002\157\000\000\002\157\000\000\000\000\000\000\002\157\000\000\002\157\002\157\000\000\002\157\002\157\002\157\012\178\002\157\002\157\000\000\000\000\002\157\002\157\002\157\000\000\000\000\000\000\000\000\002\157\002\157\002\157\002\157\003Q\003Q\000\000\000\000\000\000\003Q\000\000\000\000\003Q\000\000\000\000\003Q\000\000\003Q\000\000\000\000\003Q\000\000\003Q\003Q\003Q\000\000\003Q\003Q\003Q\000\000\000\000\000\000\000\000\000\000\003Q\003Q\003Q\003Q\003Q\000\000\003Q\000\000\000\000\000\000\000\000\000\000\003Q\003Q\003Q\003Q\003Q\000\000\000\000\003Q\000\000\000\000\000\000\000\000\003Q\000\000\003Q\003Q\000\000\000\000\000\000\000\000\003Q\003Q\003Q\000\000\000\000\000\000\000\000\000\000\000\000\003Q\003Q\003Q\003Q\003Q\003Q\003Q\003Q\003Q\000\000\000\000\003Q\000\000\003Q\003Q\000\000\000\000\000\000\000\000\000\000\000\000\003Q\003Q\003Q\000\000\003Q\003Q\003Q\000\000\003Q\000\000\000\000\000\000\003Q\000\000\003Q\003Q\000\000\n\026\003Q\003Q\003Q\003Q\003Q\000\000\000\000\003Q\003Q\n.\000\000\000\000\000\000\000\000\003Q\003Q\003Q\003Q\003M\003M\000\000\000\000\000\000\003M\000\000\000\000\003M\000\000\000\000\003M\000\000\003M\000\000\000\000\011B\000\000\003M\003M\003M\000\000\003M\003M\003M\000\000\000\000\000\000\000\000\000\000\011\170\011\242\012\n\011\194\003M\000\000\003M\000\000\000\000\000\000\000\000\000\000\003M\003M\012:\012R\003M\000\000\000\000\003M\000\000\000\000\000\000\000\000\003M\000\000\003M\003M\000\000\000\000\000\000\000\000\003M\003M\003M\000\000\000\000\000\000\000\000\000\000\000\000\003M\003M\011Z\011\218\012\130\003M\003M\003M\003M\000\000\000\000\003M\000\000\003M\003M\000\000\000\000\000\000\000\000\000\000\000\000\003M\003M\003M\000\000\003M\003M\003M\000\000\003M\000\000\000\000\000\000\003M\000\000\003M\003M\000\000\003M\003M\003M\012\178\003M\003M\000\000\000\000\003M\003M\003M\000\000\000\000\000\000\000\000\003M\003M\003M\003M\002\153\002\153\000\000\000\000\000\000\002\153\000\000\000\000\002\153\000\000\000\000\002\153\000\000\002\153\000\000\000\000\002\153\000\000\002\153\002\153\002\153\000\000\002\153\002\153\002\153\000\000\000\000\000\000\000\000\000\000\002\153\002\153\002\153\002\153\002\153\000\000\002\153\000\000\000\000\000\000\000\000\000\000\002\153\002\153\002\153\002\153\002\153\000\000\000\000\002\153\000\000\000\000\000\000\000\000\002\153\000\000\002\153\002\153\000\000\000\000\000\000\000\000\002\153\002\153\002\153\000\000\000\000\000\000\000\000\000\000\000\000\002\153\002\153\002\153\002\153\002\153\002\153\002\153\002\153\002\153\000\000\000\000\002\153\000\000\002\153\002\153\000\000\000\000\000\000\000\000\000\000\000\000\002\153\002\153\002\153\000\000\002\153\002\153\002\153\000\000\002\153\000\000\000\000\000\000\002\153\000\000\002\153\002\153\000\000\n\026\002\153\002\153\002\153\002\153\002\153\000\000\000\000\002\153\002\153\n.\000\000\000\000\000\000\000\000\002\153\002\153\002\153\002\153\002\149\002\149\000\000\000\000\000\000\002\149\000\000\000\000\002\149\000\000\000\000\002\149\000\000\002\149\000\000\000\000\011B\000\000\002\149\002\149\002\149\000\000\002\149\002\149\002\149\000\000\000\000\000\000\000\000\000\000\011\170\011\242\012\n\011\194\002\149\000\000\002\149\000\000\000\000\000\000\000\000\000\000\002\149\002\149\012:\012R\002\149\000\000\000\000\002\149\000\000\000\000\000\000\000\000\002\149\000\000\002\149\002\149\000\000\000\000\000\000\000\000\002\149\002\149\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\149\002\149\011Z\011\218\012\130\012\154\002\149\002\149\002\149\000\000\000\000\002\149\000\000\002\149\002\149\000\000\000\000\000\000\000\000\000\000\000\000\002\149\002\149\002\149\000\000\002\149\002\149\002\149\000\000\002\149\000\000\000\000\000\000\002\149\000\000\002\149\002\149\000\000\002\149\002\149\002\149\012\178\002\149\002\149\000\000\000\000\002\149\002\149\002\149\000\000\000\000\000\000\000\000\002\149\002\149\002\149\002\149\003\t\003\t\000\000\000\000\000\000\003\t\000\000\000\000\003\t\000\000\000\000\003\t\000\000\003\t\000\000\000\000\003\t\000\000\003\t\003\t\003\t\000\000\003\t\003\t\003\t\000\000\000\000\000\000\000\000\000\000\003\t\003\t\003\t\003\t\003\t\000\000\003\t\000\000\000\000\000\000\000\000\000\000\003\t\003\t\003\t\003\t\003\t\000\000\000\000\003\t\000\000\000\000\000\000\000\000\003\t\000\000\003\t\003\t\000\000\000\000\000\000\000\000\003\t\003\t\003\t\000\000\000\000\000\000\000\000\000\000\000\000\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\000\000\000\000\003\t\000\000\003\t\003\t\000\000\000\000\000\000\000\000\000\000\000\000\003\t\003\t\003\t\000\000\003\t\003\t\003\t\000\000\003\t\000\000\000\000\000\000\003\t\000\000\003\t\003\t\000\000\n\026\003\t\003\t\003\t\003\t\003\t\000\000\000\000\003\t\003\t\n.\000\000\000\000\000\000\000\000\003\t\003\t\003\t\003\t\003\005\003\005\000\000\000\000\000\000\003\005\000\000\000\000\003\005\000\000\000\000\003\005\000\000\003\005\000\000\000\000\011B\000\000\003\005\003\005\003\005\000\000\003\005\003\005\003\005\000\000\000\000\000\000\000\000\000\000\011\170\011\242\012\n\011\194\003\005\000\000\003\005\000\000\000\000\000\000\000\000\000\000\003\005\003\005\012:\012R\003\005\000\000\000\000\003\005\000\000\000\000\000\000\000\000\003\005\000\000\003\005\003\005\000\000\000\000\000\000\000\000\003\005\003\005\000\238\000\000\000\000\000\000\000\000\000\000\000\000\003\005\003\005\011Z\011\218\012\130\012\154\003\005\003\005\003\005\000\000\000\000\003\005\000\000\003\005\003\005\000\000\000\000\000\000\000\000\000\000\000\000\003\005\003\005\003\005\000\000\003\005\003\005\003\005\000\000\003\005\000\000\000\000\000\000\003\005\000\000\003\005\003\005\000\000\003\005\003\005\003\005\012\178\003\005\003\005\000\000\000\000\003\005\003\005\003\005\000\000\000\000\000\000\000\000\003\005\003\005\003\005\003\005\002\249\002\249\000\000\000\000\000\000\002\249\000\000\000\000\002\249\000\000\000\000\002\249\000\000\002\249\000\000\000\000\002\249\000\000\002\249\002\249\002\249\000\000\002\249\002\249\002\249\000\000\000\000\000\000\000\000\000\000\002\249\002\249\002\249\002\249\002\249\000\000\002\249\000\000\000\000\000\000\000\000\000\000\002\249\002\249\002\249\002\249\002\249\000\000\000\000\002\249\000\000\000\000\000\000\000\000\002\249\000\000\002\249\002\249\000\000\000\000\000\000\000\000\002\249\002\249\002\249\000\000\000\000\000\000\000\000\000\000\000\000\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\000\000\000\000\002\249\000\000\002\249\002\249\000\000\000\000\000\000\000\000\000\000\000\000\002\249\002\249\002\249\000\000\002\249\002\249\002\249\000\000\002\249\000\000\000\000\000\000\002\249\000\000\002\249\002\249\000\000\n\026\002\249\002\249\002\249\002\249\002\249\000\000\000\000\002\249\002\249\n.\000\000\000\000\000\000\000\000\002\249\002\249\002\249\002\249\002\245\002\245\000\000\000\000\000\000\002\245\000\000\000\000\002\245\000\000\000\000\002\245\000\000\002\245\000\000\000\000\011B\000\000\002\245\002\245\002\245\000\000\002\245\002\245\002\245\000\000\000\000\000\000\000\000\000\000\011\170\011\242\012\n\011\194\002\245\000\000\002\245\000\000\000\000\000\000\000\000\000\000\002\245\002\245\012:\012R\002\245\000\000\000\000\002\245\000\000\000\000\000\000\000\000\002\245\000\000\002\245\002\245\000\000\000\000\000\000\000\000\002\245\002\245\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\245\002\245\011Z\011\218\012\130\012\154\002\245\002\245\002\245\000\000\000\000\002\245\000\000\002\245\002\245\000\000\000\000\000\000\000\000\000\000\000\000\002\245\002\245\002\245\000\000\002\245\002\245\002\245\000\000\002\245\000\000\000\000\000\000\002\245\000\000\002\245\002\245\000\000\002\245\002\245\002\245\012\178\002\245\002\245\000\000\000\000\002\245\002\245\002\245\000\000\000\000\000\000\000\000\002\245\002\245\002\245\002\245\003\025\003\025\000\000\000\000\000\000\003\025\000\000\000\000\003\025\000\000\000\000\003\025\000\000\003\025\000\000\000\000\003\025\000\000\003\025\003\025\003\025\000\000\003\025\003\025\003\025\000\000\000\000\000\000\000\000\000\000\003\025\003\025\003\025\003\025\003\025\000\000\003\025\000\000\000\000\000\000\000\000\000\000\003\025\003\025\003\025\003\025\003\025\000\000\000\000\003\025\000\000\000\000\000\000\000\000\003\025\000\000\003\025\003\025\000\000\000\000\000\000\000\000\003\025\003\025\003\025\000\000\000\000\000\000\000\000\000\000\000\000\003\025\003\025\003\025\003\025\003\025\003\025\003\025\003\025\003\025\000\000\000\000\003\025\000\000\003\025\003\025\000\000\000\000\000\000\000\000\000\000\000\000\003\025\003\025\003\025\000\000\003\025\003\025\003\025\000\000\003\025\000\000\000\000\000\000\003\025\000\000\003\025\003\025\000\000\n\026\003\025\003\025\003\025\003\025\003\025\000\000\000\000\003\025\003\025\n.\000\000\000\000\000\000\000\000\003\025\003\025\003\025\003\025\003\021\003\021\000\000\000\000\000\000\003\021\000\000\000\000\003\021\000\000\000\000\003\021\000\000\003\021\000\000\000\000\011B\000\000\003\021\003\021\003\021\000\000\003\021\003\021\003\021\000\000\000\000\000\000\000\000\000\000\011\170\011\242\012\n\011\194\012\"\000\000\003\021\000\000\000\000\000\000\000\000\000\000\003\021\003\021\012:\012R\003\021\000\000\000\000\003\021\000\000\000\000\000\000\000\000\003\021\000\000\012j\003\021\000\000\000\000\000\000\000\000\003\021\003\021\000\238\000\000\000\000\000\000\000\000\000\000\000\000\003\021\003\021\011Z\011\218\012\130\012\154\012\202\003\021\003\021\000\000\000\000\003\021\000\000\003\021\012\226\000\000\000\000\000\000\000\000\000\000\000\000\003\021\003\021\012\250\000\000\003\021\003\021\003\021\000\000\003\021\000\000\000\000\000\000\003\021\000\000\003\021\003\021\000\000\003\021\003\021\003\021\012\178\003\021\003\021\000\000\000\000\003\021\r\018\003\021\000\000\000\000\000\000\000\000\003\021\003\021\r*\rB\003!\003!\000\000\000\000\000\000\003!\000\000\000\000\003!\000\000\000\000\003!\000\000\003!\000\000\000\000\003!\000\000\003!\003!\003!\000\000\003!\003!\003!\000\000\000\000\000\000\000\000\000\000\003!\003!\003!\003!\003!\000\000\003!\000\000\000\000\000\000\000\000\000\000\003!\003!\003!\003!\003!\000\000\000\000\003!\000\000\000\000\000\000\000\000\003!\000\000\003!\003!\000\000\000\000\000\000\000\000\003!\003!\003!\000\000\000\000\000\000\000\000\000\000\000\000\003!\003!\003!\003!\003!\003!\003!\003!\003!\000\000\000\000\003!\000\000\003!\003!\000\000\000\000\000\000\000\000\000\000\000\000\003!\003!\003!\000\000\003!\003!\003!\000\000\003!\000\000\000\000\000\000\003!\000\000\003!\003!\000\000\n\026\003!\003!\003!\003!\003!\000\000\000\000\003!\003!\n.\000\000\000\000\000\000\000\000\003!\003!\003!\003!\003\029\003\029\000\000\000\000\000\000\003\029\000\000\000\000\003\029\000\000\000\000\003\029\000\000\003\029\000\000\000\000\011B\000\000\003\029\003\029\003\029\000\000\003\029\003\029\003\029\000\000\000\000\000\000\000\000\000\000\011\170\011\242\012\n\011\194\003\029\000\000\003\029\000\000\000\000\000\000\000\000\000\000\003\029\003\029\012:\012R\003\029\000\000\000\000\003\029\000\000\000\000\000\000\000\000\003\029\000\000\012j\003\029\000\000\000\000\000\000\000\000\003\029\003\029\000\238\000\000\000\000\000\000\000\000\000\000\000\000\003\029\003\029\011Z\011\218\012\130\012\154\012\202\003\029\003\029\000\000\000\000\003\029\000\000\003\029\012\226\000\000\000\000\000\000\000\000\000\000\000\000\003\029\003\029\012\250\000\000\003\029\003\029\003\029\000\000\003\029\000\000\000\000\000\000\003\029\000\000\003\029\003\029\000\000\003\029\003\029\003\029\012\178\003\029\003\029\000\000\000\000\003\029\003\029\003\029\000\000\000\000\000\000\000\000\003\029\003\029\r*\rB\003)\003)\000\000\000\000\000\000\003)\000\000\000\000\003)\000\000\000\000\003)\000\000\003)\000\000\000\000\003)\000\000\003)\003)\003)\000\000\003)\003)\003)\000\000\000\000\000\000\000\000\000\000\003)\003)\003)\003)\003)\000\000\003)\000\000\000\000\000\000\000\000\000\000\003)\003)\003)\003)\003)\000\000\000\000\003)\000\000\000\000\000\000\000\000\003)\000\000\003)\003)\000\000\000\000\000\000\000\000\003)\003)\003)\000\000\000\000\000\000\000\000\000\000\000\000\003)\003)\003)\003)\003)\003)\003)\003)\003)\000\000\000\000\003)\000\000\003)\003)\000\000\000\000\000\000\000\000\000\000\000\000\003)\003)\003)\000\000\003)\003)\003)\000\000\003)\000\000\000\000\000\000\003)\000\000\003)\003)\000\000\n\026\003)\003)\003)\003)\003)\000\000\000\000\003)\003)\n.\000\000\000\000\000\000\000\000\003)\003)\003)\003)\003%\003%\000\000\000\000\000\000\003%\000\000\000\000\003%\000\000\000\000\003%\000\000\003%\000\000\000\000\011B\000\000\003%\003%\003%\000\000\003%\003%\003%\000\000\000\000\000\000\000\000\000\000\011\170\011\242\012\n\011\194\003%\000\000\003%\000\000\000\000\000\000\000\000\000\000\003%\003%\012:\012R\003%\000\000\000\000\003%\000\000\000\000\000\000\000\000\003%\000\000\012j\003%\000\000\000\000\000\000\000\000\003%\003%\000\238\000\000\000\000\000\000\000\000\000\000\000\000\003%\003%\011Z\011\218\012\130\012\154\012\202\003%\003%\000\000\000\000\003%\000\000\003%\012\226\000\000\000\000\000\000\000\000\000\000\000\000\003%\003%\012\250\000\000\003%\003%\003%\000\000\003%\000\000\000\000\000\000\003%\000\000\003%\003%\000\000\003%\003%\003%\012\178\003%\003%\000\000\000\000\003%\003%\003%\000\000\000\000\000\000\000\000\003%\003%\r*\rB\n\021\n\021\000\000\000\000\000\000\n\021\000\000\000\000\n\021\000\000\000\000\n\021\000\000\n\021\000\000\000\000\n\021\000\000\n\021\n\021\n\021\000\000\n\021\n\021\n\021\000\000\000\000\000\000\000\000\000\000\n\021\n\021\n\021\n\021\n\021\000\000\n\021\000\000\000\000\000\000\000\000\000\000\n\021\n\021\n\021\n\021\n\021\000\000\000\000\n\021\000\000\000\000\000\000\000\000\n\021\000\000\n\021\n\021\000\000\000\000\000\000\000\000\n\021\n\021\n\021\000\000\000\000\000\000\000\000\000\000\000\000\n\021\n\021\n\021\n\021\n\021\n\021\n\021\n\021\n\021\000\000\000\000\n\021\000\000\n\021\n\021\000\000\000\000\000\000\000\000\000\000\000\000\n\021\n\021\n\021\000\000\n\021\n\021\n\021\000\000\n\021\000\000\000\000\000\000\n\021\000\000\n\021\n\021\000\000\n\026\n\021\n\021\n\021\n\021\n\021\000\000\000\000\n\021\n\021\n.\000\000\000\000\000\000\000\000\n\021\n\021\n\021\n\021\n\017\n\017\000\000\000\000\000\000\n\017\000\000\000\000\n\017\000\000\000\000\n\017\000\000\n\017\000\000\000\000\011B\000\000\n\017\n\017\n\017\000\000\n\017\n\017\n\017\000\000\000\000\000\000\000\000\000\000\011\170\011\242\012\n\011\194\012\"\000\000\n\017\000\000\000\000\000\000\000\000\000\000\n\017\n\017\012:\012R\n\017\000\000\000\000\n\017\000\000\000\000\000\000\000\000\n\017\000\000\012j\n\017\000\000\000\000\000\000\000\000\n\017\n\017\000\238\000\000\000\000\000\000\000\000\000\000\000\000\n\017\n\017\011Z\011\218\012\130\012\154\012\202\n\017\n\017\000\000\000\000\n\017\000\000\n\017\012\226\000\000\000\000\000\000\000\000\000\000\000\000\n\017\n\017\012\250\000\000\n\017\n\017\n\017\000\000\n\017\000\000\000\000\000\000\n\017\000\000\n\017\n\017\000\000\n\017\n\017\n\017\012\178\n\017\n\017\000\000\000\000\n\017\r\018\n\017\000\000\000\000\000\000\000\000\n\017\n\017\r*\rB\0031\0031\000\000\000\000\000\000\0031\000\000\000\000\0031\000\000\000\000\0031\000\000\0031\000\000\000\000\0031\000\000\0031\0031\0031\000\000\0031\0031\0031\000\000\000\000\000\000\000\000\000\000\0031\0031\0031\0031\0031\000\000\0031\000\000\000\000\000\000\000\000\000\000\0031\0031\0031\0031\0031\000\000\000\000\0031\000\000\000\000\000\000\000\000\0031\000\000\0031\0031\000\000\000\000\000\000\000\000\0031\0031\0031\000\000\000\000\000\000\000\000\000\000\000\000\0031\0031\0031\0031\0031\0031\0031\0031\0031\000\000\000\000\0031\000\000\0031\0031\000\000\000\000\000\000\000\000\000\000\000\000\0031\0031\0031\000\000\0031\0031\0031\000\000\0031\000\000\000\000\000\000\0031\000\000\0031\0031\000\000\n\026\0031\0031\0031\0031\0031\000\000\000\000\0031\0031\n.\000\000\000\000\000\000\000\000\0031\0031\0031\0031\003-\003-\000\000\000\000\000\000\003-\000\000\000\000\003-\000\000\000\000\003-\000\000\003-\000\000\000\000\011B\000\000\003-\003-\003-\000\000\003-\003-\003-\000\000\000\000\000\000\000\000\000\000\011\170\011\242\012\n\011\194\012\"\000\000\003-\000\000\000\000\000\000\000\000\000\000\003-\003-\012:\012R\003-\000\000\000\000\003-\000\000\000\000\000\000\000\000\003-\000\000\012j\003-\000\000\000\000\000\000\000\000\003-\003-\000\238\000\000\000\000\000\000\000\000\000\000\000\000\003-\003-\011Z\011\218\012\130\012\154\012\202\003-\003-\000\000\000\000\003-\000\000\003-\012\226\000\000\000\000\000\000\000\000\000\000\000\000\003-\003-\012\250\000\000\003-\003-\003-\000\000\003-\000\000\000\000\000\000\003-\000\000\003-\003-\000\000\rZ\003-\rr\012\178\003-\003-\000\000\000\000\003-\r\018\003-\000\000\000\000\000\000\000\000\003-\003-\r*\rB\n\t\n\t\000\000\000\000\000\000\n\t\000\000\000\000\n\t\000\000\000\000\n\t\000\000\n\t\000\000\000\000\011B\000\000\n\t\n\t\n\t\000\000\n\t\n\t\n\t\000\000\000\000\000\000\000\000\000\000\011\170\011\242\012\n\011\194\012\"\000\000\n\t\000\000\000\000\000\000\000\000\000\000\n\t\n\t\012:\012R\n\t\000\000\000\000\n\t\000\000\000\000\000\000\000\000\n\t\000\000\012j\n\t\000\000\000\000\000\000\000\000\n\t\n\t\000\238\000\000\000\000\000\000\000\000\000\000\000\000\n\t\n\t\011Z\011\218\012\130\012\154\012\202\n\t\n\t\000\000\000\000\n\t\000\000\n\t\012\226\000\000\000\000\000\000\000\000\000\000\000\000\n\t\n\t\012\250\000\000\n\t\n\t\n\t\000\000\n\t\000\000\000\000\000\000\n\t\000\000\n\t\n\t\000\000\n\t\n\t\n\t\012\178\n\t\n\t\000\000\000\000\n\t\r\018\n\t\000\000\000\000\000\000\000\000\n\t\n\t\r*\rB\003\129\003\129\000\000\000\000\000\000\003\129\000\000\000\000\003\129\000\000\000\000\003\129\000\000\003\129\000\000\000\000\003\129\000\000\003\129\003\129\003\129\000\000\003\129\003\129\003\129\000\000\000\000\000\000\000\000\000\000\003\129\003\129\003\129\003\129\003\129\000\000\003\129\000\000\000\000\000\000\000\000\000\000\003\129\003\129\003\129\003\129\003\129\000\000\000\000\003\129\000\000\000\000\000\000\000\000\003\129\000\000\003\129\003\129\000\000\000\000\000\000\000\000\003\129\003\129\003\129\000\000\000\000\000\000\000\000\000\000\000\000\003\129\003\129\003\129\003\129\003\129\003\129\003\129\003\129\003\129\000\000\000\000\003\129\000\000\003\129\003\129\000\000\000\000\000\000\000\000\000\000\000\000\003\129\003\129\003\129\000\000\003\129\003\129\003\129\000\000\003\129\000\000\000\000\000\000\003\129\000\000\003\129\003\129\000\000\n\026\003\129\003\129\003\129\003\129\003\129\000\000\000\000\003\129\003\129\n.\000\000\000\000\000\000\000\000\003\129\003\129\003\129\003\129\003}\003}\000\000\000\000\000\000\003}\000\000\000\000\003}\000\000\000\000\003}\000\000\003}\000\000\000\000\011B\000\000\003}\003}\003}\000\000\003}\003}\003}\000\000\000\000\000\000\000\000\000\000\011\170\011\242\012\n\011\194\012\"\000\000\003}\000\000\000\000\000\000\000\000\000\000\003}\003}\012:\012R\003}\000\000\000\000\003}\000\000\000\000\000\000\000\000\003}\000\000\012j\003}\000\000\000\000\000\000\000\000\003}\003}\000\238\000\000\000\000\000\000\000\000\000\000\000\000\003}\003}\011Z\011\218\012\130\012\154\012\202\003}\003}\000\000\000\000\003}\000\000\003}\012\226\000\000\000\000\000\000\000\000\000\000\000\000\003}\003}\012\250\000\000\003}\003}\003}\000\000\003}\000\000\000\000\000\000\003}\000\000\003}\003}\000\000\rZ\003}\rr\012\178\003}\003}\000\000\000\000\003}\r\018\003}\000\000\000\000\000\000\000\000\003}\003}\r*\rB\003\161\003\161\000\000\000\000\000\000\003\161\000\000\000\000\003\161\000\000\000\000\003\161\000\000\003\161\000\000\000\000\003\161\000\000\003\161\003\161\003\161\000\000\003\161\003\161\003\161\000\000\000\000\000\000\000\000\000\000\003\161\003\161\003\161\003\161\003\161\000\000\003\161\000\000\000\000\000\000\000\000\000\000\003\161\003\161\003\161\003\161\003\161\000\000\000\000\003\161\000\000\000\000\000\000\000\000\003\161\000\000\003\161\003\161\000\000\000\000\000\000\000\000\003\161\003\161\003\161\000\000\000\000\000\000\000\000\000\000\000\000\003\161\003\161\003\161\003\161\003\161\003\161\003\161\003\161\003\161\000\000\000\000\003\161\000\000\003\161\003\161\000\000\000\000\000\000\000\000\000\000\000\000\003\161\003\161\003\161\000\000\003\161\003\161\003\161\000\000\003\161\000\000\000\000\000\000\003\161\000\000\003\161\003\161\000\000\n\026\003\161\003\161\003\161\003\161\003\161\000\000\000\000\003\161\003\161\n.\000\000\000\000\000\000\000\000\003\161\003\161\003\161\003\161\003\157\003\157\000\000\000\000\000\000\003\157\000\000\000\000\003\157\000\000\000\000\003\157\000\000\003\157\000\000\000\000\011B\000\000\003\157\003\157\003\157\000\000\003\157\003\157\003\157\000\000\000\000\000\000\000\000\000\000\011\170\011\242\012\n\011\194\012\"\000\000\003\157\000\000\000\000\000\000\000\000\000\000\003\157\003\157\012:\012R\003\157\000\000\000\000\003\157\000\000\000\000\000\000\000\000\003\157\000\000\012j\003\157\000\000\000\000\000\000\000\000\003\157\003\157\000\238\000\000\000\000\000\000\000\000\000\000\000\000\003\157\003\157\011Z\011\218\012\130\012\154\012\202\003\157\003\157\000\000\000\000\003\157\000\000\003\157\012\226\000\000\000\000\000\000\000\000\000\000\000\000\003\157\003\157\012\250\000\000\003\157\003\157\003\157\000\000\003\157\000\000\000\000\000\000\003\157\000\000\003\157\003\157\000\000\rZ\003\157\rr\012\178\003\157\003\157\000\000\000\000\003\157\r\018\003\157\000\000\000\000\000\000\000\000\003\157\003\157\r*\rB\003\145\003\145\000\000\000\000\000\000\003\145\000\000\000\000\003\145\000\000\000\000\003\145\000\000\003\145\000\000\000\000\003\145\000\000\003\145\003\145\003\145\000\000\003\145\003\145\003\145\000\000\000\000\000\000\000\000\000\000\003\145\003\145\003\145\003\145\003\145\000\000\003\145\000\000\000\000\000\000\000\000\000\000\003\145\003\145\003\145\003\145\003\145\000\000\000\000\003\145\000\000\000\000\000\000\000\000\003\145\000\000\003\145\003\145\000\000\000\000\000\000\000\000\003\145\003\145\003\145\000\000\000\000\000\000\000\000\000\000\000\000\003\145\003\145\003\145\003\145\003\145\003\145\003\145\003\145\003\145\000\000\000\000\003\145\000\000\003\145\003\145\000\000\000\000\000\000\000\000\000\000\000\000\003\145\003\145\003\145\000\000\003\145\003\145\003\145\000\000\003\145\000\000\000\000\000\000\003\145\000\000\003\145\003\145\000\000\n\026\003\145\003\145\003\145\003\145\003\145\000\000\000\000\003\145\003\145\n.\000\000\000\000\000\000\000\000\003\145\003\145\003\145\003\145\003\141\003\141\000\000\000\000\000\000\003\141\000\000\000\000\003\141\000\000\000\000\003\141\000\000\003\141\000\000\000\000\011B\000\000\003\141\003\141\003\141\000\000\003\141\003\141\003\141\000\000\000\000\000\000\000\000\000\000\011\170\011\242\012\n\011\194\012\"\000\000\003\141\000\000\000\000\000\000\000\000\000\000\003\141\003\141\012:\012R\003\141\000\000\000\000\003\141\000\000\000\000\000\000\000\000\003\141\000\000\012j\003\141\000\000\000\000\000\000\000\000\003\141\003\141\000\238\000\000\000\000\000\000\000\000\000\000\000\000\003\141\003\141\011Z\011\218\012\130\012\154\012\202\003\141\003\141\000\000\000\000\003\141\000\000\003\141\012\226\000\000\000\000\000\000\000\000\000\000\000\000\003\141\003\141\012\250\000\000\003\141\003\141\003\141\000\000\003\141\000\000\000\000\000\000\003\141\000\000\003\141\003\141\000\000\rZ\003\141\rr\012\178\003\141\003\141\000\000\000\000\003\141\r\018\003\141\000\000\000\000\000\000\000\000\003\141\003\141\r*\rB\003i\003i\000\000\000\000\000\000\003i\000\000\000\000\003i\000\000\000\000\003i\000\000\003i\000\000\000\000\003i\000\000\003i\003i\003i\000\000\003i\003i\003i\000\000\000\000\000\000\000\000\000\000\003i\003i\003i\003i\003i\000\000\003i\000\000\000\000\000\000\000\000\000\000\003i\003i\003i\003i\003i\000\000\000\000\003i\000\000\000\000\000\000\000\000\003i\000\000\003i\003i\000\000\000\000\000\000\000\000\003i\003i\003i\000\000\000\000\000\000\000\000\000\000\000\000\003i\003i\003i\003i\003i\003i\003i\003i\003i\000\000\000\000\003i\000\000\003i\003i\000\000\000\000\000\000\000\000\000\000\000\000\003i\003i\003i\000\000\003i\003i\003i\000\000\003i\000\000\000\000\000\000\003i\000\000\003i\003i\000\000\n\026\003i\003i\003i\003i\003i\000\000\000\000\003i\003i\n.\000\000\000\000\000\000\000\000\003i\003i\003i\003i\003e\003e\000\000\000\000\000\000\003e\000\000\000\000\003e\000\000\000\000\003e\000\000\003e\000\000\000\000\011B\000\000\003e\003e\003e\000\000\003e\003e\003e\000\000\000\000\000\000\000\000\000\000\011\170\011\242\012\n\011\194\012\"\000\000\003e\000\000\000\000\000\000\000\000\000\000\003e\003e\012:\012R\003e\000\000\000\000\003e\000\000\000\000\000\000\000\000\003e\000\000\012j\003e\000\000\000\000\000\000\000\000\003e\003e\000\238\000\000\000\000\000\000\000\000\000\000\000\000\003e\003e\011Z\011\218\012\130\012\154\012\202\003e\003e\000\000\000\000\003e\000\000\003e\012\226\000\000\000\000\000\000\000\000\000\000\000\000\003e\003e\012\250\000\000\003e\003e\003e\000\000\003e\000\000\000\000\000\000\003e\000\000\003e\003e\000\000\rZ\003e\rr\012\178\003e\003e\000\000\000\000\003e\r\018\003e\000\000\000\000\000\000\000\000\003e\003e\r*\rB\003y\003y\000\000\000\000\000\000\003y\000\000\000\000\003y\000\000\000\000\003y\000\000\003y\000\000\000\000\003y\000\000\003y\003y\003y\000\000\003y\003y\003y\000\000\000\000\000\000\000\000\000\000\003y\003y\003y\003y\003y\000\000\003y\000\000\000\000\000\000\000\000\000\000\003y\003y\003y\003y\003y\000\000\000\000\003y\000\000\000\000\000\000\000\000\003y\000\000\003y\003y\000\000\000\000\000\000\000\000\003y\003y\003y\000\000\000\000\000\000\000\000\000\000\000\000\003y\003y\003y\003y\003y\003y\003y\003y\003y\000\000\000\000\003y\000\000\003y\003y\000\000\000\000\000\000\000\000\000\000\000\000\003y\003y\003y\000\000\003y\003y\003y\000\000\003y\000\000\000\000\000\000\003y\000\000\003y\003y\000\000\n\026\003y\003y\003y\003y\003y\000\000\000\000\003y\003y\n.\000\000\000\000\000\000\000\000\003y\003y\003y\003y\003u\003u\000\000\000\000\000\000\003u\000\000\000\000\003u\000\000\000\000\003u\000\000\003u\000\000\000\000\011B\000\000\003u\003u\003u\000\000\003u\003u\003u\000\000\000\000\000\000\000\000\000\000\011\170\011\242\012\n\011\194\012\"\000\000\003u\000\000\000\000\000\000\000\000\000\000\003u\003u\012:\012R\003u\000\000\000\000\003u\000\000\000\000\000\000\000\000\003u\000\000\012j\003u\000\000\000\000\000\000\000\000\003u\003u\000\238\000\000\000\000\000\000\000\000\000\000\000\000\003u\003u\011Z\011\218\012\130\012\154\012\202\003u\003u\000\000\000\000\003u\000\000\003u\012\226\000\000\000\000\000\000\000\000\000\000\000\000\003u\003u\012\250\000\000\003u\003u\003u\000\000\003u\000\000\000\000\000\000\003u\000\000\003u\003u\000\000\rZ\003u\rr\012\178\003u\003u\000\000\000\000\003u\r\018\003u\000\000\000\000\000\000\000\000\003u\003u\r*\rB\003q\003q\000\000\000\000\000\000\003q\000\000\000\000\003q\000\000\000\000\003q\000\000\003q\000\000\000\000\003q\000\000\003q\003q\003q\000\000\003q\003q\003q\000\000\000\000\000\000\000\000\000\000\003q\003q\003q\003q\003q\000\000\003q\000\000\000\000\000\000\000\000\000\000\003q\003q\003q\003q\003q\000\000\000\000\003q\000\000\000\000\000\000\000\000\003q\000\000\003q\003q\000\000\000\000\000\000\000\000\003q\003q\003q\000\000\000\000\000\000\000\000\000\000\000\000\003q\003q\003q\003q\003q\003q\003q\003q\003q\000\000\000\000\003q\000\000\003q\003q\000\000\000\000\000\000\000\000\000\000\000\000\003q\003q\003q\000\000\003q\003q\003q\000\000\003q\000\000\000\000\000\000\003q\000\000\003q\003q\000\000\n\026\003q\003q\003q\003q\003q\000\000\000\000\003q\003q\n.\000\000\000\000\000\000\000\000\003q\003q\003q\003q\003m\003m\000\000\000\000\000\000\003m\000\000\000\000\003m\000\000\000\000\003m\000\000\003m\000\000\000\000\011B\000\000\003m\003m\003m\000\000\003m\003m\003m\000\000\000\000\000\000\000\000\000\000\011\170\011\242\012\n\011\194\012\"\000\000\003m\000\000\000\000\000\000\000\000\000\000\003m\003m\012:\012R\003m\000\000\000\000\003m\000\000\000\000\000\000\000\000\003m\000\000\012j\003m\000\000\000\000\000\000\000\000\003m\003m\000\238\000\000\000\000\000\000\000\000\000\000\000\000\003m\003m\011Z\011\218\012\130\012\154\012\202\003m\003m\000\000\000\000\003m\000\000\003m\012\226\000\000\000\000\000\000\000\000\000\000\000\000\003m\003m\012\250\000\000\003m\003m\003m\000\000\003m\000\000\000\000\000\000\003m\000\000\003m\003m\000\000\rZ\003m\rr\012\178\003m\003m\000\000\000\000\003m\r\018\003m\000\000\000\000\000\000\000\000\003m\003m\r*\rB\003\137\003\137\000\000\000\000\000\000\003\137\000\000\000\000\003\137\000\000\000\000\003\137\000\000\003\137\000\000\000\000\003\137\000\000\003\137\003\137\003\137\000\000\003\137\003\137\003\137\000\000\000\000\000\000\000\000\000\000\003\137\003\137\003\137\003\137\003\137\000\000\003\137\000\000\000\000\000\000\000\000\000\000\003\137\003\137\003\137\003\137\003\137\000\000\000\000\003\137\000\000\000\000\000\000\000\000\003\137\000\000\003\137\003\137\000\000\000\000\000\000\000\000\003\137\003\137\003\137\000\000\000\000\000\000\000\000\000\000\000\000\003\137\003\137\003\137\003\137\003\137\003\137\003\137\003\137\003\137\000\000\000\000\003\137\000\000\003\137\003\137\000\000\000\000\000\000\000\000\000\000\000\000\003\137\003\137\003\137\000\000\003\137\003\137\003\137\000\000\003\137\000\000\000\000\000\000\003\137\000\000\003\137\003\137\000\000\n\026\003\137\003\137\003\137\003\137\003\137\000\000\000\000\003\137\003\137\n.\000\000\000\000\000\000\000\000\003\137\003\137\003\137\003\137\003\133\003\133\000\000\000\000\000\000\003\133\000\000\000\000\003\133\000\000\000\000\003\133\000\000\003\133\000\000\000\000\011B\000\000\003\133\003\133\003\133\000\000\003\133\003\133\003\133\000\000\000\000\000\000\000\000\000\000\011\170\011\242\012\n\011\194\012\"\000\000\003\133\000\000\000\000\000\000\000\000\000\000\003\133\003\133\012:\012R\003\133\000\000\000\000\003\133\000\000\000\000\000\000\000\000\003\133\000\000\012j\003\133\000\000\000\000\000\000\000\000\003\133\003\133\000\238\000\000\000\000\000\000\000\000\000\000\000\000\003\133\003\133\011Z\011\218\012\130\012\154\012\202\003\133\003\133\000\000\000\000\003\133\000\000\003\133\012\226\000\000\000\000\000\000\000\000\000\000\000\000\003\133\003\133\012\250\000\000\003\133\003\133\003\133\000\000\003\133\000\000\000\000\000\000\003\133\000\000\003\133\003\133\000\000\rZ\003\133\rr\012\178\003\133\003\133\000\000\000\000\003\133\r\018\003\133\000\000\000\000\000\000\000\000\003\133\003\133\r*\rB\003\169\003\169\000\000\000\000\000\000\003\169\000\000\000\000\003\169\000\000\000\000\003\169\000\000\003\169\000\000\000\000\003\169\000\000\003\169\003\169\003\169\000\000\003\169\003\169\003\169\000\000\000\000\000\000\000\000\000\000\003\169\003\169\003\169\003\169\003\169\000\000\003\169\000\000\000\000\000\000\000\000\000\000\003\169\003\169\003\169\003\169\003\169\000\000\000\000\003\169\000\000\000\000\000\000\000\000\003\169\000\000\003\169\003\169\000\000\000\000\000\000\000\000\003\169\003\169\003\169\000\000\000\000\000\000\000\000\000\000\000\000\003\169\003\169\003\169\003\169\003\169\003\169\003\169\003\169\003\169\000\000\000\000\003\169\000\000\003\169\003\169\000\000\000\000\000\000\000\000\000\000\000\000\003\169\003\169\003\169\000\000\003\169\003\169\003\169\000\000\003\169\000\000\000\000\000\000\003\169\000\000\003\169\003\169\000\000\n\026\003\169\003\169\003\169\003\169\003\169\000\000\000\000\003\169\003\169\n.\000\000\000\000\000\000\000\000\003\169\003\169\003\169\003\169\003\165\003\165\000\000\000\000\000\000\003\165\000\000\000\000\003\165\000\000\000\000\003\165\000\000\003\165\000\000\000\000\011B\000\000\003\165\003\165\003\165\000\000\003\165\003\165\003\165\000\000\000\000\000\000\000\000\000\000\011\170\011\242\012\n\011\194\012\"\000\000\003\165\000\000\000\000\000\000\000\000\000\000\003\165\003\165\012:\012R\003\165\000\000\000\000\003\165\000\000\000\000\000\000\000\000\003\165\000\000\012j\003\165\000\000\000\000\000\000\000\000\003\165\003\165\000\238\000\000\000\000\000\000\000\000\000\000\000\000\003\165\003\165\011Z\011\218\012\130\012\154\012\202\003\165\003\165\000\000\000\000\003\165\000\000\003\165\012\226\000\000\000\000\000\000\000\000\000\000\000\000\003\165\003\165\012\250\000\000\003\165\003\165\003\165\000\000\003\165\000\000\000\000\000\000\003\165\000\000\003\165\003\165\000\000\rZ\003\165\rr\012\178\003\165\003\165\000\000\000\000\003\165\r\018\003\165\000\000\000\000\000\000\000\000\003\165\003\165\r*\rB\003\153\003\153\000\000\000\000\000\000\003\153\000\000\000\000\003\153\000\000\000\000\003\153\000\000\003\153\000\000\000\000\003\153\000\000\003\153\003\153\003\153\000\000\003\153\003\153\003\153\000\000\000\000\000\000\000\000\000\000\003\153\003\153\003\153\003\153\003\153\000\000\003\153\000\000\000\000\000\000\000\000\000\000\003\153\003\153\003\153\003\153\003\153\000\000\000\000\003\153\000\000\000\000\000\000\000\000\003\153\000\000\003\153\003\153\000\000\000\000\000\000\000\000\003\153\003\153\003\153\000\000\000\000\000\000\000\000\000\000\000\000\003\153\003\153\003\153\003\153\003\153\003\153\003\153\003\153\003\153\000\000\000\000\003\153\000\000\003\153\003\153\000\000\000\000\000\000\000\000\000\000\000\000\003\153\003\153\003\153\000\000\003\153\003\153\003\153\000\000\003\153\000\000\000\000\000\000\003\153\000\000\003\153\003\153\000\000\n\026\003\153\003\153\003\153\003\153\003\153\000\000\000\000\003\153\003\153\n.\000\000\000\000\000\000\000\000\003\153\003\153\003\153\003\153\003\149\003\149\000\000\000\000\000\000\003\149\000\000\000\000\003\149\000\000\000\000\003\149\000\000\003\149\000\000\000\000\011B\000\000\003\149\003\149\003\149\000\000\003\149\003\149\003\149\000\000\000\000\000\000\000\000\000\000\011\170\011\242\012\n\011\194\012\"\000\000\003\149\000\000\000\000\000\000\000\000\000\000\003\149\003\149\012:\012R\003\149\000\000\000\000\003\149\000\000\000\000\000\000\000\000\003\149\000\000\012j\003\149\000\000\000\000\000\000\000\000\003\149\003\149\000\238\000\000\000\000\000\000\000\000\000\000\000\000\003\149\003\149\011Z\011\218\012\130\012\154\012\202\003\149\003\149\000\000\000\000\003\149\000\000\003\149\012\226\000\000\000\000\000\000\000\000\000\000\000\000\003\149\003\149\012\250\000\000\003\149\003\149\003\149\000\000\003\149\000\000\000\000\000\000\003\149\000\000\003\149\003\149\000\000\rZ\003\149\rr\012\178\003\149\003\149\000\000\000\000\003\149\r\018\003\149\000\000\000\000\000\000\000\000\003\149\003\149\r*\rB\003a\003a\000\000\000\000\000\000\003a\000\000\000\000\003a\000\000\000\000\003a\000\000\003a\000\000\000\000\003a\000\000\003a\003a\003a\000\000\003a\003a\003a\000\000\000\000\000\000\000\000\000\000\003a\003a\003a\003a\003a\000\000\003a\000\000\000\000\000\000\000\000\000\000\003a\003a\003a\003a\003a\000\000\000\000\003a\000\000\000\000\000\000\000\000\003a\000\000\003a\003a\000\000\000\000\000\000\000\000\003a\003a\003a\000\000\000\000\000\000\000\000\000\000\000\000\003a\003a\003a\003a\003a\003a\003a\003a\003a\000\000\000\000\003a\000\000\003a\003a\000\000\000\000\000\000\000\000\000\000\000\000\003a\003a\003a\000\000\003a\003a\003a\000\000\003a\000\000\000\000\000\000\003a\000\000\003a\003a\000\000\n\026\003a\003a\003a\003a\003a\000\000\000\000\003a\003a\n.\000\000\000\000\000\000\000\000\003a\003a\003a\003a\003]\003]\000\000\000\000\000\000\003]\000\000\000\000\003]\000\000\000\000\003]\000\000\003]\000\000\000\000\011B\000\000\003]\003]\003]\000\000\003]\003]\003]\000\000\000\000\000\000\000\000\000\000\011\170\011\242\012\n\011\194\012\"\000\000\003]\000\000\000\000\000\000\000\000\000\000\003]\003]\012:\012R\003]\000\000\000\000\003]\000\000\000\000\000\000\000\000\003]\000\000\012j\003]\000\000\000\000\000\000\000\000\003]\003]\000\238\000\000\000\000\000\000\000\000\000\000\000\000\003]\003]\011Z\011\218\012\130\012\154\012\202\003]\003]\000\000\000\000\003]\000\000\003]\012\226\000\000\000\000\000\000\000\000\000\000\000\000\003]\003]\012\250\000\000\003]\003]\003]\000\000\003]\000\000\000\000\000\000\003]\000\000\003]\003]\000\000\rZ\003]\rr\012\178\003]\003]\000\000\000\000\003]\r\018\003]\000\000\000\000\000\000\000\000\003]\003]\r*\rB\n\025\n\025\000\000\000\000\000\000\n\025\000\000\000\000\n\025\000\000\000\000\n\025\000\000\n\025\000\000\000\000\011B\000\000\n\025\n\025\n\025\000\000\n\025\n\025\n\025\000\000\000\000\000\000\000\000\000\000\011\170\011\242\012\n\011\194\012\"\000\000\n\025\000\000\000\000\000\000\000\000\000\000\n\025\n\025\012:\012R\n\025\000\000\000\000\n\025\000\000\000\000\000\000\000\000\n\025\000\000\012j\n\025\000\000\000\000\000\000\000\000\n\025\n\025\000\238\000\000\000\000\000\000\000\000\000\000\000\000\n\025\n\025\011Z\011\218\012\130\012\154\012\202\n\025\n\025\000\000\000\000\n\025\000\000\n\025\012\226\000\000\000\000\000\000\000\000\000\000\000\000\n\025\n\025\012\250\000\000\n\025\n\025\n\025\000\000\n\025\000\000\000\000\000\000\n\025\000\000\n\025\n\025\000\000\n\025\n\025\n\025\012\178\n\025\n\025\000\000\000\000\n\025\r\018\n\025\000\000\000\000\000\000\000\000\n\025\n\025\r*\rB\nq\nq\000\000\000\000\000\000\nq\000\000\000\000\nq\000\000\000\000\nq\000\000\nq\000\000\000\000\nq\000\000\nq\nq\nq\000\000\nq\nq\nq\000\000\000\000\000\000\000\000\000\000\nq\nq\nq\nq\nq\000\000\nq\000\000\000\000\000\000\000\000\000\000\nq\nq\nq\nq\nq\000\000\000\000\nq\000\000\000\000\000\000\000\000\nq\000\000\nq\nq\000\000\000\000\000\000\000\000\nq\nq\nq\000\000\000\000\000\000\000\000\000\000\000\000\nq\nq\nq\nq\nq\nq\nq\nq\nq\000\000\000\000\nq\000\000\nq\nq\000\000\000\000\000\000\000\000\000\000\000\000\nq\nq\nq\000\000\nq\nq\nq\000\000\nq\000\000\000\000\000\000\nq\000\000\nq\nq\000\000\n\026\nq\nq\nq\nq\nq\000\000\000\000\nq\nq\n.\000\000\000\000\000\000\000\000\nq\nq\nq\nq\002i\002i\000\000\000\000\000\000\002i\000\000\000\000\002i\000\000\000\000\002i\000\000\002i\000\000\000\000\002i\000\000\002i\002i\002i\000\000\002i\002i\002i\000\000\000\000\000\000\000\000\000\000\002i\002i\002i\002i\002i\000\000\002i\000\000\000\000\000\000\000\000\000\000\002i\002i\002i\002i\002i\000\000\000\000\002i\000\000\000\000\000\000\000\000\002i\000\000\002i\002i\000\000\000\000\000\000\000\000\002i\002i\002i\000\000\000\000\000\000\000\000\000\000\000\000\002i\002i\002i\002i\002i\002i\002i\002i\002i\000\000\000\000\002i\000\000\002i\002i\000\000\000\000\000\000\000\000\000\000\000\000\002i\002i\002i\000\000\002i\002i\017\n\000\000\002i\000\000\000\000\000\000\002i\000\000\002i\002i\000\000\n\026\002i\002i\002i\002i\002i\000\000\000\000\002i\002i\n.\000\000\000\000\000\000\000\000\002i\002i\002i\002i\002a\002a\000\000\000\000\000\000\002a\000\000\000\000\002a\000\000\000\000\002a\000\000\002a\000\000\000\000\002a\000\000\002a\002a\002a\000\000\002a\002a\002a\000\000\000\000\000\000\000\000\000\000\002a\002a\002a\002a\002a\000\000\002a\000\000\000\000\000\000\000\000\000\000\002a\002a\002a\002a\002a\000\000\000\000\002a\000\000\000\000\000\000\000\000\002a\000\000\002a\002a\000\000\000\000\000\000\000\000\002a\002a\002a\000\000\000\000\000\000\000\000\000\000\000\000\002a\002a\002a\002a\002a\002a\002a\002a\002a\000\000\000\000\002a\000\000\002a\002a\000\000\000\000\000\000\000\000\000\000\000\000\002a\002a\002a\000\000\002a\002a\002a\000\000\002a\000\000\000\000\000\000\002a\000\000\002a\002a\000\000\n\026\002a\002a\002a\002a\002a\000\000\000\000\002a\002a\n.\000\000\000\000\000\000\000\000\002a\002a\002a\002a\002]\002]\000\000\000\000\000\000\002]\000\000\000\000\002]\000\000\000\000\002]\000\000\002]\000\000\000\000\011B\000\000\002]\002]\002]\000\000\002]\002]\002]\000\000\000\000\000\000\000\000\000\000\011\170\011\242\012\n\011\194\012\"\000\000\002]\000\000\000\000\000\000\000\000\000\000\002]\002]\012:\012R\002]\000\000\000\000\002]\000\000\000\000\000\000\000\000\002]\000\000\012j\002]\000\000\000\000\000\000\000\000\002]\002]\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002]\002]\011Z\011\218\012\130\012\154\012\202\002]\002]\000\000\000\000\002]\000\000\002]\012\226\000\000\000\000\000\000\000\000\000\000\000\000\002]\002]\012\250\000\000\002]\002]\002]\000\000\002]\000\000\000\000\000\000\002]\000\000\002]\002]\000\000\rZ\002]\rr\012\178\002]\002]\000\000\000\000\002]\r\018\002]\000\000\000\000\000\000\000\000\002]\002]\r*\rB\002e\002e\000\000\000\000\000\000\002e\000\000\000\000\002e\000\000\000\000\002e\000\000\002e\000\000\000\000\011B\000\000\002e\002e\002e\000\000\002e\002e\002e\000\000\000\000\000\000\000\000\000\000\011\170\011\242\012\n\011\194\012\"\000\000\002e\000\000\000\000\000\000\000\000\000\000\002e\002e\012:\012R\002e\000\000\000\000\002e\000\000\000\000\000\000\000\000\002e\000\000\012j\002e\000\000\000\000\000\000\000\000\002e\002e\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002e\002e\011Z\011\218\012\130\012\154\012\202\002e\002e\000\000\000\000\002e\000\000\002e\012\226\000\000\000\000\000\000\000\000\000\000\000\000\002e\002e\012\250\000\000\002e\002e\017&\000\000\002e\000\000\000\000\000\000\002e\000\000\002e\002e\000\000\rZ\002e\rr\012\178\002e\002e\000\000\000\000\002e\r\018\002e\000\000\000\000\000\000\000\000\002e\002e\r*\rB\002Y\002Y\000\000\000\000\000\000\002Y\000\000\000\000\002Y\000\000\000\000\002Y\000\000\002Y\000\000\000\000\002Y\000\000\002Y\002Y\002Y\000\000\002Y\002Y\002Y\000\000\000\000\000\000\000\000\000\000\002Y\002Y\002Y\002Y\002Y\000\000\002Y\000\000\000\000\000\000\000\000\000\000\002Y\002Y\002Y\002Y\002Y\000\000\000\000\002Y\000\000\000\000\000\000\000\000\002Y\000\000\002Y\002Y\000\000\000\000\000\000\000\000\002Y\002Y\002Y\000\000\000\000\000\000\000\000\000\000\000\000\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\000\000\000\000\002Y\000\000\002Y\002Y\000\000\000\000\000\000\000\000\000\000\000\000\002Y\002Y\002Y\000\000\002Y\002Y\002Y\000\000\002Y\000\000\000\000\000\000\002Y\000\000\002Y\002Y\000\000\n\026\002Y\002Y\002Y\002Y\002Y\000\000\000\000\002Y\002Y\n.\000\000\000\000\000\000\000\000\002Y\002Y\002Y\002Y\002U\002U\000\000\000\000\000\000\002U\000\000\000\000\002U\000\000\000\000\002U\000\000\002U\000\000\000\000\011B\000\000\002U\002U\002U\000\000\002U\002U\002U\000\000\000\000\000\000\000\000\000\000\011\170\011\242\012\n\011\194\012\"\000\000\002U\000\000\000\000\000\000\000\000\000\000\002U\002U\012:\012R\002U\000\000\000\000\002U\000\000\000\000\000\000\000\000\002U\000\000\012j\002U\000\000\000\000\000\000\000\000\002U\002U\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002U\002U\011Z\011\218\012\130\012\154\012\202\002U\002U\000\000\000\000\002U\000\000\002U\012\226\000\000\000\000\000\000\000\000\000\000\000\000\002U\002U\012\250\000\000\002U\002U\002U\000\000\002U\000\000\000\000\000\000\002U\000\000\002U\002U\000\000\rZ\002U\rr\012\178\002U\002U\000\000\000\000\002U\r\018\002U\000\000\000\000\000\000\000\000\002U\002U\r*\rB\003Y\003Y\000\000\000\000\000\000\003Y\000\000\000\000\003Y\000\000\000\000\003Y\000\000\003Y\000\000\000\000\003Y\000\000\003Y\003Y\003Y\000\000\003Y\003Y\003Y\000\000\000\000\000\000\000\000\000\000\003Y\003Y\003Y\003Y\003Y\000\000\003Y\000\000\000\000\000\000\000\000\000\000\003Y\003Y\003Y\003Y\003Y\000\000\000\000\003Y\000\000\000\000\000\000\000\000\003Y\000\000\003Y\003Y\000\000\000\000\000\000\000\000\003Y\003Y\003Y\000\000\000\000\000\000\000\000\000\000\000\000\003Y\003Y\003Y\003Y\003Y\003Y\003Y\003Y\003Y\000\000\000\000\003Y\000\000\003Y\003Y\000\000\000\000\000\000\000\000\000\000\000\000\003Y\003Y\003Y\000\000\003Y\003Y\003Y\000\000\003Y\000\000\000\000\000\000\003Y\000\000\003Y\003Y\000\000\n\026\003Y\003Y\003Y\003Y\003Y\000\000\000\000\003Y\003Y\n.\000\000\000\000\000\000\000\000\003Y\003Y\003Y\003Y\003U\003U\000\000\000\000\000\000\003U\000\000\000\000\003U\000\000\000\000\003U\000\000\003U\000\000\000\000\011B\000\000\003U\003U\003U\000\000\003U\003U\003U\000\000\000\000\000\000\000\000\000\000\011\170\011\242\012\n\011\194\012\"\000\000\003U\000\000\000\000\000\000\000\000\000\000\003U\003U\012:\012R\003U\000\000\000\000\003U\000\000\000\000\000\000\000\000\003U\000\000\012j\003U\000\000\000\000\000\000\000\000\003U\003U\000\238\000\000\000\000\000\000\000\000\000\000\000\000\003U\003U\011Z\011\218\012\130\012\154\012\202\003U\003U\000\000\000\000\003U\000\000\003U\012\226\000\000\000\000\000\000\000\000\000\000\000\000\003U\003U\012\250\000\000\003U\003U\003U\000\000\003U\000\000\000\000\000\000\003U\000\000\003U\003U\000\000\rZ\003U\rr\012\178\003U\003U\000\000\000\000\003U\r\018\003U\000\000\000\000\000\000\000\000\003U\003U\r*\rB\002I\002I\000\000\000\000\000\000\002I\000\000\000\000\002I\000\000\000\000\002I\000\000\002I\000\000\000\000\002I\000\000\002I\002I\002I\000\000\002I\002I\002I\000\000\000\000\000\000\000\000\000\000\002I\002I\002I\002I\002I\000\000\002I\000\000\000\000\000\000\000\000\000\000\002I\002I\002I\002I\002I\000\000\000\000\002I\000\000\000\000\000\000\000\000\002I\000\000\002I\002I\000\000\000\000\000\000\000\000\002I\002I\002I\000\000\000\000\000\000\000\000\000\000\000\000\002I\002I\002I\002I\002I\002I\002I\002I\002I\000\000\000\000\002I\000\000\002I\002I\000\000\000\000\000\000\000\000\000\000\000\000\002I\002I\002I\000\000\002I\002I\002I\000\000\002I\000\000\000\000\000\000\002I\000\000\002I\002I\000\000\002I\002I\002I\002I\002I\002I\000\000\000\000\002I\002I\n.\000\000\000\000\000\000\000\000\002I\002I\002I\002I\002M\002M\000\000\000\000\000\000\002M\000\000\000\000\002M\000\000\000\000\002M\000\000\002M\000\000\000\000\002M\000\000\002M\002M\002M\000\000\002M\002M\002M\000\000\000\000\006\138\000\000\000\000\002M\002M\002M\002M\002M\000\000\002M\000\000\004\025\004\025\000\000\000\000\002M\002M\002M\002M\002M\006\142\000\000\002M\000\000\000\000\000\000\000\000\002M\000\000\002M\002M\004\025\000\000\014\005\000\000\002M\002M\002M\000\000\000\000\000\000\000\000\000\000\000\000\002M\002M\002M\002M\002M\002M\002M\002M\002M\014\005\004\025\002M\002.\002M\002M\0022\000\000\000\000\005\209\000\000\000\238\002M\002M\002M\000\000\002M\002M\002M\002>\002M\000\000\004\025\000\000\002M\000\000\002M\002M\000\000\002M\002M\002M\002M\002M\002M\000\000\000\000\002M\002M\n.\000\000\000\000\000\000\000\000\002M\002M\002M\002M\001\006\002J\000\006\000\000\000\000\000\000\002\194\002\198\006\146\002\242\002\146\006J\006\158\005\209\000\000\002\254\001\n\000\000\006\178\000\000\002\158\000\000\006\190\006e\000\000\001\210\000\000\000\000\000\000\003\250\001\018\t.\t2\001\030\001\"\000\000\000\000\t-\003\006\000\000\003\166\t-\019\190\000\000\tV\tZ\002N\003\226\003\230\000\000\003\234\003\246\004\002\t^\007n\000\000\001:\000\000\002\186\000\000\000\000\003\254\000\000\000\000\000\000\b\218\b\222\b\234\b\254\000\000\005\182\000\000\000\000\001>\001B\001F\001J\001N\000\000\000\000\tr\001R\t-\007\249\000\000\001V\000\000\t~\t\150\n:\005\194\005\198\000\000\000\000\001Z\000\000\000\000\000\000\000\000\000\000\000\000\001^\007\249\t-\000\000\000\000\007\249\000\000\000\000\000\000\000\000\001\154\006~\000\000\006\226\005\202\b\242\000\000\001\158\000\000\017f\004\138\nN\001\006\001\166\000\006\001\170\001\174\000\000\002\194\002\198\000\000\002\242\002\146\006\230\000\000\000\000\000\000\002\254\001\n\000\000\005\006\000\000\t*\000\000\000\000\000\000\000\238\001\210\000\000\000\000\000\000\003\250\001\018\t.\t2\001\030\001\"\000\000\000\000\000\000\003\006\000\000\003\166\000\000\t6\000\000\tV\tZ\000\000\003\226\003\230\000\000\003\234\003\246\004\002\t^\007n\000\238\001:\000\000\002\186\b\005\000\000\003\254\000\000\000\000\000\000\b\218\b\222\b\234\b\254\006\146\005\182\000\000\006J\001>\001B\001F\001J\001N\b\005\006\178\tr\001R\b\005\006\190\000\000\001V\000\000\t~\t\150\n:\005\194\005\198\000\000\000\000\001Z\t\213\000\000\000\000\000\000\000\000\006\146\001^\000\000\006J\000\000\004\197\000\000\000\000\000\000\000\000\006\178\001\154\006\214\000\000\006\190\005\202\b\242\000\000\001\158\000\000\017f\004\138\nN\0059\001\166\000\006\001\170\001\174\000\246\002\194\002\198\002\202\002\242\002\146\000\000\000\000\000\000\t\213\002\254\000\000\000\000\003r\000\000\000\000\000\000\0059\000\000\003v\001\210\000\238\021\014\000\000\003\002\b\005\003z\003~\000\000\000\000\t\213\003\130\000\000\003\006\000\000\003\166\000\000\020\162\000\000\003\218\003\222\n\166\003\226\003\230\n\178\003\234\003\246\004\002\004\n\007n\000\249\004\197\021\006\002\186\000\000\000\249\003\254\021\030\000\000\000\000\b\218\b\222\b\234\b\254\t\213\005\182\006\146\000\000\005\006\006J\t\178\t\213\000\000\021&\000\249\tr\006\178\000\000\000\000\r\205\006\190\000\000\t~\t\150\n:\005\194\005\198\021:\021v\000\000\000\000\0059\0059\000\000\000\000\000\000\000\249\000\000\r\205\r\205\000\000\022\222\r\205\000\000\000\000\000\000\000\000\000\249\021\178\025\182\005\202\b\242\000\249\000\145\000\000\t\n\004\138\nN\000\145\000\000\002\198\000\145\000\249\002\146\000\000\n\154\000\000\000\000\002\254\000\000\000\000\000\145\000\000\000\145\000\000\000\145\000\000\000\145\001\210\000\000\n\210\000\000\003\002\000\238\t\209\000\000\000\000\000\249\n\218\000\145\000\000\003\006\002\001\003\166\000\000\000\145\022\170\000\249\000\000\000\145\003\226\003\230\000\000\000\000\003\246\001\190\000\000\000\145\000\000\000\000\000\145\002\186\000\000\r\205\003\254\000\145\000\145\000\145\b\218\b\222\b\234\000\n\014\234\005\182\000\145\000\145\t\209\000\000\000\000\n\190\000\000\000\145\000\000\000\000\000\000\000\145\nU\000\000\000\000\000\000\002\001\000\000\000\000\005\194\005\198\000\145\000\145\t\209\000\000\000\145\000\145\000\000\002\001\002\001\000\000\007\002\029\n\000\000\nU\005%\000\145\000\000\000\000\000\000\005%\000\000\000\145\000\145\005\202\b\242\000\000\000\000\000\169\t\n\004\138\000\000\000\145\000\169\000\145\002\198\000\169\t\209\002\146\005%\n\154\005\006\000\000\002\254\t\209\000\000\000\169\000\000\000\169\000\000\000\169\000\000\000\169\001\210\000\000\n\210\000\238\003\002\000\000\000\000\000\000\005%\000\000\n\218\000\169\000\000\003\006\000\000\003\166\000\000\000\169\000\000\005%\000\000\000\169\003\226\003\230\005%\002\234\003\246\001\190\000\000\000\169\000\000\000\000\000\169\002\186\005%\000\000\003\254\000\169\000\169\000\169\b\218\b\222\b\234\000\000\014\234\005\182\000\169\000\169\006\146\000\000\000\000\006J\029\014\000\169\000\000\000\000\nU\000\169\006\178\005%\000\000\000\000\006\190\000\000\000\000\005\194\005\198\000\169\000\169\005%\000\000\000\169\000\169\003F\007\158\000\000\000\000\000\000\000\000\000\000\000\000\002\018\000\169\000\000\002\026\000\000\000\000\007\142\000\169\000\169\005\202\b\242\001\210\000\000\000\000\t\n\004\138\000\000\000\169\000\006\000\169\000\000\000\246\002\194\002\198\002\202\002\242\002\146\000\000\003Z\000\000\000\000\002\254\000\000\000\000\005Y\000\000\000\000\007\154\001\222\000\000\003v\001\210\000\000\000\000\002\186\003\002\000\000\003z\003~\000\000\000\000\000\000\003\130\000\000\003\006\000\000\003\166\000\000\020\162\000\000\003\218\003\222\000\000\003\226\003\230\000\000\003\234\003\246\004\002\004\n\007n\000\000\007\162\021\006\002\186\000\000\000\000\003\254\021\030\000\000\000\000\b\218\b\222\b\234\b\254\000\000\005\182\000\000\t)\000\000\000\000\000\000\t)\000\000\021&\014\005\tr\n9\031\238\000\000\000\000\000\000\000\000\t~\t\150\n:\005\194\005\198\021:\021v\000\000\000\000 \015\017\246\000\000\014\005\n~\n9\002.\n9\n9\0022\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025\182\005\202\b\242\t)\002>\000\000\t\n\004\138\nN\000\006\002F\r\241\000\246\002\194\002\198\002\202\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\t) >\000\000\000\000\000\000\000\000\000\000\003v\001\210\000\000\002J\000\000\003\002\000\000\003z\003~\000\000\000\000\000\000\003\130\000\000\003\006\000\000\003\166\000\000\020\162\000\000\003\218\003\222\000\000\003\226\003\230\000\000\003\234\003\246\004\002\004\n\007n\005\006\000\000\021\006\002\186\000\000\000\000\003\254\021\030\000\000\000\000\b\218\b\222\b\234\b\254\n\026\005\182\000\000\002N\000\000\000\000\000\000\000\000\n9\021&\n.\tr\000\000\031\238\000\000\000\000\000\000\000\000\t~\t\150\n:\005\194\005\198\021:\021v\001\206\000\000\005a\000\014\000\018\000\022\000\026\000\030\000\000\000\"\000&\000*\000.\0002\000\000\0006\000:\000\000\001\210\000>\025\182\005\202\b\242\000B\000\000\000\000\t\n\004\138\nN\000\000\000F\022\214\000\000\000\000\000\000\000\000\000J\000\000\000N\000R\000V\000Z\000^\000b\000f\002\170\001*\023N\000j\000\000\000\000\002\186\000n\002\001\000r\000\000\000v\000\000\023f\000\000\002\001\000\000\000\000\002\001\000\000\000\000\000\000\000\000\000\000\000\000\000z\002\001\000\000\000~\000\130\000\000\000\000\000\000\000\000\000\n\000\134\000\138\000\142\000\000\000\000\000\000\000\000\000\000\000\146\000\150\000\154\000\158\000\000\000\162\000\166\000\170\000\000\002\001\000\000\000\174\000\178\000\000\000\182\000\000\002\001\000\000\000\186\000\000\000\190\000\194\002\001\000\000\000\000\001\006\000\000\000\000\000\198\000\000\000\202\003\022\002\198\006b\000\000\002\146\000\206\000\210\000\000\000\214\002\254\001\n\000\000\000\000\002\001\002\158\000\000\000\000\000\000\000\000\001\210\000\000\000\000\000\000\001\014\001\018\001\022\0036\001\030\001\"\000\000\000\000\000\000\002\001\000\000\000\000\000\000\003:\002\001\001.\006z\000\000\000\000\000\000\000\000\000\000\0032\001\190\0016\000\000\000\000\001:\000\000\002\186\000\000\000\000\004\014\002\001\000\000\000\000\004\018\000\000\004\026\005\170\002\001\005\182\000\n\002\001\001>\001B\001F\001J\001N\000\000\000\000\002\001\001R\005\186\000\000\002\001\001V\000\000\000\000\000\n\002\001\005\194\005\198\000\000\006\n\001Z\002\001\000\000\002\001\000\000\006\022\002\001\001^\002\001\000\000\000\000\000\000\002\001\002\001\000\000\002\001\002\001\001\154\006~\002\001\000\000\005\202\000\000\000\000\001\158\002\001\001\162\004\138\001\006\000\000\001\166\000\000\001\170\001\174\003\022\002\198\t\210\000\000\002\146\000\000\000\000\002\001\000\000\002\254\001\n\000\000\000\000\002\001\002\158\000\000\000\000\002\001\000\000\001\210\003\158\000\000\002\198\001\014\001\018\001\022\0036\001\030\001\"\003j\000\000\000\000\003\146\000\000\000\000\b\162\003:\000\000\001.\006z\001\210\000\000\000\000\000\000\000\000\0032\001\190\0016\000\000\000\000\001:\000\000\002\186\018\178\000\000\004\014\002\146\000\000\000\000\004\018\000\000\004\026\005\170\000\000\005\182\000\000\003\154\001>\001B\001F\001J\001N\000\000\002\186\025^\001R\005\186\000\000\000\000\001V\000\000\000\000\000\000\000\000\005\194\005\198\000\000\006\n\001Z\000\000\000\000\000\000\000\000\006\022\000\000\001^\000\000\018\182\000\000\000\000\000\000\007\130\000\000\000\000\000\000\001\154\006~\000\000\000\000\005\202\000\000\018\194\001\158\025\130\001\162\004\138\000\000\004\149\001\166\000\000\001\170\001\174\004\149\003\022\002\198\004\149\007\201\002\146\000\000\007>\000\000\007\201\002\254\018\178\000\000\004\149\002\146\005\198\000\000\004\149\000\000\004\149\001\210\000\000\007^\000\000\000\000\000\000\025\142\003\026\007\201\000\000\t\162\004\149\000\000\000\000\000\000\000\000\000\000\004\149\000\000\000\000\003&\000\000\000\000\025\"\000\000\000\000\t\206\001\190\000\000\004\149\007\201\000\000\004\149\002\186\000\000\018\182\004\014\004\149\004\149\012\005\004\018\007\201\004\026\000\000\t\222\005\182\007\201\007\201\000\238\018\194\000\000\025b\000\000\004\149\004\149\007\201\007\201\005\186\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\194\005\198\004\149\004\149\r\150\000\000\004\149\004\149\000\000\000\000\005\198\000\000\000\000\000\000\000\000\000\000\007\201\000\000\000\000\012\005\n\166\025n\012\005\r\158\004\149\005\202\007\201\000\000\000\000\012\005\n=\004\138\000\006\012\005\000\000\004\149\002\194\002\198\025\"\002\242\002\146\000\000\027\214\000\000\000\000\002\254\000\000\000\000\000\000\000\000\n=\000\000\n=\n=\000\000\001\210\000\000\000\000\000\000\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\230\000\000\003\234\003\246\004\002\004\n\007n\000\000\000\000\000\000\002\186\000\000\000\000\003\254\000\000\000\000\000\000\b\218\b\222\b\234\b\254\000\000\005\182\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tr\000\000\000\000\000\000\000\000\000\000\000\000\nn\t\150\n:\005\194\005\198\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\001\000\000\n5\000\000\000\006\000\000\000\000\002\001\002\194\002\198\002\001\002\242\002\146\000\000\005\202\b\242\n=\002\254\002\001\t\n\004\138\nN\n5\000\000\n5\n5\000\n\001\210\000\000\000\000\000\000\003\002\000\000\003z\003~\000\000\000\000\000\000\002\001\002\001\003\006\000\000\003\166\000\000\002\001\000\000\003\218\003\222\000\000\003\226\003\230\002\001\003\234\003\246\004\002\004\n\007n\002\001\002\001\000\000\002\186\002\001\000\000\003\254\002\001\000\n\000\000\b\218\b\222\b\234\b\254\002\001\005\182\000\000\000\000\000\000\000\000\002\001\000\000\002\001\000\000\000\000\tr\002\001\002\001\000\000\000\000\000\000\002\001\nn\t\150\n:\005\194\005\198\002\001\002\001\002\001\002\001\002\001\000\000\000\000\000\000\002\001\002\001\000\000\002\001\002\001\002\001\000\000\000\000\000\000\002\001\002\001\003\134\000\n\000\000\002\001\005\202\b\242\n5\000\n\002\001\t\n\004\138\nN\002\001\000\000\002\001\002\001\000\n\000\000\000\000\002\001\000\000\002\001\002\001\002\001\000\000\002\001\002\001\002\001\002\001\000\000\002\001\002\001\002\001\002\001\002\001\002\001\002\001\002\001\002\001\002\001\002\001\002\001\000\000\000\000\002\001\000\000\002\001\002\001\002\001\002\001\002\001\002\001\002\001\002\001\002\001\000\000\000\000\002\001\000\n\000\000\002\001\007r\000\000\002\001\002\001\002\001\000\000\018f\000\000\000\000\002\001\002\001\002\001\002\001\002\001\000\000\002\001\002\001\000\000\000\000\002\001\000\000\002\001\002\001\000\000\000\000\002\001\000\000\007v\002\001\002\001\000\000\002\001\002\001\002\001\002\001\000\000\000\000\002\001\002\001\000\000\005\201\005\201\002\001\002\001\002\001\005\201\002\001\005\201\005\201\000\000\005\201\000\000\005\201\005\201\002\001\002\001\005\201\018\166\005\201\005\201\005\201\005\201\005\201\005\201\005\201\005\201\000\000\005\201\000\000\005\201\000\000\000\000\000\000\000\000\000\000\000\000\005\201\000\000\000\000\002\001\000\000\005\201\005\201\005\201\000\000\002\001\005\201\005\201\005\201\000\000\000\000\000\000\005\201\000\000\005\201\000\000\000\000\005\201\000\000\000\000\005I\000\000\005\201\005\201\005\201\022\238\000\000\005\201\005\201\005\201\000\000\005\201\005\201\000\000\000\000\000\000\000\000\000\000\005\201\000\000\000\000\000\000\005\201\005\201\003v\005\201\000\000\005\201\000\000\000\000\000\000\000\000\005\201\005\201\005\201\000\000\005\201\005\201\005\201\005\201\000\000\005\201\005\201\000\000\000\000\000\000\023\026\005\201\000\000\005\201\005\201\000\000\000\000\002\166\005\201\000\000\000\000\021\006\0242\005\201\000\000\012!\021\030\005\201\012!\005\201\005\201\012!\012!\000\000\005\201\012!\023F\012!\000\000\000\000\012!\000\000\000\000\000\000\012!\012!\000\000\012!\012!\000\000\012!\000\000\012!\000\000\000\000\000\000\000\000\012!\000\000\000\000\012!\005I\000\000\000\000\000\000\000\000\000\000\000\000\012!\000\000\012!\023\170\000\000\000\000\000\000\000\000\012!\012!\014\005\r\241\000\000\000\000\000\000\012!\000\000\000\000\012!\000\000\000\000\012!\012!\000\000\012!\000\000\012!\012!\000\000\000\000\014\005\000\000\000\000\002.\000\000\000\000\0022\000\000\000\000\012!\000\000\000\000\000\000\002:\000\000\000\000\000\000\012!\012!\002>\000\000\012!\000\000\012!\000\000\002F\r\241\000\000\000\000\005\230\000\000\000\000\000\000\014\005\r\241\000\000\012!\012!\000\000\012!\012!\000\000\012!\000\000\012!\007y\012!\000A\012!\002J\012!\000A\000A\014\005\000A\000A\002.\000\000\000\000\0022\000A\000\000\000\000\000\000\000\000\007y\002\214\000\000\000\000\000\000\000A\000\000\002>\000\000\000A\000\000\000A\000A\002F\r\241\000\000\005Q\000\000\000A\000\000\000A\025\222\000\000\000\000\000A\000A\000\000\000A\000A\002N\000A\000A\000A\000A\000A\005\249\014E\002J\000A\000\000\003v\000A\000\000\000\000\000\000\000A\000A\000A\000A\000\000\000A\000\000\000\000\000\000\005\249\000\000\005\253\014E\005\249\000\000\000A\000\000\026N\000\000\000\000\000\000\000\000\000A\000A\000A\000A\000A\000\000\021\006\007u\005\253\000=\000\000\021\030\005\253\000=\000=\002N\000=\000=\000\000\000\000\026\242\027\002\000=\000\000\000\000\000\000\000\000\007u\000A\000A\000\000\000\000\000=\000A\000A\000A\000=\000\000\000=\000=\000\000\000\000\000\000\005%\000\000\000=\005Q\000=\005%\014E\014E\000=\000=\000\000\000=\000=\027\246\000=\000=\000=\000=\000=\005\249\000\000\000\000\000=\000\000\005%\000=\014E\014E\014E\000=\000=\000=\000=\000\000\000=\005\249\000\000\000\000\005\249\000\000\005\253\000\000\000\000\000\000\000=\000\000\005%\014E\000\000\014E\000\000\000=\000=\000=\000=\000=\005\253\005%\007\133\005\253\r\141\000\000\005%\002\234\r\141\r\141\000\000\r\141\r\141\000\000\000\000\005%\005%\r\141\000\000\000\000\000\000\000\000\007\133\000=\000=\000\000\000\000\r\141\000=\000=\000=\r\141\000\000\r\141\r\141\000\000\000\000\000\000\000\000\000\000\r\141\005%\r\141\000\000\000\000\000\000\r\141\r\141\000\000\r\141\r\141\005%\r\141\r\141\r\141\r\141\r\141\000\000\000\000\000\000\r\141\000\000\000\000\r\141\000\000\000\000\000\000\r\141\r\141\r\141\r\141\000\000\r\141\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\r\141\000\000\000\000\000\000\000\000\tJ\000\000\r\141\r\141\r\141\r\141\r\141\002\014\000\000\007\129\000\000\r\137\000\000\000\000\002\018\r\137\r\137\002\026\r\137\r\137\000\000\000\000\000\000\000\000\r\137\001\210\000\000\000\000\000\000\007\129\r\141\r\141\000\000\000\000\r\137\r\141\r\141\r\141\r\137\000\000\r\137\r\137\003Z\000\000\000\000\000\000\000\000\r\137\000\000\r\137\000\000\007\154\001\222\r\137\r\137\000\000\r\137\r\137\002\186\r\137\r\137\r\137\r\137\r\137\000\000\000\000\000\000\r\137\000\000\000\000\r\137\000\000\000\000\000\000\r\137\r\137\r\137\r\137\000\000\r\137\000\000\000\000\000\000\000\000\000\000\000\000\007\162\000\000\000\000\r\137\000\000\000\000\000\000\000\000\000\000\000\000\r\137\r\137\r\137\r\137\r\137\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\r\137\r\137\000\000\000\000\001\210\r\137\r\137\r\137\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\230\n\182\003\234\003\246\004\002\004\n\007n\001\202\001\206\r\162\002\186\000\000\000\000\003\254\000\000\000\000\000\000\b\218\b\222\b\234\b\254\000\000\005\182\000\000\000\000\000\000\001\210\001\214\001\230\000\000\000\000\000\000\tr\000\000\000\000\000\000\001\242\000\000\000\000\nn\t\150\n:\005\194\005\198\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\246\002\162\000\000\000\000\000\000\002\174\000\000\002\186\0046\004B\000\000\000\000\000\000\000\000\004N\005\202\b\242\019\170\r\197\r\197\t\n\004\138\nN\r\197\000\000\001\206\r\197\000\000\000\000\000\000\000\000\004R\000\000\000\000\004\222\000\000\r\197\r\197\r\197\000\000\r\197\r\197\r\197\000\000\000\000\000\000\000\000\000\000\002\198\000\000\000\000\000\000\000\000\000\000\r\197\000\000\000\000\000\000\000\000\000\000\r\197\r\197\000\000\000\000\r\197\000\000\001\210\000\000\000\000\000\000\002\170\000\000\r\197\000\000\000\000\r\197\000\000\000\000\000\000\025\210\r\197\r\197\r\197\000\000\000\000\000\000\000\000\000\000\000\000\r\197\r\197\000\000\027\014\003\178\000\000\027\018\r\197\000\000\000\000\002\186\004\230\000\000\000\000\r\197\000\000\000\000\027B\000\000\000\000\000\000\r\197\r\197\r\197\000\000\r\197\r\197\000\000\000\000\004\253\000\000\000\000\000\000\000\000\004\253\000\000\r\197\004\253\r\197\r\197\027R\000\000\000\000\r\197\000\000\000\000\000\000\004\253\r\197\000\000\000\000\004\253\r\197\004\253\r\197\r\197\n%\n%\000\000\000\000\000\000\n%\000\000\001\206\n%\004\253\000\000\000\000\000\000\000\000\000\000\004\253\n%\000\000\n%\n%\n%\000\000\n%\n%\n%\000\000\000\000\004\253\000\000\000\000\004\253\000\000\000\000\000\000\000\000\004\253\n%\000\000\000\000\000\000\000\000\000\000\n%\n%\000\000\000\000\n%\000\000\000\000\000\000\000\000\004\253\002\170\000\000\n%\004\253\000\000\n%\000\000\000\000\000\000\000\000\n%\n%\n%\004\253\004\253\000\000\000\000\004\253\004\253\n%\n%\000\000\000\000\000\000\000\000\000\000\n%\000\000\000\000\000\000\004\230\000\000\000\000\n%\000\000\004\253\000\000\000\000\000\000\000\000\n%\n%\n%\000\000\n%\n%\020\222\000\000\004\245\000\000\000\000\000\000\000\000\004\245\000\000\n%\004\245\n%\n%\000\000\000\000\000\000\n%\000\000\000\000\000\000\004\245\n%\000\000\000\000\004\245\n%\004\245\n%\n%\n!\n!\000\000\000\000\000\000\n!\000\000\001\206\n!\004\245\000\000\000\000\000\000\000\000\000\000\004\245\n!\000\000\n!\n!\n!\000\000\n!\n!\n!\000\000\000\000\004\245\000\000\000\000\004\245\000\000\000\000\000\000\000\000\004\245\n!\000\000\000\000\000\000\000\000\000\000\n!\n!\000\000\000\000\n!\000\000\000\000\000\000\000\000\004\245\002\170\000\000\n!\004\245\000\000\n!\000\000\000\000\000\000\000\000\n!\n!\n!\004\245\004\245\000\000\000\000\004\245\004\245\n!\n!\000\000\000\000\000\000\000\000\000\000\n!\000\000\000\000\000\000\004\230\000\000\000\000\n!\000\000\004\245\000\000\000\000\000\000\000\000\n!\n!\n!\000\000\n!\n!\023\238\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\169\n!\000\006\n!\n!\001\169\002\194\002\198\n!\002\242\002\146\000\000\000\000\n!\000\000\002\254\000\000\n!\000\000\n!\n!\000\000\004\022\000\000\001\169\001\210\000\000\000\000\000\000\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\001\169\003\226\003\230\000\000\003\234\003\246\004\002\004\n\007n\000\000\000\000\001\169\002\186\000\000\000\000\003\254\001\169\001\169\000\238\b\218\b\222\b\234\b\254\000\000\005\182\001\169\001\169\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tr\000\000\000\000\000\000\000\000\000\000\000\000\nn\t\150\n:\005\194\005\198\000\000\000\000\000\000\000\000\000\000\001\169\000\000\000\000\000\000\000\000\000\000\014Q\000\000\000\006\000\000\001\169\014Q\002\194\002\198\000\000\002\242\002\146\000\000\005\202\b\242\017z\002\254\000\000\t\n\004\138\nN\000\000\000\000\017\142\000\000\014Q\001\210\000\000\000\000\000\000\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\014Q\003\226\003\230\000\000\003\234\003\246\004\002\004\n\007n\000\000\000\000\014Q\002\186\000\000\000\000\003\254\014Q\014Q\000\238\b\218\b\222\b\234\b\254\000\000\005\182\014Q\014Q\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tr\000\000\000\000\000\000\000\000\000\000\000\000\nn\t\150\n:\005\194\005\198\000\000\000\000\000\000\000\000\000\000\014Q\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014Q\000\000\rI\000\000\000\000\000\000\000\000\rI\005\202\b\242\rI\000y\000\000\t\n\004\138\nN\000y\000\000\000y\000y\rI\000\000\000\000\000\000\rI\000\000\rI\000y\000\000\000y\000y\000\000\000\000\000y\000y\000y\000\000\t\189\rI\000\000\000\000\000\000\000\000\000\000\rI\000\000\000\000\000y\000\000\000\000\000\000\000\000\000\000\000y\000y\000\000\rI\000y\000\000\rI\000\000\000\000\000\000\000y\rI\000y\000\000\000\000\000y\000\000\000\000\000\000\000\000\000y\000y\000y\000\000\000\000\000\000\000\000\rI\0112\000y\000y\rI\000\000\000\000\000\000\000\000\000y\000y\000\000\000\000\000y\rI\rI\000y\000\000\rI\rI\000\000\000\000\000\000\000y\000y\000y\000\000\000y\000y\000\000\000\000\000\000\000\000\000\000\t\189\000\006\rI\000\000\000y\002\194\002\198\000y\002\242\002\146\000\000\000y\000\000\r\138\002\254\000\000\000y\000\000\000\000\000\000\000y\000\000\000y\000\000\001\210\000\000\000\000\000\000\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\230\000\000\003\234\003\246\004\002\004\n\007n\000\000\000\000\000\000\002\186\000\000\000\000\003\254\000\000\000\000\000\000\b\218\b\222\b\234\b\254\000\000\005\182\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tr\000\000\000\000\000\000\000\000\000\000\000\000\020\014\t\150\n:\005\194\005\198\000\000\000\000\005-\000\000\000\006\000\000\000\000\000\246\002\194\002\198\002\"\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\021\182\000\000\000\000\005\202\b\242\000\000\003v\001\210\t\n\004\138\nN\003\002\000\000\003z\003~\000\000\000\000\000\000\021\186\000\000\003\006\000\000\003\166\000\000\021\226\000\000\003\218\003\222\000\000\003\226\003\230\000\000\003\234\003\246\004\002\004\n\007n\000\000\000\000\021\006\002\186\000\000\000\000\003\254\021\030\000\000\000\000\b\218\b\222\b\234\b\254\000\000\005\182\000\000\000\000\000\000\000\000\000\000\000\000\000\000\022\130\000\000\tr\000\000\000\000\000\000\000\000\000\000\000\000\019\150\t\150\n:\005\194\005\198\021:\022\150\005%\000\000\000\006\005-\000\000\005%\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\022\166\005\202\b\242\000\000\005%\001\210\t\n\004\138\nN\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\005%\003\226\003\230\000\000\003\234\003\246\004\002\004\n\007n\000\000\000\000\005%\002\186\000\000\000\000\003\254\005%\002\234\000\238\b\218\b\222\b\234\b\254\000\000\005\182\000\000\005%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tr\000\000\000\000\000\000\000\000\018\130\000\000\018\018\t\150\n:\005\194\005\198\002\014\000\000\000\000\000\000\000\006\005%\000\000\002\018\002\194\002\198\002\026\002\242\002\146\000\000\000\000\005%\000\000\002\254\001\210\000\000\000\000\000\000\000\000\005\202\b\242\000\000\000\000\001\210\t\n\004\138\nN\003\002\000\000\003z\003~\003Z\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\007\154\001\222\003\218\003\222\000\000\003\226\003\230\002\186\003\234\003\246\004\002\004\n\007n\000\000\000\000\000\000\002\186\000\000\000\000\003\254\000\000\000\000\000\000\b\218\b\222\b\234\b\254\000\000\005\182\000\000\000\000\000\000\000\000\000\000\000\000\007\162\000\000\000\000\tr\000\000\000\000\000\000\000\000\019\214\000\000\n\n\t\150\n:\005\194\005\198\002\014\000\000\000\000\000\000\000\006\000\000\000\000\002\018\002\194\002\198\002\026\002\242\002\146\000\000\000\000\000\000\000\000\002\254\001\210\000\000\000\000\000\000\000\000\005\202\b\242\000\000\000\000\001\210\t\n\004\138\nN\003\002\000\000\003z\003~\003Z\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\007\154\001\222\003\218\003\222\000\000\003\226\003\230\002\186\003\234\003\246\004\002\004\n\007n\000\000\000\000\000\000\002\186\000\000\000\000\003\254\000\000\000\000\000\000\b\218\b\222\b\234\b\254\000\000\005\182\000\000\000\000\000\000\000\000\000\000\000\000\007\162\000\000\000\000\tr\000\000\000\000\000\000\000\000\020*\000\000\n\030\t\150\n:\005\194\005\198\002\014\000\000\000\000\000\000\000\006\000\000\000\000\002\018\002\194\002\198\002\026\002\242\002\146\000\000\000\000\000\000\000\000\002\254\001\210\000\000\000\000\000\000\000\000\005\202\b\242\000\000\000\000\001\210\t\n\004\138\nN\003\002\000\000\003z\003~\003Z\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\007\154\001\222\003\218\003\222\000\000\003\226\003\230\002\186\003\234\003\246\004\002\004\n\007n\000\000\000\000\000\000\002\186\000\000\000\000\003\254\000\000\000\000\000\000\b\218\b\222\b\234\b\254\000\000\005\182\000\000\000\000\000\000\000\000\000\000\000\000\007\162\000\000\000\000\tr\000\000\000\000\000\000\000\000\020:\000\000\n\134\t\150\n:\005\194\005\198\002\014\000\000\000\000\000\000\000\006\000\000\000\000\002\018\002\194\002\198\002\026\002\242\002\146\000\000\000\000\000\000\000\000\002\254\001\210\000\000\000\000\000\000\000\000\005\202\b\242\000\000\000\000\001\210\t\n\004\138\nN\003\002\000\000\003z\003~\003Z\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\007\154\001\222\003\218\003\222\000\000\003\226\003\230\002\186\003\234\003\246\004\002\004\n\007n\000\000\000\000\000\000\002\186\000\000\000\000\003\254\000\000\000\000\000\000\b\218\b\222\b\234\b\254\000\000\005\182\000\000\000\000\000\000\000\000\000\000\000\000\007\162\000\000\000\000\tr\000\000\000\000\000\000\000\000\020b\000\000\011\006\t\150\n:\005\194\005\198\002\014\000\000\000\000\000\000\000\006\000\000\000\000\002\018\002\194\002\198\002\026\002\242\002\146\000\000\000\000\000\000\000\000\002\254\001\210\000\000\000\000\000\000\000\000\005\202\b\242\000\000\000\000\001\210\t\n\004\138\nN\003\002\000\000\003z\003~\003Z\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\007\154\001\222\003\218\003\222\000\000\003\226\003\230\002\186\003\234\003\246\004\002\004\n\007n\000\000\000\000\000\000\002\186\000\000\000\000\003\254\000\000\000\000\000\000\b\218\b\222\b\234\b\254\000\000\005\182\000\000\000\000\000\000\000\000\000\000\000\000\007\162\000\000\000\000\tr\000\000\000\000\000\000\000\000\020r\000\000\011F\t\150\n:\005\194\005\198\002\014\000\000\000\000\000\000\000\006\000\000\000\000\002\018\002\194\002\198\002\026\002\242\002\146\000\000\000\000\000\000\000\000\002\254\001\210\000\000\000\000\000\000\000\000\005\202\b\242\000\000\000\000\001\210\t\n\004\138\nN\003\002\000\000\003z\003~\003Z\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\007\154\001\222\003\218\003\222\000\000\003\226\003\230\002\186\003\234\003\246\004\002\004\n\007n\000\000\000\000\000\000\002\186\000\000\000\000\003\254\000\000\000\000\000\000\b\218\b\222\b\234\b\254\000\000\005\182\000\000\000\000\000\000\000\000\000\000\000\000\007\162\000\000\000\000\tr\000\000\000\000\000\000\000\000\000\000\000\000\011^\t\150\n:\005\194\005\198\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\202\b\242\000\000\000\000\001\210\t\n\004\138\nN\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\230\000\000\003\234\003\246\004\002\004\n\007n\000\000\000\000\000\000\002\186\000\000\000\000\003\254\000\000\000\000\000\000\b\218\b\222\b\234\b\254\000\000\005\182\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tr\000\000\000\000\000\000\000\000\000\000\000\000\011\130\t\150\n:\005\194\005\198\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\202\b\242\000\000\000\000\001\210\t\n\004\138\nN\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\230\000\000\003\234\003\246\004\002\004\n\007n\000\000\000\000\000\000\002\186\000\000\000\000\003\254\000\000\000\000\000\000\b\218\b\222\b\234\b\254\000\000\005\182\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tr\000\000\000\000\000\000\000\000\000\000\000\000\011\174\t\150\n:\005\194\005\198\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\202\b\242\000\000\000\000\001\210\t\n\004\138\nN\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\230\000\000\003\234\003\246\004\002\004\n\007n\000\000\000\000\000\000\002\186\000\000\000\000\003\254\000\000\000\000\000\000\b\218\b\222\b\234\b\254\000\000\005\182\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tr\000\000\000\000\000\000\000\000\000\000\000\000\011\198\t\150\n:\005\194\005\198\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\202\b\242\000\000\000\000\001\210\t\n\004\138\nN\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\230\000\000\003\234\003\246\004\002\004\n\007n\000\000\000\000\000\000\002\186\000\000\000\000\003\254\000\000\000\000\000\000\b\218\b\222\b\234\b\254\000\000\005\182\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tr\000\000\000\000\000\000\000\000\000\000\000\000\011\222\t\150\n:\005\194\005\198\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\202\b\242\000\000\000\000\001\210\t\n\004\138\nN\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\230\000\000\003\234\003\246\004\002\004\n\007n\000\000\000\000\000\000\002\186\000\000\000\000\003\254\000\000\000\000\000\000\b\218\b\222\b\234\b\254\000\000\005\182\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tr\000\000\000\000\000\000\000\000\000\000\000\000\011\246\t\150\n:\005\194\005\198\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\202\b\242\000\000\000\000\001\210\t\n\004\138\nN\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\230\000\000\003\234\003\246\004\002\004\n\007n\000\000\000\000\000\000\002\186\000\000\000\000\003\254\000\000\000\000\000\000\b\218\b\222\b\234\b\254\000\000\005\182\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tr\000\000\000\000\000\000\000\000\000\000\000\000\012\014\t\150\n:\005\194\005\198\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\202\b\242\000\000\000\000\001\210\t\n\004\138\nN\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\230\000\000\003\234\003\246\004\002\004\n\007n\000\000\000\000\000\000\002\186\000\000\000\000\003\254\000\000\000\000\000\000\b\218\b\222\b\234\b\254\000\000\005\182\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tr\000\000\000\000\000\000\000\000\000\000\000\000\012&\t\150\n:\005\194\005\198\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\202\b\242\000\000\000\000\001\210\t\n\004\138\nN\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\230\000\000\003\234\003\246\004\002\004\n\007n\000\000\000\000\000\000\002\186\000\000\000\000\003\254\000\000\000\000\000\000\b\218\b\222\b\234\b\254\000\000\005\182\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tr\000\000\000\000\000\000\000\000\000\000\000\000\012>\t\150\n:\005\194\005\198\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\202\b\242\000\000\000\000\001\210\t\n\004\138\nN\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\230\000\000\003\234\003\246\004\002\004\n\007n\000\000\000\000\000\000\002\186\000\000\000\000\003\254\000\000\000\000\000\000\b\218\b\222\b\234\b\254\000\000\005\182\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tr\000\000\000\000\000\000\000\000\000\000\000\000\012V\t\150\n:\005\194\005\198\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\202\b\242\000\000\000\000\001\210\t\n\004\138\nN\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\230\000\000\003\234\003\246\004\002\004\n\007n\000\000\000\000\000\000\002\186\000\000\000\000\003\254\000\000\000\000\000\000\b\218\b\222\b\234\b\254\000\000\005\182\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tr\000\000\000\000\000\000\000\000\000\000\000\000\012n\t\150\n:\005\194\005\198\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\202\b\242\000\000\000\000\001\210\t\n\004\138\nN\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\230\000\000\003\234\003\246\004\002\004\n\007n\000\000\000\000\000\000\002\186\000\000\000\000\003\254\000\000\000\000\000\000\b\218\b\222\b\234\b\254\000\000\005\182\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tr\000\000\000\000\000\000\000\000\000\000\000\000\012\134\t\150\n:\005\194\005\198\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\202\b\242\000\000\000\000\001\210\t\n\004\138\nN\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\230\000\000\003\234\003\246\004\002\004\n\007n\000\000\000\000\000\000\002\186\000\000\000\000\003\254\000\000\000\000\000\000\b\218\b\222\b\234\b\254\000\000\005\182\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tr\000\000\000\000\000\000\000\000\000\000\000\000\012\158\t\150\n:\005\194\005\198\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\202\b\242\000\000\000\000\001\210\t\n\004\138\nN\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\230\000\000\003\234\003\246\004\002\004\n\007n\000\000\000\000\000\000\002\186\000\000\000\000\003\254\000\000\000\000\000\000\b\218\b\222\b\234\b\254\000\000\005\182\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tr\000\000\000\000\000\000\000\000\000\000\000\000\012\182\t\150\n:\005\194\005\198\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\202\b\242\000\000\000\000\001\210\t\n\004\138\nN\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\230\000\000\003\234\003\246\004\002\004\n\007n\000\000\000\000\000\000\002\186\000\000\000\000\003\254\000\000\000\000\000\000\b\218\b\222\b\234\b\254\000\000\005\182\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tr\000\000\000\000\000\000\000\000\000\000\000\000\012\206\t\150\n:\005\194\005\198\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\202\b\242\000\000\000\000\001\210\t\n\004\138\nN\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\230\000\000\003\234\003\246\004\002\004\n\007n\000\000\000\000\000\000\002\186\000\000\000\000\003\254\000\000\000\000\000\000\b\218\b\222\b\234\b\254\000\000\005\182\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tr\000\000\000\000\000\000\000\000\000\000\000\000\012\230\t\150\n:\005\194\005\198\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\202\b\242\000\000\000\000\001\210\t\n\004\138\nN\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\230\000\000\003\234\003\246\004\002\004\n\007n\000\000\000\000\000\000\002\186\000\000\000\000\003\254\000\000\000\000\000\000\b\218\b\222\b\234\b\254\000\000\005\182\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tr\000\000\000\000\000\000\000\000\000\000\000\000\012\254\t\150\n:\005\194\005\198\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\202\b\242\000\000\000\000\001\210\t\n\004\138\nN\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\230\000\000\003\234\003\246\004\002\004\n\007n\000\000\000\000\000\000\002\186\000\000\000\000\003\254\000\000\000\000\000\000\b\218\b\222\b\234\b\254\000\000\005\182\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tr\000\000\000\000\000\000\000\000\000\000\000\000\r\022\t\150\n:\005\194\005\198\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\202\b\242\000\000\000\000\001\210\t\n\004\138\nN\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\230\000\000\003\234\003\246\004\002\004\n\007n\000\000\000\000\000\000\002\186\000\000\000\000\003\254\000\000\000\000\000\000\b\218\b\222\b\234\b\254\000\000\005\182\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tr\000\000\000\000\000\000\000\000\000\000\000\000\r.\t\150\n:\005\194\005\198\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\202\b\242\000\000\000\000\001\210\t\n\004\138\nN\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\230\000\000\003\234\003\246\004\002\004\n\007n\000\000\000\000\000\000\002\186\000\000\000\000\003\254\000\000\000\000\000\000\b\218\b\222\b\234\b\254\000\000\005\182\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tr\000\000\000\000\000\000\000\000\000\000\000\000\rF\t\150\n:\005\194\005\198\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\202\b\242\000\000\000\000\001\210\t\n\004\138\nN\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\230\000\000\003\234\003\246\004\002\004\n\007n\000\000\000\000\000\000\002\186\000\000\000\000\003\254\000\000\000\000\000\000\b\218\b\222\b\234\b\254\000\000\005\182\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tr\000\000\000\000\000\000\000\000\000\000\000\000\r^\t\150\n:\005\194\005\198\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\202\b\242\000\000\000\000\001\210\t\n\004\138\nN\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\230\000\000\003\234\003\246\004\002\004\n\007n\000\000\000\000\000\000\002\186\000\000\000\000\003\254\000\000\000\000\000\000\b\218\b\222\b\234\b\254\000\000\005\182\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tr\000\000\000\000\000\000\000\000\000\000\000\000\rv\t\150\n:\005\194\005\198\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\202\b\242\000\000\000\000\001\210\t\n\004\138\nN\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\230\000\000\003\234\003\246\004\002\004\n\007n\000\000\000\000\000\000\002\186\000\000\000\000\003\254\000\000\000\000\000\000\b\218\b\222\b\234\b\254\000\000\005\182\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tr\000\000\000\000\000\000\000\000\000\000\000\000\015\n\t\150\n:\005\194\005\198\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\202\b\242\000\000\000\000\001\210\t\n\004\138\nN\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\230\000\000\003\234\003\246\004\002\004\n\007n\000\000\000\000\000\000\002\186\000\000\000\000\003\254\000\000\000\000\000\000\b\218\b\222\b\234\b\254\000\000\005\182\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tr\000\000\000\000\000\000\000\000\000\000\000\000\0152\t\150\n:\005\194\005\198\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\202\b\242\000\000\000\000\001\210\t\n\004\138\nN\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\230\000\000\003\234\003\246\004\002\004\n\007n\000\000\000\000\000\000\002\186\000\000\000\000\003\254\000\000\000\000\000\000\b\218\b\222\b\234\b\254\000\000\005\182\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tr\000\000\000\000\000\000\000\000\000\000\000\000\015Z\t\150\n:\005\194\005\198\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\202\b\242\000\000\000\000\001\210\t\n\004\138\nN\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\230\000\000\003\234\003\246\004\002\004\n\007n\000\000\000\000\000\000\002\186\000\000\000\000\003\254\000\000\000\000\000\000\b\218\b\222\b\234\b\254\000\000\005\182\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tr\000\000\000\000\000\000\000\000\000\000\000\000\015\130\t\150\n:\005\194\005\198\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\202\b\242\000\000\000\000\001\210\t\n\004\138\nN\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\230\000\000\003\234\003\246\004\002\004\n\007n\000\000\000\000\000\000\002\186\000\000\000\000\003\254\000\000\000\000\000\000\b\218\b\222\b\234\b\254\000\000\005\182\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tr\000\000\000\000\000\000\000\000\000\000\000\000\015\166\t\150\n:\005\194\005\198\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\202\b\242\000\000\000\000\001\210\t\n\004\138\nN\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\230\000\000\003\234\003\246\004\002\004\n\007n\000\000\000\000\000\000\002\186\000\000\000\000\003\254\000\000\000\000\000\000\b\218\b\222\b\234\b\254\000\000\005\182\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tr\000\000\000\000\000\000\000\000\000\000\000\000\015\202\t\150\n:\005\194\005\198\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\202\b\242\000\000\000\000\001\210\t\n\004\138\nN\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\230\000\000\003\234\003\246\004\002\004\n\007n\000\000\000\000\000\000\002\186\000\000\000\000\003\254\000\000\000\000\000\000\b\218\b\222\b\234\b\254\000\000\005\182\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tr\000\000\000\000\000\000\000\000\000\000\000\000\015\246\t\150\n:\005\194\005\198\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\202\b\242\000\000\000\000\001\210\t\n\004\138\nN\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\230\000\000\003\234\003\246\004\002\004\n\007n\000\000\000\000\000\000\002\186\000\000\000\000\003\254\000\000\000\000\000\000\b\218\b\222\b\234\b\254\000\000\005\182\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tr\000\000\000\000\000\000\000\000\000\000\000\000\016\026\t\150\n:\005\194\005\198\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\202\b\242\000\000\000\000\001\210\t\n\004\138\nN\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\230\000\000\003\234\003\246\004\002\004\n\007n\000\000\000\000\000\000\002\186\000\000\000\000\003\254\000\000\000\000\000\000\b\218\b\222\b\234\b\254\000\000\005\182\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tr\000\000\000\000\000\000\000\000\000\000\000\000\016>\t\150\n:\005\194\005\198\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\202\b\242\000\000\000\000\001\210\t\n\004\138\nN\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\230\000\000\003\234\003\246\004\002\004\n\007n\000\000\000\000\000\000\002\186\000\000\000\000\003\254\000\000\000\000\000\000\b\218\b\222\b\234\b\254\000\000\005\182\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tr\000\000\000\000\000\000\000\000\000\000\000\000\016Z\t\150\n:\005\194\005\198\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\202\b\242\000\000\000\000\001\210\t\n\004\138\nN\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\230\000\000\003\234\003\246\004\002\004\n\007n\000\000\000\000\000\000\002\186\000\000\000\000\003\254\000\000\000\000\000\000\b\218\b\222\b\234\b\254\000\000\005\182\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tr\000\000\000\000\000\000\000\000\000\000\000\000\016\250\t\150\n:\005\194\005\198\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\202\b\242\000\000\000\000\001\210\t\n\004\138\nN\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\230\000\000\003\234\003\246\004\002\004\n\007n\000\000\000\000\000\000\002\186\000\000\000\000\003\254\000\000\000\000\000\000\b\218\b\222\b\234\b\254\000\000\005\182\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tr\000\000\000\000\000\000\000\000\000\000\000\000\017\014\t\150\n:\005\194\005\198\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\202\b\242\000\000\000\000\001\210\t\n\004\138\nN\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\230\000\000\003\234\003\246\004\002\004\n\007n\000\000\000\000\000\000\002\186\000\000\000\000\003\254\000\000\000\000\000\000\b\218\b\222\b\234\b\254\000\000\005\182\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tr\000\000\000\000\000\000\000\000\000\000\000\000\017*\t\150\n:\005\194\005\198\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\246\000\000\000\000\002\202\r\201\r\201\000\000\000\000\000\000\r\201\005\202\b\242\r\201 >\000\000\t\n\004\138\nN\000\000\003v\004\162\000\000\r\201\r\201\r\201\000\000\r\201\r\201\r\201\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\020\162\000\000\000\000\r\201\000\000\000\000\000\000\000\000\000\000\r\201\r\201\000\000\028v\r\201\000\000\021\006\000\000\000\000\000\000\000\000\021\030\r\201\000\000\000\000\r\201\000\000\000\000\000\000\000\000\r\201\r\201\r\201\000\000\000\000\000\000\000\000\021&\000\000\r\201\r\201\031\238\000\000\000\000\000\000\000\000\r\201\000\000\000\000\000\000\r\201\021:\021v\r\201\000\000\005a\000\000\000\000\000\000\000\000\r\201\r\201\r\201\000\000\r\201\r\201\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025\182\000\000\r\201\000\000\r\201\r\201\000\000\000\000\000\000\r\201\000\000\000\000\000\000\000\000\r\201\000\000\012-\000\000\r\201\012-\r\201\r\201\003\022\002\198\000\000\000\241\002\146\000\000\007>\000\000\000\241\002\254\000\000\000\000\000\000\012-\012-\000\000\012-\012-\000\000\001\210\000\000\007^\000\000\000\000\000\000\000\000\003\026\000\241\000\000\t\162\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012-\000\000\003&\000\000\000\000\000\000\000\000\000\000\0032\001\190\000\000\000\000\000\241\000\000\000\000\002\186\000\000\003\018\004\014\000\000\000\000\012-\004\018\000\241\004\026\005\170\t\222\005\182\000\241\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\241\000\241\005\186\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\194\005\198\000\000\006\n\012-\000\000\012-\000\000\000\000\006\022\000\000\000\000\000\000\000\000\000\000\000\000\000\241\000\000\000\000\012-\000\000\000\000\012-\012-\000\000\005\202\000\241\012-\000\000\012-\000\000\004\138\012)\012-\000\000\012)\000\000\000\000\003\022\002\198\000\000\000\000\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\012)\012)\000\000\012)\012)\000\000\001\210\000\000\000\000\000\000\000\000\000\000\000\000\003\026\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012)\000\000\003&\000\000\000\000\000\000\000\000\000\000\006^\001\190\000\000\000\000\000\000\000\000\000\000\002\186\000\000\000\000\004\014\000\000\000\000\012)\004\018\000\000\004\026\005\170\000\000\005\182\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\186\000\000\003\209\003\209\000\000\000\000\000\000\003\209\005\194\005\198\003\209\006\n\012)\000\000\012)\000\000\000\000\006\022\000\000\000\000\003\209\003\209\003\209\000\000\003\209\003\209\003\209\012)\000\000\000\000\012)\012)\000\000\005\202\000\000\012)\000\000\012)\003\209\004\138\000\000\012)\000\000\000\000\003\209\004\154\000\000\000\000\003\209\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\209\000\000\000\000\003\209\000\000\000\000\000\000\000\000\003\209\003\209\003\209\000\000\000\000\000\000\000\000\000\000\000\000\003\209\003\209\000\000\000\000\000\000\000\000\000\000\003\209\000\000\000\000\000\000\003\209\000\000\000\000\003\209\000\000\000\000\000\000\000\000\000\000\000\000\003\209\003\209\003\209\000\000\003\209\003\209\001\193\001\193\000\000\000\000\000\000\001\193\000\000\000\000\001\193\003\209\000\000\003\209\003\209\000\000\000\000\000\000\003\209\000\000\001\193\001\193\001\193\003\209\001\193\001\193\001\193\003\209\000\000\003\209\003\209\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\193\000\000\000\000\000\000\000\000\000\000\001\193\001\193\000\000\000\000\001\193\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\193\000\000\000\000\001\193\000\000\000\000\000\000\000\000\001\193\001\193\001\193\000\000\000\000\000\000\000\000\000\000\000\000\001\193\001\193\000\000\000\000\000\000\000\000\000\000\001\193\000\000\000\000\000\000\001\193\000\000\000\000\001\193\000\000\000\000\000\000\000\000\000\000\000\000\001\193\001\193\001\193\000\000\001\193\001\193\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\193\000\000\001\193\001\193\003\022\002\198\000\000\001\193\002\146\000\000\007>\000\000\001\193\002\254\000\000\000\000\005\006\000\000\001\193\000\000\000\000\000\000\000\000\001\210\000\000\007^\000\000\000\000\000\000\000\000\003\026\000\000\000\000\t\162\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003&\000\000\000\000\000\000\000\000\000\000\t\206\001\190\000\000\000\000\000\000\000\000\000\000\002\186\000\000\000\000\004\014\000\000\000\000\012\005\004\018\000\000\004\026\000\000\t\222\005\182\000\000\000\000\000\000\000\000\006U\006U\000\000\000\000\004\209\006U\000\000\005\186\006U\000\000\000\000\000\000\000\000\000\000\000\000\005\194\005\198\000\000\006U\r\150\006U\000\000\006U\000\000\006U\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\005\000\000\006U\012\005\012\005\000\000\005\202\000\000\006U\006U\012\005\000\000\004\138\000\000\012\005\004\209\000\000\006U\000\000\000\000\006U\000\000\001\006\006U\000\000\000\000\000\000\000\000\006U\006U\006U\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\n\000\000\000\000\000\000\002\158\000\000\006U\006U\000\000\000\000\006U\000\000\000\000\001\014\001\018\001\022\001\026\001\030\001\"\000\000\006U\006U\006U\000\000\006U\006U\001&\000\000\001.\0012\000\000\bV\000\000\000\000\000\000\000\000\000\000\0016\006U\000\000\001:\006U\006U\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006U\000\000\000\000\000\000\001>\001B\001F\001J\001N\000\000\000\000\000\000\001R\000\000\000\000\000\000\001V\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001Z\004\025\004\025\004\025\004\025\000\000\004\025\001^\004\025\004\025\000\000\004\025\000\000\000\000\000\000\000\000\000\000\001\154\031\002\004\025\000\000\004\025\000\000\004\025\001\158\004\025\001\162\004\025\000\000\000\000\001\166\000\000\001\170\001\174\000\000\000\000\000\000\004\025\000\000\004\025\000\000\000\000\000\000\004\025\004\025\004\025\004\025\000\000\000\000\000\000\000\000\000\000\005\209\000\000\005\213\004\025\000\000\004\025\004\025\000\000\004\025\000\000\000\000\004\025\004\025\004\025\004\025\004\025\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\025\000\000\004\025\000\000\004\025\000\000\004\025\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\025\004\025\004\025\004\025\004\025\004\025\004\025\004\025\000\000\000\000\000\000\005\209\000\000\005\213\000\000\000\000\000\000\000\000\004\025\004\025\004\025\004\025\004\025\000\000\004\025\000\000\006I\006I\000\000\000\000\000\000\006I\000\000\004\025\006I\004\025\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006I\000\000\006I\000\000\006I\000\000\006I\000\000\000\000\b\157\000\000\000\000\b\157\000\000\000\000\000\000\000\000\000\000\006I\000\000\000\000\000\000\000\000\000\000\006I\006I\000\000\000\000\b\157\b\157\000\000\b\157\b\157\b\158\000\000\000\000\006I\000\000\000\000\006I\000\000\000\000\000\000\000\000\006I\006I\000\238\000\000\000\000\000\000\000\000\000\000\b\157\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006I\006I\000\000\000\000\006I\000\000\000\000\n1\000\000\000\000\000\000\000\000\000\000\b\157\006I\006I\006I\000\000\006I\006I\000\000\000\000\000\000\011B\000\000\000\000\014\190\n1\000\000\n1\n1\000\000\006I\000\000\000\000\006I\006I\011\170\011\242\012\n\011\194\012\"\000\000\b\157\000\000\b\157\000\000\006I\000\000\000\000\000\000\012:\012R\000\000\000\000\000\000\000\000\000\000\006B\000\000\000\000\b\157\b\157\012j\000\000\000\000\b\157\000\000\b\157\000\000\000\000\000\238\b\157\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011Z\011\218\012\130\012\154\012\202\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\226\000\000\000\000\000\000\000\000\001\006\000\000\000\000\000\000\012\250\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\n\000\000\000\000\rZ\000\000\rr\012\178\000\000\000\000\000\000\000\000\n1\r\018\001\014\001\018\001\022\001\026\001\030\001\"\000\000\r*\rB\000\000\000\000\000\000\000\000\001&\000\000\001.\0012\000\000\005%\000\000\000\000\000\000\000\000\005%\0016\000\000\005%\001:\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005%\000\000\000\000\000\000\005%\000\000\005%\000\000\001>\001B\001F\001J\001N\000\000\000\000\000\000\001R\000\000\005%\000\000\001V\000\000\000\000\000\000\005%\000\000\000\000\000\000\000\000\001Z\t\149\t\149\000\000\004Z\000\000\t\149\001^\000\000\t\149\005%\000\000\000\000\000\000\000\000\005%\002\234\001\154\031\030\t\149\000\000\t\149\000\000\t\149\001\158\t\149\001\162\000\000\000\000\000\000\001\166\005%\001\170\001\174\000\000\000\000\000\000\t\149\000\000\000\000\000\000\000\000\000\000\t\149\t\149\005%\005%\000\000\000\000\005%\005%\000\000\000\000\000\000\000\000\t\149\004j\000\000\t\149\000\000\007\238\000\000\000\000\t\149\t\149\t\149\000\000\005%\000\000\000\000\000\000\000\000\0256\000\000\000\000\000\000\000\000\000\000\005%\t\149\000\000\000\000\000\000\t\149\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\149\t\149\t\149\000\000\t\149\t\149\014\145\014\145\000\000\000\000\000\000\014\145\000\000\000\000\014\145\t\149\000\000\000\000\t\149\000\000\000\000\000\000\t\149\000\000\014\145\000\000\014\145\000\000\014\145\000\000\014\145\005\006\000\000\t\149\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\145\000\000\000\000\000\000\000\000\000\000\014\145\014\145\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004Z\000\000\000\000\014\145\000\000\000\000\014\145\000\000\000\000\000\000\000\000\014\145\014\145\014\145\014\149\014\149\000\000\000\000\000\000\014\149\000\000\000\000\014\149\000\000\000\000\000\000\000\000\014\145\000\000\000\000\000\000\014\145\014\149\000\000\014\149\000\000\014\149\000\000\014\149\000\000\000\000\014\145\014\145\014\145\000\000\014\145\014\145\000\000\000\000\000\000\014\149\000\000\004j\000\000\000\000\000\000\014\149\014\149\000\000\014\145\000\000\000\000\000\000\014\145\000\000\004Z\000\000\000\000\014\149\000\000\000\000\014\149\000\000\000\000\014\145\000\000\014\149\014\149\014\149\001\177\000\000\000\000\000\000\000\000\001\177\000\000\001\206\001\177\000\000\000\000\000\000\000\000\014\149\000\000\000\000\t\253\014\149\001\177\000\000\000\000\000\000\001\177\000\000\001\177\000\000\000\000\014\149\014\149\014\149\000\000\014\149\014\149\000\000\000\000\000\000\001\177\000\000\004j\000\000\000\000\000\000\001\177\001\177\000\000\014\149\000\000\000\000\000\000\014\149\000\000\000\000\002\170\000\000\001\177\000\000\000\000\001\177\000\000\000\000\014\149\000\000\001\177\001\177\001\177\000\000\000\000\005\021\000\000\000\000\000\000\000\000\005\021\000\000\000\000\005\021\000\000\000\000\001\177\001\177\000\000\000\000\004\230\000\000\000\000\005\021\000\000\000\000\000\000\005\021\000\000\005\021\001\177\001\177\003\253\000\000\001\177\001\177\000\000\003\253\000\000\001\206\003\253\005\021\000\000\000\000\000\000\001\177\000\000\005\021\t\249\000\000\003\253\000\000\001\177\000\000\003\253\000\000\003\253\001\177\000\000\005\021\000\000\000\000\005\021\001\177\000\000\000\000\000\000\005\021\003\253\000\000\000\000\000\000\000\000\000\000\003\253\001\173\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\021\002\170\000\000\003\253\005\021\000\000\003\253\000\000\000\000\000\000\000\000\003\253\003\253\003\253\005\021\005\021\000\000\000\000\005\021\005\021\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\253\003\253\000\000\000\000\004\230\000\000\000\000\000\000\000\000\005\021\000\000\000\000\000\000\000\000\003\253\003\253\003\249\000\000\003\253\003\253\024\210\003\249\000\000\001\206\003\249\000\000\000\000\000\000\000\000\003\253\000\000\000\000\t\249\000\000\003\249\000\000\003\253\000\000\003\249\000\000\003\249\003\253\000\000\000\000\000\000\000\000\000\000\003\253\000\000\000\000\000\000\000\000\003\249\000\000\000\000\000\000\000\000\000\000\003\249\001\173\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\170\000\000\003\249\000\000\000\000\003\249\000\000\000\000\000\000\000\000\003\249\003\249\003\249\000\000\000\153\000\000\000\000\000\000\000\000\000\153\000\000\000\000\000\153\000\000\000\000\000\000\003\249\003\249\000\000\000\000\004\230\000\000\000\153\000\000\000\153\000\000\000\153\000\000\000\153\000\000\003\249\003\249\000\000\000\000\003\249\003\249\000\000\000\000\000\000\000\000\000\153\000\000\000\000\000\000\000\000\003\249\000\153\000\000\000\000\000\000\000\153\000\000\003\249\000\000\000\000\000\000\000\000\003\249\000\153\000\000\000\000\000\153\000\000\003\249\000\000\000\000\000\153\000\153\000\238\000\000\000\000\000\000\000\000\000\000\000\000\000\153\000\153\000\000\000\000\000\000\000\000\000\000\000\153\000\000\000\221\000\000\000\153\000\000\000\000\000\221\000\000\000\000\000\221\000\000\000\000\000\000\000\153\000\153\000\000\000\000\000\153\000\153\000\221\000\000\000\221\000\000\000\221\000\000\000\221\000\000\000\000\000\153\000\000\000\000\000\000\000\000\000\000\000\153\000\153\000\000\000\221\000\000\000\000\000\000\000\000\000\000\000\221\000\153\000\000\000\153\000\221\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\221\000\000\000\000\000\221\000\000\000\000\000\000\000\000\000\221\000\221\000\238\000\000\000\000\000\000\000\000\000\000\000\000\000\221\000\221\000\000\000\000\000\000\000\000\000\000\000\221\000\000\000\161\000\000\000\221\000\000\000\000\000\161\000\000\000\000\000\161\000\000\000\000\000\000\000\221\000\221\000\000\000\000\000\221\000\221\000\161\000\000\000\161\000\000\000\161\000\000\000\161\000\000\000\000\000\221\000\000\000\000\000\000\000\000\000\000\000\221\000\221\000\000\000\161\000\000\000\000\000\000\000\000\000\000\000\161\000\221\000\000\000\221\000\161\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\161\000\000\000\000\000\161\000\000\000\000\000\000\000\000\000\161\000\161\000\238\000\000\000\000\000\000\000\000\000\000\000\000\000\161\000\161\000\000\000\000\000\000\000\000\000\000\000\161\000\000\000\157\000\000\000\161\000\000\000\000\000\157\000\000\000\000\000\157\000\000\000\000\000\000\000\161\000\161\000\000\000\000\000\161\000\161\000\157\000\000\000\157\000\000\000\157\000\000\000\157\000\000\000\000\000\161\000\000\000\000\000\000\000\000\000\000\000\161\000\161\000\000\000\157\000\000\000\000\000\000\000\000\000\000\000\157\000\161\000\000\000\161\000\157\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\157\000\000\000\000\000\157\000\000\000\000\000\000\000\000\000\157\000\157\000\238\000\000\000\000\000\000\000\000\000\000\000\000\000\157\000\157\000\000\000\000\000\000\000\000\000\000\000\157\000\000\001\141\000\000\000\157\000\000\000\000\001\141\000\000\000\000\001\141\000\000\000\000\000\000\000\157\000\157\000\000\000\000\000\157\000\157\001\141\000\000\000\000\000\000\001\141\000\000\001\141\000\000\000\000\000\157\000\246\000\000\000\000\002\202\000\000\000\157\000\157\000\000\001\141\001\141\000\000\000\000\000\000\005Y\001\141\000\157\000\000\000\157\000\000\003v\014\141\014\141\000\000\005\209\000\000\014\141\001\141\000\000\014\141\001\141\000\000\003\130\000\000\000\000\001\141\001\141\001\141\020\162\014\141\000\000\014\141\000\000\014\141\000\000\014\141\000\000\000\000\000\000\000\000\028v\001\141\000\000\021\006\000\000\001\141\000\000\014\141\021\030\000\000\000\000\000\000\000\000\014\141\014\141\001\141\001\141\000\000\000\000\001\141\001\141\000\000\000\000\000\000\021&\014\141\005\209\000\000\014\141\000\000\001\141\000\000\000\000\014\141\014\141\014\141\001\141\001\141\021:\021v\000\000\000\000\001\141\000\000\000\000\000\000\000\000\000\000\001\141\014\141\000\000\000\000\000\000\014\141\000\000\000\000\000\000\000\000\000\000\000\000\025\182\000\000\000\000\014\141\014\141\014\141\000\000\014\141\014\141\014\137\014\137\000\000\000\000\000\000\014\137\000\000\000\000\014\137\000\000\000\000\000\000\014\141\000\000\000\000\000\000\014\141\000\000\014\137\000\000\014\137\000\000\014\137\000\000\014\137\005\006\000\000\014\141\r\169\000\000\000\000\r\169\000\000\000\000\000\000\000\000\014\137\000\000\000\000\000\000\000\000\r\169\014\137\014\137\000\000\000\000\000\000\r\169\000\000\000\000\000\000\000\000\000\000\000\000\014\137\000\000\000\000\014\137\000\000\r\169\000\000\000\000\014\137\014\137\014\137\r\169\t\153\t\153\000\000\000\000\000\000\t\153\000\000\000\000\t\153\000\000\000\000\r\169\014\137\000\000\r\169\000\000\014\137\000\000\t\153\r\169\t\153\000\000\t\153\000\000\t\153\000\000\014\137\014\137\014\137\000\000\014\137\014\137\000\000\000\000\000\000\r\169\t\153\000\000\000\000\r\169\000\000\007\238\t\153\t\153\014\137\000\000\000\000\000\000\014\137\r\169\r\169\000\000\000\000\r\169\t\153\000\000\000\000\t\153\000\000\014\137\031\230\000\000\t\153\t\153\000\238\000\000\000\000\000\000\000\000\000\000\000\000\r\169\000\000\000\000\000\000\000\000\000\000\000\000\t\153\000\000\000\000\000\000\t\153\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\153\t\153\t\153\000\000\t\153\t\153\000\000\000\000\003\022\002\198\000\000\000\000\002\146\000\000\007>\t\153\000\000\002\254\t\153\000\000\000\000\000\000\t\153\000\000\000\000\000\000\000\000\001\210\000\000\007^\000\000\000\000\000\000\t\153\003\026\000\000\000\000\t\162\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\189\000\000\003&\000\000\000\000\000\000\000\000\000\000\t\206\001\190\000\000\000\000\007\229\000\000\000\000\002\186\000\000\000\000\004\014\000\000\000\000\000\000\004\018\000\000\004\026\000\000\t\222\005\182\011B\000\000\000\000\007\229\000\000\000\000\000\000\007\229\000\000\000\000\000\000\005\186\000\000\000\000\011\170\011\242\012\n\011\194\012\"\005\194\005\198\000\000\000\000\003\189\000\000\000\000\000\000\000\000\012:\012R\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\189\012j\000\000\003\189\000\000\005\202\000\000\000\000\000\000\000\238\000\000\004\138\000\000\000\000\000\000\000\000\000\000\000\000\011Z\011\218\012\130\012\154\012\202\000\000\000\000\000\000\001\173\000\000\000\000\007\229\012\226\001\173\000\000\001\206\001\173\000\000\000\000\000\000\000\000\012\250\000\000\000\000\t\249\000\000\001\173\000\000\000\000\000\000\001\173\000\000\001\173\000\000\000\000\000\000\rZ\000\000\rr\012\178\000\000\000\000\000\000\000\000\001\173\r\018\000\000\000\000\000\000\000\000\001\173\000\000\000\000\r*\rB\000\000\000\000\000\000\000\000\000\000\002\170\000\000\001\173\000\000\020V\001\173\000\000\000\000\000\000\000\000\001\173\001\173\001\173\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011B\000\000\000\000\000\000\020Z\000\000\001\173\001\173\000\000\000\000\004\230\000\000\000\000\000\000\011\170\011\242\012\n\011\194\012\"\000\000\001\173\001\173\000\000\000\000\001\173\001\173\000\000\000\000\012:\012R\000\000\000\000\000\000\000\000\000\000\001\173\000\000\000\000\000\000\000\000\012j\000\000\001\173\000\000\000\000\000\000\000\000\001\173\000\238\000\000\000\000\000\000\000\000\001\173\000\000\000\000\000\000\011Z\011\218\012\130\012\154\012\202\000\000\000\000\000\000\005-\000\000\000\000\000\000\012\226\000\246\001\202\001\206\002\"\000\000\000\000\000\000\000\000\012\250\000\000\000\000\000\000\000\000\021\182\000\000\000\000\000\000\005-\000\000\003v\001\210\001\250\001\230\rZ\020^\rr\012\178\020n\000\000\000\000\001\242\021\186\r\018\000\000\000\000\000\000\000\000\021\226\000\000\000\000\r*\rB\000\000\000\000\000\000\000\000\001\246\002\162\000\000\000\000\000\000\002\174\021\006\002\186\0046\004B\000\000\021\030\000\000\000\000\004N\006\137\006\137\000\000\000\000\000\000\006\137\000\000\000\000\006\137\000\000\000\000\000\000\022\130\000\000\000\000\000\000\004R\000\000\006\137\000\000\006\137\000\000\006\137\000\000\006\137\000\000\021:\022\150\000\000\000\000\005-\005-\000\000\000\000\000\000\000\000\006\137\000\000\000\000\000\000\000\000\000\000\006\137\006\137\000\000\000\000\000\000\000\000\022\166\000\000\000\000\b\158\000\000\004\134\006\137\004\138\000\000\006\137\000\000\000\000\000\000\000\000\006\137\006\137\000\238\006\133\007\194\000\000\000\000\000\000\006\133\000\000\000\000\006\133\000\000\000\000\000\000\000\000\006\137\000\000\000\000\000\000\006\137\006\133\000\000\006\133\000\000\006\133\000\000\006\133\000\000\000\000\006\137\006\137\006\137\000\000\006\137\006\137\000\000\000\000\000\000\006\133\000\000\000\000\000\000\000\000\000\000\006\133\bB\000\000\006\137\000\000\000\000\000\000\006\137\000\000\000\000\000\000\000\000\006\133\000\000\000\000\006\133\000\000\000\000\006\137\000\000\006\133\006\133\000\238\014\153\014\153\000\000\000\000\000\000\014\153\000\000\000\000\014\153\000\000\000\000\000\000\000\000\006\133\000\000\000\000\000\000\006\133\014\153\000\000\014\153\000\000\014\153\000\000\014\153\000\000\000\000\006\133\006\133\006\133\000\000\006\133\006\133\000\000\000\000\000\000\014\153\000\000\000\000\000\000\000\000\000\000\014\153\014\153\000\000\006\133\000\000\000\000\000\000\006\133\000\000\000\000\000\000\000\000\014\153\000\000\000\000\014\153\000\000\000\000\006\133\000\000\014\153\014\153\000\238\014\157\014\157\000\000\000\000\000\000\014\157\000\000\000\000\014\157\000\000\000\000\000\000\000\000\014\153\000\000\000\000\000\000\014\153\014\157\000\000\014\157\000\000\014\157\000\000\014\157\000\000\000\000\014\153\014\153\014\153\000\000\014\153\014\153\000\000\000\000\000\000\014\157\000\000\000\000\000\000\000\000\000\000\014\157\bB\000\000\014\153\000\000\000\000\000\000\014\153\000\000\000\000\000\000\000\000\014\157\000\000\000\000\014\157\000\000\000\000\014\153\000\000\014\157\014\157\000\238\006\157\007\194\000\000\000\000\000\000\006\157\000\000\000\000\006\157\000\000\000\000\000\000\000\000\014\157\000\000\000\000\000\000\014\157\006\157\000\000\006\157\000\000\006\157\000\000\006\157\000\000\000\000\014\157\014\157\014\157\000\000\014\157\014\157\000\000\000\000\000\000\006\157\000\000\000\000\000\000\000\000\000\000\006\157\bB\000\000\014\157\000\000\000\000\000\000\014\157\000\000\000\000\000\000\000\000\006\157\000\000\000\000\006\157\000\000\000\000\014\157\000\000\006\157\006\157\000\238\006\161\006\161\000\000\000\000\000\000\006\161\000\000\000\000\006\161\000\000\000\000\000\000\000\000\006\157\000\000\000\000\000\000\006\157\006\161\000\000\006\161\000\000\006\161\000\000\006\161\000\000\000\000\006\157\006\157\006\157\000\000\006\157\006\157\000\000\000\000\000\000\006\161\000\000\000\000\000\000\000\000\000\000\006\161\006\161\000\000\006\157\000\000\000\000\000\000\006\157\000\000\000\000\000\000\000\000\006\161\000\000\000\000\006\161\000\000\000\000\006\157\000\000\006\161\006\161\006\161\006\129\007\194\000\000\000\000\000\000\006\129\000\000\000\000\006\129\000\000\000\000\000\000\000\000\006\161\000\000\000\000\000\000\006\161\006\129\000\000\006\129\000\000\006\129\000\000\006\129\000\000\000\000\006\161\006\161\006\161\000\000\006\161\006\161\000\000\000\000\000\000\006\129\000\000\000\000\000\000\000\000\000\000\006\129\bB\000\000\006\161\000\000\000\000\000\000\006\161\000\000\000\000\000\000\000\000\006\129\000\000\000\000\006\129\000\000\000\000\bj\000\000\006\129\006\129\000\238\003\245\000\000\000\000\000\000\000\000\003\245\000\000\001\206\003\245\000\000\000\000\000\000\000\000\006\129\000\000\000\000\000\000\006\129\003\245\000\000\000\000\000\000\003\245\000\000\003\245\000\000\000\000\006\129\006\129\006\129\000\000\006\129\006\129\000\000\000\000\000\000\003\245\000\000\000\000\000\000\000\000\000\000\003\245\000\000\000\000\006\129\000\000\000\000\003\241\006\129\000\000\000\000\002\170\003\241\003\245\001\206\003\241\003\245\000\000\000\000\006\129\000\000\003\245\003\245\003\245\000\000\003\241\000\000\000\000\000\000\003\241\000\000\003\241\000\000\000\000\000\000\000\000\000\000\003\245\003\245\000\000\000\000\004\230\000\000\003\241\000\000\000\000\000\000\000\000\000\000\003\241\000\000\003\245\003\245\000\000\000\000\003\245\003\245\000\000\000\000\002\170\000\000\003\241\000\000\000\000\003\241\000\000\003\245\000\000\000\000\003\241\003\241\003\241\000\000\003\245\0011\000\000\000\000\000\000\003\245\0011\000\000\000\000\0011\000\000\003\245\003\241\003\241\000\000\000\000\004\230\000\000\000\000\0011\000\000\0011\000\000\0011\000\000\0011\003\241\003\241\000\000\000\000\003\241\003\241\000\000\000\000\000\000\000\000\000\000\0011\000\000\000\000\000\000\003\241\000\000\0011\007\237\000\000\000\000\0011\003\241\007\237\000\000\000\000\007\237\003\241\000\000\0011\000\000\000\000\0011\003\241\000\000\000\000\007\237\0011\0011\000\238\007\237\001-\007\237\000\000\000\000\000\000\001-\0011\000\000\001-\000\000\000\000\000\000\0011\007\237\000\000\000\000\0011\000\000\001-\007\237\001-\000\000\001-\000\000\001-\000\000\0011\0011\0011\000\000\0011\0011\000\000\000\000\007\237\000\000\001-\000\000\000\000\007\237\007\237\0011\001-\000\000\000\000\000\000\001-\000\000\0011\000\000\000\000\000\000\000\000\000\000\001-\007\237\000\000\001-\000\000\0011\000\000\000\000\001-\001-\000\238\000\000\000\000\000\000\000\000\007\237\007\237\020\182\001-\007\237\007\237\000\000\000\000\000\000\001-\000\000\000\000\000\000\001-\000\000\000\000\000\000\000\000\000\000\021\246\000\000\000\000\007\237\001-\001-\001-\001i\001-\001-\000\000\000\000\001i\000\000\r\233\001i\000\000\000\000\000\000\001-\000\000\000\000\000\000\r\233\000\000\001i\001-\001i\000\000\001i\000\000\001i\000\000\000\000\000\000\000\000\000\000\001-\000\000\000\000\000\000\000\000\000\000\001i\000\000\000\000\000\000\000\000\000\000\001i\r\233\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\r\233\000\000\000\000\000\000\000\000\001i\000\000\000\000\000\000\000\000\001i\001i\001i\001\029\000\000\000\000\000\000\000\000\001\029\000\000\002\025\001\029\000\000\000\000\000\000\000\000\001i\000\000\000\000\002\025\r\233\001\029\000\000\001\029\000\000\001\029\000\000\001\029\000\000\000\000\001i\001i\001i\000\000\001i\001i\000\000\000\000\000\000\001\029\000\000\000\000\000\000\000\000\000\000\001\029\002\025\000\000\000\000\000\000\000\000\001\185\001i\000\000\000\000\002\025\001\185\000\000\018\178\001\185\001\029\002\146\000\000\001i\000\000\001\029\001\029\001\029\000\000\001\185\000\000\000\000\000\000\001\185\000\000\001\185\000\000\000\000\000\000\000\000\000\000\001\029\000\000\000\000\000\000\002\025\000\000\001\185\000\000\000\000\000\000\000\000\000\000\001\185\000\000\001\029\001\029\001\029\000\000\001\029\001\029\000\000\018\182\000\000\000\000\001\185\000\000\000\000\001\185\000\000\000\000\000\000\0075\001\185\001\185\000\000\018\194\001\029\000\000\002\198\000\000\000\000\002\146\000\000\000\000\000\000\000\000\002\254\001\029\001\185\000\000\000\000\0075\001\185\000\000\000\000\000\000\001\210\000\000\000\000\000\000\003\002\005\198\001\185\001\185\000\000\000\000\001\185\001\185\000\000\003\006\000\000\003\166\000\000\000\000\000\000\000\000\000\000\001\185\003\226\003\230\000\000\000\000\003\246\001\190\001\185\000\000\000\000\000\000\000\000\002\186\000\000\000\000\003\254\000\000\000\000\001\185\b\218\b\222\b\234\000\000\000\000\005\182\000\000\006\002\000\000\000\000\000\000\000\000\000\000\003\022\002\198\000\000\000\000\002\146\000\000\007>\000\000\000\000\002\254\000\000\000\000\005\194\005\198\006\006\000\000\004\022\000\000\000\000\001\210\000\000\007^\000\000\000\000\000\000\000\000\003\026\000\000\000\000\t\162\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\202\b\242\003&\000\000\000\000\t\n\004\138\000\000\0032\001\190\000\000\000\000\000\000\000\000\000\000\002\186\000\000\000\000\004\014\000\000\000\000\000\000\004\018\000\000\004\026\005\170\t\222\005\182\000\000\000\000\nY\000\000\000\000\000\000\000\000\000\000\003\022\002\198\000\000\005\186\002\146\000\000\007>\000\000\000\000\002\254\000\000\005\194\005\198\000\000\006\n\025\206\nY\000\000\000\000\001\210\006\022\007^\000\000\000\000\000\000\000\000\003\026\000\000\000\000\t\162\000\000\000\000\000\000\006\214\028*\000\000\005\202\027^\007*\003&\t\138\000\000\004\138\000\000\000\000\0032\001\190\000\000\000\000\000\000\000\000\000\000\002\186\000\000\000\000\004\014\000\000\000\000\000\000\004\018\000\000\004\026\005\170\t\222\005\182\000\000\000\000\000\000\000\000\000\000\000\000\002\001\002\001\000\000\000\000\002\001\005\186\000\000\000\000\000\000\002\001\000\000\000\000\000\000\005\194\005\198\000\000\006\n\000\000\000\000\002\001\000\000\000\000\006\022\000\000\000\000\000\000\002\001\000\n\000\000\005%\000\000\000\000\000\000\000\000\005%\000\000\000\000\005%\005\202\002\001\nY\000\000\000\000\000\000\004\138\002\001\002\001\005%\000\000\000\000\000\000\005%\002\001\005%\000\000\002\001\000\000\000\000\002\001\002\001\000\000\002\001\002\001\000\000\002\001\005%\000\000\000\000\000\000\000\000\000\000\005%\000\000\000\000\000\000\005%\002\001\000\000\000\000\000\000\000\000\000\000\000\000\005%\002\001\002\001\005%\002\001\000\000\000\000\000\000\005%\002\234\002\001\000\000\000\000\000\000\000\000\000\000\000\000\005%\005%\000\000\000\000\000\000\000\000\000\000\005%\005%\002\001\000\000\005%\000\000\002\001\000\000\002\001\000\000\007]\000\000\000\000\000\000\005%\005%\000\000\002\198\005%\005%\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\005%\007]\000\000\000\000\000\000\000\000\001\210\005%\000\000\000\000\003\002\000\000\029R\000\000\000\000\000\000\000\000\000\000\005%\003\006\000\000\003\166\000\000\000\000\000\000\000\000\000\000\000\000\003\226\003\230\000\000\000\000\003\246\001\190\000\000\000\000\000\000\000\000\000\000\002\186\000\000\000\000\003\254\000\000\000\000\000\000\b\218\b\222\b\234\000\000\000\000\005\182\t%\000\000\000\000\000\000\000\000\t%\000\000\000\000\t%\000\000\000\000\000\000\000\000\000\000\000\000\001\202\001\206\000\000\t%\005\194\005\198\000\000\t%\000\000\t%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\210\001\250\t%\000\000\000\000\000\000\000\000\000\000\t%\000\000\005\202\b\242\t%\000\000\000\000\t\n\004\138\000\000\000\000\000\000\t%\000\000\000\000\t%\000\000\000\000\001\246\002\170\t%\t%\000\238\002\174\000\000\002\186\0046\004B\000\000\t%\t%\000\000\004N\000\000\018\206\000\000\t%\000\000\t!\000\000\t%\000\000\000\000\t!\000\000\000\000\t!\000\000\000\000\004R\t%\t%\t%\000\000\t%\t%\t!\000\000\000\000\000\000\t!\003\233\t!\000\000\000\000\t%\003\233\000\000\000\000\003\233\000\000\000\000\t%\000\000\t!\000\000\000\000\000\000\000\000\003\233\t!\000\000\000\000\003\233\t!\003\233\000\000\000\000\000\000\000\000\000\000\000\000\t!\000\000\000\000\t!\000\000\003\233\018\202\000\000\t!\t!\000\238\003\233\000\000\000\000\000\000\000\000\000\000\t!\t!\000\000\000\000\000\000\000\000\003\233\t!\000\000\003\233\000\000\t!\000\000\000\000\003\233\003\233\003\233\000\000\000\000\000\000\000\000\t!\t!\t!\000\000\t!\t!\000\000\000\000\000\000\003\233\000\000\000\000\000\000\003\233\000\000\t!\000\000\000\000\000\000\000\000\000\000\000\000\t!\003\233\003\233\029Z\000\000\003\233\003\233\000\000\000\000\000\000\000\000\003\022\002\198\000\000\000\000\002\146\003\233\007>\000\000\000\000\002\254\000\000\019*\003\233\000\000\000\000\000\000\000\000\003\233\000\000\001\210\000\000\007^\000\000\003\233\000\000\000\000\003\026\000\000\000\000\t\162\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003&\000\000\000\000\000\000\000\000\000\000\t\206\001\190\000\000\000\000\007\185\007\185\000\000\002\186\000\000\000\000\004\014\000\000\000\000\000\000\004\018\000\000\004\026\000\000\t\222\005\182\004F\000\000\000\000\007\185\007\185\007\185\003\022\002\198\000\000\000\000\002\146\005\186\007>\007\185\000\000\002\254\000\000\000\000\000\000\005\194\005\198\000\000\000\000\r\150\000\000\001\210\000\000\007^\000\000\007\185\007\185\000\000\003\026\000\000\007\185\t\162\007\185\007\185\007\185\000\000\000\000\000\000\026f\007\185\005\202\003&\000\000\000\000\000\000\000\000\004\138\t\206\001\190\000\000\000\000\000\000\000\000\000\000\002\186\000\000\007\185\004\014\000\000\000\000\000\000\004\018\000\000\004\026\000\000\t\222\005\182\000\000\000\000\000\000\000\000\000\000\000\000\005\r\005\r\000\000\000\000\005\r\005\186\000\000\000\000\000\000\005\r\000\000\000\000\000\000\005\194\005\198\005\r\000\000\r\150\000\000\005\r\004:\000\000\007\185\000\000\000\000\000\000\005\r\027\022\000\000\000\000\027.\000\000\000\000\000\000\000\000\000\000\026\198\000\000\005\202\005\r\000\000\000\000\000\000\000\000\004\138\005\r\005\r\000\000\007\181\007\181\000\000\000\000\005\r\000\000\000\000\005\r\000\000\000\000\000\238\005\r\000\000\005\r\005\r\000\000\005\r\0292\000\000\007\181\007\181\007\181\000\000\003\022\002\198\000\000\000\000\002\146\005\r\007\181\000\000\000\000\002\254\000\000\000\000\000\000\005\r\005\r\000\000\006\238\000\000\000\000\001\210\000\000\000\000\007\181\007\181\000\000\000\000\003\026\007\181\000\000\007\181\007\181\007\181\003\233\000\000\000\000\000\000\007\181\003\233\005\r\003&\003\233\000\000\000\000\000\000\005\r\0032\001\190\000\000\000\000\000\000\003\233\000\000\002\186\007\181\003\233\004\014\003\233\000\000\000\000\004\018\000\000\004\026\005\170\000\000\005\182\000\000\000\000\000\000\003\233\018\202\000\000\000\000\000\000\000\000\003\233\000\000\005\186\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\194\005\198\003\233\006\n\000\000\003\233\000\000\000\000\000\000\006\022\003\233\003\233\003\233\005>\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\202\003\233\000\000\r\225\t\138\003\233\004\138\000\000\r\225\000\000\000\000\r\225\000\000\000\000\000\000\003\233\003\233\029\138\000\000\003\233\003\233\r\225\000\000\000\000\006\162\r\225\000\000\r\225\000\000\000\000\001\202\001\206\000\000\005\201\000\000\000\000\019*\003\233\000\000\r\225\000\000\000\000\003\233\000\000\000\000\r\225\000\000\000\000\000\000\001\210\001\250\001\230\000\000\000\000\000\000\000\000\000\000\r\225\000\000\001\242\r\225\000\000\006N\000\000\000\000\r\225\r\225\000\000\003\022\002\198\000\000\000\000\002\146\000\000\000\000\001\246\002\162\002\254\000\000\000\000\002\174\r\225\002\186\0046\004B\r\225\000\000\001\210\000\000\004N\000\000\000\000\000\000\000\000\003\026\r\225\r\225\002\138\000\000\r\225\r\225\000\000\000\000\000\000\000\000\000\000\004R\003&\000\000\000\000\r\225\000\000\000\000\0032\001\190\000\000\000\000\r\225\000\000\000\000\002\186\000\000\000\000\004\014\000\000\000\000\000\000\004\018\r\225\004\026\005\170\000\000\005\182\006\150\000\000\000\000\000\000\000\000\000\000\003\022\002\198\000\000\000\000\002\146\005\186\000\000\000\000\000\000\002\254\000\000\000\000\000\000\005\194\005\198\000\000\006\n\000\000\000\000\001\210\000\000\000\000\006\022\000\000\000\000\000\000\003\026\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\202\003&\000\000\000\000\000\000\006\182\004\138\0032\001\190\000\000\000\000\003\022\002\198\000\000\002\186\002\146\000\000\004\014\000\000\000\000\002\254\004\018\000\000\004\026\005\170\000\000\005\182\000\000\000\000\000\000\001\210\000\000\000\000\000\000\000\000\000\000\000\000\003\026\005\186\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\194\005\198\000\000\006\n\003&\000\000\000\000\000\000\014&\006\022\0032\001\190\000\000\000\000\003\022\002\198\000\000\002\186\002\146\000\000\004\014\000\000\000\000\002\254\004\018\005\202\004\026\005\170\000\000\005\182\000\000\004\138\000\000\001\210\000\000\000\000\000\000\000\000\000\000\000\000\003\026\005\186\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\194\005\198\000\000\006\n\003&\000\000\000\000\000\000\0142\006\022\0032\001\190\000\000\000\000\003\022\002\198\000\000\002\186\002\146\000\000\004\014\000\000\000\000\002\254\004\018\005\202\004\026\005\170\000\000\005\182\000\000\004\138\000\000\001\210\000\000\000\000\000\000\000\000\000\000\000\000\003\026\005\186\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\194\005\198\000\000\006\n\003&\000\000\000\000\000\000\014>\006\022\0032\001\190\000\000\000\000\003\022\002\198\000\000\002\186\002\146\000\000\004\014\000\000\000\000\002\254\004\018\005\202\004\026\005\170\000\000\005\182\000\000\004\138\000\000\001\210\000\000\000\000\000\000\000\000\000\000\000\000\003\026\005\186\000\000\000\000\000\000\000\000\006!\000\000\000\000\005\194\005\198\006!\006\n\003&\006!\000\000\000\000\000\000\006\022\0032\001\190\000\000\000\000\000\000\006!\000\000\002\186\000\000\006!\004\014\006!\000\000\000\000\004\018\005\202\004\026\005\170\000\000\005\182\000\000\004\138\000\000\006!\000\000\000\000\000\000\000\000\000\000\006!\000\000\005\186\000\000\000\000\000\000\000\000\000\000\000\000\b\158\005\194\005\198\006!\006\n\000\000\006!\000\000\000\000\000\000\006\022\006!\006!\000\238\000\000\006)\000\000\000\000\000\000\000\000\006)\000\000\000\000\006)\000\000\000\000\005\202\006!\006!\000\000\000\000\006!\004\138\006)\000\000\000\000\000\000\006)\000\000\006)\000\000\006!\006!\000\000\000\000\006!\006!\000\000\000\000\000\000\000\000\006)\000\000\000\000\000\000\000\000\000\000\006)\000\000\000\000\000\000\000\000\000\000\006!\000\000\000\000\b\158\000\000\003\233\006)\000\000\000\000\006)\003\233\006!\000\000\003\233\006)\006)\000\238\000\000\000\000\000\000\000\000\000\000\000\000\003\233\000\000\000\000\000\000\003\233\006\229\003\233\006)\006)\000\000\006\229\006)\000\000\006\229\000\000\000\000\000\000\000\000\003\233\018\202\000\000\006)\006)\006\229\003\233\006)\006)\006\229\000\000\006\229\000\000\000\000\000\000\000\000\000\000\000\000\003\233\000\000\000\000\003\233\000\000\006\229\000\000\006)\003\233\003\233\003\233\006\229\000\000\000\000\000\000\000\000\000\000\000\000\006)\000\000\000\000\000\000\000\000\006\229\003\233\000\000\006\229\000\000\003\233\000\000\000\000\006\229\006\229\000\238\000\000\000\000\000\000\000\000\003\233\003\233\021\134\000\000\003\233\003\233\000\000\000\000\000\000\006\229\000\000\r\225\000\000\006\229\000\000\000\000\r\225\000\000\000\000\r\225\000\000\019*\003\233\006\229\006\229\025Z\000\000\006\229\006\229\r\225\000\000\000\000\000\000\r\225\000\000\r\225\000\000\000\000\006\229\000\000\000\000\005\201\000\000\000\000\000\000\006\229\000\000\r\225\000\000\000\000\000\000\000\000\000\000\r\225\000\000\000\000\006\229\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0079\000\000\000\000\r\225\000\000\000\000\003\022\002\198\r\225\r\225\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\0079\000\000\000\000\000\000\r\225\001\210\000\000\000\000\000\000\000\000\000\000\000\000\003\026\000\000\000\000\000\000\000\000\000\000\r\225\r\225\002\138\000\000\r\225\r\225\000\000\003&\000\000\000\000\000\000\000\000\000\000\0032\001\190\r\225\000\000\000\000\000\000\030F\002\186\000\000\r\225\004\014\000\000\000\000\000\000\004\018\000\000\004\026\005\170\000\000\005\182\r\225\000\000\000\000\000\000\007\241\007\194\000\000\000\000\000\000\007\241\000\000\005\186\007\241\000\000\000\000\000\000\000\000\000\000\000\000\005\194\005\198\000\000\007\241\000\000\000\000\000\000\007\241\001\189\007\241\000\000\000\000\000\000\001\189\000\000\000\000\001\189\000\000\000\000\000\000\000\000\007\241\000\000\000\000\000\000\005\202\001\189\007\241\bB\000\000\001\189\004\138\001\189\000\000\000\000\000\000\000\000\000\000\000\000\007\241\000\000\000\000\007\241\000\000\001\189\000\000\000\000\007\241\007\241\000\238\001\189\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\r\225\001\189\007\241\000\000\001\189\r\225\007\241\000\000\r\225\001\189\001\189\000\000\000\000\000\000\000\000\000\000\007\241\007\241\r\225\000\000\007\241\007\241\r\225\006\233\r\225\001\189\000\000\000\000\006\233\001\189\005\201\006\233\000\000\000\000\000\000\000\000\r\225\000\000\007\241\001\189\001\189\006\233\r\225\001\189\001\189\006\233\000\000\006\233\000\000\000\000\000\000\000\000\000\000\000\000\001\189\000\000\000\000\r\225\000\000\006\233\000\000\001\189\r\225\r\225\000\000\006\233\0256\000\000\000\000\000\000\000\000\000\000\001\189\000\000\000\000\000\000\000\000\006\233\r\225\000\000\006\233\000\000\000\000\000\000\000\000\006\233\006\233\000\238\000\000\000\000\000\000\000\000\r\225\r\225\002\138\000\000\r\225\r\225\000\000\000\000\000\000\006\233\000\000\000\000\000\000\006\233\000\000\r\225\000\000\000\000\000\000\030~\000\000\000\000\r\225\006\233\006\233\000\000\000\000\006\233\006\233\r\153\000\000\002\198\r\153\r\225\031\246\000\000\000\000\000\000\006\233\031\250\000\000\000\000\r\153\000\000\000\000\006\233\000\000\005%\r\153\000\000\000\000\000\000\005%\000\000\000\000\005%\006\233\000\000\000\000\000\000\r\153\000\000\000\000\000\000\000\000\005%\r\153\000\000\000\000\005%\000\000\005%\000\000\000\000\000\000\001\002\001\190\000\000\r\153\000\000\000\000\r\153\000\000\005%\000\000\000\000\r\153\000\000\005%\005%\000\000\005%\000\000\000\000\031\254\000\000\000\000\000\000\b\158\000\000\000\000\005%\r\153\000\000\005%\005%\r\153\005%\000\000\005%\002\234\000\238\000\000\000\000\000\000 \002\r\153\r\153\000\000\005%\r\153\000\000\000\000\000\000\000\000\005%\005%\007\194\000\000\005%\000\000\005%\tU\tU\005%\000\000\tU\000\000\r\153\005%\005%\tU\000\000\005%\005%\005%\002\234\019r\005%\000\000\005%\tU\000\000\000\000\007\238\000\000\000\000\000\000\tU\000\000\000\000\005%\005%\000\000\000\000\000\000\000\000\000\000\005%\bB\000\000\tU\005%\000\000\000\000\005%\005%\tU\tU\005%\005%\000\000\000\000\005%\tU\000\000\bV\tU\005%\002\234\000\238\tU\000\000\tU\tU\000\000\tU\005%\000\000\000\000\000\000\000\000\000\000\000\000\005%\000\000\001U\000\000\tU\000\000\000\000\001U\000\000\000\000\001U\000\000\tU\tU\005%\005%\000\000\000\000\005%\005%\001U\000\000\001U\000\000\001U\000\000\001U\000\209\000\000\000\000\000\000\000\000\000\209\000\000\000\000\000\209\005%\tU\001U\000\000\000\000\000\000\000\000\tU\001U\000\209\000\000\005%\000\000\000\209\000\213\000\209\000\000\000\000\000\000\000\213\000\000\000\000\000\213\001U\000\000\000\000\000\000\000\209\001U\001U\000\238\000\000\000\213\000\209\000\000\000\000\000\213\000\000\000\213\000\000\000\000\000\000\000\000\000\000\001U\000\209\000\000\000\000\000\209\000\000\000\213\000\000\000\000\000\209\000\209\000\238\000\213\000\000\001U\001U\001U\000\000\001U\001U\000\000\000\000\000\000\000\000\000\213\000\209\000\000\000\213\000\000\000\209\000\000\000\000\000\213\000\213\000\238\000\000\001U\000\000\000\000\000\209\000\209\000\000\000\000\000\209\000\209\000\000\000\000\001U\000\213\000\000\000\000\000\000\000\213\000\000\001\202\002\142\000\000\000\000\002\146\000\000\000\000\000\209\000\213\000\213\000\000\000\000\000\213\000\213\000\000\000\000\000\000\000\000\000\209\001\210\001\250\001\230\002\150\000\000\000\000\000\000\000\000\000\000\000\000\001\242\000\213\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\213\000\000\000\000\000\000\002\154\002\162\000\000\001\202\001\206\002\174\000\000\002\186\0046\004B\007\237\000\000\000\000\000\000\025\014\007\237\025\018\000\000\007\237\000\000\000\000\000\000\001\210\001\250\000\000\000\000\000\000\000\000\007\237\000\000\000\000\004R\007\237\000\000\007\237\000\000\000\000\000\000\000\000\000\000\005\198\000\000\000\000\000\000\000\000\000\000\007\237\000\000\001\246\002\178\000\000\025\030\007\237\002\174\000\000\002\186\0046\004B\000\000\000\000\000\000\000\000\004N\000\000\007\237\000\000\000\000\007\237\025\"\006\221\000\000\000\000\007\237\007\237\006\221\000\000\000\000\006\221\000\000\004R\000\000\000\000\029\234\000\000\021b\000\000\000\000\006\221\007\237\000\000\000\000\006\221\007\237\006\221\000\000\000\000\000\000\000\000\000\000\029\214\000\000\000\000\007\237\007\237\020\182\006\221\007\237\007\237\000\000\000\000\000\000\006\221\0061\007\194\000\000\000\000\000\000\0061\000\000\000\000\0061\000\000\000\000\006\221\007\237\000\000\006\221\000\000\000\000\000\000\0061\006\221\006\221\000\000\0061\000\000\0061\000\000\000\000\001\202\002\142\000\000\000\000\002\146\000\000\000\000\000\000\006\221\0061\000\000\000\000\006\221\000\000\000\000\0061\bB\000\000\000\000\001\210\001\250\001\230\006\221\006\221\000\000\000\000\006\221\006\221\000\000\001\242\0061\000\000\000\000\000\000\000\000\0061\0061\000\238\000\000\000\000\000\000\000\000\000\000\000\000\006\221\002\154\002\162\000\000\001\202\001\206\002\174\0061\002\186\0046\004B\004\229\000\000\000\000\000\000\025\014\004\229\030*\000\000\004\229\000\000\0061\0061\001\210\001\250\0061\0061\000\000\000\000\004\229\000\000\000\000\004R\004\229\000\000\004\229\000\000\000\000\000\000\000\000\000\000\005\198\000\000\0061\000\000\000\000\000\000\004\229\000\000\001\246\002\178\000\000\0306\004\229\002\174\000\000\002\186\0046\004B\000\000\000\000\000\000\000\000\004N\000\000\004\229\000\000\000\000\004\229\025\"\n\170\000\000\000\000\004\229\000\000\000\000\001\202\001\206\000\000\000\000\004R\000\000\000\000\005\153\000\000\000\000\000\000\000\000\000\000\004\229\002\158\000\000\000\000\004\229\000\000\001\210\001\250\001\230\000\000\000\000\029\214\000\000\000\000\004\229\004\229\001\242\000\000\004\229\004\229\005\005\000\000\000\000\002\002\000\000\005\005\000\000\000\000\005\005\000\000\000\000\000\000\001\246\002\162\000\000\000\000\004\229\002\174\005\005\002\186\0046\004B\005\005\004\237\005\005\000\000\004N\028J\004\237\000\000\000\000\004\237\000\000\000\000\000\000\000\000\005\005\000\000\000\000\000\000\000\000\004\237\005\005\004R\000\000\004\237\005\029\004\237\000\000\000\000\000\000\005\029\000\000\000\000\005\029\000\000\000\000\005\005\000\000\004\237\000\000\000\000\005\005\000\000\005\029\004\237\000\000\000\000\005\029\000\000\005\029\000\000\000\000\018\186\000\000\000\000\000\000\000\000\005\005\000\000\004\237\000\000\005\029\000\000\000\000\004\237\000\000\000\000\005\029\000\000\000\000\000\000\005\005\005\005\000\000\000\000\005\005\005\005\000\000\000\000\000\000\004\237\000\000\005\029\000\000\n\182\000\000\000\000\005\029\000\000\000\000\001\202\001\206\000\000\005\005\004\237\004\237\000\000\000\000\004\237\004\237\000\000\000\000\000\000\005\029\0222\000\000\004\022\000\000\000\000\001\210\001\250\001\230\000\000\000\000\000\000\000\000\004\237\005\029\005\029\001\242\000\000\005\029\005\029\0059\000\000\000\000\000\000\024z\000\246\000\000\000\000\002\202\000\000\000\000\000\000\001\246\002\162\000\000\000\000\005\029\002\174\003r\002\186\0046\004B\0059\000\000\003v\b\181\004N\024\250\b\181\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\130\000\000\000\000\000\000\000\000\000\000\020\162\004R\b\181\b\181\000\000\b\181\b\181\000\000\000\000\000\000\000\000\000\000\028v\000\000\000\000\021\006\000\000\000\000\000\000\000\000\021\030\000\000\b\137\000\000\000\000\b\137\b\181\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\021&\000\000\004\134\000\000\004\138\b\137\b\137\000\000\b\137\b\137\000\000\000\238\000\000\000\000\021:\021v\000\000\000\000\0059\0059\000\000\000\000\000\000\000\000\000\000\b\185\000\000\000\000\b\185\b\137\000\000\000\000\000\000\000\000\000\000\000\000\025\182\000\000\000\000\000\000\000\000\b\181\000\000\b\181\b\185\b\185\000\000\b\185\b\185\000\000\b\137\000\000\000\000\000\000\000\000\000\000\b\181\000\000\000\000\006J\b\181\000\000\000\000\000\000\b\181\000\000\b\181\000\000\b\185\000\000\b\181\b\165\000\000\000\000\b\165\000\000\000\000\001\202\001\206\000\000\b\137\000\000\b\137\000\000\000\000\000\000\000\000\000\000\000\000\000\238\b\165\b\165\000\000\b\165\b\165\b\137\001\210\001\250\006J\b\137\000\000\000\000\000\000\b\137\000\000\b\137\000\000\000\000\000\000\b\137\000\000\000\000\000\000\000\000\b\165\000\000\000\000\000\000\000\000\b\185\000\000\b\185\001\246\002\178\000\000\000\000\000\000\002\174\000\000\002\186\0046\004B\000\000\000\000\b\185\000\238\004N\006J\b\185\000\000\000\000\000\000\b\185\000\000\b\185\000\000\000\000\000\000\b\185\000\000\001\202\001\206\000\000\004R\000\000\000\000\005\157\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\165\000\000\b\165\000\000\001\210\001\250\001\230\000\000\029\214\000\000\000\000\000\000\000\000\000\000\001\242\006\146\000\000\022\214\006J\b\165\000\000\014\161\014\161\b\165\000\000\b\165\000\000\000\000\000\000\b\165\001\246\024.\000\000\023N\000\000\002\174\000\000\002\186\0046\004B\014\161\014\161\014\161\007\214\024>\000\000\000\000\000\000\000\000\000\000\014\161\000\000\000\000\000\000\000\000\000\000\000\000\001\202\001\206\026j\000\000\004R\000\000\000\000\000\000\000\000\014\161\014\161\000\000\000\000\000\000\014\161\000\000\014\161\014\161\014\161\001\210\001\214\001\230\000\000\014\161\000\000\000\000\000\000\000\000\000\000\001\242\000\000\000\000\000\000\000\000\000\000\000\000\001\202\001\206\026\202\000\000\014\161\000\000\000\000\000\000\000\000\001\246\002\162\001\202\001\206\000\000\002\174\000\000\002\186\0046\004B\001\210\001\214\001\230\000\000\004N\000\000\000\000\000\000\000\000\000\000\001\242\001\210\001\214\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004R\000\000\000\000\000\000\000\000\001\246\002\162\000\000\000\000\000\000\002\174\000\000\002\186\0046\004B\000\000\001\246\002\170\000\000\004N\000\000\002\174\000\000\002\186\0046\004B\000\000\000\000\000\000\000\000\004N\000\000\018\206\000\000\000\000\000\000\004R\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004R")) + ((16, "z\218\133\n\129v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\021\248\129v\000\000\000\000\021\000\129vz\218\003F\005F\0003\187\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\232\001\136\000\242\000\000\001\170\b\136\000\000\000\172\002\b\t\136\000\000\003$\002~\n\136\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\012\000\000\000\000\000\000\003\"\131\186\000\000\000\000\000\000\005\014\000\000\000\000\182j\004\006\003\196\000\000\000\000\180\176\005\014\000\000\133\n\021\000\129@\188@\004\176\000\000\021\000\141:\132\236\021\000\134d\000\000\001\022\000\000\134d\001\192\000\000xZ\000\000\001l\000\000\000\000\003\232\000\000\005\014\000\000\000\000\000\000\005P\000\000xZ\000\000\006\014\224\148\232\022\198\000\000\000\233\134\180\176\000\000\139v\229l\000\000\217H\026\184\131\186\129vz\218\000\000\000\000\132\236\021\000\135\220\134d\006j\224\148\000\000\230.\129vz\218\133\n\021\000\000\000\006\160\006V\000*\137\024\000\000\221n\000\000\142X\221n\000\000\142X\204\018\003\014\007\004\003*\000\000\004\228\000\000\007\014\000\000\000\000\007\014\000\000\000\000\000\000\142X\005\014\000\000\000\000\184\230\137\024\229l\007P\137\024\000\000\t\004\027\214\180\176\000\000\000\000\000\000\000\000\000\000\000\000\000F\000\000\000\000\175\156\237\248\139\128\229l\176\154\003\014\000\000\000\000\183B\238@\139\132\229l\177\152\178\150\179\148\185\170\007x\005\014\000\000\000\000\000\000\000\000\000\000\000\000\bJ\000\000\142X\000\000\001\b\215\158\000\000\137\024\006\b\137\024}T\000\000\021\000\000\000}v\000\000\007\b\nJ\000\000\0074\142X\n\216\000\000\011\030\000\000\004J\000\000\000\000\006\230\000\000\000\000\000\000 \212\138\002\000\000{\130\137\024!\212\t&\t\216\140~\011\016\n\180\000*\011\012\000\000\000\000\000\000\017\000\127\208\021\000\143\146\180\134\000\000\012\016\011\234\011\166\137\024\007\136\012\236\214\012\012F\rd\012\240\137\024\007\234\000\000\000\000\004\158\000\000\000\000\006\158\000\000\000\000\127\132\022\140\021\188\002\248\000\007\000\000\000\000\002&\000\000\129@\r\200\014\004\021\000\023\238\021\000z\218z\218\000\000\000\000\000\000\145\250\132\236\021\000\023\238\014\216\000\000\175`\021\000\141:\023\228\020\160\007\230\000\000\011j\bV\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\000\000\000\133\n\021\000\000\000x\238\214\182\136\182\001\000\141\246\223f\012J\016\170\017$\137\024\t\234\0178\129\218\012\158\017\180\017\206\137\024\n\170\000\000\000\000\198v\198v\000\000\007\230\000\000\000\028\000\000\000\000\022\150\137\024)\212!(\180\134\133\n\021\000\129\218\000\000\003\014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\142\236\028\198\000\000\000\000\000\000\002\004\030\210\198v\000\000\000\000\129\218\017\228\215<\r\016\018^\018\020\137\024\n\228\000\000\000\000\129\218\000\000\000\000\000\000\000\000\133\n\021\000\180\134\129\218\000\000\018B\129\218\000\000\180\134\000\000\000\000\000\000\000\000\000\000\189b\215\202\rF\018\186\018H\137\024\n\234\000\000\000\000\129\218\000\000\000\000\190\224\216X\000\000\234\252\181z\127\132\003\170\003\170\000\000\019\016\129\218\000\000\024R\019*\000\000y\210\000\000\000\000\205\216\000\000\rJ\018\252\018\136\137\024\011&\000\000\000\000\129\218\000\000\000\000\235H\142X\000\000\011\136\000\000\000\000\216\230\000\000\235\206\003\160\000\000\000\000\000\000\000\000\000\000\236\020\019F\000\000|\158\000\000\000\000\213z\000\000\000\202\000\000\000\000|l\199\b\000\000\000\000\138>\020\160\022\146\025v\000\000\000\000\000\000\000\000\b8\000\000\000\000\129\218\000\000\000\000\000\000\028\"\217t\000\000\029\"\000\000\000\000\000\000\030\"\225P\r\142\019\014\018\150\137\024\011\170\000\000\000\000\129\218\000\000\000\000\031\"\018\174\225\136\r\158\0198\018\196\137\024\011\234\000\000\000\000\129\218\000\000\000\000\"\"\129\218\018\210\226\022\014\016\019F\018\206\137\024\012&\000\000\000\000\129\218\000\000\000\000#\"\186|\014F\019J\001\228\137\024\000\234\019\150\000\000\000\000\014J\019J\004\002\000\000\191$\146\182\132\236\021\000\023\238\000F\004\188\000\007\000\000\018\228\129@\193zx:\000F\004\188\004\188\129@\b\158\129@\000\000\206p\002^\134d\007\230\bV\2372\000\000\137\024\199\160\137\024\191\188\200\"\137\024\007\234\137\024\200\166\000\000\t\158\n\160\012\022\129@\206\242\000\000\t\210\b\160\188D\000\000\000\000\000\000\000\000\000\000\129@\207t\129@\207\246\021\002\003\014\192\128\bV\003\014\193\002\000\000\208x\002^\000\000\000\000\208\250\029\226\000\000\000\000\023\140\000\000\012\188\023\238\000\000\189,\175`\000\000\025z\000\000\000\000\129@\031\226\000\000\000\000\000\000\000\000\187\018\000\000\011X\000\000\137\160\0001\022J\143\216\022\238\131\206\133\n\021\000}\168\133\n\021\000\017\000\017\000\000\000\000\000\000\000\000\000\002\000\024\210y\228\000\000\133\198\134\130\132\236\021\000\023\238\005\228\129@\000\000\030\210\000\000\135>\135\250\223f\024F\137\024\n\228\000\000\017\000\0242\017\000\003\000\004\232\131X\133\n\021\000\000\000\201b\021\000\198v\180\134\025^\000\000\201b\021\000\130h\004F\000\000\180\134z\142\137\024\005\228\004\002\019\164\000\000\000\000\000\000\128x\003\170\019\170\000\000\129\218\000\000\000\000\201\240\000\000\000\000\n\204\229l\003\014\019\130\144\148\201b\021\000\198v \238\145P\014\142\019\140\000*\019\206\000\000\000\000\017\000\022\238\019\156\000\000\023\214\000\000\133\n\021\000\180\134$\"\000\000\133\n\021\000\017\000\023\238\000\000\000\000\000\000\000\000\146\012\201b\021\000\198v\000\000\000\000\017\000\014\158\019\158\000*\019\224\000\000\000\000\019\164\000\000\017\000\004\000\017\000\005\000\015\232\131X\201b\021\000\198vxv\131X\000\000!\238\146\200\015\016\019\170\000*\019\244\000\000\000\000\017\000\024\238\201b\021\000\198v\"\238\180\134\000\000\018\000\025\238\t:\000\000\000\000\000\000#\238\147\132\201b\021\000\198v$\238%\238\148@\201b\021\000\198v&\238'\238\000\000\019\000\026\238\148\252\201b\021\000\198v\000\000\000\000\000\000\129v\000\000\000\000\000\000\149\184\201b\021\000\198v(\238)\238\150t\201b\021\000\198v*\238+\238\1510\201b\021\000\198v,\238-\238\151\236\201b\021\000\198v.\238/\238\152\168\201b\021\000\198v0\2381\238\153d\201b\021\000\198v2\2383\238\154 \201b\021\000\198v4\2385\238\154\220\201b\021\000\198v6\2387\238\155\152\201b\021\000\198v8\2389\238\156T\201b\021\000\198v:\238;\238\157\016\201b\021\000\198v<\238=\238\157\204\201b\021\000\198v>\238?\238\158\136\201b\021\000\198v@\238A\238\159D\201b\021\000\198vB\238C\238\160\000\201b\021\000\198vD\238E\238\160\188\201b\021\000\198vF\238G\238\161x\201b\021\000\198vH\238I\238\1624\201b\021\000\198vJ\238K\238\162\240\015F\019\186\000*\020\002\000\000\000\000\017\000\027\238\201b\021\000\198vL\238M\238\163\172\201b\021\000\198vN\238O\238\021\000\223f\130h\000\000\000\000\131\186\003\170\019f\137\024\011\228\000\000\000\000\005\222\005\014\000\000\137\024\012L\000\000\000\000\019|\000\000\000\000\000\000\003\246\000\000\019\142\144\148\000\000\000\000\000\000\025F\137\024\012\228\000\000\000\000%\"\000\000\000\000\223\158\000\000\015J\019\230\019\130\137\024\r&\000\000\000\000\129\218\000\000\000\000&\"\218\002\000\000'\"\004\160\000\000\000\000\000\000\218H\218H\000\000\000\000\000\000P\238\189\214\132N\000\000\t*\000\000\006\000\164h\201b\021\000\198vQ\238R\238\131X\005\166\000\000\007\000\165$\201b\021\000\198vS\238T\238\131X\tJ\000\000\b\000\165\224\201b\021\000\198vU\238V\238\028\210\000\000\n\204\000\000\t\000\166\156\201b\021\000\198vW\238X\238\000\000\014\b\000\000\n\000\167X\201b\021\000\198vY\238Z\238\000\000\011\244\000\000\011\000\168\020\201b\021\000\198v[\238\\\238\011j\016\232\131X\r*\000\000\012\000\168\208\201b\021\000\198v]\238^\238\131X\014\012\000\000\r\000\169\140\201b\021\000\198v_\238`\238\131X\012\028\000\000\014\000\170H\201b\021\000\198va\238b\238\015\000\171\004\201b\021\000\198vc\238d\238\016\000\020\000\000\000\000\000\000\000\006\246\000\000\000\000\000\000\019\150\000\000\n\b\000\000\000\000\014\"\000\000\000\000\014\166\000\000\000\000\r\028\000\000\012j\017\232\131X\014*\000\000\131X\015\b\000\000\131X\015\028\000\000\000\000\201b\021\000\198ve\238f\238\000\000\020\024\000\000\000\000\000\000\000\000\000\000\000\000g\238\020\\\171\192\201b\021\000\198vh\238\172|\201b\021\000\198vi\238j\238k\238\1738\201b\021\000\198vl\238m\238\015*\000\000\131X\015\012\000\000\131X\015\198\000\000\173\244\015\158\020\016\000*\020`\000\000\000\000\017\000\028\238\201b\021\000\198vn\238o\238\000\000(\"\000\000\000\000\014\198\000\000\000\000\223f\000\000\000\000\218\240\016\012\000\000\000\000\137\160\000\000\015N\000\000\000\000\138\138\000\000\015\160\000\000\000\000\0001\rj\000\000\000\000\022\238\0242\007\230\000\000zZ\"(\026v\028&\000\000\000\000\016\028\000\000\000\000\002&\026\210\133x\000\000\029\238\000\000\012\198\000\000\000\000\016x\000\000\000\000\201b\021\000\198v\030L\202^\003\166\007d\000\000\000\000\014j\000\000\000\000\015\166\000\000\000\000\000\000\021\000\023\238\012X\000\000\000\000\021\188\002\248\000\007\006\228\023\238\226\\\135,\000\000\000L\023\238\226\198\020\004\000\000\000\000\006\228\000\000\023\230\020\196\021\192\000\000\015B\020~\000\000\020\132\003\234\229l\000\252\000\000\020\178\020Z\131\186\014T\137\024zv\020\226\016\152\020\226\000\000{\216\021d\000\000\000\252\000\000\000\000\021t\229l\193\132\000\000\203\000\237\192\015\222\229l\021B\229l\209|\194@\021D\229l\209\220\194\252\006\b\021\b\000\000\000\000\000\000\021\000\227<\000\000\223f\218H\000\000\000\000\021\176\000\000\000\000\000\000\201b\021\000\198vp\238q\238\000\000\017\012\000\000\000\000\000\000\132\236\021\000\023\238\003\228\000\000\142\212\000\000!$\000\000\000*\000\000\000\000\021\178\000\000\021\224\198vr\238\021\138\000\000\000\000\201b\021\000\198v\021\246\000\000\000\000\147r\000\000!\140\000\000\148.\000\000\021\000\000\000\129@\"$\000\000\203p\000\000\000\000\148\234\000\000\"\140\000\000\149\166\000\000\030\140\000\000\129@\"\210\000\000\230t\000\000\021\000\023\238\230t\000\000\030\020\023\228\020\160\005\014\232\144\129@\228\006\218H\000\000\002\248\005\248\000\007\006\228\218H\177b\002\248\000\007\006\228\218H\177b\000\000\000\000\006\228\218H\000\000\129vz\218\180\134\027\"\000\000\000\000\129vz\218\132\236\021\000\023\238\230t\000\000\003F\005F\0003\021,\131\186\016T\137\024\219~\021d\022\018\233\006\000\000\218H\000\000\220\030\023\230\020\196\021\192\224f\025T\015\206\002\n\016\162\021Z\021\000\218H\000\000\021\000\218H\000\000\204\018\236V\024b\000\246\002\248\003\014\218H\000\000\002\248\003\014\218H\000\000\031\020\023\228\020\160\005\014\210\184\129@\230z\000\000\002\248\006\162\024\188\003\176\000\000\218H\000\000\000\007\021\132\129@\230z\234\000\002\248\000\007\021\134\129@\230z\234\000\000\000\000\000\007H\005\190\000\000\230.\000\000\129@\233\\\218H\000\000\007\228\005\190\000\000\133\n\021\000\129@\230z\000\000\023\230\020\196\021\192\220Ly\172\027\184\020J\005\208\000\000\011JxZ\0028\000\000\022\006\021\206x\178\021\000{H\137\024\016\170\000\000\135\204\020\196\003\208\016\180\000\000\bJ\000\000\022(\021\184\137\024\145P\000\000\000>\001\208\t\234\000\000\bp\000\000\022:\021\212\131\186|\154\000\000\020\196x\178\022p\021^\002\248\000\000\015:x\178\137\024\015\254\003\014\000\000\137\024\005t\tt\000\000\000\000\210b\000\000\000\000\016fx\178\210\230\145P\000\000\021\000\137\024\015\228\137\024\130z|\154\000\000\014\198\000\000\000\000|\154\000\000\000\000\135\204\000\000\230.\178`\020J\005\208\011J\022Z\022\012x\178\230.\178`\000\000\000\000\020J\005\208\011J\022b\021\234\181\164\204\140\229l\022~\181\164\204\018\025t\022\128\181\164\229l\022\140\181\164\211\164\212&\000\000\231\026\000\000\000\000\218H\234V\020J\005\208\011J\022\140\022\020\181\164\218H\234V\000\000\000\000\000\000\236V\000\000\000\000\000\000\000\000\000\000\000\000\000\000\218H\000\000\179^\021\000~:\022\152\224\148\000\000\230.\179^\000\000\000\000\234\132\021\000~:\022\162\0222\232\022\221\252\000\252\022\244\000\000\000\000\212\134\220L\021\000\000\000\228d\021\192\000\000\000\000\230.\234\132\000\000\000\000\000\000\227\130~\172\174\194\000\252\022\246\000\000\000\000\000\000\220L\021\000\000\000\000\252\022\248\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011&y\172\020J\005\208\011J\022\204\221\012\138\180\021\000\143\146\140\198\021(\007\180\000\252\022\208\007\240\000\000\000\000\022\128\000\000\000\000\145P\000\000\006\208\017^\000\000\016J\000\000\022\240\022z\137\024\144\148\022\252\b\234\000\000\000\000\022\170\000\000\000\000\021D\000>\017>\000\000\023\014\221\154\216,\003\170\022\198\137\024\016\228\000\000\000\000\022\222\000\000\000\000\000\000\145P\000\000\004\252\017\160\000\000\017J\000\000\0234\022\188\131\186\000\000\0238\222(\216\186\003\170\022\222\137\024\017\228\000\000\000\000\022\254\000\000\000\000\000\000\021\000\000\000\145P\000\000\021\"\020\196\138\180\138\180\2136\129v\021\000\227<\223f\t\172\000\000\021j\002\248\000\000\017f\138\180\137\024\017\254\007\230\000\000\021\000\221\012\221\012\138\180\t~\138\180\000\000{\198|\180\000\000\195\128\000\000\000\000\196 \000\000\000\000\196\192\000\000\017\132\138\180\197`\227<\223f\t\172\000\000\005\136\000\000\000\000\181\164\016\204\000\000\000\000\142\254\023X\000\000\145P\000\000\138\180\142\254\145P\000\000\021\000\137\024\145P\000\000\016v\000\000\000\000\145P\000\000\000\000\140\198\000\000\231L\181\164\023\n\138\180\231z\221\012\000\000\218H\194\n\020J\005\208\011J\023\142\221\012\218H\194\n\000\000\000\000\000\000\234\238\191$\000\000\000\000\000\000\000\000\000\000\000\000\175\138\218H\000\000\179^\000\000\000\000\000\000\000\000\218H\234\238\000\000\000\000\000\000\175\138\023\212\000\000\023\214\000\000\218H\234\238\000\000\000\000\017J\000\000\000\000\205\014 \226\000\000\000\000\129\218\000\000\000\000\236\250\023,\222\182\017F\023\176\023@\137\024\018\132\000\000\000\000\129\218\000\000\000\000\237.|l\000\000\137\024\018\134\000\000\140\198\017\136\000\000\000\000\017\000\030\238\201b\021\000\198vs\238t\238\023J\174\176\018\016\023\208\000*\024\018\000\000\000\000\017\000\031\238\201b\021\000\198vu\238v\238\024>\213z\000\000w\238\024\"\000\000\000\000\024\026\027\166\028\166\021\192\220L\025T\021\000\000\000\218H\000\000\000\000\000\000\000\000\000\000\000\000\000\000\2246\025T\021\000\000\000\017j\224\148\000\000\230.\000\000\0246\027\166\028\166\218H\000\000\024H\000\000\006\206\r\246\021\000\222\138\000\000\000\000!\184\232v\000\000\000\000\023\204\000\000\024\"\137\024\000\000\020\158\237\248\184\"\137\024\000\000\017\204\t\014\003\014\000\000\000\000\137\024\b\228\t\228\137\024\012\228\000\252\024`\000\000\000\000\228\196\000\000\000\000\232\022\000\000\230.\000\000\024X\027\166\028\230\230.\000\000\000\000\000\000\000\000\018\164\229\\\232\022\000\000\230.\000\000\024b\027\166\028\230\230.\000\000\018\136\000\000\000\000#$\000\000\218H\000\000\024t\000\000\000\000\023\206\000\000\0188\000\000\000\000\023\236\000\000\000\000\192\018\023\244\000\000\000\000\031\230\187\130\024\146\000\000\000\000\000\000\018f\b\160\190\138\024\152\000\000\000\000\000\000\000\000\000\000\000\000\024$\000\000\025T\000\000\0242\000\000\137\024\000\000\018R\000\000\000\000\0244\000\000\000\000\003\014\000\000\r\254\000\000\000\000\000\000\016\254\000\000\023\238\000\000\nF\000\000\129@\000\000\026d\000\000\n\160\000\000\0246\000\000\180\134\026\"\000\000\000\000\t\158\024:\000\000\000\000\024<\011\158}\168\005\014\229\220\000\000\000\000\000\000\000\000\000\000\219$\000\000\000\000\024\236\000\000\213\192\000\000\018\208\024\244\000\000\025\000\000\000~\154~\154\184\016\184\016\000\000\000\000\205\202\184\016\000\000\000\000\000\000\205\202\184\016\024~\000\000\024\128\000\000"), (16, "\003\197\003\197\000\006\005Z\005^\003\197\002\198\002\202\003\197\002\246\002\150\003\197\003\002\003\197\006j\004\218\003\197\t\198\003\197\003\197\003\197\022\166\003\197\003\197\003\197\001\214\001\006\001\194\011\026\004\222\003\197\005\142\005\146\r\242\003\197\005\197\003\197\006n\004\226\t\250\005\186\022\170\003\197\003\197\005\230\005\234\003\197\005\238\005\242\003\197\005\246\006\002\006\014\006\022\t\166\003\182\003\197\003\197\002\190\005\197\020\242\006\n\003\197\003\197\003\197\011\018\011\022\011\"\0116\011\170\006\146\003\197\003\197\003\197\003\197\003\197\003\197\003\197\003\197\003\197\011\194\nz\003\197\005\197\003\197\003\197\005\197\011\206\011\230\012\158\006\158\006\162\003\197\003\197\003\197\000\242\003\197\003\197\003\197\000\242\003\197\bb\000\242\019J\003\197\001j\003\197\003\197\004-\003\197\003\197\003\197\003\197\003\197\003\197\006\166\011*\003\197\003\197\003\197\011B\003j\012\178\bf\003\197\003\197\003\197\003\197\015\129\015\129\002\001\003\014\021J\015\129\004\162\015\129\015\129\004Y\015\129\015\129\015\129\015\129\001.\015\129\015\129\015E\015\129\015\129\015\129\004M\015\129\015\129\015\129\015\129\005\197\015\129\000\n\015\129\015\129\015\129\015\129\015\129\015\129\015\129\015\129\015E\015\129\021\146\015\129\0042\015\129\015\129\015\129\015\129\015\129\015\129\015\129\015\129\007m\015\129\015\129\000\242\015\129\006\018\015\129\015\129\015\129\002\001\015M\015\129\015\129\015\129\015\129\015\129\015\129\015\129\000\242\015\129\015\129\015\129\015\129\015\129\015\129\015\129\015\129\015\129\015\129\015\129\015M\015\129\015\129\004Y\015\129\015\129\002V\001j\004-\005\197\015\129\015\129\015\129\015\129\015\129\001n\015\129\015\129\015\129\002Z\015\129\015\129\015I\015\129\015\129\001v\015\129\015\129\025\226\015\129\015\129\015\129\015\129\015\129\015\129\015\129\015\129\015\129\015\129\015\129\015\129\015\129\015I\005\197\015\129\015\129\015\129\015\129\001\153\001\153\001\153\002:\025\234\001\153\004U\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\134\001\153\t\225\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\005f\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\025\134\001\153\001\153\001\153\001\153\t\254\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\004U\001\153\001\153\001\153\001\153\001\153\001\150\001\153\002F\n:\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\t\130\001\153\001\153\001\153\011Z\001\153\006\214\001\153\001\153\024R\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\020\166\001\153\001\153\001\153\001\153\001\153\012\233\012\233\005\197\005\197\005j\012\233\001\186\012\233\012\233\002~\012\233\012\233\012\233\012\233\001\210\012\233\012\233\005\197\012\233\012\233\012\233\003>\012\233\012\233\012\233\012\233\001\190\012\233\001\210\012\233\012\233\012\233\012\233\012\233\012\233\012\233\012\233\001j\012\233\001f\012\233\004-\012\233\012\233\012\233\012\233\012\233\012\233\012\233\012\233\b\141\012\233\012\233\001~\012\233\001\142\012\233\012\233\012\233\002\174\000\242\012\233\012\233\012\233\012\233\012\233\012\233\012\233\000\n\012\233\012\233\012\233\012\233\012\233\012\233\012\233\012\233\012\233\012\233\012\233\b*\012\233\012\233\011\129\012\233\012\233\002\001\002\001\024\210\003\210\012\233\012\233\012\233\012\233\012\233\001\210\012\233\012\233\012\233\002\001\012\233\011\186\020\234\012\150\012\233\007\141\012\233\012\233\025\182\012\233\012\233\012\233\012\233\012\233\012\233\012\233\012\233\012\233\012\233\012\233\012\233\012\233\002b\012\233\012\233\012\233\012\233\012\233\004u\004u\001\202\001\006\001\194\004u\022\142\004u\004u\007\166\004u\004u\004u\004u\002f\004u\004u\025\190\004u\004u\004u\b\181\004u\004u\004u\004u\021\138\004u\007u\004u\004u\004u\004u\004u\004u\004u\004u\n\214\004u\011\129\004u\011\246\004u\004u\004u\004u\004u\004u\004u\004u\000\242\004u\004u\003\241\004u\001\238\004u\004u\004u\004\134\007\141\004u\004u\004u\004u\004u\004u\004u\003\241\004u\004u\004u\004u\004u\004u\004u\004u\004u\004u\004u\016\222\011\178\012\142\001\242\004u\004u\011\250\012\022\002\026\b\189\004u\004u\004u\004u\004u\t\162\004u\004u\004u\022\146\004u\011\186\021\234\012\150\004u\003\014\004u\004u\004\162\004u\004u\004u\004u\004u\004u\004u\004u\004u\004u\004u\004u\004u\004\138\004u\004u\004u\004u\004u\004e\004e\029^\001\006\001\194\004e\003F\004e\004e\t\230\004e\004e\004e\004e\001\222\004e\004e\t\194\004e\004e\004e\0052\004e\004e\004e\004e\029f\004e\004&\004e\004e\004e\004e\004e\004e\004e\004e\003:\004e\011\190\004e\0056\004e\004e\004e\004e\004e\004e\004e\004e\t\217\004e\004e\019\174\004e\019\186\004e\004e\004e\001\226\002z\004e\004e\004e\004e\004e\004e\004e\030z\004e\004e\004e\004e\004e\004e\004e\004e\004e\004e\004e\0115\011\178\012\142\017:\004e\004e\005\197\005\197\030~\003J\004e\004e\004e\004e\004e\025\026\004e\004e\004e\000\242\004e\011\186\002\202\012\150\004e\017>\004e\004e\025v\004e\004e\004e\004e\004e\004e\004e\004e\004e\004e\004e\004e\004e\000\242\004e\004e\004e\004e\004e\012I\012I\005Z\005^\000\242\012I\005\129\012I\012I\0166\012I\012I\012I\012I\001\210\012I\012I\023\142\012I\012I\012I\002~\012I\012I\012I\012I\005\197\012I\015\165\012I\012I\012I\012I\012I\012I\012I\012I\n\214\012I\0115\012I\015\165\012I\012I\012I\012I\012I\012I\012I\012I\000\242\012I\012I\030\130\012I\017\026\012I\012I\012I\002\138\001\210\012I\012I\012I\012I\012I\012I\012I\000\242\012I\012I\012I\012I\012I\012I\012I\012I\012I\012I\012I\005\129\012I\012I\005\197\012I\012I\016>\005Z\024\202\005\197\012I\012I\012I\012I\012I\003\n\012I\012I\012I\011~\012I\012I\024\222\012I\012I\002\226\012I\012I\028\210\012I\012I\012I\012I\012I\012I\012I\012I\012I\012I\012I\012I\012I\005\197\005\197\012I\012I\012I\012I\012Y\012Y\004B\003\006 J\012Y\018\178\012Y\012Y\004\146\012Y\012Y\012Y\012Y\003N\012Y\012Y\028\218\012Y\012Y\012Y\005>\012Y\012Y\012Y\012Y\011e\012Y\007m\012Y\012Y\012Y\012Y\012Y\012Y\012Y\012Y\t\194\012Y\000\242\012Y\005B\012Y\012Y\012Y\012Y\012Y\012Y\012Y\012Y\011\133\012Y\012Y\003:\012Y\017B\012Y\012Y\012Y\003Z\005\197\012Y\012Y\012Y\012Y\012Y\012Y\012Y\000\242\012Y\012Y\012Y\012Y\012Y\012Y\012Y\012Y\012Y\012Y\012Y\0216\012Y\012Y\003\134\012Y\012Y\004\002\t\194\005\n\011e\012Y\012Y\012Y\012Y\012Y\018\182\012Y\012Y\012Y\021>\012Y\012Y\011\026\012Y\012Y\003V\012Y\012Y\003j\012Y\012Y\012Y\012Y\012Y\012Y\012Y\012Y\012Y\012Y\012Y\012Y\012Y\002\202\011e\012Y\012Y\012Y\012Y\012Q\012Q\025\022\005\197\000\242\012Q\011\133\012Q\012Q\005&\012Q\012Q\012Q\012Q\005\197\012Q\012Q\004n\012Q\012Q\012Q\025&\012Q\012Q\012Q\012Q\000\242\012Q\b\158\012Q\012Q\012Q\012Q\012Q\012Q\012Q\012Q\t\194\012Q\005\198\012Q\025\194\012Q\012Q\012Q\012Q\012Q\012Q\012Q\012Q\005\210\012Q\012Q\000\242\012Q\017j\012Q\012Q\012Q\004\"\025\238\012Q\012Q\012Q\012Q\012Q\012Q\012Q\007\249\012Q\012Q\012Q\012Q\012Q\012Q\012Q\012Q\012Q\012Q\012Q\025:\012Q\012Q\n.\012Q\012Q\028\178\nZ\007\249\007y\012Q\012Q\012Q\012Q\012Q\005\214\012Q\012Q\012Q\025&\012Q\012Q\003\014\012Q\012Q\004\162\012Q\012Q\t\229\012Q\012Q\012Q\012Q\012Q\012Q\012Q\012Q\012Q\012Q\012Q\012Q\012Q\t\238\001z\012Q\012Q\012Q\012Q\012=\012=\t\194\"\138\001\226\012=\011Y\012=\012=\n\n\012=\012=\012=\012=\001\210\012=\012=\b\162\012=\012=\012=\017\018\012=\012=\012=\012=\n\018\012=\004&\012=\012=\012=\012=\012=\012=\012=\012=\017b\012=\004\186\012=\017\022\012=\012=\012=\012=\012=\012=\012=\012=\000\242\012=\012=\003:\012=\017\150\012=\012=\012=\002\174\017f\012=\012=\012=\012=\012=\012=\012=\b\001\012=\012=\012=\012=\012=\012=\012=\012=\012=\012=\012=\0111\012=\012=\028\250\012=\012=\002\202\n>\b\001!z\012=\012=\012=\012=\012=\011Y\012=\012=\012=\003\014\012=\012=\004\162\012=\012=\003\146\012=\012=\r\138\012=\012=\012=\012=\012=\012=\012=\012=\012=\012=\012=\012=\012=\000\242\001\138\012=\012=\012=\012=\012E\012E\001\006\001\194\018\202\012E\003\182\012E\012E\006.\012E\012E\012E\012E\030&\012E\012E\025\230\012E\012E\012E\002\238\012E\012E\012E\012E\016\002\012E\003:\012E\012E\012E\012E\012E\012E\012E\012E\005\221\012E\0111\012E\t\233\012E\012E\012E\012E\012E\012E\012E\012E\000\242\012E\012E\000\242\012E\017\190\012E\012E\012E\004f\016\002\012E\012E\012E\012E\012E\012E\012E\b\t\012E\012E\012E\012E\012E\012E\012E\012E\012E\012E\012E\nV\012E\012E\005\221\012E\012E\n\214\002\018\b\t\004\190\012E\012E\012E\012E\012E!\146\012E\012E\012E\000\242\012E\012E\017\142\012E\012E\006J\012E\012E\018\206\012E\012E\012E\012E\012E\012E\012E\012E\012E\012E\012E\012E\012E\017\146\001\154\012E\012E\012E\012E\012A\012A\004v#\015\001\226\012A\007\006\012A\012A\007v\012A\012A\012A\012A\004\202\012A\012A\b\137\012A\012A\012A\000\242\012A\012A\012A\012A\004\210\012A\011a\012A\012A\012A\012A\012A\012A\012A\012A\004~\012A\007\238\012A\t\181\012A\012A\012A\012A\012A\012A\012A\012A\000\242\012A\012A\000\242\012A\017\230\012A\012A\012A\004\198\004\214\012A\012A\012A\012A\012A\012A\012A\b\018\012A\012A\012A\012A\012A\012A\012A\012A\012A\012A\012A\011\166\012A\012A\000\242\012A\012A\005\210\012J\b\022\002!\012A\012A\012A\012A\012A\n\214\012A\012A\012A\004&\012A\012A\025~\012A\012A\b\238\012A\012A\000\242\012A\012A\012A\012A\012A\012A\012A\012A\012A\012A\012A\012A\012A\017\222\011\014\012A\012A\012A\012A\012M\012M\001\006\001\194\000\242\012M\004&\012M\012M\t\"\012M\012M\012M\012M\018^\012M\012M\017\226\012M\012M\012M\000\242\012M\012M\012M\012M\018\002\012M\005\206\012M\012M\012M\012M\012M\012M\012M\012M\018b\012M\tZ\012M\004\254\012M\012M\012M\012M\012M\012M\012M\012M\000\242\012M\012M\000\242\012M\018\022\012M\012M\012M\004\250\031\214\012M\012M\012M\012M\012M\012M\012M\005\002\012M\012M\012M\012M\012M\012M\012M\012M\012M\012M\012M\016*\012M\012M\000\242\012M\012M\005\022\005*\006\030\t\006\012M\012M\012M\012M\012M\n\214\012M\012M\012M\020\190\012M\012M\000\242\012M\012M\nF\012M\012M\000\242\012M\012M\012M\012M\012M\012M\012M\012M\012M\012M\012M\012M\012M\nr\021\030\012M\012M\012M\012M\012]\012]\006:\006N\016F\012]\011]\012]\012]\n\202\012]\012]\012]\012]\017\222\012]\012]\t\194\012]\012]\012]\018\014\012]\012]\012]\012]\018\246\012]\005\206\012]\012]\012]\012]\012]\012]\012]\012]\018\238\012]\016\182\012]\018\018\012]\012]\012]\012]\012]\012]\012]\012]\000\242\012]\012]\020f\012]\018>\012]\012]\012]\006\246\007\n\012]\012]\012]\012]\012]\012]\012]\020\194\012]\012]\012]\012]\012]\012]\012]\012]\012]\012]\012]\016\134\012]\012]\000\242\012]\012]\007f\007z\007\222\007\242\012]\012]\012]\012]\012]\011]\012]\012]\012]\005\014\012]\012]\005\026\012]\012]\005\030\012]\012]\005r\012]\012]\012]\012]\012]\012]\012]\012]\012]\012]\012]\012]\012]\b\222\b\242\012]\012]\012]\012]\012U\012U\t\018\t&\017\182\012U\0186\012U\012U\020j\012U\012U\012U\012U!*\012U\012U\017\142\012U\012U\012U\018\014\012U\012U\012U\012U\017\186\012U\018:\012U\012U\012U\012U\012U\012U\012U\012U\018\214\012U\005v\012U\019\002\012U\012U\012U\012U\012U\012U\012U\012U\003:\012U\012U\020\250\012U\018f\012U\012U\012U\tJ\t^\012U\012U\012U\012U\012U\012U\012U\0166\012U\012U\012U\012U\012U\012U\012U\012U\012U\012U\012U\006Y\012U\012U\017\182\012U\012U\tz\t\146\t\154\022N\012U\012U\012U\012U\012U\"\239\012U\012U\012U\026\138\012U\012U\003J\012U\012U\018\226\012U\012U\005\170\012U\012U\012U\012U\012U\012U\012U\012U\012U\012U\012U\012U\012U\012r\012\130\012U\012U\012U\012U\012\213\012\213\012\242\r\002\0186\012\213\017:\012\213\012\213\020\254\012\213\012\213\012\213\012\213\018^\012\213\012\213\021\166\012\213\012\213\012\213\017\018\012\213\012\213\012\213\012\213\019\014\012\213\019\182\012\213\012\213\012\213\012\213\012\213\012\213\012\213\012\213\019\026\012\213\020B\012\213\019\170\012\213\012\213\012\213\012\213\012\213\012\213\012\213\012\213\020\018\012\213\012\213\002\162\012\213\018\130\012\213\012\213\012\213\rJ\rZ\012\213\012\213\012\213\012\213\012\213\012\213\012\213\026\142\012\213\012\213\012\213\012\213\012\213\012\213\012\213\012\213\012\213\012\213\012\213\020V\012\213\012\213\021\006\012\213\012\213\015\186\015\202\016\166\016\186\012\213\012\213\012\213\012\213\012\213\020\026\012\213\012\213\012\213\017b\012\213\012\213\020Z\012\213\012\213\021\n\012\213\012\213\026\"\012\213\012\213\012\213\012\213\012\213\012\213\012\213\012\213\012\213\012\213\012\213\012\213\012\213\019\194\002\162\012\213\012\213\012\213\012\213\004a\004a\019\206\019\222\n\142\004a\020.\004a\004a\0166\004a\004a\004a\004a\020\154\004a\004a\021z\004a\004a\004a\026.\004a\004a\004a\004a\0202\004a\020F\004a\004a\004a\004a\004a\004a\004a\004a\020\158\004a\r\"\004a\028\222\004a\004a\004a\004a\004a\004a\004a\004a\000\242\004a\004a\0172\004a\017Z\004a\004a\004a\030\202\020\202\004a\004a\004a\004a\004a\004a\004a\0166\004a\004a\004a\004a\004a\004a\004a\004a\004a\004a\004a\026v\011\178\012\142\020\206\004a\004a\021\242\007\190\005\210\007q\004a\004a\004a\004a\004a\021\182\004a\004a\004a\004A\004a\011\186\030\138\012\150\004a\025\166\004a\004a\0266\004a\004a\004a\004a\004a\004a\004a\004a\004a\004a\004a\004a\004a\030\142\004a\004a\004a\004a\004a\0021\0021\026Z\025\186\024V\0021\022r\002\202\0021\006\"\002\150\0021\012\238\0021\007}\004\218\0021\024\018\0021\0021\0021\000\242\0021\0021\0021\001\214\n\142\r\006\030\206\004\222\0021\0021\0021\0021\0021\r\014\0021\031\174\004\226\018\006\005\186\029j\0021\0021\0021\0021\0021\005\238\005\242\0021\000\242\006\002\001\194\018.\0021\018V\0021\0021\002\190\029\026\001\210\006\n\0021\0021\0021\011\018\011\022\011\" &\r\022\006\146\0021\0021\0021\0021\0021\0021\0021\0021\0021\029:\011\178\012\142\t\217\0021\0021\031\226\031\246\028\214\t\221\006\158\006\162\0021\0021\0021\"\255\0021\0021\0021\015\173\0021\r\030\n\142\017\130\0021 \246\0021\0021\029b\0021\0021\0021\0021\0021\0021\006\166\011*\0021\0021\0021\011B\003j!v\022v\0021\0021\0021\0021\012\189\012\189\029\254\006&\015\185\012\189\031\178\002\202\012\189\0062\002\150\012\189\012\189\012\189\006>\004\218\012\189\030^\012\189\012\189\012\189\030\n\012\189\012\189\012\189\001\214\n\142\012\189\"F\004\222\012\189\012\189\012\189\012\189\012\189\012\189\012\189 *\004\226\018\250\005\186\n\142\012\189\012\189\012\189\012\189\012\189\005\238\005\242\012\189\000\242\006\002\001\194\019\006\012\189\019\018\012\189\012\189\002\190 V f\006\n\012\189\012\189\012\189\011\018\011\022\011\"\"\022\012\189\006\146\012\189\012\189\012\189\012\189\012\189\012\189\012\189\012\189\012\189\029\154\012\189\012\189!\134\012\189\012\189\031\242 \026\006B\001\210\006\158\006\162\012\189\012\189\012\189\006\238\012\189\012\189\012\189\006\250\012\189\012\189\003:\012\189\012\189\000\242\012\189\012\189\0266\012\189\012\189\012\189\012\189\012\189\012\189\006\166\011*\012\189\012\189\012\189\011B\003j\005\221\006\254\012\189\012\189\012\189\012\189\012\185\012\185\000\242\000\242\"J\012\185!\234\002\202\012\185\"\207\002\150\012\185\012\185\012\185\007:\004\218\012\185\007j\012\185\012\185\012\185\007n\012\185\012\185\012\185\001\214\"\134\012\185\007\178\004\222\012\185\012\185\012\185\012\185\012\185\012\185\012\185\"\026\004\226\002\238\005\186\007\194\012\185\012\185\012\185\012\185\012\185\005\238\005\242\012\185\007\226\006\002\001\194\007\230\012\185\bF\012\185\012\185\002\190\b\226\b\230\006\n\012\185\012\185\012\185\011\018\011\022\011\"\t\n\012\185\006\146\012\185\012\185\012\185\012\185\012\185\012\185\012\185\012\185\012\185\t\022\012\185\012\185\t\026\012\185\012\185\tB\tN\tR\t~\006\158\006\162\012\185\012\185\012\185\t\142\012\185\012\185\012\185\t\206\012\185\012\185\012\018\012\185\012\185\012*\012\185\012\185\012V\012\185\012\185\012\185\012\185\012\185\012\185\006\166\011*\012\185\012\185\012\185\011B\003j\012v\012~\012\185\012\185\012\185\012\185\002\133\002\133\012\146\012\246\012\254\002\133\r\n\002\202\002\133\rN\002\150\002\133\012\238\002\133\rV\004\218\002\133\015\190\002\133\002\133\002\133\015\198\002\133\002\133\002\133\001\214\016\"\r\006\016R\004\222\002\133\002\133\002\133\002\133\002\133\r\014\002\133\016j\004\226\016\170\005\186\005\197\002\133\002\133\002\133\002\133\002\133\005\238\005\242\002\133\016\174\006\002\001\194\018\194\002\133\019>\002\133\002\133\002\190\019^\019\210\006\n\002\133\002\133\002\133\011\018\011\022\011\"\019\218\r\022\006\146\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\006-\021V\002\133\021~\002\133\002\133\001\210\005\197\006Z\005\197\006\158\006\162\002\133\002\133\002\133!b\002\133\002\133\002\133\b\130\002\133\000\242\005\197\006-\002\133\005\197\002\133\002\133\005\197\002\133\002\133\002\133\002\133\002\133\002\133\006\166\011*\002\133\002\133\002\133\011B\003j\015\001\005\197\002\133\002\133\002\133\002\133\005\197\t\250\005\197\002\174\005\197\005\197\005\197\005\197\005\197\005\197\005\197\005\197\005\197\021\154\005\197\005\197\000\242\005\197\005\197\005\197\023\002\005\197\005\197\005\197\005\197\005\197\005\197\005\197\005\197\005\197\021\158\005\197\005\197\003\210\000\242\005\197\005\197\005\197\005\197\005\197\005\197\005\197\005\197\nz\005\197\005\197\005\197\005\197\005\197\000\242\005\197\005\197\005\197\005\197\005\197\005\197\005\197\005\197\005\197\005\197\005\197\005\197\005\197\005\197\000\242\005\197\005\197\005\197\005\197\005\197\005\197\005\197\005\197\021\198\021\218\005\197\021\250\022\n\005\197\005\197\005\197\000\242\005\197\022\030\000\242\005\197\005\197\005\197\005\197\005\197\005\197\005\197\005\197\005\197\001.\n\134\005\197\005\197\000\242\005\197\002\001\002\001\005\197\021r\n\142\005\197\002\150\005\197\022J\022\178\023\006\000\242\n\146\022\186\005\197\005\197\005\197\000\242\022\198\005\197\005\197\005\197\005\197\022\222\000\129\005\197\000\129\000\n\000\129\000\129\000\129\000\129\000\129\000\129\000\129\024\n\000\129\029\198\000\129\000\129\028\162\000\129\000\129\022\226\024\030\000\129\000\129\021v\000\129\000\129\000\129\000\129\024\"\000\129\029\018\000\129\000\129\bB\002\001\000\129\000\129\021\130\000\129\000\129\000\129\b\153\000\129\026\022\000\129\000\129\000\129\000\129\000\129\029\242\000\129\000\129\000\129\000\129\000\129\024\230\024\254\000\129\000\129\025\142\b\153\000\129\000\129\006\162\000\129\000\129\000\129\000\129\000\129\000\129\000\129\000\129\000\129\025\146\b-\000\129\025\202\0061\000\129\b\145\000\129\025\206\000\129\b\134\002\202\025\246\000\129\000\129\000\129\000\129\000\129\000\129\000\129\000\129\b-\025\250\026\018\000\129\b\145\000\129\0061\026\190\b\145\000\226\026\194\026\230\026\234\000\129\012j\022\230\026\250\027\n\022\246\000\129\000\129\000\129\000\129\027\022\rv\000\129\000\129\000\129\000\129\ne\ne\b\153\027J\027N\ne\005\198\002\202\ne\027\158\002\150\ne\011\030\ne\027\198\004\218\ne\027\202\ne\ne\ne\0052\ne\ne\ne\001\214\027\218\028*\028J\004\222\ne\ne\ne\ne\ne\028\138\ne\028\174\004\226\028\190\005\186\0056\ne\ne\ne\ne\ne\005\238\005\242\ne\b\145\006\002\011&\028\230\ne\028\234\ne\ne\002\190\028\246\029\006\006\n\ne\ne\ne\011\018\011\022\011\"\029\"\006v\006\146\ne\ne\ne\ne\ne\ne\ne\ne\ne\t\250\011\178\012\142\0292\ne\ne\029F\029r\029v\029\130\006\158\006\162\ne\ne\ne\029\146\ne\ne\ne\n\194\ne\011\186\029\166\012\150\ne\030\154\ne\ne\030\242\ne\ne\ne\ne\ne\ne\006\166\011*\ne\ne\ne\011B\003j\nz\002\202\ne\ne\ne\ne\002}\002}\002\001\002\001\031\026\002}\002\001\002\202\002}\031\142\031\150\002}\031\218\002}\005~\000\242\002}\005\166\002}\002}\002}\031\230\002}\002}\002}\001\214\031\234 N\000\n\000\n\002}\002}\002}\002}\002}\020v\002} Z b\012\154\005\198 \138\002}\002}\002}\002}\002}\002\001 \154\002}\b9\005\174 \166\018\218\002}\018\230\002}\002}\002\190\002\001\002\001\002\001\002}\002}\002}\002\001!\n!\030!N!V\b9\002}\002}\002}\002}\002}\002}\002}\002}\002}!\162\011\178\012\142!\202\002}\002}\t\186\002\001\"\002\"2\">\000\n\002}\002}\002}\"S\002}\002}\002}\"c\002}\011\186\"v\012\150\002}\"\146\002}\002}\tm\002}\002}\002}\002}\002}\002}\011\178\012\142\002}\002}\002}\005>\005\210\002\001\"\175\002}\002}\002}\002}\n=\n=\"\191\"\219#/\n=#K\011\186\n=\012\150\tm\n=\005B\n=#V\019\198\n=#\139\n=\n=\n=#\159\n=\n=\n=\tm\007\029#\167\tm\011\158\n=\n=\n=\n=\n=\tm\n=\011^\001\194\tm#\227#\235\n=\n=\n=\n=\n=\0206\000\000\n=\024~\020J\020^\020n\n=\000\000\n=\n=\002\202\011\226\000\000\002\150\n=\n=\n=\000\000\000\000\000\000\by\007\029\n\226\n=\n=\n=\n=\n=\n=\n=\n=\n=\000\000\011\178\012\142\000\000\n=\n=\024\206\b\138\007\029\0111\n\230\by\n=\n=\n=\000\000\n=\n=\n=\019F\n=\011\186\024J\012\150\n=\000\000\n=\n=\rA\n=\n=\n=\n=\n=\n=\000\000\021\130\n=\n=\n=\000\242\n\214\000\000\000\000\n=\n=\n=\n=\002\145\002\145\000\000\000\242\000\000\002\145\000\242\000\000\002\145\000\000\rA\002\145\000\000\002\145\006\162\000\000\002\145\000\000\002\145\002\145\002\145\000\000\002\145\002\145\002\145\rA\000\000\000\000\rA\016~\002\145\002\145\002\145\002\145\002\145\rA\002\145\007\210\000\000\rA\007\142\000\000\002\145\002\145\002\145\002\145\002\145\b\026\0111\002\145\000\000\b&\000\000\000\000\002\145\n\234\002\145\002\145\011e\000\000\t\250\000\000\002\145\002\145\002\145\000\000\000\000\000\000\011\153\000\000\000\000\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\000\000\011\178\012\142\000\000\002\145\002\145\000\000\020\138\000\000\000\000\000\242\011\153\002\145\002\145\002\145\000\000\002\145\002\145\002\145\000\000\002\145\011\186\nz\012\150\002\145\000\000\002\145\002\145\006\129\002\145\002\145\002\145\002\145\002\145\002\145\000\000\000\000\002\145\002\145\002\145\006\129\005\210#;\000\242\002\145\002\145\002\145\002\145\002\141\002\141\000\000\000\000\000\000\002\141\000\000\007\210\002\141\000\000\007\142\002\141\000\000\002\141\000\000\000\000\002\141\b\026\002\141\002\141\002\141\b&\002\141\002\141\002\141\006\129\000\000#\031\000\000\023\214\002\141\002\141\002\141\002\141\002\141\000\000\002\141\011^\020\170\000\000\000\000\000\000\002\141\002\141\002\141\002\141\002\141\0206\t\185\002\141\000\000\020J\020^\020n\002\141\006\129\002\141\002\141\006\129\000\000\000\000\000\000\002\141\002\141\002\141\000\000\000\000\000\000\000\000\000\000\000\000\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\000\000\011\178\012\142\000\000\002\141\002\141\002\186\000\000\000\000\000\000\000\242\000\000\002\141\002\141\002\141\000\000\002\141\002\141\002\141\t\217\002\141\011\186\t\217\012\150\002\141\002\001\002\141\002\141\000\000\002\141\002\141\002\141\002\141\002\141\002\141\000\000\000\000\002\141\002\141\002\141\029\026\000\000\000\000\003N\002\141\002\141\002\141\002\141\nQ\nQ\000\000\000\000\000\000\nQ\000\n\007\210\nQ\000\000\007\142\nQ\000\000\nQ\000\000\t\217\nQ\b\026\nQ\nQ\nQ\b&\nQ\nQ\nQ\002\001\000\000\000\000\011\157\t\217\nQ\nQ\nQ\nQ\nQ\002\202\nQ\002\001\002\001\003\150\003Z\000\000\nQ\nQ\nQ\nQ\nQ\003\022\003\"\nQ\000\000\011\157\000\000\003.\nQ\t\217\nQ\nQ\000\000\000\000\000\000\000\000\nQ\nQ\nQ\000\000\000\000\000\000\000\000\000\000\000\000\nQ\nQ\nQ\nQ\nQ\nQ\nQ\nQ\nQ\005\198\011\178\012\142\t\217\nQ\nQ\000\000\000\000\000\000\000\000\000\242\000\000\nQ\nQ\nQ\000\000\nQ\nQ\nQ\021r\nQ\011\186\002\150\012\150\nQ\000\000\nQ\nQ\000\000\nQ\nQ\nQ\nQ\nQ\nQ\000\000\000\000\nQ\nQ\nQ\005-\002\202\000\000\004\218\nQ\nQ\nQ\nQ\ny\ny\000\000\021r\000\000\ny\002\150\005-\ny\000\000\b\186\ny\005.\ny\000\000\021v\ny\005-\ny\ny\ny\005-\ny\ny\ny\005:\000\000\000\000\000\000\021\130\ny\ny\ny\ny\ny\000\000\ny\017\134\005\198\000\000\000\000\000\000\ny\ny\ny\ny\ny\021v\000\000\ny\006\146\017\174\000\000\017\214\ny\006\162\ny\ny\000\000\000\000\000\000\021\130\ny\ny\ny\000\000\000\000\000\000\000\000\000\000\006\158\ny\ny\ny\ny\ny\ny\ny\ny\ny\000\000\011\178\012\142 \174\ny\ny\000\000\006\162\000\000\000\000\t\129\000\000\ny\ny\ny\006\166\ny\ny\ny\000\000\ny\011\186\000\000\012\150\ny\000\000\ny\ny\000\000\ny\ny\ny\ny\ny\ny\027\246\000\000\ny\ny\ny\t\129\000\000\n\182\t\250\ny\ny\ny\ny\002\129\002\129\000\000\000\000\000\000\002\129\000\000\t\129\002\129\000\000\007\142\002\129\000\000\002\129\n\186\000\000\002\129\t\129\002\129\002\129\002\129\t\129\002\129\002\129\002\129\002\001\002\001\023f\000\000\000\000\002\129\002\129\002\129\002\129\002\129\000\000\002\129\nz\000\000\000\000\002\001\000\000\002\129\002\129\002\129\002\129\002\129\b\161\000\000\002\129\000\000\000\000\000\n\000\000\002\129\000\000\002\129\002\129\000\242\000\000\000\000\000\000\002\129\002\129\002\129\000\000\b\161\000\000\000\000\000\000\b\161\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\t\250\011\178\012\142\002\001\002\129\002\129\000\000\000\000\000\000\000\000\n\197\000\000\002\129\002\129\002\129\000\000\002\129\002\129\002\129\023:\002\129\011\186\000\000\012\150\002\129\000\000\002\129\002\129\000\000\002\129\002\129\002\129\002\129\002\129\002\129\t\250\000\000\002\129\002\129\002\129\n\197\005\210\nz\000\000\002\129\002\129\002\129\002\129\n\161\n\161\000\000\b\161\000\000\n\161\011\138\b\214\n\161\000\000\n\197\n\161\000\000\n\161\000\000\000\242\n\161\n\197\n\161\n\161\n\161\n\197\n\161\n\161\n\161\002\001\002\001\024\166\012j\nz\n\161\n\161\n\161\n\161\n\161\000\000\n\161\006\218\rv\000\000\002\001\000\000\n\161\n\161\n\161\n\161\n\161\006R\000\000\n\161\000\242\bV\000\n\006^\n\161\000\000\n\161\n\161\000\000\000\000\000\000\023>\n\161\n\161\n\161\000\000\000\000\000\000\000\000\000\000\000\000\n\161\n\161\n\161\n\161\n\161\n\161\n\161\n\161\n\161\000\000\011\178\012\142\002\001\n\161\n\161\000\000\000\000\000\000\000\000\000\242\000\000\n\161\n\161\n\161\000\000\n\161\n\161\n\161\000\000\n\161\011\186\000\000\012\150\n\161\000\000\n\161\n\161\000\000\n\161\n\161\n\161\n\161\n\161\n\161\000\000\000\000\n\161\n\161\n\161\004\237\000\000\n\242\t\250\n\161\n\161\n\161\n\161\n\141\n\141\000\000\002\018\000\000\n\141\002\150\004\237\n\141\000\000\b\186\n\141\000\000\n\141\n\246\000\000\n\141\004\237\n\141\n\141\n\141\004\237\n\141\n\141\n\141\000\000\000\000\000\000\000\000\000\000\n\141\n\141\n\141\n\141\n\141\000\000\n\141\nz\000\000\000\000\000\000\000\000\n\141\n\141\n\141\n\141\n\141\"n\001\226\n\141\000\000\000\000\000\000\000\000\n\141\000\000\n\141\n\141\000\242\000\000\000\000\021\130\n\141\n\141\n\141\000\000\000\000\000\000\000\000\000\000\000\000\n\141\n\141\n\141\n\141\n\141\n\141\n\141\n\141\n\141\000\000\011\178\012\142\000\000\n\141\n\141\000\000\006\162\000\000\000\000\000\000\000\000\n\141\n\141\n\141\000\000\n\141\n\141\n\141\000\000\n\141\011\186\000\000\012\150\n\141\000\000\n\141\n\141\000\000\n\141\n\141\n\141\n\141\n\141\n\141\015\017\000\000\n\141\n\141\n\141\000\000\000\000\031\190\t\250\n\141\n\141\n\141\n\141\002)\002)\000\000\000\000\000\000\002)\015\017\015\017\002)\000\000\015\017\002)\000\000\002)\031\194\000\000\002)\000\000\002)\002)\002)\000\000\002)\002)\002)\000\000\000\000\000\000\t\250\b\173\002)\002)\002)\002)\002)\000\000\002)\nz\000\000\000\000\000\000\000\000\002)\002)\002)\002)\002)\022\158\b\173\002)\000\000\000\242\b\173\000\000\002)\000\000\002)\002)\000\242\000\000\000\000\000\000\002)\002)\002)\000\000\000\000\000\000\000\000\000\000\nz\002)\002)\002)\002)\002)\002)\002)\002)\002)\t\250\015\017\002)\000\000\002)\002)\000\000\000\000\000\000\000\000\000\000\000\242\002)\002)\002)\000\000\002)\002)\002)\022\242\002)\000\000\000\000\000\000\002)\000\000\002)\002)\001\210\012j\002)\002)\002)\002)\002)\015\r\000\000\002)\002)\rv!>\000\000\nz\006\130\002)\002)\002)\002)\002\137\002\137\000\000\000\000\000\000\002\137\015\r\015\r\002\137\000\000\015\r\002\137\000\000\002\137\000\000\000\242\002\137\000\000\002\137\002\137\002\137\000\000\002\137\002\137\002\137\002\174\000\000\000\000\t\250\b\153\002\137\002\137\002\137\002\137\002\137\000\000\002\137\000\000\000\000\000\000\000\000\000\000\002\137\002\137\002\137\002\137\002\137\023\014\b\153\002\137\000\000\000\242\b\153\000\000\002\137\003\210\002\137\002\137\006]\000\000\000\000\000\000\002\137\002\137\002\137\000\000\000\000\000\000\000\000\000\000\nz\002\137\002\137\002\137\002\137\002\137\002\137\002\137\002\137\002\137\t\250\015\r\002\137\000\000\002\137\002\137\000\000\000\000\000\000\000\000\000\242\000\242\002\137\002\137\002\137\000\000\002\137\002\137\002\137\023*\002\137\000\000\000\000\000\000\002\137\000\000\002\137\002\137\000\000\rB\002\137\002\137\002\137\002\137\002\137\t\250\000\000\002\137\002\137\002\137\005\029\000\000\nz\011\030\002\137\002\137\002\137\002\137\n9\n9\000\000\000\000\000\000\n9\023F\005\029\n9\000\000\b\186\n9\000\000\n9\000\000\000\242\n9\005\029\n9\n9\n9\005\029\n9\n9\n9\000\000\000\000\000\000\t\250\nz\n9\n9\n9\n9\n9\000\000\n9\000\000\000\000\000\000\000\000\000\000\n9\n9\n9\n9\n9\"\"\000\000\n9\000\242\000\000\000\000\000\000\n9\000\000\n9\n9\000\000\000\000\000\000\000\000\n9\n9\n9\000\000\000\000\000\000\000\000\000\000\nz\n9\n9\n9\n9\n9\n9\n9\n9\n9\000\000\000\000\n9\000\000\n9\n9\000\000\000\000\000\000\000\000\000\242\000\242\n9\n9\n9\000\000\n9\n9\n9\000\000\n9\000\000\000\000\000\000\n9\000\000\n9\n9\000\000\012j\n9\n9\n9\n9\n9\000\000\000\000\n9\n9\rv\005\r\000\000\000\000\000\000\n9\n9\n9\n9\003\193\003\193\000\000\000\000\000\000\003\193\000\000\005\r\003\193\000\000\b\186\003\193\000\000\003\193\000\000\000\000\r\154\005\r\003\193\r\238\003\193\005\r\003\193\003\193\003\193\000\000\000\000\000\000\000\000\000\000\014\002\014J\014b\014\026\014z\000\000\003\193\000\000\000\000\000\000\000\000\000\000\003\193\003\193\014\146\014\170\003\193\000\000\000\000\003\193\000\000\000\000\000\000\000\000\003\193\000\000\014\194\003\193\000\000\000\000\000\000\000\000\003\193\003\193\000\242\000\000\000\000\000\000\000\000\000\000\000\000\003\193\003\193\r\178\0142\014\218\014\242\015\"\003\193\003\193\000\000\000\000\003\193\000\000\003\193\015:\000\000\000\000\000\000\000\000\000\242\000\000\003\193\003\193\015R\000\000\003\193\003\193\003\193\000\000\003\193\000\000\000\000\000\000\003\193\000\000\003\193\003\193\000\000\015\178\003\193\015\234\015\n\003\193\003\193\000\000\000\000\003\193\015j\003\193\012\174\000\000\000\000\000\000\003\193\003\193\015\130\015\154\002\233\002\233\000\000\000\000\000\000\002\233\000\000\007\210\002\233\000\000\007\142\002\233\000\000\002\233\000\000\000\000\002\233\b\026\002\233\002\233\002\233\b&\002\233\002\233\002\233\000\000\000\000\000\000\000\000\000\000\002\233\002\233\002\233\002\233\002\233\000\000\002\233\000\000\000\000\000\000\000\000\000\000\002\233\002\233\002\233\002\233\002\233\000\000\000\000\002\233\000\000\000\000\000\000\000\000\002\233\000\000\002\233\002\233\000\000\000\000\000\000\000\000\002\233\002\233\002\233\000\000\000\000\000\000\000\000\000\000\000\000\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\000\000\000\000\002\233\000\000\002\233\002\233\000\000\000\000\000\000\000\000\000\242\000\000\002\233\002\233\002\233\000\000\002\233\002\233\002\233\000\000\002\233\000\000\000\000\000\000\002\233\000\000\002\233\002\233\000\000\012j\002\233\002\233\002\233\002\233\002\233\000\000\000\000\002\233\002\233\rv\016\146\000\000\000\000\000\000\002\233\002\233\002\233\002\233\002\229\002\229\000\000\000\000\000\000\002\229\000\000\016\154\002\229\000\000\b\186\002\229\000\000\002\229\000\000\000\000\002\229\016\206\002\229\002\229\002\229\016\218\002\229\002\229\002\229\000\000\000\000\000\000\000\000\000\000\002\229\002\229\002\229\002\229\002\229\000\000\002\229\000\000\000\000\000\000\000\000\000\000\002\229\002\229\002\229\002\229\002\229\000\000\000\000\002\229\000\000\000\000\000\000\000\000\002\229\000\000\002\229\002\229\000\000\000\000\000\000\000\000\002\229\002\229\002\229\000\000\000\000\000\000\000\000\000\000\000\000\002\229\002\229\r\178\002\229\002\229\002\229\002\229\002\229\002\229\000\000\000\000\002\229\000\000\002\229\002\229\000\000\000\000\000\000\000\000\000\242\000\000\002\229\002\229\002\229\000\000\002\229\002\229\002\229\000\000\002\229\000\000\000\000\000\000\002\229\000\000\002\229\002\229\000\000\002\229\002\229\002\229\002\229\002\229\002\229\000\000\000\000\002\229\002\229\002\229\004\253\000\000\000\000\000\000\002\229\002\229\002\229\002\229\002\185\002\185\000\000\000\000\000\000\002\185\000\000\004\253\002\185\000\000\b\186\002\185\000\000\002\185\000\000\000\000\002\185\004\253\002\185\002\185\002\185\004\253\002\185\002\185\002\185\000\000\000\000\000\000\000\000\000\000\002\185\002\185\002\185\002\185\002\185\000\000\002\185\000\000\000\000\000\000\000\000\000\000\002\185\002\185\002\185\002\185\002\185\000\000\000\000\002\185\000\000\000\000\000\000\000\000\002\185\000\000\002\185\002\185\000\000\000\000\000\000\000\000\002\185\002\185\002\185\000\000\000\000\000\000\000\000\000\000\000\000\002\185\002\185\002\185\002\185\002\185\002\185\002\185\002\185\002\185\000\000\000\000\002\185\000\000\002\185\002\185\000\000\000\000\000\000\000\000\000\242\000\000\002\185\002\185\002\185\000\000\002\185\002\185\002\185\000\000\002\185\000\000\000\000\000\000\002\185\000\000\002\185\002\185\000\000\012j\002\185\002\185\002\185\002\185\002\185\000\000\000\000\002\185\002\185\rv\t\157\000\000\000\000\000\000\002\185\002\185\002\185\002\185\002\181\002\181\000\000\000\000\000\000\002\181\000\000\007\210\002\181\000\000\007\142\002\181\000\000\002\181\000\000\000\000\002\181\t\157\002\181\002\181\002\181\t\157\002\181\002\181\002\181\000\000\000\000\000\000\000\000\000\000\002\181\002\181\002\181\002\181\002\181\000\000\002\181\000\000\000\000\000\000\000\000\000\000\002\181\002\181\002\181\002\181\002\181\000\000\000\000\002\181\000\000\000\000\000\000\000\000\002\181\000\000\002\181\002\181\000\000\000\000\000\000\000\000\002\181\002\181\002\181\000\000\000\000\000\000\000\000\000\000\000\000\002\181\002\181\r\178\002\181\002\181\002\181\002\181\002\181\002\181\000\000\000\000\002\181\000\000\002\181\002\181\000\000\000\000\000\000\000\000\000\242\000\000\002\181\002\181\002\181\000\000\002\181\002\181\002\181\000\000\002\181\000\000\000\000\000\000\002\181\000\000\002\181\002\181\000\000\002\181\002\181\002\181\002\181\002\181\002\181\000\000\000\000\002\181\002\181\002\181\020\006\000\000\000\000\000\000\002\181\002\181\002\181\002\181\002\209\002\209\000\000\000\000\000\000\002\209\000\000\016\154\002\209\000\000\b\186\002\209\000\000\002\209\000\000\000\000\002\209\016\206\002\209\002\209\002\209\016\218\002\209\002\209\002\209\000\000\000\000\000\000\000\000\000\000\002\209\002\209\002\209\002\209\002\209\000\000\002\209\000\000\000\000\000\000\000\000\000\000\002\209\002\209\002\209\002\209\002\209\000\000\000\000\002\209\000\000\000\000\000\000\000\000\002\209\000\000\002\209\002\209\000\000\000\000\000\000\000\000\002\209\002\209\002\209\000\000\000\000\000\000\000\000\000\000\000\000\002\209\002\209\002\209\002\209\002\209\002\209\002\209\002\209\002\209\000\000\000\000\002\209\000\000\002\209\002\209\000\000\000\000\000\000\000\000\000\000\000\000\002\209\002\209\002\209\000\000\002\209\002\209\002\209\000\000\002\209\000\000\000\000\000\000\002\209\000\000\002\209\002\209\000\000\012j\002\209\002\209\002\209\002\209\002\209\b\149\000\000\002\209\002\209\rv\000\000\000\000\000\000\000\000\002\209\002\209\002\209\002\209\002\205\002\205\000\000\000\000\000\000\002\205\b\149\000\000\002\205\000\000\b\149\002\205\000\000\002\205\000\000\000\000\r\154\000\000\002\205\002\205\002\205\000\000\002\205\002\205\002\205\000\000\000\000\000\000\000\000\000\000\002\205\002\205\002\205\014\026\002\205\000\000\002\205\000\000\000\000\000\000\000\000\000\000\002\205\002\205\002\205\002\205\002\205\000\000\000\000\002\205\000\000\000\242\000\000\000\000\002\205\000\000\002\205\002\205\000\000\000\000\000\000\000\000\002\205\002\205\002\205\000\000\000\000\000\000\000\000\000\000\000\000\002\205\002\205\r\178\0142\002\205\002\205\002\205\002\205\002\205\000\000\b\149\002\205\000\000\002\205\002\205\000\000\000\000\000\000\000\000\000\000\000\000\002\205\002\205\002\205\000\000\002\205\002\205\002\205\000\000\002\205\000\000\000\000\000\000\002\205\000\000\002\205\002\205\000\000\002\205\002\205\002\205\002\205\002\205\002\205\000\000\000\000\002\205\002\205\002\205\000\000\000\000\000\000\000\000\002\205\002\205\002\205\002\205\002\241\002\241\000\000\000\000\000\000\002\241\000\000\000\000\002\241\000\000\000\000\002\241\000\000\002\241\000\000\000\000\002\241\000\000\002\241\002\241\002\241\000\000\002\241\002\241\002\241\000\000\000\000\000\000\000\000\000\000\002\241\002\241\002\241\002\241\002\241\000\000\002\241\000\000\000\000\000\000\000\000\000\000\002\241\002\241\002\241\002\241\002\241\000\000\000\000\002\241\000\000\000\000\000\000\000\000\002\241\000\000\002\241\002\241\000\000\000\000\000\000\000\000\002\241\002\241\002\241\000\000\000\000\000\000\000\000\000\000\000\000\002\241\002\241\002\241\002\241\002\241\002\241\002\241\002\241\002\241\000\000\000\000\002\241\000\000\002\241\002\241\000\000\000\000\000\000\000\000\000\000\000\000\002\241\002\241\002\241\000\000\002\241\002\241\002\241\000\000\002\241\000\000\000\000\000\000\002\241\000\000\002\241\002\241\000\000\012j\002\241\002\241\002\241\002\241\002\241\000\000\000\000\002\241\002\241\rv\000\000\000\000\000\000\000\000\002\241\002\241\002\241\002\241\002\237\002\237\000\000\000\000\000\000\002\237\000\000\000\000\002\237\000\000\000\000\002\237\000\000\002\237\000\000\000\000\002\237\000\000\002\237\002\237\002\237\000\000\002\237\002\237\002\237\000\000\000\000\000\000\000\000\000\000\002\237\002\237\002\237\002\237\002\237\000\000\002\237\000\000\000\000\000\000\000\000\000\000\002\237\002\237\002\237\002\237\002\237\000\000\000\000\002\237\000\000\000\000\000\000\000\000\002\237\000\000\002\237\002\237\000\000\000\000\000\000\000\000\002\237\002\237\002\237\000\000\000\000\000\000\000\000\000\000\000\000\002\237\002\237\r\178\002\237\002\237\002\237\002\237\002\237\002\237\000\000\000\000\002\237\000\000\002\237\002\237\000\000\000\000\000\000\000\000\000\000\000\000\002\237\002\237\002\237\000\000\002\237\002\237\002\237\000\000\002\237\000\000\000\000\000\000\002\237\000\000\002\237\002\237\000\000\002\237\002\237\002\237\002\237\002\237\002\237\000\000\000\000\002\237\002\237\002\237\000\000\000\000\000\000\000\000\002\237\002\237\002\237\002\237\002\177\002\177\000\000\000\000\000\000\002\177\000\000\000\000\002\177\000\000\000\000\002\177\000\000\002\177\000\000\000\000\002\177\000\000\002\177\002\177\002\177\000\000\002\177\002\177\002\177\000\000\000\000\000\000\000\000\000\000\002\177\002\177\002\177\002\177\002\177\000\000\002\177\000\000\000\000\000\000\000\000\000\000\002\177\002\177\002\177\002\177\002\177\000\000\000\000\002\177\000\000\000\000\000\000\000\000\002\177\000\000\002\177\002\177\000\000\000\000\000\000\000\000\002\177\002\177\002\177\000\000\000\000\000\000\000\000\000\000\000\000\002\177\002\177\002\177\002\177\002\177\002\177\002\177\002\177\002\177\000\000\000\000\002\177\000\000\002\177\002\177\000\000\000\000\000\000\000\000\000\000\000\000\002\177\002\177\002\177\000\000\002\177\002\177\002\177\000\000\002\177\000\000\000\000\000\000\002\177\000\000\002\177\002\177\000\000\012j\002\177\002\177\002\177\002\177\002\177\000\000\000\000\002\177\002\177\rv\000\000\000\000\000\000\000\000\002\177\002\177\002\177\002\177\002\173\002\173\000\000\000\000\000\000\002\173\000\000\000\000\002\173\000\000\000\000\002\173\000\000\002\173\000\000\000\000\002\173\000\000\002\173\002\173\002\173\000\000\002\173\002\173\002\173\000\000\000\000\000\000\000\000\000\000\002\173\002\173\002\173\002\173\002\173\000\000\002\173\000\000\000\000\000\000\000\000\000\000\002\173\002\173\002\173\002\173\002\173\000\000\000\000\002\173\000\000\000\000\000\000\000\000\002\173\000\000\002\173\002\173\000\000\000\000\000\000\000\000\002\173\002\173\002\173\000\000\000\000\000\000\000\000\000\000\000\000\002\173\002\173\r\178\002\173\002\173\002\173\002\173\002\173\002\173\000\000\000\000\002\173\000\000\002\173\002\173\000\000\000\000\000\000\000\000\000\000\000\000\002\173\002\173\002\173\000\000\002\173\002\173\002\173\000\000\002\173\000\000\000\000\000\000\002\173\000\000\002\173\002\173\000\000\002\173\002\173\002\173\002\173\002\173\002\173\000\000\000\000\002\173\002\173\002\173\000\000\000\000\000\000\000\000\002\173\002\173\002\173\002\173\002\201\002\201\000\000\000\000\000\000\002\201\000\000\000\000\002\201\000\000\000\000\002\201\000\000\002\201\000\000\000\000\002\201\000\000\002\201\002\201\002\201\000\000\002\201\002\201\002\201\000\000\000\000\000\000\000\000\000\000\002\201\002\201\002\201\002\201\002\201\000\000\002\201\000\000\000\000\000\000\000\000\000\000\002\201\002\201\002\201\002\201\002\201\000\000\000\000\002\201\000\000\000\000\000\000\000\000\002\201\000\000\002\201\002\201\000\000\000\000\000\000\000\000\002\201\002\201\002\201\000\000\000\000\000\000\000\000\000\000\000\000\002\201\002\201\002\201\002\201\002\201\002\201\002\201\002\201\002\201\000\000\000\000\002\201\000\000\002\201\002\201\000\000\000\000\000\000\000\000\000\000\000\000\002\201\002\201\002\201\000\000\002\201\002\201\002\201\000\000\002\201\000\000\000\000\000\000\002\201\000\000\002\201\002\201\000\000\012j\002\201\002\201\002\201\002\201\002\201\000\000\000\000\002\201\002\201\rv\000\000\000\000\000\000\000\000\002\201\002\201\002\201\002\201\002\197\002\197\000\000\000\000\000\000\002\197\000\000\000\000\002\197\000\000\000\000\002\197\000\000\002\197\000\000\000\000\r\154\000\000\002\197\002\197\002\197\000\000\002\197\002\197\002\197\000\000\000\000\000\000\000\000\000\000\002\197\002\197\002\197\014\026\002\197\000\000\002\197\000\000\000\000\000\000\000\000\000\000\002\197\002\197\002\197\002\197\002\197\000\000\000\000\002\197\000\000\000\000\000\000\000\000\002\197\000\000\002\197\002\197\000\000\000\000\000\000\000\000\002\197\002\197\002\197\000\000\000\000\000\000\000\000\000\000\000\000\002\197\002\197\r\178\0142\002\197\002\197\002\197\002\197\002\197\000\000\000\000\002\197\000\000\002\197\002\197\000\000\000\000\000\000\000\000\000\000\000\000\002\197\002\197\002\197\000\000\002\197\002\197\002\197\000\000\002\197\000\000\000\000\000\000\002\197\000\000\002\197\002\197\000\000\002\197\002\197\002\197\002\197\002\197\002\197\000\000\000\000\002\197\002\197\002\197\000\000\000\000\000\000\000\000\002\197\002\197\002\197\002\197\002\193\002\193\000\000\000\000\000\000\002\193\000\000\000\000\002\193\000\000\000\000\002\193\000\000\002\193\000\000\000\000\002\193\000\000\002\193\002\193\002\193\000\000\002\193\002\193\002\193\000\000\000\000\000\000\000\000\000\000\002\193\002\193\002\193\002\193\002\193\000\000\002\193\000\000\000\000\000\000\000\000\000\000\002\193\002\193\002\193\002\193\002\193\000\000\000\000\002\193\000\000\000\000\000\000\000\000\002\193\000\000\002\193\002\193\000\000\000\000\000\000\000\000\002\193\002\193\002\193\000\000\000\000\000\000\000\000\000\000\000\000\002\193\002\193\002\193\002\193\002\193\002\193\002\193\002\193\002\193\000\000\000\000\002\193\000\000\002\193\002\193\000\000\000\000\000\000\000\000\000\000\000\000\002\193\002\193\002\193\000\000\002\193\002\193\002\193\000\000\002\193\000\000\000\000\000\000\002\193\000\000\002\193\002\193\000\000\012j\002\193\002\193\002\193\002\193\002\193\000\000\000\000\002\193\002\193\rv\000\000\000\000\000\000\000\000\002\193\002\193\002\193\002\193\002\189\002\189\000\000\000\000\000\000\002\189\000\000\000\000\002\189\000\000\000\000\002\189\000\000\002\189\000\000\000\000\r\154\000\000\002\189\002\189\002\189\000\000\002\189\002\189\002\189\000\000\000\000\000\000\000\000\000\000\002\189\002\189\002\189\014\026\002\189\000\000\002\189\000\000\000\000\000\000\000\000\000\000\002\189\002\189\002\189\002\189\002\189\000\000\000\000\002\189\000\000\000\000\000\000\000\000\002\189\000\000\002\189\002\189\000\000\000\000\000\000\000\000\002\189\002\189\002\189\000\000\000\000\000\000\000\000\000\000\000\000\002\189\002\189\r\178\0142\002\189\002\189\002\189\002\189\002\189\000\000\000\000\002\189\000\000\002\189\002\189\000\000\000\000\000\000\000\000\000\000\000\000\002\189\002\189\002\189\000\000\002\189\002\189\002\189\000\000\002\189\000\000\000\000\000\000\002\189\000\000\002\189\002\189\000\000\002\189\002\189\002\189\002\189\002\189\002\189\000\000\000\000\002\189\002\189\002\189\000\000\000\000\000\000\000\000\002\189\002\189\002\189\002\189\003\017\003\017\000\000\000\000\000\000\003\017\000\000\000\000\003\017\000\000\000\000\003\017\000\000\003\017\000\000\000\000\003\017\000\000\003\017\003\017\003\017\000\000\003\017\003\017\003\017\000\000\000\000\000\000\000\000\000\000\003\017\003\017\003\017\003\017\003\017\000\000\003\017\000\000\000\000\000\000\000\000\000\000\003\017\003\017\003\017\003\017\003\017\000\000\000\000\003\017\000\000\000\000\000\000\000\000\003\017\000\000\003\017\003\017\000\000\000\000\000\000\000\000\003\017\003\017\003\017\000\000\000\000\000\000\000\000\000\000\000\000\003\017\003\017\003\017\003\017\003\017\003\017\003\017\003\017\003\017\000\000\000\000\003\017\000\000\003\017\003\017\000\000\000\000\000\000\000\000\000\000\000\000\003\017\003\017\003\017\000\000\003\017\003\017\003\017\000\000\003\017\000\000\000\000\000\000\003\017\000\000\003\017\003\017\000\000\012j\003\017\003\017\003\017\003\017\003\017\000\000\000\000\003\017\003\017\rv\000\000\000\000\000\000\000\000\003\017\003\017\003\017\003\017\003\r\003\r\000\000\000\000\000\000\003\r\000\000\000\000\003\r\000\000\000\000\003\r\000\000\003\r\000\000\000\000\r\154\000\000\003\r\003\r\003\r\000\000\003\r\003\r\003\r\000\000\000\000\000\000\000\000\000\000\014\002\014J\014b\014\026\014z\000\000\003\r\000\000\000\000\000\000\000\000\000\000\003\r\003\r\014\146\014\170\003\r\000\000\000\000\003\r\000\000\000\000\000\000\000\000\003\r\000\000\014\194\003\r\000\000\000\000\000\000\000\000\003\r\003\r\000\242\000\000\000\000\000\000\000\000\000\000\000\000\003\r\003\r\r\178\0142\014\218\014\242\015\"\003\r\003\r\000\000\000\000\003\r\000\000\003\r\015:\000\000\000\000\000\000\000\000\000\000\000\000\003\r\003\r\015R\000\000\003\r\003\r\003\r\000\000\003\r\000\000\000\000\000\000\003\r\000\000\003\r\003\r\000\000\003\r\003\r\003\r\015\n\003\r\003\r\000\000\000\000\003\r\015j\003\r\000\000\000\000\000\000\000\000\003\r\003\r\015\130\015\154\002\225\002\225\000\000\000\000\000\000\002\225\000\000\000\000\002\225\000\000\000\000\002\225\000\000\002\225\000\000\000\000\002\225\000\000\002\225\002\225\002\225\000\000\002\225\002\225\002\225\000\000\000\000\000\000\000\000\000\000\002\225\002\225\002\225\002\225\002\225\000\000\002\225\000\000\000\000\000\000\000\000\000\000\002\225\002\225\002\225\002\225\002\225\000\000\000\000\002\225\000\000\000\000\000\000\000\000\002\225\000\000\002\225\002\225\000\000\000\000\000\000\000\000\002\225\002\225\002\225\000\000\000\000\000\000\000\000\000\000\000\000\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\000\000\000\000\002\225\000\000\002\225\002\225\000\000\000\000\000\000\000\000\000\000\000\000\002\225\002\225\002\225\000\000\002\225\002\225\002\225\000\000\002\225\000\000\000\000\000\000\002\225\000\000\002\225\002\225\000\000\012j\002\225\002\225\002\225\002\225\002\225\000\000\000\000\002\225\002\225\rv\000\000\000\000\000\000\000\000\002\225\002\225\002\225\002\225\002\221\002\221\000\000\000\000\000\000\002\221\000\000\000\000\002\221\000\000\000\000\002\221\000\000\002\221\000\000\000\000\r\154\000\000\002\221\002\221\002\221\000\000\002\221\002\221\002\221\000\000\000\000\000\000\000\000\000\000\002\221\002\221\002\221\014\026\002\221\000\000\002\221\000\000\000\000\000\000\000\000\000\000\002\221\002\221\002\221\002\221\002\221\000\000\000\000\002\221\000\000\000\000\000\000\000\000\002\221\000\000\002\221\002\221\000\000\000\000\000\000\000\000\002\221\002\221\002\221\000\000\000\000\000\000\000\000\000\000\000\000\002\221\002\221\r\178\0142\002\221\002\221\002\221\002\221\002\221\000\000\000\000\002\221\000\000\002\221\002\221\000\000\000\000\000\000\000\000\000\000\000\000\002\221\002\221\002\221\000\000\002\221\002\221\002\221\000\000\002\221\000\000\000\000\000\000\002\221\000\000\002\221\002\221\000\000\002\221\002\221\002\221\002\221\002\221\002\221\000\000\000\000\002\221\002\221\002\221\000\000\000\000\000\000\000\000\002\221\002\221\002\221\002\221\002\217\002\217\000\000\000\000\000\000\002\217\000\000\000\000\002\217\000\000\000\000\002\217\000\000\002\217\000\000\000\000\002\217\000\000\002\217\002\217\002\217\000\000\002\217\002\217\002\217\000\000\000\000\000\000\000\000\000\000\002\217\002\217\002\217\002\217\002\217\000\000\002\217\000\000\000\000\000\000\000\000\000\000\002\217\002\217\002\217\002\217\002\217\000\000\000\000\002\217\000\000\000\000\000\000\000\000\002\217\000\000\002\217\002\217\000\000\000\000\000\000\000\000\002\217\002\217\002\217\000\000\000\000\000\000\000\000\000\000\000\000\002\217\002\217\002\217\002\217\002\217\002\217\002\217\002\217\002\217\000\000\000\000\002\217\000\000\002\217\002\217\000\000\000\000\000\000\000\000\000\000\000\000\002\217\002\217\002\217\000\000\002\217\002\217\002\217\000\000\002\217\000\000\000\000\000\000\002\217\000\000\002\217\002\217\000\000\012j\002\217\002\217\002\217\002\217\002\217\000\000\000\000\002\217\002\217\rv\000\000\000\000\000\000\000\000\002\217\002\217\002\217\002\217\002\213\002\213\000\000\000\000\000\000\002\213\000\000\000\000\002\213\000\000\000\000\002\213\000\000\002\213\000\000\000\000\r\154\000\000\002\213\002\213\002\213\000\000\002\213\002\213\002\213\000\000\000\000\000\000\000\000\000\000\002\213\002\213\002\213\014\026\002\213\000\000\002\213\000\000\000\000\000\000\000\000\000\000\002\213\002\213\002\213\002\213\002\213\000\000\000\000\002\213\000\000\000\000\000\000\000\000\002\213\000\000\002\213\002\213\000\000\000\000\000\000\000\000\002\213\002\213\002\213\000\000\000\000\000\000\000\000\000\000\000\000\002\213\002\213\r\178\0142\002\213\002\213\002\213\002\213\002\213\000\000\000\000\002\213\000\000\002\213\002\213\000\000\000\000\000\000\000\000\000\000\000\000\002\213\002\213\002\213\000\000\002\213\002\213\002\213\000\000\002\213\000\000\000\000\000\000\002\213\000\000\002\213\002\213\000\000\002\213\002\213\002\213\002\213\002\213\002\213\000\000\000\000\002\213\002\213\002\213\000\000\000\000\000\000\000\000\002\213\002\213\002\213\002\213\003\001\003\001\000\000\000\000\000\000\003\001\000\000\000\000\003\001\000\000\000\000\003\001\000\000\003\001\000\000\000\000\003\001\000\000\003\001\003\001\003\001\000\000\003\001\003\001\003\001\000\000\000\000\000\000\000\000\000\000\003\001\003\001\003\001\003\001\003\001\000\000\003\001\000\000\000\000\000\000\000\000\000\000\003\001\003\001\003\001\003\001\003\001\000\000\000\000\003\001\000\000\000\000\000\000\000\000\003\001\000\000\003\001\003\001\000\000\000\000\000\000\000\000\003\001\003\001\003\001\000\000\000\000\000\000\000\000\000\000\000\000\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\000\000\000\000\003\001\000\000\003\001\003\001\000\000\000\000\000\000\000\000\000\000\000\000\003\001\003\001\003\001\000\000\003\001\003\001\003\001\000\000\003\001\000\000\000\000\000\000\003\001\000\000\003\001\003\001\000\000\012j\003\001\003\001\003\001\003\001\003\001\000\000\000\000\003\001\003\001\rv\000\000\000\000\000\000\000\000\003\001\003\001\003\001\003\001\002\253\002\253\000\000\000\000\000\000\002\253\000\000\000\000\002\253\000\000\000\000\002\253\000\000\002\253\000\000\000\000\r\154\000\000\002\253\002\253\002\253\000\000\002\253\002\253\002\253\000\000\000\000\000\000\000\000\000\000\014\002\014J\014b\014\026\002\253\000\000\002\253\000\000\000\000\000\000\000\000\000\000\002\253\002\253\014\146\014\170\002\253\000\000\000\000\002\253\000\000\000\000\000\000\000\000\002\253\000\000\002\253\002\253\000\000\000\000\000\000\000\000\002\253\002\253\000\242\000\000\000\000\000\000\000\000\000\000\000\000\002\253\002\253\r\178\0142\014\218\014\242\002\253\002\253\002\253\000\000\000\000\002\253\000\000\002\253\002\253\000\000\000\000\000\000\000\000\000\000\000\000\002\253\002\253\002\253\000\000\002\253\002\253\002\253\000\000\002\253\000\000\000\000\000\000\002\253\000\000\002\253\002\253\000\000\002\253\002\253\002\253\015\n\002\253\002\253\000\000\000\000\002\253\002\253\002\253\000\000\000\000\000\000\000\000\002\253\002\253\002\253\002\253\002\169\002\169\000\000\000\000\000\000\002\169\000\000\000\000\002\169\000\000\000\000\002\169\000\000\002\169\000\000\000\000\002\169\000\000\002\169\002\169\002\169\000\000\002\169\002\169\002\169\000\000\000\000\000\000\000\000\000\000\002\169\002\169\002\169\002\169\002\169\000\000\002\169\000\000\000\000\000\000\000\000\000\000\002\169\002\169\002\169\002\169\002\169\000\000\000\000\002\169\000\000\000\000\000\000\000\000\002\169\000\000\002\169\002\169\000\000\000\000\000\000\000\000\002\169\002\169\002\169\000\000\000\000\000\000\000\000\000\000\000\000\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\000\000\000\000\002\169\000\000\002\169\002\169\000\000\000\000\000\000\000\000\000\000\000\000\002\169\002\169\002\169\000\000\002\169\002\169\002\169\000\000\002\169\000\000\000\000\000\000\002\169\000\000\002\169\002\169\000\000\012j\002\169\002\169\002\169\002\169\002\169\000\000\000\000\002\169\002\169\rv\000\000\000\000\000\000\000\000\002\169\002\169\002\169\002\169\002\165\002\165\000\000\000\000\000\000\002\165\000\000\000\000\002\165\000\000\000\000\002\165\000\000\002\165\000\000\000\000\r\154\000\000\002\165\002\165\002\165\000\000\002\165\002\165\002\165\000\000\000\000\000\000\000\000\000\000\002\165\002\165\002\165\014\026\002\165\000\000\002\165\000\000\000\000\000\000\000\000\000\000\002\165\002\165\002\165\002\165\002\165\000\000\000\000\002\165\000\000\000\000\000\000\000\000\002\165\000\000\002\165\002\165\000\000\000\000\000\000\000\000\002\165\002\165\002\165\000\000\000\000\000\000\000\000\000\000\000\000\002\165\002\165\r\178\0142\002\165\002\165\002\165\002\165\002\165\000\000\000\000\002\165\000\000\002\165\002\165\000\000\000\000\000\000\000\000\000\000\000\000\002\165\002\165\002\165\000\000\002\165\002\165\002\165\000\000\002\165\000\000\000\000\000\000\002\165\000\000\002\165\002\165\000\000\002\165\002\165\002\165\002\165\002\165\002\165\000\000\000\000\002\165\002\165\002\165\000\000\000\000\000\000\000\000\002\165\002\165\002\165\002\165\002\161\002\161\000\000\000\000\000\000\002\161\000\000\000\000\002\161\000\000\000\000\002\161\000\000\002\161\000\000\000\000\002\161\000\000\002\161\002\161\002\161\000\000\002\161\002\161\002\161\000\000\000\000\000\000\000\000\000\000\002\161\002\161\002\161\002\161\002\161\000\000\002\161\000\000\000\000\000\000\000\000\000\000\002\161\002\161\002\161\002\161\002\161\000\000\000\000\002\161\000\000\000\000\000\000\000\000\002\161\000\000\002\161\002\161\000\000\000\000\000\000\000\000\002\161\002\161\002\161\000\000\000\000\000\000\000\000\000\000\000\000\002\161\002\161\002\161\002\161\002\161\002\161\002\161\002\161\002\161\000\000\000\000\002\161\000\000\002\161\002\161\000\000\000\000\000\000\000\000\000\000\000\000\002\161\002\161\002\161\000\000\002\161\002\161\002\161\000\000\002\161\000\000\000\000\000\000\002\161\000\000\002\161\002\161\000\000\012j\002\161\002\161\002\161\002\161\002\161\000\000\000\000\002\161\002\161\rv\000\000\000\000\000\000\000\000\002\161\002\161\002\161\002\161\002\157\002\157\000\000\000\000\000\000\002\157\000\000\000\000\002\157\000\000\000\000\002\157\000\000\002\157\000\000\000\000\r\154\000\000\002\157\002\157\002\157\000\000\002\157\002\157\002\157\000\000\000\000\000\000\000\000\000\000\014\002\014J\014b\014\026\002\157\000\000\002\157\000\000\000\000\000\000\000\000\000\000\002\157\002\157\014\146\014\170\002\157\000\000\000\000\002\157\000\000\000\000\000\000\000\000\002\157\000\000\002\157\002\157\000\000\000\000\000\000\000\000\002\157\002\157\000\242\000\000\000\000\000\000\000\000\000\000\000\000\002\157\002\157\r\178\0142\014\218\014\242\002\157\002\157\002\157\000\000\000\000\002\157\000\000\002\157\002\157\000\000\000\000\000\000\000\000\000\000\000\000\002\157\002\157\002\157\000\000\002\157\002\157\002\157\000\000\002\157\000\000\000\000\000\000\002\157\000\000\002\157\002\157\000\000\002\157\002\157\002\157\015\n\002\157\002\157\000\000\000\000\002\157\002\157\002\157\000\000\000\000\000\000\000\000\002\157\002\157\002\157\002\157\003Q\003Q\000\000\000\000\000\000\003Q\000\000\000\000\003Q\000\000\000\000\003Q\000\000\003Q\000\000\000\000\003Q\000\000\003Q\003Q\003Q\000\000\003Q\003Q\003Q\000\000\000\000\000\000\000\000\000\000\003Q\003Q\003Q\003Q\003Q\000\000\003Q\000\000\000\000\000\000\000\000\000\000\003Q\003Q\003Q\003Q\003Q\000\000\000\000\003Q\000\000\000\000\000\000\000\000\003Q\000\000\003Q\003Q\000\000\000\000\000\000\000\000\003Q\003Q\003Q\000\000\000\000\000\000\000\000\000\000\000\000\003Q\003Q\003Q\003Q\003Q\003Q\003Q\003Q\003Q\000\000\000\000\003Q\000\000\003Q\003Q\000\000\000\000\000\000\000\000\000\000\000\000\003Q\003Q\003Q\000\000\003Q\003Q\003Q\000\000\003Q\000\000\000\000\000\000\003Q\000\000\003Q\003Q\000\000\012j\003Q\003Q\003Q\003Q\003Q\000\000\000\000\003Q\003Q\rv\000\000\000\000\000\000\000\000\003Q\003Q\003Q\003Q\003M\003M\000\000\000\000\000\000\003M\000\000\000\000\003M\000\000\000\000\003M\000\000\003M\000\000\000\000\r\154\000\000\003M\003M\003M\000\000\003M\003M\003M\000\000\000\000\000\000\000\000\000\000\014\002\014J\014b\014\026\003M\000\000\003M\000\000\000\000\000\000\000\000\000\000\003M\003M\014\146\014\170\003M\000\000\000\000\003M\000\000\000\000\000\000\000\000\003M\000\000\003M\003M\000\000\000\000\000\000\000\000\003M\003M\003M\000\000\000\000\000\000\000\000\000\000\000\000\003M\003M\r\178\0142\014\218\003M\003M\003M\003M\000\000\000\000\003M\000\000\003M\003M\000\000\000\000\000\000\000\000\000\000\000\000\003M\003M\003M\000\000\003M\003M\003M\000\000\003M\000\000\000\000\000\000\003M\000\000\003M\003M\000\000\003M\003M\003M\015\n\003M\003M\000\000\000\000\003M\003M\003M\000\000\000\000\000\000\000\000\003M\003M\003M\003M\002\153\002\153\000\000\000\000\000\000\002\153\000\000\000\000\002\153\000\000\000\000\002\153\000\000\002\153\000\000\000\000\002\153\000\000\002\153\002\153\002\153\000\000\002\153\002\153\002\153\000\000\000\000\000\000\000\000\000\000\002\153\002\153\002\153\002\153\002\153\000\000\002\153\000\000\000\000\000\000\000\000\000\000\002\153\002\153\002\153\002\153\002\153\000\000\000\000\002\153\000\000\000\000\000\000\000\000\002\153\000\000\002\153\002\153\000\000\000\000\000\000\000\000\002\153\002\153\002\153\000\000\000\000\000\000\000\000\000\000\000\000\002\153\002\153\002\153\002\153\002\153\002\153\002\153\002\153\002\153\000\000\000\000\002\153\000\000\002\153\002\153\000\000\000\000\000\000\000\000\000\000\000\000\002\153\002\153\002\153\000\000\002\153\002\153\002\153\000\000\002\153\000\000\000\000\000\000\002\153\000\000\002\153\002\153\000\000\012j\002\153\002\153\002\153\002\153\002\153\000\000\000\000\002\153\002\153\rv\000\000\000\000\000\000\000\000\002\153\002\153\002\153\002\153\002\149\002\149\000\000\000\000\000\000\002\149\000\000\000\000\002\149\000\000\000\000\002\149\000\000\002\149\000\000\000\000\r\154\000\000\002\149\002\149\002\149\000\000\002\149\002\149\002\149\000\000\000\000\000\000\000\000\000\000\014\002\014J\014b\014\026\002\149\000\000\002\149\000\000\000\000\000\000\000\000\000\000\002\149\002\149\014\146\014\170\002\149\000\000\000\000\002\149\000\000\000\000\000\000\000\000\002\149\000\000\002\149\002\149\000\000\000\000\000\000\000\000\002\149\002\149\000\242\000\000\000\000\000\000\000\000\000\000\000\000\002\149\002\149\r\178\0142\014\218\014\242\002\149\002\149\002\149\000\000\000\000\002\149\000\000\002\149\002\149\000\000\000\000\000\000\000\000\000\000\000\000\002\149\002\149\002\149\000\000\002\149\002\149\002\149\000\000\002\149\000\000\000\000\000\000\002\149\000\000\002\149\002\149\000\000\002\149\002\149\002\149\015\n\002\149\002\149\000\000\000\000\002\149\002\149\002\149\000\000\000\000\000\000\000\000\002\149\002\149\002\149\002\149\003\t\003\t\000\000\000\000\000\000\003\t\000\000\000\000\003\t\000\000\000\000\003\t\000\000\003\t\000\000\000\000\003\t\000\000\003\t\003\t\003\t\000\000\003\t\003\t\003\t\000\000\000\000\000\000\000\000\000\000\003\t\003\t\003\t\003\t\003\t\000\000\003\t\000\000\000\000\000\000\000\000\000\000\003\t\003\t\003\t\003\t\003\t\000\000\000\000\003\t\000\000\000\000\000\000\000\000\003\t\000\000\003\t\003\t\000\000\000\000\000\000\000\000\003\t\003\t\003\t\000\000\000\000\000\000\000\000\000\000\000\000\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\000\000\000\000\003\t\000\000\003\t\003\t\000\000\000\000\000\000\000\000\000\000\000\000\003\t\003\t\003\t\000\000\003\t\003\t\003\t\000\000\003\t\000\000\000\000\000\000\003\t\000\000\003\t\003\t\000\000\012j\003\t\003\t\003\t\003\t\003\t\000\000\000\000\003\t\003\t\rv\000\000\000\000\000\000\000\000\003\t\003\t\003\t\003\t\003\005\003\005\000\000\000\000\000\000\003\005\000\000\000\000\003\005\000\000\000\000\003\005\000\000\003\005\000\000\000\000\r\154\000\000\003\005\003\005\003\005\000\000\003\005\003\005\003\005\000\000\000\000\000\000\000\000\000\000\014\002\014J\014b\014\026\003\005\000\000\003\005\000\000\000\000\000\000\000\000\000\000\003\005\003\005\014\146\014\170\003\005\000\000\000\000\003\005\000\000\000\000\000\000\000\000\003\005\000\000\003\005\003\005\000\000\000\000\000\000\000\000\003\005\003\005\000\242\000\000\000\000\000\000\000\000\000\000\000\000\003\005\003\005\r\178\0142\014\218\014\242\003\005\003\005\003\005\000\000\000\000\003\005\000\000\003\005\003\005\000\000\000\000\000\000\000\000\000\000\000\000\003\005\003\005\003\005\000\000\003\005\003\005\003\005\000\000\003\005\000\000\000\000\000\000\003\005\000\000\003\005\003\005\000\000\003\005\003\005\003\005\015\n\003\005\003\005\000\000\000\000\003\005\003\005\003\005\000\000\000\000\000\000\000\000\003\005\003\005\003\005\003\005\002\249\002\249\000\000\000\000\000\000\002\249\000\000\000\000\002\249\000\000\000\000\002\249\000\000\002\249\000\000\000\000\002\249\000\000\002\249\002\249\002\249\000\000\002\249\002\249\002\249\000\000\000\000\000\000\000\000\000\000\002\249\002\249\002\249\002\249\002\249\000\000\002\249\000\000\000\000\000\000\000\000\000\000\002\249\002\249\002\249\002\249\002\249\000\000\000\000\002\249\000\000\000\000\000\000\000\000\002\249\000\000\002\249\002\249\000\000\000\000\000\000\000\000\002\249\002\249\002\249\000\000\000\000\000\000\000\000\000\000\000\000\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\000\000\000\000\002\249\000\000\002\249\002\249\000\000\000\000\000\000\000\000\000\000\000\000\002\249\002\249\002\249\000\000\002\249\002\249\002\249\000\000\002\249\000\000\000\000\000\000\002\249\000\000\002\249\002\249\000\000\012j\002\249\002\249\002\249\002\249\002\249\000\000\000\000\002\249\002\249\rv\000\000\000\000\000\000\000\000\002\249\002\249\002\249\002\249\002\245\002\245\000\000\000\000\000\000\002\245\000\000\000\000\002\245\000\000\000\000\002\245\000\000\002\245\000\000\000\000\r\154\000\000\002\245\002\245\002\245\000\000\002\245\002\245\002\245\000\000\000\000\000\000\000\000\000\000\014\002\014J\014b\014\026\002\245\000\000\002\245\000\000\000\000\000\000\000\000\000\000\002\245\002\245\014\146\014\170\002\245\000\000\000\000\002\245\000\000\000\000\000\000\000\000\002\245\000\000\002\245\002\245\000\000\000\000\000\000\000\000\002\245\002\245\000\242\000\000\000\000\000\000\000\000\000\000\000\000\002\245\002\245\r\178\0142\014\218\014\242\002\245\002\245\002\245\000\000\000\000\002\245\000\000\002\245\002\245\000\000\000\000\000\000\000\000\000\000\000\000\002\245\002\245\002\245\000\000\002\245\002\245\002\245\000\000\002\245\000\000\000\000\000\000\002\245\000\000\002\245\002\245\000\000\002\245\002\245\002\245\015\n\002\245\002\245\000\000\000\000\002\245\002\245\002\245\000\000\000\000\000\000\000\000\002\245\002\245\002\245\002\245\003\025\003\025\000\000\000\000\000\000\003\025\000\000\000\000\003\025\000\000\000\000\003\025\000\000\003\025\000\000\000\000\003\025\000\000\003\025\003\025\003\025\000\000\003\025\003\025\003\025\000\000\000\000\000\000\000\000\000\000\003\025\003\025\003\025\003\025\003\025\000\000\003\025\000\000\000\000\000\000\000\000\000\000\003\025\003\025\003\025\003\025\003\025\000\000\000\000\003\025\000\000\000\000\000\000\000\000\003\025\000\000\003\025\003\025\000\000\000\000\000\000\000\000\003\025\003\025\003\025\000\000\000\000\000\000\000\000\000\000\000\000\003\025\003\025\003\025\003\025\003\025\003\025\003\025\003\025\003\025\000\000\000\000\003\025\000\000\003\025\003\025\000\000\000\000\000\000\000\000\000\000\000\000\003\025\003\025\003\025\000\000\003\025\003\025\003\025\000\000\003\025\000\000\000\000\000\000\003\025\000\000\003\025\003\025\000\000\012j\003\025\003\025\003\025\003\025\003\025\000\000\000\000\003\025\003\025\rv\000\000\000\000\000\000\000\000\003\025\003\025\003\025\003\025\003\021\003\021\000\000\000\000\000\000\003\021\000\000\000\000\003\021\000\000\000\000\003\021\000\000\003\021\000\000\000\000\r\154\000\000\003\021\003\021\003\021\000\000\003\021\003\021\003\021\000\000\000\000\000\000\000\000\000\000\014\002\014J\014b\014\026\014z\000\000\003\021\000\000\000\000\000\000\000\000\000\000\003\021\003\021\014\146\014\170\003\021\000\000\000\000\003\021\000\000\000\000\000\000\000\000\003\021\000\000\014\194\003\021\000\000\000\000\000\000\000\000\003\021\003\021\000\242\000\000\000\000\000\000\000\000\000\000\000\000\003\021\003\021\r\178\0142\014\218\014\242\015\"\003\021\003\021\000\000\000\000\003\021\000\000\003\021\015:\000\000\000\000\000\000\000\000\000\000\000\000\003\021\003\021\015R\000\000\003\021\003\021\003\021\000\000\003\021\000\000\000\000\000\000\003\021\000\000\003\021\003\021\000\000\003\021\003\021\003\021\015\n\003\021\003\021\000\000\000\000\003\021\015j\003\021\000\000\000\000\000\000\000\000\003\021\003\021\015\130\015\154\003!\003!\000\000\000\000\000\000\003!\000\000\000\000\003!\000\000\000\000\003!\000\000\003!\000\000\000\000\003!\000\000\003!\003!\003!\000\000\003!\003!\003!\000\000\000\000\000\000\000\000\000\000\003!\003!\003!\003!\003!\000\000\003!\000\000\000\000\000\000\000\000\000\000\003!\003!\003!\003!\003!\000\000\000\000\003!\000\000\000\000\000\000\000\000\003!\000\000\003!\003!\000\000\000\000\000\000\000\000\003!\003!\003!\000\000\000\000\000\000\000\000\000\000\000\000\003!\003!\003!\003!\003!\003!\003!\003!\003!\000\000\000\000\003!\000\000\003!\003!\000\000\000\000\000\000\000\000\000\000\000\000\003!\003!\003!\000\000\003!\003!\003!\000\000\003!\000\000\000\000\000\000\003!\000\000\003!\003!\000\000\012j\003!\003!\003!\003!\003!\000\000\000\000\003!\003!\rv\000\000\000\000\000\000\000\000\003!\003!\003!\003!\003\029\003\029\000\000\000\000\000\000\003\029\000\000\000\000\003\029\000\000\000\000\003\029\000\000\003\029\000\000\000\000\r\154\000\000\003\029\003\029\003\029\000\000\003\029\003\029\003\029\000\000\000\000\000\000\000\000\000\000\014\002\014J\014b\014\026\003\029\000\000\003\029\000\000\000\000\000\000\000\000\000\000\003\029\003\029\014\146\014\170\003\029\000\000\000\000\003\029\000\000\000\000\000\000\000\000\003\029\000\000\014\194\003\029\000\000\000\000\000\000\000\000\003\029\003\029\000\242\000\000\000\000\000\000\000\000\000\000\000\000\003\029\003\029\r\178\0142\014\218\014\242\015\"\003\029\003\029\000\000\000\000\003\029\000\000\003\029\015:\000\000\000\000\000\000\000\000\000\000\000\000\003\029\003\029\015R\000\000\003\029\003\029\003\029\000\000\003\029\000\000\000\000\000\000\003\029\000\000\003\029\003\029\000\000\003\029\003\029\003\029\015\n\003\029\003\029\000\000\000\000\003\029\003\029\003\029\000\000\000\000\000\000\000\000\003\029\003\029\015\130\015\154\003)\003)\000\000\000\000\000\000\003)\000\000\000\000\003)\000\000\000\000\003)\000\000\003)\000\000\000\000\003)\000\000\003)\003)\003)\000\000\003)\003)\003)\000\000\000\000\000\000\000\000\000\000\003)\003)\003)\003)\003)\000\000\003)\000\000\000\000\000\000\000\000\000\000\003)\003)\003)\003)\003)\000\000\000\000\003)\000\000\000\000\000\000\000\000\003)\000\000\003)\003)\000\000\000\000\000\000\000\000\003)\003)\003)\000\000\000\000\000\000\000\000\000\000\000\000\003)\003)\003)\003)\003)\003)\003)\003)\003)\000\000\000\000\003)\000\000\003)\003)\000\000\000\000\000\000\000\000\000\000\000\000\003)\003)\003)\000\000\003)\003)\003)\000\000\003)\000\000\000\000\000\000\003)\000\000\003)\003)\000\000\012j\003)\003)\003)\003)\003)\000\000\000\000\003)\003)\rv\000\000\000\000\000\000\000\000\003)\003)\003)\003)\003%\003%\000\000\000\000\000\000\003%\000\000\000\000\003%\000\000\000\000\003%\000\000\003%\000\000\000\000\r\154\000\000\003%\003%\003%\000\000\003%\003%\003%\000\000\000\000\000\000\000\000\000\000\014\002\014J\014b\014\026\003%\000\000\003%\000\000\000\000\000\000\000\000\000\000\003%\003%\014\146\014\170\003%\000\000\000\000\003%\000\000\000\000\000\000\000\000\003%\000\000\014\194\003%\000\000\000\000\000\000\000\000\003%\003%\000\242\000\000\000\000\000\000\000\000\000\000\000\000\003%\003%\r\178\0142\014\218\014\242\015\"\003%\003%\000\000\000\000\003%\000\000\003%\015:\000\000\000\000\000\000\000\000\000\000\000\000\003%\003%\015R\000\000\003%\003%\003%\000\000\003%\000\000\000\000\000\000\003%\000\000\003%\003%\000\000\003%\003%\003%\015\n\003%\003%\000\000\000\000\003%\003%\003%\000\000\000\000\000\000\000\000\003%\003%\015\130\015\154\nM\nM\000\000\000\000\000\000\nM\000\000\000\000\nM\000\000\000\000\nM\000\000\nM\000\000\000\000\nM\000\000\nM\nM\nM\000\000\nM\nM\nM\000\000\000\000\000\000\000\000\000\000\nM\nM\nM\nM\nM\000\000\nM\000\000\000\000\000\000\000\000\000\000\nM\nM\nM\nM\nM\000\000\000\000\nM\000\000\000\000\000\000\000\000\nM\000\000\nM\nM\000\000\000\000\000\000\000\000\nM\nM\nM\000\000\000\000\000\000\000\000\000\000\000\000\nM\nM\nM\nM\nM\nM\nM\nM\nM\000\000\000\000\nM\000\000\nM\nM\000\000\000\000\000\000\000\000\000\000\000\000\nM\nM\nM\000\000\nM\nM\nM\000\000\nM\000\000\000\000\000\000\nM\000\000\nM\nM\000\000\012j\nM\nM\nM\nM\nM\000\000\000\000\nM\nM\rv\000\000\000\000\000\000\000\000\nM\nM\nM\nM\nI\nI\000\000\000\000\000\000\nI\000\000\000\000\nI\000\000\000\000\nI\000\000\nI\000\000\000\000\r\154\000\000\nI\nI\nI\000\000\nI\nI\nI\000\000\000\000\000\000\000\000\000\000\014\002\014J\014b\014\026\014z\000\000\nI\000\000\000\000\000\000\000\000\000\000\nI\nI\014\146\014\170\nI\000\000\000\000\nI\000\000\000\000\000\000\000\000\nI\000\000\014\194\nI\000\000\000\000\000\000\000\000\nI\nI\000\242\000\000\000\000\000\000\000\000\000\000\000\000\nI\nI\r\178\0142\014\218\014\242\015\"\nI\nI\000\000\000\000\nI\000\000\nI\015:\000\000\000\000\000\000\000\000\000\000\000\000\nI\nI\015R\000\000\nI\nI\nI\000\000\nI\000\000\000\000\000\000\nI\000\000\nI\nI\000\000\nI\nI\nI\015\n\nI\nI\000\000\000\000\nI\015j\nI\000\000\000\000\000\000\000\000\nI\nI\015\130\015\154\0031\0031\000\000\000\000\000\000\0031\000\000\000\000\0031\000\000\000\000\0031\000\000\0031\000\000\000\000\0031\000\000\0031\0031\0031\000\000\0031\0031\0031\000\000\000\000\000\000\000\000\000\000\0031\0031\0031\0031\0031\000\000\0031\000\000\000\000\000\000\000\000\000\000\0031\0031\0031\0031\0031\000\000\000\000\0031\000\000\000\000\000\000\000\000\0031\000\000\0031\0031\000\000\000\000\000\000\000\000\0031\0031\0031\000\000\000\000\000\000\000\000\000\000\000\000\0031\0031\0031\0031\0031\0031\0031\0031\0031\000\000\000\000\0031\000\000\0031\0031\000\000\000\000\000\000\000\000\000\000\000\000\0031\0031\0031\000\000\0031\0031\0031\000\000\0031\000\000\000\000\000\000\0031\000\000\0031\0031\000\000\012j\0031\0031\0031\0031\0031\000\000\000\000\0031\0031\rv\000\000\000\000\000\000\000\000\0031\0031\0031\0031\003-\003-\000\000\000\000\000\000\003-\000\000\000\000\003-\000\000\000\000\003-\000\000\003-\000\000\000\000\r\154\000\000\003-\003-\003-\000\000\003-\003-\003-\000\000\000\000\000\000\000\000\000\000\014\002\014J\014b\014\026\014z\000\000\003-\000\000\000\000\000\000\000\000\000\000\003-\003-\014\146\014\170\003-\000\000\000\000\003-\000\000\000\000\000\000\000\000\003-\000\000\014\194\003-\000\000\000\000\000\000\000\000\003-\003-\000\242\000\000\000\000\000\000\000\000\000\000\000\000\003-\003-\r\178\0142\014\218\014\242\015\"\003-\003-\000\000\000\000\003-\000\000\003-\015:\000\000\000\000\000\000\000\000\000\000\000\000\003-\003-\015R\000\000\003-\003-\003-\000\000\003-\000\000\000\000\000\000\003-\000\000\003-\003-\000\000\015\178\003-\015\234\015\n\003-\003-\000\000\000\000\003-\015j\003-\000\000\000\000\000\000\000\000\003-\003-\015\130\015\154\n5\n5\000\000\000\000\000\000\n5\000\000\000\000\n5\000\000\000\000\n5\000\000\n5\000\000\000\000\r\154\000\000\n5\n5\n5\000\000\n5\n5\n5\000\000\000\000\000\000\000\000\000\000\014\002\014J\014b\014\026\014z\000\000\n5\000\000\000\000\000\000\000\000\000\000\n5\n5\014\146\014\170\n5\000\000\000\000\n5\000\000\000\000\000\000\000\000\n5\000\000\014\194\n5\000\000\000\000\000\000\000\000\n5\n5\000\242\000\000\000\000\000\000\000\000\000\000\000\000\n5\n5\r\178\0142\014\218\014\242\015\"\n5\n5\000\000\000\000\n5\000\000\n5\015:\000\000\000\000\000\000\000\000\000\000\000\000\n5\n5\015R\000\000\n5\n5\n5\000\000\n5\000\000\000\000\000\000\n5\000\000\n5\n5\000\000\n5\n5\n5\015\n\n5\n5\000\000\000\000\n5\015j\n5\000\000\000\000\000\000\000\000\n5\n5\015\130\015\154\003\129\003\129\000\000\000\000\000\000\003\129\000\000\000\000\003\129\000\000\000\000\003\129\000\000\003\129\000\000\000\000\003\129\000\000\003\129\003\129\003\129\000\000\003\129\003\129\003\129\000\000\000\000\000\000\000\000\000\000\003\129\003\129\003\129\003\129\003\129\000\000\003\129\000\000\000\000\000\000\000\000\000\000\003\129\003\129\003\129\003\129\003\129\000\000\000\000\003\129\000\000\000\000\000\000\000\000\003\129\000\000\003\129\003\129\000\000\000\000\000\000\000\000\003\129\003\129\003\129\000\000\000\000\000\000\000\000\000\000\000\000\003\129\003\129\003\129\003\129\003\129\003\129\003\129\003\129\003\129\000\000\000\000\003\129\000\000\003\129\003\129\000\000\000\000\000\000\000\000\000\000\000\000\003\129\003\129\003\129\000\000\003\129\003\129\003\129\000\000\003\129\000\000\000\000\000\000\003\129\000\000\003\129\003\129\000\000\012j\003\129\003\129\003\129\003\129\003\129\000\000\000\000\003\129\003\129\rv\000\000\000\000\000\000\000\000\003\129\003\129\003\129\003\129\003}\003}\000\000\000\000\000\000\003}\000\000\000\000\003}\000\000\000\000\003}\000\000\003}\000\000\000\000\r\154\000\000\003}\003}\003}\000\000\003}\003}\003}\000\000\000\000\000\000\000\000\000\000\014\002\014J\014b\014\026\014z\000\000\003}\000\000\000\000\000\000\000\000\000\000\003}\003}\014\146\014\170\003}\000\000\000\000\003}\000\000\000\000\000\000\000\000\003}\000\000\014\194\003}\000\000\000\000\000\000\000\000\003}\003}\000\242\000\000\000\000\000\000\000\000\000\000\000\000\003}\003}\r\178\0142\014\218\014\242\015\"\003}\003}\000\000\000\000\003}\000\000\003}\015:\000\000\000\000\000\000\000\000\000\000\000\000\003}\003}\015R\000\000\003}\003}\003}\000\000\003}\000\000\000\000\000\000\003}\000\000\003}\003}\000\000\015\178\003}\015\234\015\n\003}\003}\000\000\000\000\003}\015j\003}\000\000\000\000\000\000\000\000\003}\003}\015\130\015\154\003\161\003\161\000\000\000\000\000\000\003\161\000\000\000\000\003\161\000\000\000\000\003\161\000\000\003\161\000\000\000\000\003\161\000\000\003\161\003\161\003\161\000\000\003\161\003\161\003\161\000\000\000\000\000\000\000\000\000\000\003\161\003\161\003\161\003\161\003\161\000\000\003\161\000\000\000\000\000\000\000\000\000\000\003\161\003\161\003\161\003\161\003\161\000\000\000\000\003\161\000\000\000\000\000\000\000\000\003\161\000\000\003\161\003\161\000\000\000\000\000\000\000\000\003\161\003\161\003\161\000\000\000\000\000\000\000\000\000\000\000\000\003\161\003\161\003\161\003\161\003\161\003\161\003\161\003\161\003\161\000\000\000\000\003\161\000\000\003\161\003\161\000\000\000\000\000\000\000\000\000\000\000\000\003\161\003\161\003\161\000\000\003\161\003\161\003\161\000\000\003\161\000\000\000\000\000\000\003\161\000\000\003\161\003\161\000\000\012j\003\161\003\161\003\161\003\161\003\161\000\000\000\000\003\161\003\161\rv\000\000\000\000\000\000\000\000\003\161\003\161\003\161\003\161\003\157\003\157\000\000\000\000\000\000\003\157\000\000\000\000\003\157\000\000\000\000\003\157\000\000\003\157\000\000\000\000\r\154\000\000\003\157\003\157\003\157\000\000\003\157\003\157\003\157\000\000\000\000\000\000\000\000\000\000\014\002\014J\014b\014\026\014z\000\000\003\157\000\000\000\000\000\000\000\000\000\000\003\157\003\157\014\146\014\170\003\157\000\000\000\000\003\157\000\000\000\000\000\000\000\000\003\157\000\000\014\194\003\157\000\000\000\000\000\000\000\000\003\157\003\157\000\242\000\000\000\000\000\000\000\000\000\000\000\000\003\157\003\157\r\178\0142\014\218\014\242\015\"\003\157\003\157\000\000\000\000\003\157\000\000\003\157\015:\000\000\000\000\000\000\000\000\000\000\000\000\003\157\003\157\015R\000\000\003\157\003\157\003\157\000\000\003\157\000\000\000\000\000\000\003\157\000\000\003\157\003\157\000\000\015\178\003\157\015\234\015\n\003\157\003\157\000\000\000\000\003\157\015j\003\157\000\000\000\000\000\000\000\000\003\157\003\157\015\130\015\154\003\145\003\145\000\000\000\000\000\000\003\145\000\000\000\000\003\145\000\000\000\000\003\145\000\000\003\145\000\000\000\000\003\145\000\000\003\145\003\145\003\145\000\000\003\145\003\145\003\145\000\000\000\000\000\000\000\000\000\000\003\145\003\145\003\145\003\145\003\145\000\000\003\145\000\000\000\000\000\000\000\000\000\000\003\145\003\145\003\145\003\145\003\145\000\000\000\000\003\145\000\000\000\000\000\000\000\000\003\145\000\000\003\145\003\145\000\000\000\000\000\000\000\000\003\145\003\145\003\145\000\000\000\000\000\000\000\000\000\000\000\000\003\145\003\145\003\145\003\145\003\145\003\145\003\145\003\145\003\145\000\000\000\000\003\145\000\000\003\145\003\145\000\000\000\000\000\000\000\000\000\000\000\000\003\145\003\145\003\145\000\000\003\145\003\145\003\145\000\000\003\145\000\000\000\000\000\000\003\145\000\000\003\145\003\145\000\000\012j\003\145\003\145\003\145\003\145\003\145\000\000\000\000\003\145\003\145\rv\000\000\000\000\000\000\000\000\003\145\003\145\003\145\003\145\003\141\003\141\000\000\000\000\000\000\003\141\000\000\000\000\003\141\000\000\000\000\003\141\000\000\003\141\000\000\000\000\r\154\000\000\003\141\003\141\003\141\000\000\003\141\003\141\003\141\000\000\000\000\000\000\000\000\000\000\014\002\014J\014b\014\026\014z\000\000\003\141\000\000\000\000\000\000\000\000\000\000\003\141\003\141\014\146\014\170\003\141\000\000\000\000\003\141\000\000\000\000\000\000\000\000\003\141\000\000\014\194\003\141\000\000\000\000\000\000\000\000\003\141\003\141\000\242\000\000\000\000\000\000\000\000\000\000\000\000\003\141\003\141\r\178\0142\014\218\014\242\015\"\003\141\003\141\000\000\000\000\003\141\000\000\003\141\015:\000\000\000\000\000\000\000\000\000\000\000\000\003\141\003\141\015R\000\000\003\141\003\141\003\141\000\000\003\141\000\000\000\000\000\000\003\141\000\000\003\141\003\141\000\000\015\178\003\141\015\234\015\n\003\141\003\141\000\000\000\000\003\141\015j\003\141\000\000\000\000\000\000\000\000\003\141\003\141\015\130\015\154\003i\003i\000\000\000\000\000\000\003i\000\000\000\000\003i\000\000\000\000\003i\000\000\003i\000\000\000\000\003i\000\000\003i\003i\003i\000\000\003i\003i\003i\000\000\000\000\000\000\000\000\000\000\003i\003i\003i\003i\003i\000\000\003i\000\000\000\000\000\000\000\000\000\000\003i\003i\003i\003i\003i\000\000\000\000\003i\000\000\000\000\000\000\000\000\003i\000\000\003i\003i\000\000\000\000\000\000\000\000\003i\003i\003i\000\000\000\000\000\000\000\000\000\000\000\000\003i\003i\003i\003i\003i\003i\003i\003i\003i\000\000\000\000\003i\000\000\003i\003i\000\000\000\000\000\000\000\000\000\000\000\000\003i\003i\003i\000\000\003i\003i\003i\000\000\003i\000\000\000\000\000\000\003i\000\000\003i\003i\000\000\012j\003i\003i\003i\003i\003i\000\000\000\000\003i\003i\rv\000\000\000\000\000\000\000\000\003i\003i\003i\003i\003e\003e\000\000\000\000\000\000\003e\000\000\000\000\003e\000\000\000\000\003e\000\000\003e\000\000\000\000\r\154\000\000\003e\003e\003e\000\000\003e\003e\003e\000\000\000\000\000\000\000\000\000\000\014\002\014J\014b\014\026\014z\000\000\003e\000\000\000\000\000\000\000\000\000\000\003e\003e\014\146\014\170\003e\000\000\000\000\003e\000\000\000\000\000\000\000\000\003e\000\000\014\194\003e\000\000\000\000\000\000\000\000\003e\003e\000\242\000\000\000\000\000\000\000\000\000\000\000\000\003e\003e\r\178\0142\014\218\014\242\015\"\003e\003e\000\000\000\000\003e\000\000\003e\015:\000\000\000\000\000\000\000\000\000\000\000\000\003e\003e\015R\000\000\003e\003e\003e\000\000\003e\000\000\000\000\000\000\003e\000\000\003e\003e\000\000\015\178\003e\015\234\015\n\003e\003e\000\000\000\000\003e\015j\003e\000\000\000\000\000\000\000\000\003e\003e\015\130\015\154\003y\003y\000\000\000\000\000\000\003y\000\000\000\000\003y\000\000\000\000\003y\000\000\003y\000\000\000\000\003y\000\000\003y\003y\003y\000\000\003y\003y\003y\000\000\000\000\000\000\000\000\000\000\003y\003y\003y\003y\003y\000\000\003y\000\000\000\000\000\000\000\000\000\000\003y\003y\003y\003y\003y\000\000\000\000\003y\000\000\000\000\000\000\000\000\003y\000\000\003y\003y\000\000\000\000\000\000\000\000\003y\003y\003y\000\000\000\000\000\000\000\000\000\000\000\000\003y\003y\003y\003y\003y\003y\003y\003y\003y\000\000\000\000\003y\000\000\003y\003y\000\000\000\000\000\000\000\000\000\000\000\000\003y\003y\003y\000\000\003y\003y\003y\000\000\003y\000\000\000\000\000\000\003y\000\000\003y\003y\000\000\012j\003y\003y\003y\003y\003y\000\000\000\000\003y\003y\rv\000\000\000\000\000\000\000\000\003y\003y\003y\003y\003u\003u\000\000\000\000\000\000\003u\000\000\000\000\003u\000\000\000\000\003u\000\000\003u\000\000\000\000\r\154\000\000\003u\003u\003u\000\000\003u\003u\003u\000\000\000\000\000\000\000\000\000\000\014\002\014J\014b\014\026\014z\000\000\003u\000\000\000\000\000\000\000\000\000\000\003u\003u\014\146\014\170\003u\000\000\000\000\003u\000\000\000\000\000\000\000\000\003u\000\000\014\194\003u\000\000\000\000\000\000\000\000\003u\003u\000\242\000\000\000\000\000\000\000\000\000\000\000\000\003u\003u\r\178\0142\014\218\014\242\015\"\003u\003u\000\000\000\000\003u\000\000\003u\015:\000\000\000\000\000\000\000\000\000\000\000\000\003u\003u\015R\000\000\003u\003u\003u\000\000\003u\000\000\000\000\000\000\003u\000\000\003u\003u\000\000\015\178\003u\015\234\015\n\003u\003u\000\000\000\000\003u\015j\003u\000\000\000\000\000\000\000\000\003u\003u\015\130\015\154\003q\003q\000\000\000\000\000\000\003q\000\000\000\000\003q\000\000\000\000\003q\000\000\003q\000\000\000\000\003q\000\000\003q\003q\003q\000\000\003q\003q\003q\000\000\000\000\000\000\000\000\000\000\003q\003q\003q\003q\003q\000\000\003q\000\000\000\000\000\000\000\000\000\000\003q\003q\003q\003q\003q\000\000\000\000\003q\000\000\000\000\000\000\000\000\003q\000\000\003q\003q\000\000\000\000\000\000\000\000\003q\003q\003q\000\000\000\000\000\000\000\000\000\000\000\000\003q\003q\003q\003q\003q\003q\003q\003q\003q\000\000\000\000\003q\000\000\003q\003q\000\000\000\000\000\000\000\000\000\000\000\000\003q\003q\003q\000\000\003q\003q\003q\000\000\003q\000\000\000\000\000\000\003q\000\000\003q\003q\000\000\012j\003q\003q\003q\003q\003q\000\000\000\000\003q\003q\rv\000\000\000\000\000\000\000\000\003q\003q\003q\003q\003m\003m\000\000\000\000\000\000\003m\000\000\000\000\003m\000\000\000\000\003m\000\000\003m\000\000\000\000\r\154\000\000\003m\003m\003m\000\000\003m\003m\003m\000\000\000\000\000\000\000\000\000\000\014\002\014J\014b\014\026\014z\000\000\003m\000\000\000\000\000\000\000\000\000\000\003m\003m\014\146\014\170\003m\000\000\000\000\003m\000\000\000\000\000\000\000\000\003m\000\000\014\194\003m\000\000\000\000\000\000\000\000\003m\003m\000\242\000\000\000\000\000\000\000\000\000\000\000\000\003m\003m\r\178\0142\014\218\014\242\015\"\003m\003m\000\000\000\000\003m\000\000\003m\015:\000\000\000\000\000\000\000\000\000\000\000\000\003m\003m\015R\000\000\003m\003m\003m\000\000\003m\000\000\000\000\000\000\003m\000\000\003m\003m\000\000\015\178\003m\015\234\015\n\003m\003m\000\000\000\000\003m\015j\003m\000\000\000\000\000\000\000\000\003m\003m\015\130\015\154\003\137\003\137\000\000\000\000\000\000\003\137\000\000\000\000\003\137\000\000\000\000\003\137\000\000\003\137\000\000\000\000\003\137\000\000\003\137\003\137\003\137\000\000\003\137\003\137\003\137\000\000\000\000\000\000\000\000\000\000\003\137\003\137\003\137\003\137\003\137\000\000\003\137\000\000\000\000\000\000\000\000\000\000\003\137\003\137\003\137\003\137\003\137\000\000\000\000\003\137\000\000\000\000\000\000\000\000\003\137\000\000\003\137\003\137\000\000\000\000\000\000\000\000\003\137\003\137\003\137\000\000\000\000\000\000\000\000\000\000\000\000\003\137\003\137\003\137\003\137\003\137\003\137\003\137\003\137\003\137\000\000\000\000\003\137\000\000\003\137\003\137\000\000\000\000\000\000\000\000\000\000\000\000\003\137\003\137\003\137\000\000\003\137\003\137\003\137\000\000\003\137\000\000\000\000\000\000\003\137\000\000\003\137\003\137\000\000\012j\003\137\003\137\003\137\003\137\003\137\000\000\000\000\003\137\003\137\rv\000\000\000\000\000\000\000\000\003\137\003\137\003\137\003\137\003\133\003\133\000\000\000\000\000\000\003\133\000\000\000\000\003\133\000\000\000\000\003\133\000\000\003\133\000\000\000\000\r\154\000\000\003\133\003\133\003\133\000\000\003\133\003\133\003\133\000\000\000\000\000\000\000\000\000\000\014\002\014J\014b\014\026\014z\000\000\003\133\000\000\000\000\000\000\000\000\000\000\003\133\003\133\014\146\014\170\003\133\000\000\000\000\003\133\000\000\000\000\000\000\000\000\003\133\000\000\014\194\003\133\000\000\000\000\000\000\000\000\003\133\003\133\000\242\000\000\000\000\000\000\000\000\000\000\000\000\003\133\003\133\r\178\0142\014\218\014\242\015\"\003\133\003\133\000\000\000\000\003\133\000\000\003\133\015:\000\000\000\000\000\000\000\000\000\000\000\000\003\133\003\133\015R\000\000\003\133\003\133\003\133\000\000\003\133\000\000\000\000\000\000\003\133\000\000\003\133\003\133\000\000\015\178\003\133\015\234\015\n\003\133\003\133\000\000\000\000\003\133\015j\003\133\000\000\000\000\000\000\000\000\003\133\003\133\015\130\015\154\003\169\003\169\000\000\000\000\000\000\003\169\000\000\000\000\003\169\000\000\000\000\003\169\000\000\003\169\000\000\000\000\003\169\000\000\003\169\003\169\003\169\000\000\003\169\003\169\003\169\000\000\000\000\000\000\000\000\000\000\003\169\003\169\003\169\003\169\003\169\000\000\003\169\000\000\000\000\000\000\000\000\000\000\003\169\003\169\003\169\003\169\003\169\000\000\000\000\003\169\000\000\000\000\000\000\000\000\003\169\000\000\003\169\003\169\000\000\000\000\000\000\000\000\003\169\003\169\003\169\000\000\000\000\000\000\000\000\000\000\000\000\003\169\003\169\003\169\003\169\003\169\003\169\003\169\003\169\003\169\000\000\000\000\003\169\000\000\003\169\003\169\000\000\000\000\000\000\000\000\000\000\000\000\003\169\003\169\003\169\000\000\003\169\003\169\003\169\000\000\003\169\000\000\000\000\000\000\003\169\000\000\003\169\003\169\000\000\012j\003\169\003\169\003\169\003\169\003\169\000\000\000\000\003\169\003\169\rv\000\000\000\000\000\000\000\000\003\169\003\169\003\169\003\169\003\165\003\165\000\000\000\000\000\000\003\165\000\000\000\000\003\165\000\000\000\000\003\165\000\000\003\165\000\000\000\000\r\154\000\000\003\165\003\165\003\165\000\000\003\165\003\165\003\165\000\000\000\000\000\000\000\000\000\000\014\002\014J\014b\014\026\014z\000\000\003\165\000\000\000\000\000\000\000\000\000\000\003\165\003\165\014\146\014\170\003\165\000\000\000\000\003\165\000\000\000\000\000\000\000\000\003\165\000\000\014\194\003\165\000\000\000\000\000\000\000\000\003\165\003\165\000\242\000\000\000\000\000\000\000\000\000\000\000\000\003\165\003\165\r\178\0142\014\218\014\242\015\"\003\165\003\165\000\000\000\000\003\165\000\000\003\165\015:\000\000\000\000\000\000\000\000\000\000\000\000\003\165\003\165\015R\000\000\003\165\003\165\003\165\000\000\003\165\000\000\000\000\000\000\003\165\000\000\003\165\003\165\000\000\015\178\003\165\015\234\015\n\003\165\003\165\000\000\000\000\003\165\015j\003\165\000\000\000\000\000\000\000\000\003\165\003\165\015\130\015\154\003\153\003\153\000\000\000\000\000\000\003\153\000\000\000\000\003\153\000\000\000\000\003\153\000\000\003\153\000\000\000\000\003\153\000\000\003\153\003\153\003\153\000\000\003\153\003\153\003\153\000\000\000\000\000\000\000\000\000\000\003\153\003\153\003\153\003\153\003\153\000\000\003\153\000\000\000\000\000\000\000\000\000\000\003\153\003\153\003\153\003\153\003\153\000\000\000\000\003\153\000\000\000\000\000\000\000\000\003\153\000\000\003\153\003\153\000\000\000\000\000\000\000\000\003\153\003\153\003\153\000\000\000\000\000\000\000\000\000\000\000\000\003\153\003\153\003\153\003\153\003\153\003\153\003\153\003\153\003\153\000\000\000\000\003\153\000\000\003\153\003\153\000\000\000\000\000\000\000\000\000\000\000\000\003\153\003\153\003\153\000\000\003\153\003\153\003\153\000\000\003\153\000\000\000\000\000\000\003\153\000\000\003\153\003\153\000\000\012j\003\153\003\153\003\153\003\153\003\153\000\000\000\000\003\153\003\153\rv\000\000\000\000\000\000\000\000\003\153\003\153\003\153\003\153\003\149\003\149\000\000\000\000\000\000\003\149\000\000\000\000\003\149\000\000\000\000\003\149\000\000\003\149\000\000\000\000\r\154\000\000\003\149\003\149\003\149\000\000\003\149\003\149\003\149\000\000\000\000\000\000\000\000\000\000\014\002\014J\014b\014\026\014z\000\000\003\149\000\000\000\000\000\000\000\000\000\000\003\149\003\149\014\146\014\170\003\149\000\000\000\000\003\149\000\000\000\000\000\000\000\000\003\149\000\000\014\194\003\149\000\000\000\000\000\000\000\000\003\149\003\149\000\242\000\000\000\000\000\000\000\000\000\000\000\000\003\149\003\149\r\178\0142\014\218\014\242\015\"\003\149\003\149\000\000\000\000\003\149\000\000\003\149\015:\000\000\000\000\000\000\000\000\000\000\000\000\003\149\003\149\015R\000\000\003\149\003\149\003\149\000\000\003\149\000\000\000\000\000\000\003\149\000\000\003\149\003\149\000\000\015\178\003\149\015\234\015\n\003\149\003\149\000\000\000\000\003\149\015j\003\149\000\000\000\000\000\000\000\000\003\149\003\149\015\130\015\154\003a\003a\000\000\000\000\000\000\003a\000\000\000\000\003a\000\000\000\000\003a\000\000\003a\000\000\000\000\003a\000\000\003a\003a\003a\000\000\003a\003a\003a\000\000\000\000\000\000\000\000\000\000\003a\003a\003a\003a\003a\000\000\003a\000\000\000\000\000\000\000\000\000\000\003a\003a\003a\003a\003a\000\000\000\000\003a\000\000\000\000\000\000\000\000\003a\000\000\003a\003a\000\000\000\000\000\000\000\000\003a\003a\003a\000\000\000\000\000\000\000\000\000\000\000\000\003a\003a\003a\003a\003a\003a\003a\003a\003a\000\000\000\000\003a\000\000\003a\003a\000\000\000\000\000\000\000\000\000\000\000\000\003a\003a\003a\000\000\003a\003a\003a\000\000\003a\000\000\000\000\000\000\003a\000\000\003a\003a\000\000\012j\003a\003a\003a\003a\003a\000\000\000\000\003a\003a\rv\000\000\000\000\000\000\000\000\003a\003a\003a\003a\003]\003]\000\000\000\000\000\000\003]\000\000\000\000\003]\000\000\000\000\003]\000\000\003]\000\000\000\000\r\154\000\000\003]\003]\003]\000\000\003]\003]\003]\000\000\000\000\000\000\000\000\000\000\014\002\014J\014b\014\026\014z\000\000\003]\000\000\000\000\000\000\000\000\000\000\003]\003]\014\146\014\170\003]\000\000\000\000\003]\000\000\000\000\000\000\000\000\003]\000\000\014\194\003]\000\000\000\000\000\000\000\000\003]\003]\000\242\000\000\000\000\000\000\000\000\000\000\000\000\003]\003]\r\178\0142\014\218\014\242\015\"\003]\003]\000\000\000\000\003]\000\000\003]\015:\000\000\000\000\000\000\000\000\000\000\000\000\003]\003]\015R\000\000\003]\003]\003]\000\000\003]\000\000\000\000\000\000\003]\000\000\003]\003]\000\000\015\178\003]\015\234\015\n\003]\003]\000\000\000\000\003]\015j\003]\000\000\000\000\000\000\000\000\003]\003]\015\130\015\154\na\na\000\000\000\000\000\000\na\000\000\000\000\na\000\000\000\000\na\000\000\na\000\000\000\000\na\000\000\na\na\na\000\000\na\na\na\000\000\000\000\000\000\000\000\000\000\na\na\na\na\na\000\000\na\000\000\000\000\000\000\000\000\000\000\na\na\na\na\na\000\000\000\000\na\000\000\000\000\000\000\000\000\na\000\000\na\na\000\000\000\000\000\000\000\000\na\na\na\000\000\000\000\000\000\000\000\000\000\000\000\na\na\na\na\na\na\na\na\na\000\000\000\000\na\000\000\na\na\000\000\000\000\000\000\000\000\000\000\000\000\na\na\na\000\000\na\na\na\000\000\na\000\000\000\000\000\000\na\000\000\na\na\000\000\012j\na\na\na\na\na\000\000\000\000\na\na\rv\000\000\000\000\000\000\000\000\na\na\na\na\n]\n]\000\000\000\000\000\000\n]\000\000\000\000\n]\000\000\000\000\n]\000\000\n]\000\000\000\000\r\154\000\000\n]\n]\n]\000\000\n]\n]\n]\000\000\000\000\000\000\000\000\000\000\014\002\014J\014b\014\026\014z\000\000\n]\000\000\000\000\000\000\000\000\000\000\n]\n]\014\146\014\170\n]\000\000\000\000\n]\000\000\000\000\000\000\000\000\n]\000\000\014\194\n]\000\000\000\000\000\000\000\000\n]\n]\000\242\000\000\000\000\000\000\000\000\000\000\000\000\n]\n]\r\178\0142\014\218\014\242\015\"\n]\n]\000\000\000\000\n]\000\000\n]\015:\000\000\000\000\000\000\000\000\000\000\000\000\n]\n]\015R\000\000\n]\n]\n]\000\000\n]\000\000\000\000\000\000\n]\000\000\n]\n]\000\000\n]\n]\n]\015\n\n]\n]\000\000\000\000\n]\015j\n]\000\000\000\000\000\000\000\000\n]\n]\015\130\015\154\011\169\011\169\000\000\000\000\000\000\011\169\000\000\000\000\011\169\000\000\000\000\011\169\000\000\011\169\000\000\000\000\011\169\000\000\011\169\011\169\011\169\000\000\011\169\011\169\011\169\000\000\000\000\000\000\000\000\000\000\011\169\011\169\011\169\011\169\011\169\000\000\011\169\000\000\000\000\000\000\000\000\000\000\011\169\011\169\011\169\011\169\011\169\000\000\000\000\011\169\000\000\000\000\000\000\000\000\011\169\000\000\011\169\011\169\000\000\000\000\000\000\000\000\011\169\011\169\011\169\000\000\000\000\000\000\000\000\000\000\000\000\011\169\011\169\011\169\011\169\011\169\011\169\011\169\011\169\011\169\000\000\000\000\011\169\000\000\011\169\011\169\000\000\000\000\000\000\000\000\000\000\000\000\011\169\011\169\011\169\000\000\011\169\011\169\011\169\000\000\011\169\000\000\000\000\000\000\011\169\000\000\011\169\011\169\000\000\012j\011\169\011\169\011\169\011\169\011\169\000\000\000\000\011\169\011\169\rv\000\000\000\000\000\000\000\000\011\169\011\169\011\169\011\169\002i\002i\000\000\000\000\000\000\002i\000\000\000\000\002i\000\000\000\000\002i\000\000\002i\000\000\000\000\002i\000\000\002i\002i\002i\000\000\002i\002i\002i\000\000\000\000\000\000\000\000\000\000\002i\002i\002i\002i\002i\000\000\002i\000\000\000\000\000\000\000\000\000\000\002i\002i\002i\002i\002i\000\000\000\000\002i\000\000\000\000\000\000\000\000\002i\000\000\002i\002i\000\000\000\000\000\000\000\000\002i\002i\002i\000\000\000\000\000\000\000\000\000\000\000\000\002i\002i\002i\002i\002i\002i\002i\002i\002i\000\000\000\000\002i\000\000\002i\002i\000\000\000\000\000\000\000\000\000\000\000\000\002i\002i\002i\000\000\002i\002i\019r\000\000\002i\000\000\000\000\000\000\002i\000\000\002i\002i\000\000\012j\002i\002i\002i\002i\002i\000\000\000\000\002i\002i\rv\000\000\000\000\000\000\000\000\002i\002i\002i\002i\002a\002a\000\000\000\000\000\000\002a\000\000\000\000\002a\000\000\000\000\002a\000\000\002a\000\000\000\000\002a\000\000\002a\002a\002a\000\000\002a\002a\002a\000\000\000\000\000\000\000\000\000\000\002a\002a\002a\002a\002a\000\000\002a\000\000\000\000\000\000\000\000\000\000\002a\002a\002a\002a\002a\000\000\000\000\002a\000\000\000\000\000\000\000\000\002a\000\000\002a\002a\000\000\000\000\000\000\000\000\002a\002a\002a\000\000\000\000\000\000\000\000\000\000\000\000\002a\002a\002a\002a\002a\002a\002a\002a\002a\000\000\000\000\002a\000\000\002a\002a\000\000\000\000\000\000\000\000\000\000\000\000\002a\002a\002a\000\000\002a\002a\002a\000\000\002a\000\000\000\000\000\000\002a\000\000\002a\002a\000\000\012j\002a\002a\002a\002a\002a\000\000\000\000\002a\002a\rv\000\000\000\000\000\000\000\000\002a\002a\002a\002a\002]\002]\000\000\000\000\000\000\002]\000\000\000\000\002]\000\000\000\000\002]\000\000\002]\000\000\000\000\r\154\000\000\002]\002]\002]\000\000\002]\002]\002]\000\000\000\000\000\000\000\000\000\000\014\002\014J\014b\014\026\014z\000\000\002]\000\000\000\000\000\000\000\000\000\000\002]\002]\014\146\014\170\002]\000\000\000\000\002]\000\000\000\000\000\000\000\000\002]\000\000\014\194\002]\000\000\000\000\000\000\000\000\002]\002]\000\242\000\000\000\000\000\000\000\000\000\000\000\000\002]\002]\r\178\0142\014\218\014\242\015\"\002]\002]\000\000\000\000\002]\000\000\002]\015:\000\000\000\000\000\000\000\000\000\000\000\000\002]\002]\015R\000\000\002]\002]\002]\000\000\002]\000\000\000\000\000\000\002]\000\000\002]\002]\000\000\015\178\002]\015\234\015\n\002]\002]\000\000\000\000\002]\015j\002]\000\000\000\000\000\000\000\000\002]\002]\015\130\015\154\002e\002e\000\000\000\000\000\000\002e\000\000\000\000\002e\000\000\000\000\002e\000\000\002e\000\000\000\000\r\154\000\000\002e\002e\002e\000\000\002e\002e\002e\000\000\000\000\000\000\000\000\000\000\014\002\014J\014b\014\026\014z\000\000\002e\000\000\000\000\000\000\000\000\000\000\002e\002e\014\146\014\170\002e\000\000\000\000\002e\000\000\000\000\000\000\000\000\002e\000\000\014\194\002e\000\000\000\000\000\000\000\000\002e\002e\000\242\000\000\000\000\000\000\000\000\000\000\000\000\002e\002e\r\178\0142\014\218\014\242\015\"\002e\002e\000\000\000\000\002e\000\000\002e\015:\000\000\000\000\000\000\000\000\000\000\000\000\002e\002e\015R\000\000\002e\002e\019\142\000\000\002e\000\000\000\000\000\000\002e\000\000\002e\002e\000\000\015\178\002e\015\234\015\n\002e\002e\000\000\000\000\002e\015j\002e\000\000\000\000\000\000\000\000\002e\002e\015\130\015\154\002Y\002Y\000\000\000\000\000\000\002Y\000\000\000\000\002Y\000\000\000\000\002Y\000\000\002Y\000\000\000\000\002Y\000\000\002Y\002Y\002Y\000\000\002Y\002Y\002Y\000\000\000\000\000\000\000\000\000\000\002Y\002Y\002Y\002Y\002Y\000\000\002Y\000\000\000\000\000\000\000\000\000\000\002Y\002Y\002Y\002Y\002Y\000\000\000\000\002Y\000\000\000\000\000\000\000\000\002Y\000\000\002Y\002Y\000\000\000\000\000\000\000\000\002Y\002Y\002Y\000\000\000\000\000\000\000\000\000\000\000\000\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\000\000\000\000\002Y\000\000\002Y\002Y\000\000\000\000\000\000\000\000\000\000\000\000\002Y\002Y\002Y\000\000\002Y\002Y\002Y\000\000\002Y\000\000\000\000\000\000\002Y\000\000\002Y\002Y\000\000\012j\002Y\002Y\002Y\002Y\002Y\000\000\000\000\002Y\002Y\rv\000\000\000\000\000\000\000\000\002Y\002Y\002Y\002Y\002U\002U\000\000\000\000\000\000\002U\000\000\000\000\002U\000\000\000\000\002U\000\000\002U\000\000\000\000\r\154\000\000\002U\002U\002U\000\000\002U\002U\002U\000\000\000\000\000\000\000\000\000\000\014\002\014J\014b\014\026\014z\000\000\002U\000\000\000\000\000\000\000\000\000\000\002U\002U\014\146\014\170\002U\000\000\000\000\002U\000\000\000\000\000\000\000\000\002U\000\000\014\194\002U\000\000\000\000\000\000\000\000\002U\002U\000\242\000\000\000\000\000\000\000\000\000\000\000\000\002U\002U\r\178\0142\014\218\014\242\015\"\002U\002U\000\000\000\000\002U\000\000\002U\015:\000\000\000\000\000\000\000\000\000\000\000\000\002U\002U\015R\000\000\002U\002U\002U\000\000\002U\000\000\000\000\000\000\002U\000\000\002U\002U\000\000\015\178\002U\015\234\015\n\002U\002U\000\000\000\000\002U\015j\002U\000\000\000\000\000\000\000\000\002U\002U\015\130\015\154\nu\nu\000\000\000\000\000\000\nu\000\000\000\000\nu\000\000\000\000\nu\000\000\nu\000\000\000\000\nu\000\000\nu\nu\nu\000\000\nu\nu\nu\000\000\000\000\000\000\000\000\000\000\nu\nu\nu\nu\nu\000\000\nu\000\000\000\000\000\000\000\000\000\000\nu\nu\nu\nu\nu\000\000\000\000\nu\000\000\000\000\000\000\000\000\nu\000\000\nu\nu\000\000\000\000\000\000\000\000\nu\nu\nu\000\000\000\000\000\000\000\000\000\000\000\000\nu\nu\nu\nu\nu\nu\nu\nu\nu\000\000\000\000\nu\000\000\nu\nu\000\000\000\000\000\000\000\000\000\000\000\000\nu\nu\nu\000\000\nu\nu\nu\000\000\nu\000\000\000\000\000\000\nu\000\000\nu\nu\000\000\012j\nu\nu\nu\nu\nu\000\000\000\000\nu\nu\rv\000\000\000\000\000\000\000\000\nu\nu\nu\nu\nq\nq\000\000\000\000\000\000\nq\000\000\000\000\nq\000\000\000\000\nq\000\000\nq\000\000\000\000\r\154\000\000\nq\nq\nq\000\000\nq\nq\nq\000\000\000\000\000\000\000\000\000\000\014\002\014J\014b\014\026\014z\000\000\nq\000\000\000\000\000\000\000\000\000\000\nq\nq\014\146\014\170\nq\000\000\000\000\nq\000\000\000\000\000\000\000\000\nq\000\000\014\194\nq\000\000\000\000\000\000\000\000\nq\nq\000\242\000\000\000\000\000\000\000\000\000\000\000\000\nq\nq\r\178\0142\014\218\014\242\015\"\nq\nq\000\000\000\000\nq\000\000\nq\015:\000\000\000\000\000\000\000\000\000\000\000\000\nq\nq\015R\000\000\nq\nq\nq\000\000\nq\000\000\000\000\000\000\nq\000\000\nq\nq\000\000\nq\nq\nq\015\n\nq\nq\000\000\000\000\nq\015j\nq\000\000\000\000\000\000\000\000\nq\nq\015\130\015\154\003Y\003Y\000\000\000\000\000\000\003Y\000\000\000\000\003Y\000\000\000\000\003Y\000\000\003Y\000\000\000\000\003Y\000\000\003Y\003Y\003Y\000\000\003Y\003Y\003Y\000\000\000\000\000\000\000\000\000\000\003Y\003Y\003Y\003Y\003Y\000\000\003Y\000\000\000\000\000\000\000\000\000\000\003Y\003Y\003Y\003Y\003Y\000\000\000\000\003Y\000\000\000\000\000\000\000\000\003Y\000\000\003Y\003Y\000\000\000\000\000\000\000\000\003Y\003Y\003Y\000\000\000\000\000\000\000\000\000\000\000\000\003Y\003Y\003Y\003Y\003Y\003Y\003Y\003Y\003Y\000\000\000\000\003Y\000\000\003Y\003Y\000\000\000\000\000\000\000\000\000\000\000\000\003Y\003Y\003Y\000\000\003Y\003Y\003Y\000\000\003Y\000\000\000\000\000\000\003Y\000\000\003Y\003Y\000\000\012j\003Y\003Y\003Y\003Y\003Y\000\000\000\000\003Y\003Y\rv\000\000\000\000\000\000\000\000\003Y\003Y\003Y\003Y\003U\003U\000\000\000\000\000\000\003U\000\000\000\000\003U\000\000\000\000\003U\000\000\003U\000\000\000\000\r\154\000\000\003U\003U\003U\000\000\003U\003U\003U\000\000\000\000\000\000\000\000\000\000\014\002\014J\014b\014\026\014z\000\000\003U\000\000\000\000\000\000\000\000\000\000\003U\003U\014\146\014\170\003U\000\000\000\000\003U\000\000\000\000\000\000\000\000\003U\000\000\014\194\003U\000\000\000\000\000\000\000\000\003U\003U\000\242\000\000\000\000\000\000\000\000\000\000\000\000\003U\003U\r\178\0142\014\218\014\242\015\"\003U\003U\000\000\000\000\003U\000\000\003U\015:\000\000\000\000\000\000\000\000\000\000\000\000\003U\003U\015R\000\000\003U\003U\003U\000\000\003U\000\000\000\000\000\000\003U\000\000\003U\003U\000\000\015\178\003U\015\234\015\n\003U\003U\000\000\000\000\003U\015j\003U\000\000\000\000\000\000\000\000\003U\003U\015\130\015\154\002I\002I\000\000\000\000\000\000\002I\000\000\000\000\002I\000\000\000\000\002I\000\000\002I\000\000\000\000\002I\000\000\002I\002I\002I\000\000\002I\002I\002I\000\000\000\000\000\000\000\000\000\000\002I\002I\002I\002I\002I\000\000\002I\000\000\000\000\000\000\000\000\000\000\002I\002I\002I\002I\002I\000\000\000\000\002I\000\000\000\000\000\000\000\000\002I\000\000\002I\002I\000\000\000\000\000\000\000\000\002I\002I\002I\000\000\000\000\000\000\000\000\000\000\000\000\002I\002I\002I\002I\002I\002I\002I\002I\002I\000\000\000\000\002I\000\000\002I\002I\000\000\000\000\000\000\000\000\000\000\000\000\002I\002I\002I\000\000\002I\002I\002I\000\000\002I\000\000\000\000\000\000\002I\000\000\002I\002I\000\000\002I\002I\002I\002I\002I\002I\000\000\000\000\002I\002I\rv\000\000\000\000\000\000\000\000\002I\002I\002I\002I\n\157\n\157\000\000\000\000\000\000\n\157\000\000\000\000\n\157\000\000\000\000\n\157\000\000\n\157\000\000\000\000\n\157\000\000\n\157\n\157\n\157\000\000\n\157\n\157\n\157\000\000\000\000\000\000\000\000\000\000\n\157\n\157\n\157\n\157\n\157\000\000\n\157\000\000\000\000\000\000\000\000\000\000\n\157\n\157\n\157\n\157\n\157\000\000\000\000\n\157\000\000\000\000\000\000\000\000\n\157\000\000\n\157\n\157\000\000\000\000\000\000\000\000\n\157\n\157\n\157\000\000\000\000\000\000\000\000\000\000\000\000\n\157\n\157\n\157\n\157\n\157\n\157\n\157\n\157\n\157\000\000\000\000\n\157\000\000\n\157\n\157\000\000\000\000\000\000\000\000\000\000\000\000\n\157\n\157\n\157\000\000\n\157\n\157\n\157\000\000\n\157\000\000\000\000\000\000\n\157\000\000\n\157\n\157\000\000\012j\n\157\n\157\n\157\n\157\n\157\000\000\000\000\n\157\n\157\rv\000\000\000\000\000\000\000\000\n\157\n\157\n\157\n\157\n\153\n\153\000\000\000\000\000\000\n\153\000\000\000\000\n\153\000\000\000\000\n\153\000\000\n\153\000\000\000\000\r\154\000\000\n\153\n\153\n\153\000\000\n\153\n\153\n\153\000\000\000\000\000\000\000\000\000\000\014\002\014J\014b\014\026\014z\000\000\n\153\000\000\000\000\000\000\000\000\000\000\n\153\n\153\014\146\014\170\n\153\000\000\000\000\n\153\000\000\000\000\000\000\000\000\n\153\000\000\014\194\n\153\000\000\000\000\000\000\000\000\n\153\n\153\000\242\000\000\000\000\000\000\000\000\000\000\000\000\n\153\n\153\r\178\0142\014\218\014\242\015\"\n\153\n\153\000\000\000\000\n\153\000\000\n\153\015:\000\000\000\000\000\000\000\000\000\000\000\000\n\153\n\153\015R\000\000\n\153\n\153\n\153\000\000\n\153\000\000\000\000\000\000\n\153\000\000\n\153\n\153\000\000\n\153\n\153\n\153\015\n\n\153\n\153\000\000\000\000\n\153\015j\n\153\000\000\000\000\000\000\000\000\n\153\n\153\015\130\015\154\n\137\n\137\000\000\000\000\000\000\n\137\000\000\000\000\n\137\000\000\000\000\n\137\000\000\n\137\000\000\000\000\n\137\000\000\n\137\n\137\n\137\000\000\n\137\n\137\n\137\000\000\000\000\000\000\000\000\000\000\n\137\n\137\n\137\n\137\n\137\000\000\n\137\000\000\000\000\000\000\000\000\000\000\n\137\n\137\n\137\n\137\n\137\000\000\000\000\n\137\000\000\000\000\000\000\000\000\n\137\000\000\n\137\n\137\000\000\000\000\000\000\000\000\n\137\n\137\n\137\000\000\000\000\000\000\000\000\000\000\000\000\n\137\n\137\n\137\n\137\n\137\n\137\n\137\n\137\n\137\000\000\000\000\n\137\000\000\n\137\n\137\000\000\000\000\000\000\000\000\000\000\000\000\n\137\n\137\n\137\000\000\n\137\n\137\n\137\000\000\n\137\000\000\000\000\000\000\n\137\000\000\n\137\n\137\000\000\012j\n\137\n\137\n\137\n\137\n\137\000\000\000\000\n\137\n\137\rv\000\000\000\000\000\000\000\000\n\137\n\137\n\137\n\137\n\133\n\133\000\000\000\000\000\000\n\133\000\000\000\000\n\133\000\000\000\000\n\133\000\000\n\133\000\000\000\000\r\154\000\000\n\133\n\133\n\133\000\000\n\133\n\133\n\133\000\000\000\000\000\000\000\000\000\000\014\002\014J\014b\014\026\014z\000\000\n\133\000\000\000\000\000\000\000\000\000\000\n\133\n\133\014\146\014\170\n\133\000\000\000\000\n\133\000\000\000\000\000\000\000\000\n\133\000\000\014\194\n\133\000\000\000\000\000\000\000\000\n\133\n\133\000\242\000\000\000\000\000\000\000\000\000\000\000\000\n\133\n\133\r\178\0142\014\218\014\242\015\"\n\133\n\133\000\000\000\000\n\133\000\000\n\133\015:\000\000\000\000\000\000\000\000\000\000\000\000\n\133\n\133\015R\000\000\n\133\n\133\n\133\000\000\n\133\000\000\000\000\000\000\n\133\000\000\n\133\n\133\000\000\n\133\n\133\n\133\015\n\n\133\n\133\000\000\000\000\n\133\015j\n\133\000\000\000\000\000\000\000\000\n\133\n\133\015\130\015\154\002M\002M\000\000\000\000\000\000\002M\000\000\000\000\002M\000\000\000\000\002M\000\000\002M\000\000\000\000\002M\000\000\002M\002M\002M\000\000\002M\002M\002M\000\000\000\000\000\000\000\000\000\000\002M\002M\002M\002M\002M\000\000\002M\000\000\004!\004!\000\000\000\000\002M\002M\002M\002M\002M\000\000\000\000\002M\000\000\000\000\000\000\000\000\002M\000\000\002M\002M\004!\000\000\015A\000\000\002M\002M\002M\000\000\000\000\000\000\011q\000\000\000\000\002M\002M\002M\002M\002M\002M\002M\002M\002M\015A\004!\002M\0022\002M\002M\0026\r6\011q\006\137\011q\011q\002M\002M\002M\000\000\002M\002M\002M\002B\002M\000\000\004!\000\000\002M\001\210\002M\002M\000\000\002M\002M\002M\002M\002M\002M\000\000\000\000\002M\002M\rv\000\000\000\000\000\000\001\214\002M\002M\002M\002M\001\n\002N\000\006\000\000\000\000\000\000\002\198\002\202\025\150\002\246\002\150\000\000\003\002\006\137\000\000\004\218\001\014\000\000\000\000\000\000\002\162\000\000\002\174\007\029\026\014\001\214\000\000\000\000\002\190\006\006\001\022\011f\011j\001\"\001&\026&\000\000\000\000\004\226\000\000\005\186\000\000\022~\000\000\011\142\011\146\002R\005\238\005\242\012j\005\246\006\002\006\014\011\150\t\166\000\000\001>\011q\002\190\rv\000\000\006\n\000\000\000\000\000\000\011\018\011\022\011\"\0116\011\170\006\146\000\000\000\000\001B\001F\001J\001N\001R\000\000\000\000\011\194\001V\000\000\000\000\000\000\001Z\000\000\011\206\011\230\012\158\006\158\006\162\000\000\000\000\001^\000\000\000\000\000\000\000\000\002\001\000\000\001b\000\000\025j\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\158\007\190\000\000\007\202\006\166\011*\000\000\001\162\000\000\020&\003j\012\178\001\n\001\170\000\006\001\174\001\178\000\n\002\198\002\202\000\000\002\246\002\150\007\206\003\002\000\000\000\000\004\218\001\014\000\000\000\000\000\000\011b\000\000\000\000\000\000\002\001\001\214\000\000\000\000\000\000\006\006\001\022\011f\011j\001\"\001&\000\000\002\001\002\001\004\226\000\000\005\186\000\000\011n\000\000\011\142\011\146\000\000\005\238\005\242\000\000\005\246\006\002\006\014\011\150\t\166\000\242\001>\000\000\002\190\b\189\000\000\006\n\000\000\000\000\000\000\011\018\011\022\011\"\0116\011\170\006\146\000\000\000\000\001B\001F\001J\001N\001R\b\189\000\000\011\194\001V\b\189\000\000\000\000\001Z\000\000\011\206\011\230\012\158\006\158\006\162\t\205\000\000\001^\000\000\t\205\000\000\000\000\000\000\007\210\001b\000\000\007\142\b\006\005}\000\000\000\000\000\000\000\000\b\026\001\158\bB\000\000\b&\006\166\011*\000\000\001\162\000\000\020&\003j\012\178\005\241\001\170\000\006\001\174\001\178\000\250\002\198\002\202\002\206\002\246\002\150\000\000\003\002\000\000\t\205\004\218\000\000\000\000\005\134\000\000\000\000\000\000\005\241\000\000\005\138\001\214\000\242\023\206\000\000\004\222\b\189\005\142\005\146\000\000\000\000\t\205\005\150\000\000\004\226\000\000\005\186\000\000\023b\000\000\005\230\005\234\003\014\005\238\005\242\004\162\005\246\006\002\006\014\006\022\t\166\000\249\005}\023\198\002\190\000\000\000\249\006\n\023\222\000\000\000\000\011\018\011\022\011\"\0116\011\170\006\146\007\210\000\000\003\254\007\142\012\002\000\000\000\000\023\230\000\249\011\194\b\026\000\000\000\000\015\t\b&\000\000\011\206\011\230\012\158\006\158\006\162\023\250\0246\000\000\000\000\005\241\005\241\000\000\000\000\000\000\000\249\000\000\015\t\015\t\000\000\025\158\015\t\000\000\000\000\000\000\000\000\000\249\024r\028v\006\166\011*\000\249\000\145\000\000\011B\003j\012\178\000\145\000\000\002\202\000\145\000\249\002\150\000\000\012\238\000\000\000\000\004\218\000\000\000\000\000\145\000\000\000\145\000\000\000\145\000\000\000\145\001\214\000\000\r\006\t\201\004\222\000\242\000\000\t\201\000\000\000\249\r\014\000\145\000\000\004\226\000\000\005\186\000\000\000\145\000\000\000\249\000\000\000\145\005\238\005\242\000\000\000\000\006\002\001\194\000\000\000\145\000\000\000\000\000\145\002\190\000\000\015\t\006\n\000\145\000\145\000\145\011\018\011\022\011\"\000\000\r\022\006\146\000\145\000\145\t\201\000\000\000\000\004\174\000\000\000\145\000\000\000\000\000\000\000\145\011\141\000\000\000\000\000\000\000\000\000\000\000\000\006\158\006\162\000\145\000\145\t\201\000\000\000\145\000\145\000\000\000\000\000\000\000\000\bn \014\000\000\011\141\005\221\000\145\bN\000\000\000\000\005\221\000\000\000\145\000\145\006\166\011*\000\000\000\000\000\169\011B\003j\000\000\000\145\000\169\000\145\002\202\000\169\bR\002\150\005\221\012\238\003\254\000\000\004\218\000\000\000\000\000\169\000\000\000\169\000\000\000\169\000\000\000\169\001\214\000\000\r\006\000\242\004\222\000\000\000\000\000\000\005\221\000\000\r\014\000\169\000\000\004\226\000\000\005\186\000\000\000\169\000\000\005\221\000\000\000\169\005\238\005\242\005\221\002\238\006\002\001\194\000\242\000\169\000\000\000\000\000\169\002\190\005\221\000\000\006\n\000\169\000\169\000\169\011\018\011\022\011\"\000\000\r\022\006\146\000\169\000\169\007\210\000\000\000\000\007\142 \018\000\169\000\000\000\000\011\141\000\169\b\026\005\221\000\000\000\000\b&\000\000\000\000\006\158\006\162\000\169\000\169\005\221\000\000\000\169\000\169\007\210\000\000\000\000\007\142\011\029\000\000\000\000\000\000\000\000\000\169\b\026\000\000\000\000\000\000\b&\000\169\000\169\006\166\011*\000\000\000\000\011\025\011B\003j\000\000\000\169\000\006\000\169\000\000\000\250\002\198\002\202\002\206\002\246\002\150\000\000\003\002\000\000\000\000\004\218\000\000\000\000\006\017\000\000\000\000\000\000\011\029\000\000\005\138\001\214\000\000\000\000\000\000\004\222\000\000\005\142\005\146\000\000\000\000\000\000\005\150\000\000\004\226\011\025\005\186\000\000\023b\011\029\005\230\005\234\000\000\005\238\005\242\000\000\005\246\006\002\006\014\006\022\t\166\000\000\000\000\023\198\002\190\000\000\011\025\006\n\023\222\000\000\000\000\011\018\011\022\011\"\0116\011\170\006\146\000\000\000\000\000\000\000\000\000\000\000\000\011\029\023\230\015A\011\194\003\254#^\000\000\011\029\000\000\000\000\011\206\011\230\012\158\006\158\006\162\023\250\0246\011\025\000\000#\127\020\182\003\254\015A\000\000\011\025\0022\000\000\000\000\0026\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\028v\006\166\011*\000\000\002B\000\000\011B\003j\012\178\000\006\002J\015-\000\250\002\198\002\202\002\206\002\246\002\150\000\000\003\002\000\000\000\000\004\218\021r\000\000#\174\002\150\000\000\000\000\000\000\000\000\005\138\001\214\000\000\002N\000\000\004\222\000\000\005\142\005\146\000\000\000\000\000\000\005\150\028\030\004\226\000\000\005\186\000\000\023b\000\000\005\230\005\234\000\000\005\238\005\242\000\000\005\246\006\002\006\014\006\022\t\166\000\000\000\000\023\198\002\190\000\000\021v\006\n\023\222\000\000\000\000\011\018\011\022\011\"\0116\011\170\006\146\000\000\002R\000\000\021\130\000\000\028B\000\000\023\230\000\000\011\194\000\000#^\000\000\000\000\000\000\000\000\011\206\011\230\012\158\006\158\006\162\023\250\0246\000\000\000\000\006\025\000\000\000\000\000\000\006\162\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\028N\000\000\000\000\028v\006\166\011*\001\n\000\000\000\000\011B\003j\012\178\004\242\002\202\007\162\000\000\002\150\027\226\004\246\000\000\000\000\004\218\001\014\000\000\000\000\000\000\002\162\000\000\000\000\000\000\000\000\001\214\000\000\000\000\000\000\001\018\001\022\001\026\005J\001\"\001&\000\000\000\000\000\000\002\001\000\000\000\000\000\000\005N\002\001\0012\007\186\000\000\000\000\000\000\000\000\000\000\005F\001\194\001:\000\000\000\000\001>\000\000\002\190\000\000\000\000\006R\002\001\000\000\000\000\006V\000\000\006^\006\134\006\230\006\146\000\n\000\000\001B\001F\001J\001N\001R\000\000\000\000\000\000\001V\006\150\000\000\002\001\001Z\000\000\000\000\000\000\002\001\006\158\006\162\000\000\007\"\001^\002\001\000\000\000\000\000\000\007.\002\001\001b\002\001\000\000\000\000\000\000\000\000\000\000\000\000\002\001\002\001\001\158\007\190\000\000\000\000\006\166\000\000\000\000\001\162\000\000\001\166\003j\001\n\000\000\001\170\000\000\001\174\001\178\004\242\002\202\012\"\000\000\002\150\000\000\004\246\002\001\000\000\004\218\001\014\000\000\000\000\000\000\002\162\000\000\000\000\002\001\000\000\001\214\000\000\000\000\000\000\001\018\001\022\001\026\005J\001\"\001&\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005N\000\000\0012\007\186\000\000\000\000\000\000\000\000\000\000\005F\001\194\001:\000\000\000\000\001>\000\000\002\190\000\000\000\000\006R\000\000\000\000\000\000\006V\000\000\006^\006\134\006\230\006\146\000\000\000\000\001B\001F\001J\001N\001R\000\000\000\000\000\000\001V\006\150\000\000\000\000\001Z\000\000\000\000\000\000\000\000\006\158\006\162\000\000\007\"\001^\000\000\000\000\000\000\000\000\007.\011\130\001b\000\000\000\000\000\000\000\000\000\000\002\018\000\000\000\000\000\000\001\158\007\190\000\000\002\022\006\166\000\000\002\030\001\162\000\000\001\166\003j\000\000\000\000\001\170\001\214\001\174\001\178\000\014\000\018\000\022\000\026\000\030\000\000\000\"\000&\000*\000.\0002\000\000\0006\000:\005n\000\000\000>\000\000\000\000\000\000\000B\000\000\000\000\t\210\001\226\000\000\000\000\000F\000\000\000\000\002\190\000\000\000\000\000J\000\000\000N\000R\000V\000Z\000^\000b\000f\000\000\000\000\000\000\000j\000\000\000\000\000\000\000n\000\000\000r\000\000\000v\000\000\004\242\002\202\000\000\t\218\002\150\000\000\0066\000\000\000\000\004\218\000\000\000\000\000z\000\000\000\000\000~\000\130\000\000\000\000\001\214\000\000\000\000\000\134\000\138\000\142\000\000\005.\000\000\000\000\000\000\000\146\000\150\000\154\000\158\000\000\000\162\000\166\000\170\000\000\005:\000\000\000\174\000\178\000\182\000\186\005F\001\194\000\000\000\190\000\000\000\194\000\198\002\190\000\000\000\000\006R\000\000\000\000\000\202\006V\000\206\006^\006\134\b\166\006\146\005M\000\210\000\214\000\000\000\218\005M\004\242\002\202\005M\001\169\002\150\006\150\tv\000\000\001\169\004\218\000\000\000\000\005M\006\158\006\162\000\000\005M\000\000\005M\001\214\000\000\t\150\000\000\000\000\000\000\b\174\005.\001\169\000\000\011\242\005M\000\000\000\000\000\000\000\000\000\000\005M\000\000\006\166\005:\000\000\000\000\000\000\000\000\003j\012\030\001\194\000\000\005M\001\169\000\000\005M\002\190\000\000\000\000\006R\005M\005M\r=\006V\001\169\006^\000\000\012.\006\146\001\169\001\169\000\242\000\000\000\000\000\000\000\000\005M\005M\001\169\001\169\006\150\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\158\006\162\005M\005M\016\014\000\000\005M\005M\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\169\000\000\000\000\r=\003\014\000\000\r=\016\022\005M\006\166\001\169\000\000\000\000\r=\011u\003j\000\006\r=\000\000\005M\002\198\002\202\000\000\002\246\002\150\000\000\003\002\000\000\000\000\004\218\000\000\000\000\000\000\000\000\011u\000\000\011u\011u\000\000\001\214\000\000\000\000\000\000\004\222\000\000\005\142\005\146\000\000\000\000\000\000\000\000\000\000\004\226\000\000\005\186\000\000\000\000\000\000\005\230\005\234\000\000\005\238\005\242\004\166\005\246\006\002\006\014\006\022\t\166\001\206\001\210\016\026\002\190\006\177\015\129\006\n\000\000\000\000\000\000\011\018\011\022\011\"\0116\011\170\006\146\000\000\000\000\000\000\001\214\001\218\001\234\000\000\006\177\000\000\011\194\000\000\006\177\000\000\001\246\000\000\000\000\r&\011\230\012\158\006\158\006\162\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\250\002\166\000\000\000\000\000\000\002\178\000\000\002\190\003\022\003\"\000\000\000\000\000\000\000\000\003.\006\166\011*\011u\000\000\000\000\011B\003j\012\178\011m\000\000\000\006\000\000\000\000\000\000\002\198\002\202\0032\002\246\002\150\000\000\003\002\000\000\000\000\004\218\000\000\015\129\015\129\000\000\011m\000\000\011m\011m\000\000\001\214\000\000\000\000\000\000\004\222\006\177\005\142\005\146\000\000\000\000\000\000\000\000\015\129\004\226\015\129\005\186\000\000\000\000\000\000\005\230\005\234\006\177\005\238\005\242\006\177\005\246\006\002\006\014\006\022\t\166\000\000\000\000\000\000\002\190\000\000\000\000\006\n\000\000\000\000\000\000\011\018\011\022\011\"\0116\011\170\006\146\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001.\011\194\000\000\000\000\000\000\000\000\002\001\002\001\r&\011\230\012\158\006\158\006\162\000\000\002\001\000\000\000\000\002\001\000\000\000\000\000\000\002\001\002\001\000\000\002\001\002\001\002\001\002\001\000\000\002\001\002\001\000\000\002\001\000\n\000\000\000\000\006\166\011*\011m\002\001\002\001\011B\003j\012\178\002\001\002\001\002\001\002\001\000\n\000\000\000\000\002\001\002\001\002\001\000\000\002\001\000\000\002\001\002\001\002\001\002\001\000\000\002\001\002\001\002\001\002\001\002\001\002\001\002\001\002\001\006\181\015\129\000\000\002\001\000\000\002\001\002\001\000\000\000\000\002\001\002\001\002\001\002\001\002\001\002\001\002\001\002\001\000\000\000\000\006\181\000\000\000\000\000\000\006\181\000\000\002\001\000\000\002\001\000\000\000\000\000\000\002\001\002\001\002\001\002\001\002\001\002\001\000\000\002\001\b1\000\000\000A\002\001\000\000\002\001\000A\000A\000\000\000A\000A\002\001\000A\000\000\000\000\000A\000\000\000\000\000\000\000\000\b1\002\001\002\001\000\000\000\000\000A\002\001\002\001\002\001\000A\000\000\000A\000A\000\000\000\000\000\000\000\000\000\000\000A\000\000\000A\000\000\015\129\015\129\000A\000A\000\000\000A\000A\000\000\000A\000A\000A\000A\000A\006\181\000\000\000\000\000A\000\000\000\000\000A\015\129\000\000\015\129\000A\000A\000A\000A\000A\000A\006\181\000\000\000\000\006\181\000\000\000\000\000\000\000\000\000\000\000A\000\000\000\000\000\000\000\000\015A\015-\000A\000A\000A\000A\000A\000\000\000\000\b-\000\000\000=\000\000\000\000\000\000\000=\000=\000\000\000=\000=\015A\000=\000\000\0022\000=\000\000\0026\000\000\000\000\b-\000A\000A\000\000\002>\000=\000A\000A\000A\000=\002B\000=\000=\000\000\000\000\000\000\002J\015-\000=\000\000\000=\000\000\000\000\000\000\000=\000=\000\000\000=\000=\000\000\000=\000=\000=\000=\000=\000\000\000\000\000\000\000=\000\000\002N\000=\000\000\000\000\000\000\000=\000=\000=\000=\000=\000=\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000=\000\000\000\000\000\000\000\000\021B\000\000\000=\000=\000=\000=\000=\002\018\000\000\b=\000\000\014\201\000\000\000\000\002\022\014\201\014\201\002\030\014\201\014\201\002R\014\201\000\000\000\000\014\201\001\214\000\000\000\000\000\000\b=\000=\000=\000\000\000\000\014\201\000=\000=\000=\014\201\000\000\014\201\014\201\005n\000\000\000\000\000\000\000\000\014\201\000\000\014\201\000\000\t\210\001\226\014\201\014\201\000\000\014\201\014\201\002\190\014\201\014\201\014\201\014\201\014\201\000\000\000\000\000\000\014\201\000\000\000\000\014\201\000\000\000\000\000\000\014\201\014\201\014\201\014\201\014\201\014\201\006\001\000\000\000\000\000\000\000\000\025\174\t\218\000\000\000\000\014\201\000\000\000\000\000\000\000\000\015A\015-\014\201\014\201\014\201\014\201\014\201\000\000\000\000\b9\005\138\014\197\000\000\000\000\000\000\014\197\014\197\000\000\014\197\014\197\015A\014\197\000\000\0022\014\197\000\000\0026\000\000\000\000\b9\014\201\014\201\025\218\002\218\014\197\014\201\014\201\014\201\014\197\002B\014\197\014\197\000\000\023\198\000\000\002J\015-\014\197\023\222\014\197\000\000\000\000\000\000\014\197\014\197\000\000\014\197\014\197\026\006\014\197\014\197\014\197\014\197\014\197\000\000\000\000\000\000\014\197\000\000\002N\014\197\000\000\000\000\000\000\014\197\014\197\014\197\014\197\014\197\014\197\000\000\000\000\000\000\006\001\000\000\000\000\000\000\000\000\000\000\014\197\000\000\000\000\000\000\026j\000\000\000\000\014\197\014\197\014\197\014\197\014\197\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\198\002\202\000\000\002\246\002\150\002R\003\002\000\000\000\000\004\218\000\000\000\000\000\000\000\000\000\000\014\197\014\197\000\000\000\000\001\214\014\197\014\197\014\197\004\222\000\000\005\142\005\146\000\000\000\000\000\000\000\000\000\000\004\226\000\000\005\186\000\000\000\000\000\000\005\230\005\234\000\000\005\238\005\242\003\018\005\246\006\002\006\014\006\022\t\166\001\206\001\210\000\000\002\190\000\000\000\000\006\n\000\000\000\000\000\000\011\018\011\022\011\"\0116\011\170\006\146\000\000\000\000\000\000\001\214\001\254\001\234\000\000\000\000\000\000\011\194\000\000\000\000\000\000\001\246\000\000\000\000\r&\011\230\012\158\006\158\006\162\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\250\002\166\000\000\000\000\000\000\002\178\000\000\002\190\003\022\003\"\000\000\000\000\000\000\000\000\003.\006\166\011*\022j\000\000\000\006\011B\003j\012\178\002\198\002\202\000\000\002\246\002\150\000\000\003\002\000\000\0032\004\218\000\000\000\000\000\000\000\000\000\000\000\000\006Z\000\000\000\000\001\214\000\000\000\000\000\000\004\222\000\000\005\142\005\146\000\000\000\000\000\000\000\000\000\000\004\226\000\000\005\186\000\000\000\000\000\000\005\230\005\234\000\000\005\238\005\242\004\166\005\246\006\002\006\014\006\022\t\166\001\206\001\210\000\000\002\190\000\000\000\000\006\n\000\000\000\000\000\000\011\018\011\022\011\"\0116\011\170\006\146\000\000\000\000\000\000\001\214\001\254\001\234\000\000\000\000\b\177\011\194\000\000\000\000\000\000\001\246\000\000\000\000\r&\011\230\012\158\006\158\006\162\000\000\000\000\000\000\000\000\000\000\000\000\b\177\000\000\001\250\002\166\b\177\000\000\000\000\002\178\000\000\002\190\003\022\003\"\000\000\000\000\000\000\000\000\003.\006\166\011*\020:\000\000\000\006\011B\003j\012\178\002\198\002\202\000\000\002\246\002\150\000\000\003\002\000\000\0032\004\218\000\000\000\000\000\000\000\000\000\000\000\000\020N\000\000\000\000\001\214\000\242\000\000\002\202\004\222\000\000\005\142\005\146\000\000\000\000\000\000\000\000\000\000\004\226\000\000\005\186\000\000\000\000\000\000\005\230\005\234\001\214\005\238\005\242\000\000\005\246\006\002\006\014\006\022\t\166\000\000\000\000\000\000\002\190\028\146\000\000\006\n\000\000\000\000\000\000\011\018\011\022\011\"\0116\011\170\006\146\007\210\029\206\005\198\007\142\029\210\000\000\000\000\000\000\002\190\011\194\b\026\000\000\000\000\000\000\b&\030\002\r&\011\230\012\158\006\158\006\162\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\030\018\000\000\000\000\000\000\000\000\000\000\006\166\011*\000\000\006\129\006\129\011B\003j\012\178\006\129\006\129\006\129\006\129\000\000\006\129\000\000\006\129\006\129\006\129\006\129\006\129\000\000\006\129\006\129\006\129\006\129\006\129\006\129\006\129\006\129\006\129\006\129\006\129\006\129\006\129\006\129\000\000\000\000\000\000\000\000\006\129\000\000\000\000\000\000\000\000\006\129\006\129\006\129\000\000\000\000\006\129\006\129\006\129\006\129\006\129\006\129\006\129\006\129\006\129\000\000\000\000\006\129\000\000\006\129\000\000\006\129\006\129\006\129\006\129\000\000\000\000\006\129\006\129\006\129\006\129\006\129\006\129\000\000\000\000\000\000\006\129\006\129\006\129\006\129\000\000\000\000\006\129\006\129\000\000\006\129\000\000\006\129\000\000\006\129\006\129\000\000\006\129\006\129\006\129\000\000\006\129\006\129\006\129\006\129\006\129\006\129\006\129\006\129\006\129\000\000\000\000\006\129\000\000\006\129\006\129\000\000\006\129\002\170\006\129\006\129\006\129\006\129\003\202\006\129\003\234\006\129\000\000\006\129\006\129\006\129\006\129\000\000\006\129\000\000\006\129\006\129\006\129\006\129\000\006\000\000\000\000\000\000\002\198\002\202\000\000\002\246\002\150\000\000\004\194\000\000\000\000\004\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\214\000\000\000\000\000\000\004\222\000\000\005\142\005\146\000\000\000\000\000\000\006\t\000\000\004\226\000\000\005\186\028\158\000\000\000\000\005\230\005\234\000\000\005\238\005\242\000\000\005\246\006\002\006\014\006\022\t\166\000\000\000\000\000\000\002\190\000\000\005\138\006\n\000\000\000\000\000\000\011\018\011\022\011\"\0116 .\006\146\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\194\000\000\029\014\000\000\000\000\000\000\000\000 6\011\230\012\158\006\158\006\162\000\000\023\198\005\229\000\000\000\006\000\000\023\222\000\250\002\198\002\202\002&\002\246\002\150\000\000\003\002\029\178\029\194\004\218\000\000\000\000\024v\000\000\000\000\006\166\011*\000\000\005\138\001\214\011B\003j\012\178\004\222\000\000\005\142\005\146\000\000\000\000\000\000\024z\000\000\004\226\006\t\005\186\000\000\024\162\000\000\005\230\005\234\000\000\005\238\005\242\030\182\005\246\006\002\006\014\006\022\t\166\000\000\000\000\023\198\002\190\000\000\000\000\006\n\023\222\000\000\000\000\011\018\011\022\011\"\0116\011\170\006\146\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025B\000\000\011\194\000\000\000\000\000\000\000\000\000\000\000\000\022\206\011\230\012\158\006\158\006\162\023\250\025V\000\000\000\000\000\006\005\229\000\000\000\000\002\198\002\202\000\000\002\246\002\150\000\000\003\002\000\000\000\000\004\218\000\000\000\000\000\000\000\000\025f\006\166\011*\000\000\000\000\001\214\011B\003j\012\178\004\222\000\000\005\142\005\146\000\000\000\000\000\000\000\000\000\000\004\226\000\000\005\186\000\000\000\000\000\000\005\230\005\234\000\000\005\238\005\242\b\n\005\246\006\002\006\014\006\022\t\166\001\206\001\210\000\000\002\190\000\000\000\000\006\n\000\000\000\000\000\000\011\018\011\022\011\"\0116\011\170\006\146\000\000\000\000\000\000\001\214\001\254\001\234\000\000\000\000\000\000\011\194\000\000\000\000\000\000\001\246\000\000\000\000\022V\011\230\012\158\006\158\006\162\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\250\002\166\000\000\000\000\000\000\002\178\000\000\002\190\003\022\003\"\000\000\022\150\000\000\000\000\003.\006\166\011*\000\000\002\018\000\000\011B\003j\012\178\rY\000\000\002\022\rY\000\000\002\030\rY\rY\0032\b\129\rY\000\000\rY\001\214\b\129\rY\000\000\000\000\000\000\rY\rY\000\000\rY\rY\000\000\rY\000\000\rY\000\000\000\000\005n\000\000\rY\b\129\000\000\rY\000\000\000\000\000\000\t\210\001\226\000\000\000\000\rY\000\000\rY\002\190\003j\000\000\000\000\000\000\rY\rY\000\000\000\000\b\129\000\000\000\000\rY\000\000\000\000\rY\000\000\000\000\rY\rY\b\129\rY\000\000\rY\rY\b\129\b\129\000\242\t\218\000\000\000\000\000\000\000\000\000\000\b\129\b\129\rY\000\241\000\000\000\000\000\000\000\000\000\241\000\000\rY\rY\000\000\000\000\rY\000\000\rY\000\000\000\000\000\000\000\000\000\000\006\194\000\000\000\000\000\000\b\129\000\241\000\000\rY\rY\000\000\rY\rY\000\000\rY\b\129\rY\000\000\rY\000\006\rY\000\000\rY\002\198\002\202\000\000\002\246\002\150\000\241\003\002\000\000\030\150\004\218\004\238\000\000\000\000\000\000\000\000\000\000\000\241\000\000\000\000\001\214\000\000\000\241\000\000\004\222\000\000\005\142\005\146\000\000\000\000\000\000\000\241\000\241\004\226\000\000\005\186\000\000\000\000\000\000\005\230\005\234\000\000\005\238\005\242\000\000\005\246\006\002\006\014\006\022\t\166\000\000\000\000\000\000\002\190\000\000\000\000\006\n\000\241\000\000\000\000\011\018\011\022\011\"\0116\011\170\006\146\000\000\000\241\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\194\000\000\000\000\000\000\000\000\000\000\000\000\020\210\011\230\012\158\006\158\006\162\000\000\000\000\015\141\000\000\000\006\000\000\000\000\015\141\002\198\002\202\000\000\002\246\002\150\000\000\003\002\000\000\000\000\004\218\000\000\000\000\000\000\000\000\000\000\006\166\011*\000\000\015\141\001\214\011B\003j\012\178\004\222\000\000\005\142\005\146\000\000\000\000\000\000\000\000\000\000\004\226\000\000\005\186\000\000\000\000\000\000\005\230\005\234\015\141\005\238\005\242\000\000\005\246\006\002\006\014\006\022\t\166\000\000\000\000\015\141\002\190\000\000\000\000\006\n\015\141\015\141\000\242\011\018\011\022\011\"\0116\011\170\006\146\015\141\015\141\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\194\000\000\000\000\000\000\000\000\000\000\000\000\012Z\011\230\012\158\006\158\006\162\000\000\000\000\005\221\000\000\000\006\015\141\000\000\005\221\002\198\002\202\000\000\002\246\002\150\000\000\012n\015\141\000\000\004\218\000\000\000\000\000\000\000\000\000\000\006\166\011*\000\000\005\221\001\214\011B\003j\012\178\004\222\000\000\005\142\005\146\000\000\000\000\000\000\000\000\000\000\004\226\000\000\005\186\000\000\000\000\000\000\005\230\005\234\005\221\005\238\005\242\000\000\005\246\006\002\006\014\006\022\t\166\000\000\000\000\005\221\002\190\000\000\000\000\006\n\005\221\002\238\000\242\011\018\011\022\011\"\0116\012\134\006\146\005\221\005\221\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\194\000\000\000\000\000\000\000\000\000\000\000\000\019\"\011\230\012\158\006\158\006\162\002\001\000\000\000\000\000\000\000\006\005\221\000\000\002\001\002\198\002\202\002\001\002\246\002\150\000\000\003\002\005\221\000\000\004\218\002\001\000\000\000\000\000\000\000\000\006\166\011*\000\000\000\n\001\214\011B\003j\012\178\004\222\000\000\005\142\005\146\000\000\000\000\000\000\000\000\000\000\004\226\000\000\005\186\000\000\002\001\000\000\005\230\005\234\000\000\005\238\005\242\002\001\005\246\006\002\006\014\006\022\t\166\002\001\000\000\000\000\002\190\000\000\000\000\006\n\000\000\000\000\000\000\011\018\011\022\011\"\0116\011\170\006\146\000\000\000\000\000\000\000\000\000\000\000\000\002\001\000\000\000\000\011\194\000\000\000\000\000\000\000\000\000\000\000\000\012\214\011\230\012\158\006\158\006\162\002\001\000\000\000\000\000\000\000\006\000\000\000\000\002\001\002\198\002\202\002\001\002\246\002\150\000\000\rF\000\000\000\000\004\218\002\001\005\154\000\000\000\000\000\000\006\166\011*\000\000\000\n\001\214\011B\003j\012\178\004\222\000\000\005\142\005\146\000\000\000\000\000\000\000\000\000\000\004\226\000\000\005\186\000\000\002\001\000\000\005\230\005\234\000\000\005\238\005\242\002\001\005\246\006\002\006\014\006\022\t\166\002\001\000\000\000\000\002\190\000\000\000\000\006\n\000\000\000\000\000\000\011\018\011\022\011\"\0116\r^\006\146\000\000\000\000\000\000\000\000\000\000\000\000\002\001\000\000\000\000\011\194\000\000\000\000\000\000\000\000\022\234\000\000\rf\011\230\012\158\006\158\006\162\002\018\000\000\000\000\000\000\000\006\000\000\000\000\002\022\002\198\002\202\002\030\002\246\002\150\000\000\003\002\000\000\000\000\004\218\001\214\t\174\000\000\000\000\000\000\006\166\011*\000\000\000\000\001\214\011B\003j\012\178\004\222\000\000\005\142\005\146\005n\000\000\000\000\000\000\000\000\004\226\000\000\005\186\000\000\t\210\001\226\005\230\005\234\000\000\005\238\005\242\002\190\005\246\006\002\006\014\006\022\t\166\000\000\000\000\000\000\002\190\000\000\000\000\006\n\000\000\000\000\000\000\011\018\011\022\011\"\0116\011\170\006\146\000\000\000\000\000\000\000\000\000\000\000\000\t\218\000\000\000\000\011\194\000\000\000\000\000\000\000\000\022\250\000\000\r\158\011\230\012\158\006\158\006\162\002\018\000\000\000\000\000\000\000\006\000\000\000\000\002\022\002\198\002\202\002\030\002\246\002\150\000\000\003\002\000\000\000\000\004\218\001\214\000\000\000\000\000\000\000\000\006\166\011*\000\000\000\000\001\214\011B\003j\012\178\004\222\000\000\005\142\005\146\005n\000\000\000\000\000\000\000\000\004\226\000\000\005\186\000\000\t\210\001\226\005\230\005\234\000\000\005\238\005\242\002\190\005\246\006\002\006\014\006\022\t\166\000\000\000\000\000\000\002\190\000\000\000\000\006\n\000\000\000\000\000\000\011\018\011\022\011\"\0116\011\170\006\146\000\000\000\000\000\000\000\000\000\000\000\000\t\218\000\000\000\000\011\194\000\000\000\000\000\000\000\000\023\"\000\000\r\182\011\230\012\158\006\158\006\162\002\018\000\000\000\000\000\000\000\006\000\000\000\000\002\022\002\198\002\202\002\030\002\246\002\150\000\000\003\002\000\000\000\000\004\218\001\214\000\000\000\000\000\000\000\000\006\166\011*\000\000\000\000\001\214\011B\003j\012\178\004\222\000\000\005\142\005\146\005n\000\000\000\000\000\000\000\000\004\226\000\000\005\186\000\000\t\210\001\226\005\230\005\234\000\000\005\238\005\242\002\190\005\246\006\002\006\014\006\022\t\166\000\000\000\000\000\000\002\190\000\000\000\000\006\n\000\000\000\000\000\000\011\018\011\022\011\"\0116\011\170\006\146\000\000\000\000\000\000\000\000\000\000\000\000\t\218\000\000\000\000\011\194\000\000\000\000\000\000\000\000\0232\000\000\r\218\011\230\012\158\006\158\006\162\002\018\000\000\000\000\000\000\000\006\000\000\000\000\002\022\002\198\002\202\002\030\002\246\002\150\000\000\003\002\000\000\000\000\004\218\001\214\000\000\000\000\000\000\000\000\006\166\011*\000\000\000\000\001\214\011B\003j\012\178\004\222\000\000\005\142\005\146\005n\000\000\000\000\000\000\000\000\004\226\000\000\005\186\000\000\t\210\001\226\005\230\005\234\000\000\005\238\005\242\002\190\005\246\006\002\006\014\006\022\t\166\000\000\000\000\000\000\002\190\000\000\000\000\006\n\000\000\000\000\000\000\011\018\011\022\011\"\0116\011\170\006\146\000\000\000\000\000\000\000\000\000\000\000\000\t\218\000\000\000\000\011\194\000\000\000\000\000\000\000\000\000\000\000\000\014\006\011\230\012\158\006\158\006\162\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\198\002\202\000\000\002\246\002\150\000\000\003\002\000\000\000\000\004\218\000\000\000\000\000\000\000\000\000\000\006\166\011*\000\000\000\000\001\214\011B\003j\012\178\004\222\000\000\005\142\005\146\000\000\000\000\000\000\000\000\000\000\004\226\000\000\005\186\000\000\000\000\000\000\005\230\005\234\000\000\005\238\005\242\000\000\005\246\006\002\006\014\006\022\t\166\000\000\000\000\000\000\002\190\000\000\000\000\006\n\000\000\000\000\000\000\011\018\011\022\011\"\0116\011\170\006\146\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\194\000\000\000\000\000\000\000\000\000\000\000\000\014\030\011\230\012\158\006\158\006\162\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\198\002\202\000\000\002\246\002\150\000\000\003\002\000\000\000\000\004\218\000\000\000\000\000\000\000\000\000\000\006\166\011*\000\000\000\000\001\214\011B\003j\012\178\004\222\000\000\005\142\005\146\000\000\000\000\000\000\000\000\000\000\004\226\000\000\005\186\000\000\000\000\000\000\005\230\005\234\000\000\005\238\005\242\000\000\005\246\006\002\006\014\006\022\t\166\000\000\000\000\000\000\002\190\000\000\000\000\006\n\000\000\000\000\000\000\011\018\011\022\011\"\0116\011\170\006\146\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\194\000\000\000\000\000\000\000\000\000\000\000\000\0146\011\230\012\158\006\158\006\162\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\198\002\202\000\000\002\246\002\150\000\000\003\002\000\000\000\000\004\218\000\000\000\000\000\000\000\000\000\000\006\166\011*\000\000\000\000\001\214\011B\003j\012\178\004\222\000\000\005\142\005\146\000\000\000\000\000\000\000\000\000\000\004\226\000\000\005\186\000\000\000\000\000\000\005\230\005\234\000\000\005\238\005\242\000\000\005\246\006\002\006\014\006\022\t\166\000\000\000\000\000\000\002\190\000\000\000\000\006\n\000\000\000\000\000\000\011\018\011\022\011\"\0116\011\170\006\146\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\194\000\000\000\000\000\000\000\000\000\000\000\000\014N\011\230\012\158\006\158\006\162\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\198\002\202\000\000\002\246\002\150\000\000\003\002\000\000\000\000\004\218\000\000\000\000\000\000\000\000\000\000\006\166\011*\000\000\000\000\001\214\011B\003j\012\178\004\222\000\000\005\142\005\146\000\000\000\000\000\000\000\000\000\000\004\226\000\000\005\186\000\000\000\000\000\000\005\230\005\234\000\000\005\238\005\242\000\000\005\246\006\002\006\014\006\022\t\166\000\000\000\000\000\000\002\190\000\000\000\000\006\n\000\000\000\000\000\000\011\018\011\022\011\"\0116\011\170\006\146\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\194\000\000\000\000\000\000\000\000\000\000\000\000\014f\011\230\012\158\006\158\006\162\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\198\002\202\000\000\002\246\002\150\000\000\003\002\000\000\000\000\004\218\000\000\000\000\000\000\000\000\000\000\006\166\011*\000\000\000\000\001\214\011B\003j\012\178\004\222\000\000\005\142\005\146\000\000\000\000\000\000\000\000\000\000\004\226\000\000\005\186\000\000\000\000\000\000\005\230\005\234\000\000\005\238\005\242\000\000\005\246\006\002\006\014\006\022\t\166\000\000\000\000\000\000\002\190\000\000\000\000\006\n\000\000\000\000\000\000\011\018\011\022\011\"\0116\011\170\006\146\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\194\000\000\000\000\000\000\000\000\000\000\000\000\014~\011\230\012\158\006\158\006\162\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\198\002\202\000\000\002\246\002\150\000\000\003\002\000\000\000\000\004\218\000\000\000\000\000\000\000\000\000\000\006\166\011*\000\000\000\000\001\214\011B\003j\012\178\004\222\000\000\005\142\005\146\000\000\000\000\000\000\000\000\000\000\004\226\000\000\005\186\000\000\000\000\000\000\005\230\005\234\000\000\005\238\005\242\000\000\005\246\006\002\006\014\006\022\t\166\000\000\000\000\000\000\002\190\000\000\000\000\006\n\000\000\000\000\000\000\011\018\011\022\011\"\0116\011\170\006\146\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\194\000\000\000\000\000\000\000\000\000\000\000\000\014\150\011\230\012\158\006\158\006\162\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\198\002\202\000\000\002\246\002\150\000\000\003\002\000\000\000\000\004\218\000\000\000\000\000\000\000\000\000\000\006\166\011*\000\000\000\000\001\214\011B\003j\012\178\004\222\000\000\005\142\005\146\000\000\000\000\000\000\000\000\000\000\004\226\000\000\005\186\000\000\000\000\000\000\005\230\005\234\000\000\005\238\005\242\000\000\005\246\006\002\006\014\006\022\t\166\000\000\000\000\000\000\002\190\000\000\000\000\006\n\000\000\000\000\000\000\011\018\011\022\011\"\0116\011\170\006\146\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\194\000\000\000\000\000\000\000\000\000\000\000\000\014\174\011\230\012\158\006\158\006\162\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\198\002\202\000\000\002\246\002\150\000\000\003\002\000\000\000\000\004\218\000\000\000\000\000\000\000\000\000\000\006\166\011*\000\000\000\000\001\214\011B\003j\012\178\004\222\000\000\005\142\005\146\000\000\000\000\000\000\000\000\000\000\004\226\000\000\005\186\000\000\000\000\000\000\005\230\005\234\000\000\005\238\005\242\000\000\005\246\006\002\006\014\006\022\t\166\000\000\000\000\000\000\002\190\000\000\000\000\006\n\000\000\000\000\000\000\011\018\011\022\011\"\0116\011\170\006\146\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\194\000\000\000\000\000\000\000\000\000\000\000\000\014\198\011\230\012\158\006\158\006\162\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\198\002\202\000\000\002\246\002\150\000\000\003\002\000\000\000\000\004\218\000\000\000\000\000\000\000\000\000\000\006\166\011*\000\000\000\000\001\214\011B\003j\012\178\004\222\000\000\005\142\005\146\000\000\000\000\000\000\000\000\000\000\004\226\000\000\005\186\000\000\000\000\000\000\005\230\005\234\000\000\005\238\005\242\000\000\005\246\006\002\006\014\006\022\t\166\000\000\000\000\000\000\002\190\000\000\000\000\006\n\000\000\000\000\000\000\011\018\011\022\011\"\0116\011\170\006\146\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\194\000\000\000\000\000\000\000\000\000\000\000\000\014\222\011\230\012\158\006\158\006\162\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\198\002\202\000\000\002\246\002\150\000\000\003\002\000\000\000\000\004\218\000\000\000\000\000\000\000\000\000\000\006\166\011*\000\000\000\000\001\214\011B\003j\012\178\004\222\000\000\005\142\005\146\000\000\000\000\000\000\000\000\000\000\004\226\000\000\005\186\000\000\000\000\000\000\005\230\005\234\000\000\005\238\005\242\000\000\005\246\006\002\006\014\006\022\t\166\000\000\000\000\000\000\002\190\000\000\000\000\006\n\000\000\000\000\000\000\011\018\011\022\011\"\0116\011\170\006\146\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\194\000\000\000\000\000\000\000\000\000\000\000\000\014\246\011\230\012\158\006\158\006\162\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\198\002\202\000\000\002\246\002\150\000\000\003\002\000\000\000\000\004\218\000\000\000\000\000\000\000\000\000\000\006\166\011*\000\000\000\000\001\214\011B\003j\012\178\004\222\000\000\005\142\005\146\000\000\000\000\000\000\000\000\000\000\004\226\000\000\005\186\000\000\000\000\000\000\005\230\005\234\000\000\005\238\005\242\000\000\005\246\006\002\006\014\006\022\t\166\000\000\000\000\000\000\002\190\000\000\000\000\006\n\000\000\000\000\000\000\011\018\011\022\011\"\0116\011\170\006\146\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\194\000\000\000\000\000\000\000\000\000\000\000\000\015\014\011\230\012\158\006\158\006\162\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\198\002\202\000\000\002\246\002\150\000\000\003\002\000\000\000\000\004\218\000\000\000\000\000\000\000\000\000\000\006\166\011*\000\000\000\000\001\214\011B\003j\012\178\004\222\000\000\005\142\005\146\000\000\000\000\000\000\000\000\000\000\004\226\000\000\005\186\000\000\000\000\000\000\005\230\005\234\000\000\005\238\005\242\000\000\005\246\006\002\006\014\006\022\t\166\000\000\000\000\000\000\002\190\000\000\000\000\006\n\000\000\000\000\000\000\011\018\011\022\011\"\0116\011\170\006\146\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\194\000\000\000\000\000\000\000\000\000\000\000\000\015&\011\230\012\158\006\158\006\162\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\198\002\202\000\000\002\246\002\150\000\000\003\002\000\000\000\000\004\218\000\000\000\000\000\000\000\000\000\000\006\166\011*\000\000\000\000\001\214\011B\003j\012\178\004\222\000\000\005\142\005\146\000\000\000\000\000\000\000\000\000\000\004\226\000\000\005\186\000\000\000\000\000\000\005\230\005\234\000\000\005\238\005\242\000\000\005\246\006\002\006\014\006\022\t\166\000\000\000\000\000\000\002\190\000\000\000\000\006\n\000\000\000\000\000\000\011\018\011\022\011\"\0116\011\170\006\146\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\194\000\000\000\000\000\000\000\000\000\000\000\000\015>\011\230\012\158\006\158\006\162\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\198\002\202\000\000\002\246\002\150\000\000\003\002\000\000\000\000\004\218\000\000\000\000\000\000\000\000\000\000\006\166\011*\000\000\000\000\001\214\011B\003j\012\178\004\222\000\000\005\142\005\146\000\000\000\000\000\000\000\000\000\000\004\226\000\000\005\186\000\000\000\000\000\000\005\230\005\234\000\000\005\238\005\242\000\000\005\246\006\002\006\014\006\022\t\166\000\000\000\000\000\000\002\190\000\000\000\000\006\n\000\000\000\000\000\000\011\018\011\022\011\"\0116\011\170\006\146\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\194\000\000\000\000\000\000\000\000\000\000\000\000\015V\011\230\012\158\006\158\006\162\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\198\002\202\000\000\002\246\002\150\000\000\003\002\000\000\000\000\004\218\000\000\000\000\000\000\000\000\000\000\006\166\011*\000\000\000\000\001\214\011B\003j\012\178\004\222\000\000\005\142\005\146\000\000\000\000\000\000\000\000\000\000\004\226\000\000\005\186\000\000\000\000\000\000\005\230\005\234\000\000\005\238\005\242\000\000\005\246\006\002\006\014\006\022\t\166\000\000\000\000\000\000\002\190\000\000\000\000\006\n\000\000\000\000\000\000\011\018\011\022\011\"\0116\011\170\006\146\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\194\000\000\000\000\000\000\000\000\000\000\000\000\015n\011\230\012\158\006\158\006\162\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\198\002\202\000\000\002\246\002\150\000\000\003\002\000\000\000\000\004\218\000\000\000\000\000\000\000\000\000\000\006\166\011*\000\000\000\000\001\214\011B\003j\012\178\004\222\000\000\005\142\005\146\000\000\000\000\000\000\000\000\000\000\004\226\000\000\005\186\000\000\000\000\000\000\005\230\005\234\000\000\005\238\005\242\000\000\005\246\006\002\006\014\006\022\t\166\000\000\000\000\000\000\002\190\000\000\000\000\006\n\000\000\000\000\000\000\011\018\011\022\011\"\0116\011\170\006\146\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\194\000\000\000\000\000\000\000\000\000\000\000\000\015\134\011\230\012\158\006\158\006\162\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\198\002\202\000\000\002\246\002\150\000\000\003\002\000\000\000\000\004\218\000\000\000\000\000\000\000\000\000\000\006\166\011*\000\000\000\000\001\214\011B\003j\012\178\004\222\000\000\005\142\005\146\000\000\000\000\000\000\000\000\000\000\004\226\000\000\005\186\000\000\000\000\000\000\005\230\005\234\000\000\005\238\005\242\000\000\005\246\006\002\006\014\006\022\t\166\000\000\000\000\000\000\002\190\000\000\000\000\006\n\000\000\000\000\000\000\011\018\011\022\011\"\0116\011\170\006\146\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\194\000\000\000\000\000\000\000\000\000\000\000\000\015\158\011\230\012\158\006\158\006\162\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\198\002\202\000\000\002\246\002\150\000\000\015\182\000\000\000\000\004\218\000\000\000\000\000\000\000\000\000\000\006\166\011*\000\000\000\000\001\214\011B\003j\012\178\004\222\000\000\005\142\005\146\000\000\000\000\000\000\000\000\000\000\004\226\000\000\005\186\000\000\000\000\000\000\005\230\005\234\000\000\005\238\005\242\000\000\005\246\006\002\006\014\006\022\t\166\000\000\000\000\000\000\002\190\000\000\000\000\006\n\000\000\000\000\000\000\011\018\011\022\011\"\0116\015\206\006\146\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\194\000\000\000\000\000\000\000\000\000\000\000\000\015\214\011\230\012\158\006\158\006\162\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\198\002\202\000\000\002\246\002\150\000\000\003\002\000\000\000\000\004\218\000\000\000\000\000\000\000\000\000\000\006\166\011*\000\000\000\000\001\214\011B\003j\012\178\004\222\000\000\005\142\005\146\000\000\000\000\000\000\000\000\000\000\004\226\000\000\005\186\000\000\000\000\000\000\005\230\005\234\000\000\005\238\005\242\000\000\005\246\006\002\006\014\006\022\t\166\000\000\000\000\000\000\002\190\000\000\000\000\006\n\000\000\000\000\000\000\011\018\011\022\011\"\0116\011\170\006\146\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\194\000\000\000\000\000\000\000\000\000\000\000\000\015\238\011\230\012\158\006\158\006\162\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\198\002\202\000\000\002\246\002\150\000\000\003\002\000\000\000\000\004\218\000\000\000\000\000\000\000\000\000\000\006\166\011*\000\000\000\000\001\214\011B\003j\012\178\004\222\000\000\005\142\005\146\000\000\000\000\000\000\000\000\000\000\004\226\000\000\005\186\000\000\000\000\000\000\005\230\005\234\000\000\005\238\005\242\000\000\005\246\006\002\006\014\006\022\t\166\000\000\000\000\000\000\002\190\000\000\000\000\006\n\000\000\000\000\000\000\011\018\011\022\011\"\0116\011\170\006\146\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\194\000\000\000\000\000\000\000\000\000\000\000\000\017\030\011\230\012\158\006\158\006\162\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\198\002\202\000\000\002\246\002\150\000\000\003\002\000\000\000\000\004\218\000\000\000\000\000\000\000\000\000\000\006\166\011*\000\000\000\000\001\214\011B\003j\012\178\004\222\000\000\005\142\005\146\000\000\000\000\000\000\000\000\000\000\004\226\000\000\005\186\000\000\000\000\000\000\005\230\005\234\000\000\005\238\005\242\000\000\005\246\006\002\006\014\006\022\t\166\000\000\000\000\000\000\002\190\000\000\000\000\006\n\000\000\000\000\000\000\011\018\011\022\011\"\0116\011\170\006\146\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\194\000\000\000\000\000\000\000\000\000\000\000\000\017F\011\230\012\158\006\158\006\162\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\198\002\202\000\000\002\246\002\150\000\000\003\002\000\000\000\000\004\218\000\000\000\000\000\000\000\000\000\000\006\166\011*\000\000\000\000\001\214\011B\003j\012\178\004\222\000\000\005\142\005\146\000\000\000\000\000\000\000\000\000\000\004\226\000\000\005\186\000\000\000\000\000\000\005\230\005\234\000\000\005\238\005\242\000\000\005\246\006\002\006\014\006\022\t\166\000\000\000\000\000\000\002\190\000\000\000\000\006\n\000\000\000\000\000\000\011\018\011\022\011\"\0116\011\170\006\146\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\194\000\000\000\000\000\000\000\000\000\000\000\000\017n\011\230\012\158\006\158\006\162\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\198\002\202\000\000\002\246\002\150\000\000\003\002\000\000\000\000\004\218\000\000\000\000\000\000\000\000\000\000\006\166\011*\000\000\000\000\001\214\011B\003j\012\178\004\222\000\000\005\142\005\146\000\000\000\000\000\000\000\000\000\000\004\226\000\000\005\186\000\000\000\000\000\000\005\230\005\234\000\000\005\238\005\242\000\000\005\246\006\002\006\014\006\022\t\166\000\000\000\000\000\000\002\190\000\000\000\000\006\n\000\000\000\000\000\000\011\018\011\022\011\"\0116\011\170\006\146\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\194\000\000\000\000\000\000\000\000\000\000\000\000\017\154\011\230\012\158\006\158\006\162\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\198\002\202\000\000\002\246\002\150\000\000\003\002\000\000\000\000\004\218\000\000\000\000\000\000\000\000\000\000\006\166\011*\000\000\000\000\001\214\011B\003j\012\178\004\222\000\000\005\142\005\146\000\000\000\000\000\000\000\000\000\000\004\226\000\000\005\186\000\000\000\000\000\000\005\230\005\234\000\000\005\238\005\242\000\000\005\246\006\002\006\014\006\022\t\166\000\000\000\000\000\000\002\190\000\000\000\000\006\n\000\000\000\000\000\000\011\018\011\022\011\"\0116\011\170\006\146\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\194\000\000\000\000\000\000\000\000\000\000\000\000\017\194\011\230\012\158\006\158\006\162\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\198\002\202\000\000\002\246\002\150\000\000\003\002\000\000\000\000\004\218\000\000\000\000\000\000\000\000\000\000\006\166\011*\000\000\000\000\001\214\011B\003j\012\178\004\222\000\000\005\142\005\146\000\000\000\000\000\000\000\000\000\000\004\226\000\000\005\186\000\000\000\000\000\000\005\230\005\234\000\000\005\238\005\242\000\000\005\246\006\002\006\014\006\022\t\166\000\000\000\000\000\000\002\190\000\000\000\000\006\n\000\000\000\000\000\000\011\018\011\022\011\"\0116\011\170\006\146\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\194\000\000\000\000\000\000\000\000\000\000\000\000\017\234\011\230\012\158\006\158\006\162\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\198\002\202\000\000\002\246\002\150\000\000\003\002\000\000\000\000\004\218\000\000\000\000\000\000\000\000\000\000\006\166\011*\000\000\000\000\001\214\011B\003j\012\178\004\222\000\000\005\142\005\146\000\000\000\000\000\000\000\000\000\000\004\226\000\000\005\186\000\000\000\000\000\000\005\230\005\234\000\000\005\238\005\242\000\000\005\246\006\002\006\014\006\022\t\166\000\000\000\000\000\000\002\190\000\000\000\000\006\n\000\000\000\000\000\000\011\018\011\022\011\"\0116\011\170\006\146\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\194\000\000\000\000\000\000\000\000\000\000\000\000\018\026\011\230\012\158\006\158\006\162\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\198\002\202\000\000\002\246\002\150\000\000\003\002\000\000\000\000\004\218\000\000\000\000\000\000\000\000\000\000\006\166\011*\000\000\000\000\001\214\011B\003j\012\178\004\222\000\000\005\142\005\146\000\000\000\000\000\000\000\000\000\000\004\226\000\000\005\186\000\000\000\000\000\000\005\230\005\234\000\000\005\238\005\242\000\000\005\246\006\002\006\014\006\022\t\166\000\000\000\000\000\000\002\190\000\000\000\000\006\n\000\000\000\000\000\000\011\018\011\022\011\"\0116\011\170\006\146\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\194\000\000\000\000\000\000\000\000\000\000\000\000\018B\011\230\012\158\006\158\006\162\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\198\002\202\000\000\002\246\002\150\000\000\003\002\000\000\000\000\004\218\000\000\000\000\000\000\000\000\000\000\006\166\011*\000\000\000\000\001\214\011B\003j\012\178\004\222\000\000\005\142\005\146\000\000\000\000\000\000\000\000\000\000\004\226\000\000\005\186\000\000\000\000\000\000\005\230\005\234\000\000\005\238\005\242\000\000\005\246\006\002\006\014\006\022\t\166\000\000\000\000\000\000\002\190\000\000\000\000\006\n\000\000\000\000\000\000\011\018\011\022\011\"\0116\011\170\006\146\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\194\000\000\000\000\000\000\000\000\000\000\000\000\018j\011\230\012\158\006\158\006\162\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\198\002\202\000\000\002\246\002\150\000\000\003\002\000\000\000\000\004\218\000\000\000\000\000\000\000\000\000\000\006\166\011*\000\000\000\000\001\214\011B\003j\012\178\004\222\000\000\005\142\005\146\000\000\000\000\000\000\000\000\000\000\004\226\000\000\005\186\000\000\000\000\000\000\005\230\005\234\000\000\005\238\005\242\000\000\005\246\006\002\006\014\006\022\t\166\000\000\000\000\000\000\002\190\000\000\000\000\006\n\000\000\000\000\000\000\011\018\011\022\011\"\0116\011\170\006\146\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\194\000\000\000\000\000\000\000\000\000\000\000\000\018\134\011\230\012\158\006\158\006\162\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\198\002\202\000\000\002\246\002\150\000\000\003\002\000\000\000\000\004\218\000\000\000\000\000\000\000\000\000\000\006\166\011*\000\000\000\000\001\214\011B\003j\012\178\004\222\000\000\005\142\005\146\000\000\000\000\000\000\000\000\000\000\004\226\000\000\005\186\000\000\000\000\000\000\005\230\005\234\000\000\005\238\005\242\000\000\005\246\006\002\006\014\006\022\t\166\000\000\000\000\000\000\002\190\000\000\000\000\006\n\000\000\000\000\000\000\011\018\011\022\011\"\0116\011\170\006\146\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\194\000\000\000\000\000\000\000\000\000\000\000\000\019b\011\230\012\158\006\158\006\162\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\198\002\202\000\000\002\246\002\150\000\000\003\002\000\000\000\000\004\218\000\000\000\000\000\000\000\000\000\000\006\166\011*\000\000\000\000\001\214\011B\003j\012\178\004\222\000\000\005\142\005\146\000\000\000\000\000\000\000\000\000\000\004\226\000\000\005\186\000\000\000\000\000\000\005\230\005\234\000\000\005\238\005\242\000\000\005\246\006\002\006\014\006\022\t\166\000\000\000\000\000\000\002\190\000\000\000\000\006\n\000\000\000\000\000\000\011\018\011\022\011\"\0116\011\170\006\146\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\194\000\000\000\000\000\000\000\000\000\000\000\000\019v\011\230\012\158\006\158\006\162\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\198\002\202\000\000\002\246\002\150\000\000\003\002\000\000\000\000\004\218\000\000\000\000\000\000\000\000\000\000\006\166\011*\000\000\000\000\001\214\011B\003j\012\178\004\222\000\000\005\142\005\146\000\000\000\000\000\000\000\000\000\000\004\226\000\000\005\186\000\000\000\000\000\000\005\230\005\234\000\000\005\238\005\242\000\000\005\246\006\002\006\014\006\022\t\166\000\000\000\000\000\000\002\190\000\000\000\000\006\n\000\000\000\000\000\000\011\018\011\022\011\"\0116\011\170\006\146\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\194\000\000\000\000\000\000\000\000\000\000\000\000\019\146\011\230\012\158\006\158\006\162\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\198\002\202\000\000\002\246\002\150\000\000\019\202\000\000\000\000\004\218\000\000\000\000\000\000\000\000\000\000\006\166\011*\000\000\000\000\001\214\011B\003j\012\178\004\222\000\000\005\142\005\146\000\000\000\000\000\000\000\000\000\000\004\226\000\000\005\186\000\000\000\000\000\000\005\230\005\234\000\000\005\238\005\242\000\000\005\246\006\002\006\014\006\022\t\166\000\000\000\000\000\000\002\190\000\000\000\000\006\n\000\000\000\000\000\000\011\018\011\022\011\"\0116\019\226\006\146\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\194\000\000\000\000\000\000\000\000\000\000\000\000\019\234\011\230\012\158\006\158\006\162\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\198\002\202\000\000\002\246\002\150\000\000 R\000\000\000\000\004\218\021r\000\000\000\000\002\150\000\000\006\166\011*\000\000\000\000\001\214\011B\003j\012\178\004\222\000\000\005\142\005\146\000\000\000\000\000\000\000\000\000\000\004\226\000\000\005\186\000\000\000\000\000\000\005\230\005\234\000\000\005\238\005\242\000\000\005\246\006\002\006\014\006\022\t\166\000\000\000\000\000\000\002\190\000\000\021v\006\n\000\000\000\000\000\000\011\018\011\022\011\"\0116 j\006\146\000\000\000\000\000\000\021\130\000\000\028\"\000\000\000\000\000\000\011\194\000\000\000\000\000\000\000\000\000\000\000\000 r\011\230\012\158\006\158\006\162\000\000\005\178\000\000\002\202\000\000\000\000\000\000\000\000\006\162\000\000\005~\000\000\000\000\005\166\000\000\000\000\n\218\014\133\000\000\028.\000\000\001\214\014\133\006\166\011*\014\133\015\001\015\001\011B\003j\012\178\015\001\000\000\001\210\015\001\014\133\027\226\000\000\000\000\014\133\000\000\014\133\003\194\000\000\015\001\015\001\015\001\005\174\015\001\015\001\015\001\000\000\000\000\014\133\002\190\000\000\000\000\000\000\000\000\014\133\000\000\000\000\015\001\000\000\000\000\000\000\000\000\000\000\015\001\015\001\000\000\014\133\015\001\000\000\014\133\000\000\000\000\000\000\002\174\014\133\015\001\000\000\t\186\015\001\000\000\000\000\000\000\000\000\015\001\015\001\015\001\000\000\000\000\000\000\000\000\014\133\r\138\015\001\015\001\014\133\000\000\000\000\000\000\000\000\015\001\000\000\000\000\000\000\003\210\014\133\014\133\015\001\000\000\014\133\014\133\000\000\000\000\000\000\015\001\015\001\015\001\000\000\015\001\015\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\133\000\000\015\001\000\000\015\001\015\001\000\000\000\000\000\000\015\001\000\000\016\002\000\000\000\000\015\001\000\000\000\000\000\000\015\001\000\000\015\001\015\001\011M\011M\000\000\000\000\000\000\011M\000\000\001\210\011M\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011M\000\000\011M\011M\011M\000\000\011M\011M\011M\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011M\000\000\000\000\000\000\000\000\000\000\011M\011M\000\000\000\000\011M\000\000\000\000\000\000\000\000\000\000\002\174\000\000\011M\000\000\000\000\011M\000\000\000\000\000\000\000\000\011M\011M\011M\000\000\000\000\000\000\000\000\000\000\000\000\011M\011M\000\000\000\000\000\000\000\000\000\000\011M\000\000\000\000\000\000\003\210\000\000\000\000\011M\000\000\000\000\000\000\000\000\000\000\000\000\011M\011M\011M\000\000\011M\011M\000\000\000\000\005\181\000\000\000\000\000\000\000\000\005\181\000\000\011M\005\181\011M\011M\000\000\000\000\000\000\011M\000\000\000\000\000\000\005\181\011M\000\000\000\000\005\181\011M\005\181\011M\011M\011U\011U\000\000\000\000\000\000\011U\000\000\001\210\011U\005\181\000\000\000\000\000\000\000\000\000\000\005\181\011U\000\000\011U\011U\011U\000\000\011U\011U\011U\000\000\000\000\005\181\000\000\000\000\005\181\000\000\000\000\000\000\000\000\005\181\011U\000\000\000\000\000\000\000\000\000\000\011U\011U\000\000\000\000\011U\000\000\000\000\000\000\000\000\005\181\002\174\000\000\011U\005\181\000\000\011U\000\000\000\000\000\000\000\000\011U\011U\011U\005\181\005\181\000\000\000\000\005\181\005\181\011U\011U\000\000\000\000\000\000\000\000\000\000\011U\000\000\000\000\000\000\003\210\000\000\000\000\011U\000\000\005\181\000\000\000\000\000\000\000\000\011U\011U\011U\000\000\011U\011U\023\158\000\000\005\173\000\000\000\000\000\000\000\000\005\173\000\000\011U\005\173\011U\011U\000\000\000\000\000\000\011U\000\000\000\000\000\000\005\173\011U\000\000\000\000\005\173\011U\005\173\011U\011U\011Q\011Q\000\000\000\000\000\000\011Q\000\000\001\210\011Q\005\173\000\000\000\000\000\000\000\000\000\000\005\173\011Q\000\000\011Q\011Q\011Q\000\000\011Q\011Q\011Q\000\000\000\000\005\173\000\000\000\000\005\173\000\000\000\000\000\000\000\000\005\173\011Q\000\000\000\000\000\000\000\000\000\000\011Q\011Q\000\000\000\000\011Q\000\000\000\000\000\000\000\000\005\173\002\174\000\000\011Q\005\173\000\000\011Q\000\000\000\000\000\000\000\000\011Q\011Q\011Q\005\173\005\173\000\000\000\000\005\173\005\173\011Q\011Q\000\000\000\000\000\000\000\000\000\000\011Q\000\000\000\000\000\000\003\210\000\000\000\000\011Q\000\000\005\173\000\000\000\000\000\000\000\000\011Q\011Q\011Q\000\000\011Q\011Q\026\174\000\000\005\205\000\000\000\000\000\000\000\000\005\205\000\000\011Q\005\205\011Q\011Q\000\000\000\000\000\000\011Q\000\000\000\000\000\000\005\205\011Q\000\000\000\000\005\205\011Q\005\205\011Q\011Q\011I\011I\000\000\000\000\000\000\011I\000\000\001\210\011I\005\205\000\000\000\000\000\000\000\000\000\000\005\205\011I\000\000\011I\011I\011I\000\000\011I\011I\011I\000\000\000\000\005\205\000\000\000\000\005\205\000\000\000\000\000\000\000\000\005\205\011I\000\000\000\000\000\000\000\000\000\000\011I\011I\000\000\000\000\011I\000\000\000\000\000\000\000\000\005\205\002\174\000\000\011I\005\205\000\000\011I\000\000\000\000\000\000\000\000\011I\011I\011I\005\205\005\205\000\000\000\000\005\205\005\205\011I\011I\000\000\000\000\000\000\000\000\000\000\011I\000\000\000\000\000\000\003\210\000\000\000\000\011I\000\000\005\205\000\000\000\000\000\000\000\000\011I\011I\011I\000\000\011I\011I\027\146\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011I\000\000\011I\011I\000\000\000\000\000\000\011I\000\000\000\000\000\000\000\000\011I\000\000\re\000\000\011I\re\011I\011I\004\242\002\202\000\000\000\000\002\150\000\000\004\246\000\000\000\000\004\218\000\000\000\000\000\000\re\re\000\000\re\re\000\000\001\214\000\000\001\206\001\210\000\000\000\000\000\000\005.\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\162\000\000\re\000\000\005:\001\214\001\254\001\234\000\000\000\000\005F\001\194\000\000\000\000\000\000\001\246\000\000\002\190\000\000\000\000\006R\000\000\002\006\re\006V\000\000\006^\006\134\006\230\006\146\000\000\001\250\002\166\000\000\000\000\000\000\002\178\000\000\002\190\003\022\003\"\006\150\000\000\000\000\000\000\003.\000\000\000\000\000\000\006\158\006\162\000\000\007\"\re\000\000\re\000\000\000\000\007.\000\000\000\000\000\000\0032\000\000\000\000\000\000\000\000\000\000\re\000\000\000\000\re\re\000\000\006\166\000\000\re\000\000\re\000\000\003j\ra\re\000\000\ra\000\000\000\000\004\242\002\202\000\000\000\000\002\150\021z\004\246\000\000\000\000\004\218\000\000\000\000\000\000\ra\ra\000\000\ra\ra\000\000\001\214\000\000\001\206\001\210\000\000\000\000\000\000\005.\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ra\000\000\005:\001\214\001\254\001\234\000\000\000\000\007\158\001\194\000\000\000\000\000\000\001\246\000\000\002\190\025\150\000\000\006R\000\000\000\000\ra\006V\000\000\006^\006\134\006\230\006\146\000\000\001\250\026\238\000\000\026\014\000\000\002\178\000\000\002\190\003\022\003\"\006\150\000\000\000\000\000\000\026\254\000\000\000\000\000\000\006\158\006\162\000\000\007\"\ra\000\000\ra\000\000\000\000\007.\000\000\000\000\000\000\0032\000\000\000\000\000\000\000\000\000\000\ra\000\000\000\000\ra\ra\000\000\006\166\000\000\ra\000\000\ra\000y\003j\000\000\ra\000\000\000y\000\000\000y\000y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000y\000\000\000y\000y\000\000\000\000\000y\000y\000y\000\000\011\005\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000y\000\000\000\000\000\000\000\000\000\000\000y\000y\000\000\000\000\000y\000\000\000\000\000\000\000\000\000\000\000y\000\000\000y\000\000\000\000\000y\000\000\000\000\000\000\000\000\000y\000y\000y\000\000\000\000\000\000\000\000\000\000\000\000\000y\000y\000\000\000\000\000\000\000\000\000\000\000y\000y\000\000\000\000\000y\000\000\000\000\000y\000\000\000\000\000\000\000\000\000\000\000\000\000y\000y\000y\000\000\000y\000y\000\000\000\000\000\000\000\000\000\000\011\005\000\000\000\000\000\000\000y\015\005\015\005\000y\000\000\000\000\015\005\000y\000\000\015\005\000\000\000\000\000y\000\000\000\000\000\000\000y\003\226\000y\015\005\015\005\015\005\000\000\015\005\015\005\015\005\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\005\000\000\000\000\000\000\000\000\000\000\015\005\015\005\000\000\000\000\015\005\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\005\000\000\000\000\015\005\000\000\000\000\000\000\000\000\015\005\015\005\015\005\000\000\000\000\000\000\000\000\000\000\000\000\015\005\015\005\000\000\000\000\000\000\000\000\000\000\015\005\000\000\000\000\000\000\015\005\000\000\000\000\015\005\000\000\000\000\000\000\000\000\000\000\000\000\015\005\015\005\015\005\000\000\015\005\015\005\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\005\000\250\015\005\015\005\002\206\003\229\003\229\015\005\000\000\000\000\003\229\000\000\015\005\003\229#\174\000\000\015\005\000\000\015\005\015\005\005\138\003\226\000\000\003\229\003\229\003\229\000\000\003\229\003\229\003\229\000\000\000\000\005\150\000\000\000\000\000\000\000\000\000\000\023b\000\000\000\000\003\229\000\000\000\000\000\000\000\000\000\000\003\229!j\000\000\0316\003\229\000\000\023\198\000\000\000\000\000\000\000\000\023\222\003\229\000\000\000\000\003\229\000\000\000\000\000\000\000\000\003\229\003\229\003\229\000\000\000\000\000\000\000\000\023\230\000\000\003\229\003\229#^\000\000\000\000\000\000\000\000\003\229\000\000\000\000\000\000\003\229\023\250\0246\003\229\000\000\006\025\000\000\000\000\000\000\000\000\003\229\003\229\003\229\000\000\003\229\003\229\003\209\003\209\000\000\000\000\000\000\003\209\000\000\028v\003\209\003\229\000\000\003\229\003\229\000\000\000\000\000\000\003\229\000\000\003\209\003\209\003\209\003\229\003\209\003\209\003\209\003\229\000\000\003\229\003\229\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\209\000\000\000\000\000\000\000\000\000\000\003\209\003z\000\000\000\000\003\209\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\209\000\000\000\000\003\209\000\000\000\000\000\000\000\000\003\209\003\209\003\209\000\000\000\000\000\000\000\000\000\000\000\000\003\209\003\209\000\000\000\000\000\000\000\000\000\000\003\209\000\000\000\000\000\000\003\209\000\000\000\000\003\209\000\000\000\000\000\000\000\000\000\000\000\000\003\209\003\209\003\209\000\000\003\209\003\209\001\193\001\193\000\000\000\000\000\000\001\193\000\000\000\000\001\193\003\209\000\000\003\209\003\209\000\000\000\000\000\000\003\209\000\000\001\193\001\193\001\193\003\209\001\193\001\193\001\193\003\209\000\000\003\209\003\209\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\193\000\000\000\000\000\000\000\000\000\000\001\193\001\193\000\000\000\000\001\193\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\193\000\000\000\000\001\193\000\000\000\000\000\000\000\000\001\193\001\193\001\193\000\000\000\000\000\000\000\000\000\000\000\000\001\193\001\193\000\000\000\000\000\000\000\000\000\000\001\193\000\000\000\000\000\000\001\193\000\000\000\000\001\193\000\000\000\000\000\000\000\000\000\000\000\000\001\193\001\193\001\193\000\000\001\193\001\193\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\193\000\000\001\193\001\193\004\242\002\202\000\000\001\193\002\150\000\000\tv\000\000\001\193\004\218\000\000\000\000\003\254\000\000\001\193\000\000\000\000\000\000\000\000\001\214\000\000\t\150\000\000\000\000\000\000\000\000\005.\000\000\000\000\011\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005:\000\000\000\000\000\000\000\000\000\000\012\030\001\194\000\000\000\000\000\000\000\000\000\000\002\190\000\000\000\000\006R\000\000\000\000\r=\006V\000\000\006^\000\000\012.\006\146\000\000\000\000\000\000\000\000\007\r\007\r\000\000\000\000\005\137\007\r\000\000\006\150\007\r\000\000\000\000\000\000\000\000\000\000\000\000\006\158\006\162\000\000\007\r\016\014\007\r\000\000\007\r\000\000\007\r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\r=\000\000\007\r\r=\r=\000\000\006\166\000\000\007\r\007\r\r=\000\000\003j\000\000\r=\005\137\000\000\007\r\000\000\000\000\007\r\000\000\001\n\007\r\000\000\000\000\000\000\000\000\007\r\007\r\007\r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\014\000\000\000\000\000\000\002\162\000\000\007\r\007\r\000\000\000\000\007\r\000\000\000\000\001\018\001\022\001\026\001\030\001\"\001&\000\000\007\r\007\r\007\r\000\000\007\r\007\r\001*\000\000\0012\0016\000\000\n\142\000\000\000\000\000\000\000\000\000\000\001:\007\r\000\000\001>\007\r\007\r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\r\000\000\000\000\000\000\001B\001F\001J\001N\001R\000\000\000\000\000\000\001V\000\000\000\000\000\000\001Z\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001^\004!\004!\004!\004!\000\000\004!\001b\004!\004!\000\000\004!\000\000\000\000\000\000\000\000\000\000\001\158\"r\004!\000\000\004!\000\000\004!\001\162\004!\001\166\004!\000\000\000\000\001\170\000\000\001\174\001\178\000\000\000\000\000\000\004!\000\000\004!\000\000\000\000\000\000\004!\004!\004!\004!\000\000\000\000\000\000\000\000\000\000\006\137\000\000\006\141\004!\000\000\004!\004!\000\000\004!\000\000\000\000\004!\004!\004!\004!\004!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004!\000\000\004!\000\000\004!\000\000\004!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004!\004!\004!\004!\004!\004!\004!\004!\000\000\000\000\000\000\006\137\000\000\006\141\000\000\000\000\000\000\000\000\004!\004!\004!\004!\004!\000\000\004!\000\000\007\001\007\001\000\000\000\000\000\000\007\001\000\000\004!\007\001\004!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\001\000\000\007\001\000\000\007\001\000\000\007\001\000\000\000\000\n\173\000\000\000\000\n\173\000\000\000\000\000\000\000\000\000\000\007\001\000\000\000\000\000\000\000\000\000\000\007\001\007\001\000\000\000\000\n\173\n\173\000\000\n\173\n\173\n\214\000\000\000\000\007\001\000\000\000\000\007\001\000\000\000\000\000\000\000\000\007\001\007\001\000\242\000\000\000\000\000\000\000\000\000\000\n\173\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\001\007\001\000\000\000\000\007\001\000\000\000\000\011i\000\000\000\000\000\000\000\000\000\000\n\173\007\001\007\001\007\001\000\000\007\001\007\001\000\000\000\000\000\000\r\154\000\000\000\000\017\006\011i\000\000\011i\011i\000\000\007\001\000\000\000\000\007\001\007\001\014\002\014J\014b\014\026\014z\000\000\n\173\000\000\n\173\000\000\007\001\000\000\000\000\000\000\014\146\014\170\000\000\000\000\000\000\000\000\000\000\007^\000\000\000\000\n\173\n\173\014\194\000\000\000\000\n\173\000\000\n\173\000\000\000\000\000\242\n\173\000\000\000\000\000\000\000\000\000\000\000\000\000\000\r\178\0142\014\218\014\242\015\"\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015:\000\000\000\000\000\000\000\000\001\n\000\000\000\000\000\000\015R\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\014\000\000\000\000\015\178\000\000\015\234\015\n\000\000\000\000\000\000\000\000\011i\015j\001\018\001\022\001\026\001\030\001\"\001&\000\000\015\130\015\154\000\000\000\000\000\000\000\000\001*\004\153\0012\0016\004\153\000\000\000\000\000\000\000\000\000\000\000\000\001:\000\000\000\000\001>\000\000\000\000\000\000\000\000\000\000\004\153\004\153\000\000\004\153\004\153\000\000\000\000\000\000\000\000\000\000\000\000\001B\001F\001J\001N\001R\000\000\000\000\000\000\001V\000\000\002\001\002\001\001Z\004\153\002\001\000\000\002\001\000\000\000\000\002\001\000\000\001^\000\000\000\000\000\000\002\001\000\000\000\000\001b\002\001\000\000\000\000\000\000\000\000\000\242\000\000\002\001\000\n\001\158\"\142\t\170\000\000\000\000\000\000\000\000\001\162\021&\001\166\000\000\002\001\000\000\001\170\000\000\001\174\001\178\002\001\002\001\000\000\000\000\000\000\000\000\000\000\002\001\000\000\004\153\002\001\004\153\000\000\002\001\002\001\000\000\002\001\002\001\002\001\002\001\000\000\000\000\000\000\000\000\004\153\n\221\n\221\007\142\004\153\000\000\n\221\002\001\004\153\n\221\004\153\000\000\000\000\000\000\004\153\002\001\002\001\000\000\021f\n\221\000\000\n\221\000\000\n\221\000\000\n\221\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n\221\000\000\000\000\002\001\000\000\000\000\n\221\n\221\000\000\002\001\000\000\000\000\000\250\000\000\000\000\002&\000\000\000\000\n\221\000\000\000\000\n\221\000\000\000\000\000\000\024v\n\221\n\221\n\221\000\000\000\000\005\138\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n\221\024z\000\000\000\000\n\221\000\000\000\000\024\162\000\000\000\000\000\000\000\000\000\000\000\000\n\221\n\221\n\221\000\000\n\221\n\221\015\205\015\205\023\198\000\000\000\000\015\205\000\000\023\222\015\205\n\221\000\000\000\000\n\221\000\000\000\000\000\000\n\221\000\000\015\205\000\000\015\205\000\000\015\205\025B\015\205\003\254\000\000\n\221\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\205\023\250\025V\000\000\000\000\005\229\015\205\015\205\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003:\000\000\000\000\015\205\000\000\000\000\015\205\000\000\025f\000\000\000\000\015\205\015\205\015\205\015\209\015\209\000\000\000\000\000\000\015\209\000\000\000\000\015\209\000\000\000\000\000\000\000\000\015\205\000\000\000\000\000\000\015\205\015\209\000\000\015\209\000\000\015\209\000\000\015\209\000\000\000\000\015\205\015\205\015\205\000\000\015\205\015\205\000\000\000\000\000\000\015\209\000\000\003J\000\000\000\000\000\000\015\209\015\209\000\000\015\205\000\000\000\000\000\000\015\205\000\000\003:\000\000\000\000\015\209\000\000\000\000\015\209\000\000\000\000\015\205\000\000\015\209\015\209\015\209\001\177\005Z\t\214\000\000\000\000\001\177\000\000\001\210\001\177\002\022\000\000\000\000\002\030\015\209\000\000\t\198\011E\015\209\001\177\000\000\001\214\000\000\001\177\000\000\001\177\000\000\000\000\015\209\015\209\015\209\000\000\015\209\015\209\000\000\000\000\000\000\001\177\005n\003J\000\000\000\000\000\000\001\177\001\177\000\000\015\209\t\210\001\226\000\000\015\209\000\000\000\000\002\174\002\190\001\177\000\000\000\000\001\177\000\000\000\000\015\209\000\000\001\177\001\177\001\177\000\000\000\000\005\157\000\000\000\000\000\000\000\000\005\157\000\000\000\000\005\157\000\000\000\000\001\177\001\177\000\000\t\218\003\210\000\000\000\000\005\157\000\000\000\000\000\000\005\157\000\000\005\157\001\177\001\177\004\005\000\000\001\177\001\177\000\000\004\005\000\000\001\210\004\005\005\157\000\000\000\000\000\000\001\177\000\000\005\157\011A\000\000\004\005\000\000\001\177\000\000\004\005\000\000\004\005\001\177\000\000\005\157\000\000\000\000\005\157\001\177\000\000\000\000\000\000\005\157\004\005\000\000\000\000\000\000\000\000\000\000\004\005\001\173\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\157\002\174\000\000\004\005\005\157\000\000\004\005\000\000\000\000\000\000\000\000\004\005\004\005\004\005\005\157\005\157\000\000\000\000\005\157\005\157\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\005\004\005\000\000\000\000\003\210\000\000\000\000\000\000\000\000\005\157\000\000\000\000\000\000\000\000\004\005\004\005\004\001\000\000\004\005\004\005\031\n\004\001\000\000\001\210\004\001\000\000\000\000\000\000\000\000\004\005\000\000\000\000\011A\000\000\004\001\000\000\004\005\000\000\004\001\000\000\004\001\004\005\000\000\000\000\000\000\000\000\000\000\004\005\000\000\000\000\000\000\000\000\004\001\000\000\000\000\000\000\000\000\000\000\004\001\001\173\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\174\000\000\004\001\000\000\000\000\004\001\000\000\000\000\000\000\000\000\004\001\004\001\004\001\000\000\000\153\000\000\000\000\000\000\000\000\000\153\000\000\000\000\000\153\000\000\000\000\000\000\004\001\004\001\000\000\000\000\003\210\000\000\000\153\000\000\000\153\000\000\000\153\000\000\000\153\000\000\004\001\004\001\000\000\000\000\004\001\004\001\000\000\000\000\000\000\000\000\000\153\000\000\000\000\000\000\000\000\004\001\000\153\000\000\000\000\000\000\000\153\000\000\004\001\000\000\000\000\000\000\000\000\004\001\000\153\000\000\000\000\000\153\000\000\004\001\000\000\000\000\000\153\000\153\000\242\000\000\000\000\000\000\000\000\000\000\000\000\000\153\000\153\000\000\000\000\000\000\000\000\000\000\000\153\000\000\000\221\000\000\000\153\000\000\000\000\000\221\000\000\000\000\000\221\000\000\000\000\000\000\000\153\000\153\000\000\000\000\000\153\000\153\000\221\000\000\000\221\000\000\000\221\000\000\000\221\000\000\000\000\000\153\000\000\000\000\000\000\000\000\000\000\000\153\000\153\000\000\000\221\000\000\000\000\000\000\000\000\000\000\000\221\000\153\000\000\000\153\000\221\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\221\000\000\000\000\000\221\000\000\000\000\000\000\000\000\000\221\000\221\000\242\000\000\000\000\000\000\000\000\000\000\000\000\000\221\000\221\000\000\000\000\000\000\000\000\000\000\000\221\000\000\000\161\000\000\000\221\000\000\000\000\000\161\000\000\000\000\000\161\000\000\000\000\000\000\000\221\000\221\000\000\000\000\000\221\000\221\000\161\000\000\000\161\000\000\000\161\000\000\000\161\000\000\000\000\000\221\000\000\000\000\000\000\000\000\000\000\000\221\000\221\000\000\000\161\000\000\000\000\000\000\000\000\000\000\000\161\000\221\000\000\000\221\000\161\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\161\000\000\000\000\000\161\000\000\000\000\000\000\000\000\000\161\000\161\000\242\000\000\000\000\000\000\000\000\000\000\000\000\000\161\000\161\000\000\000\000\000\000\000\000\000\000\000\161\000\000\000\157\000\000\000\161\000\000\000\000\000\157\000\000\000\000\000\157\000\000\000\000\000\000\000\161\000\161\000\000\000\000\000\161\000\161\000\157\000\000\000\157\000\000\000\157\000\000\000\157\000\000\000\000\000\161\000\000\000\000\000\000\000\000\000\000\000\161\000\161\000\000\000\157\000\000\000\000\000\000\000\000\000\000\000\157\000\161\000\000\000\161\000\157\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\157\000\000\000\000\000\157\000\000\000\000\000\000\000\000\000\157\000\157\000\242\000\000\000\000\000\000\000\000\000\000\000\000\000\157\000\157\000\000\000\000\000\000\000\000\000\000\000\157\000\000\001\141\000\000\000\157\000\000\000\000\001\141\000\000\000\000\001\141\000\000\000\000\000\000\000\157\000\157\000\000\000\000\000\157\000\157\001\141\000\000\000\000\000\000\001\141\000\000\001\141\000\000\000\000\000\157\000\000\000\000\000\000\000\000\000\000\000\157\000\157\000\000\001\141\001\141\000\000\000\000\000\000\000\000\001\141\000\157\000\000\000\157\000\000\000\000\000\000\000\000\000\000\006\137\000\000\000\000\001\141\000\000\000\000\001\141\000\000\006\222\000\000\000\000\001\141\001\141\001\141\004\242\002\202\000\000\000\000\002\150\000\000\004\246\000\000\000\000\004\218\000\000\000\000\000\000\001\141\006\226\000\000\006Z\001\141\000\000\001\214\000\000\000\000\000\000\000\000\000\000\000\000\005.\001\141\001\141\000\000\000\000\001\141\001\141\000\000\000\000\000\000\000\000\000\000\006\137\005:\000\000\000\000\001\141\000\000\000\000\005F\001\194\000\000\001\141\001\141\000\000\000\000\002\190\000\000\001\141\006R\000\000\000\000\000\000\006V\001\141\006^\006\134\006\230\006\146\000\000\000\000\011\145\000\000\000\000\000\000\000\000\000\000\004\242\002\202\000\000\006\150\002\150\000\000\004\246\000\000\000\000\004\218\000\000\006\158\006\162\000\000\007\"\000\000\011\145\000\000\000\000\001\214\007.\000\000\000\000\000\000\000\000\000\000\005.\000\000\000\000\000\000\000\000\000\000\000\000\bB\000\000\000\000\006\166\000\000\b\150\005:\011\218\000\000\003j\000\000\000\000\005F\001\194\000\000\000\000\000\000\000\000\000\000\002\190\000\000\000\000\006R\000\000\000\000\000\000\006V\000\000\006^\006\134\006\230\006\146\000\000\000\000\000\000\000\000\000\000\015\201\015\201\000\000\000\000\000\000\015\201\006\150\000\000\015\201\000\000\000\000\000\000\000\000\000\000\006\158\006\162\000\000\007\"\015\201\000\000\015\201\000\000\015\201\007.\015\201\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\201\000\000\000\000\006\166\000\000\011\145\015\201\015\201\000\000\003j\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\201\000\000\000\000\015\201\000\000\000\000\000\000\000\000\015\201\015\201\015\201\015\197\015\197\000\000\000\000\000\000\015\197\000\000\000\000\015\197\000\000\000\000\000\000\000\000\015\201\000\000\000\000\000\000\015\201\015\197\000\000\015\197\000\000\015\197\000\000\015\197\000\000\000\000\015\201\015\201\015\201\000\000\015\201\015\201\000\000\000\000\000\000\015\197\000\000\000\000\000\000\000\000\000\000\015\197\015\197\000\000\015\201\000\000\000\000\000\000\015\201\000\000\000\000\000\000\000\000\015\197\000\000\000\000\015\197\003\254\000\000\015\201\000\000\015\197\015\197\015\197\000\000\n\225\n\225\000\000\000\000\000\000\n\225\000\000\000\000\n\225\000\000\000\000\000\000\015\197\000\000\000\000\000\000\015\197\000\000\n\225\000\000\n\225\000\000\n\225\000\000\n\225\000\000\015\197\015\197\015\197\000\000\015\197\015\197\000\000\000\000\000\000\000\000\n\225\000\000\000\000\000\000\000\000\n&\n\225\n\225\015\197\000\000\000\000\000\000\015\197\000\000\000\000\000\000\000\000\000\000\n\225\000\000\000\000\n\225\000\000\015\197\000\000\000\000\n\225\n\225\000\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n\225\000\000\000\000\000\000\n\225\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n\225\n\225\n\225\000\000\n\225\n\225\000\000\000\000\002\001\002\001\000\000\000\000\002\001\000\000\002\001\n\225\000\000\002\001\n\225\000\000\000\000\000\000\n\225\000\000\000\000\000\000\000\000\002\001\000\000\002\001\000\000\000\000\000\000\n\225\002\001\000\n\000\000\002\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\001\000\000\000\000\000\000\000\000\000\000\002\001\002\001\000\000\000\000\000\000\000\000\000\000\002\001\000\000\000\000\002\001\000\000\000\000\002\001\002\001\000\000\002\001\002\001\002\001\002\001\000\000\000\000\000\000\000\000\000\000\000\000\004\242\002\202\000\000\000\000\002\150\002\001\tv\000\000\000\000\004\218\000\000\000\000\000\000\002\001\002\001\000\000\002\001\000\000\000\000\001\214\000\000\t\150\002\001\000\000\000\000\000\000\005.\000\000\000\000\011\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\189\002\001\005:\000\000\000\000\002\001\000\000\002\001\012\030\001\194\000\000\000\000\b\157\000\000\000\000\002\190\000\000\000\000\006R\000\000\000\000\000\000\006V\000\000\006^\000\000\012.\006\146\r\154\000\000\000\000\b\157\000\000\000\000\000\000\b\157\000\000\000\000\000\000\006\150\000\000\000\000\014\002\014J\014b\014\026\014z\006\158\006\162\000\000\000\000\003\189\000\000\000\000\000\000\000\000\014\146\014\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\189\014\194\000\000\003\189\000\000\006\166\000\000\000\000\000\000\000\242\000\000\003j\000\000\000\000\000\000\000\000\000\000\000\000\r\178\0142\014\218\014\242\015\"\000\000\000\000\000\000\001\173\000\000\000\000\b\157\015:\001\173\000\000\001\210\001\173\000\000\000\000\000\000\000\000\015R\000\000\000\000\011A\000\000\001\173\000\000\000\000\000\000\001\173\000\000\001\173\000\000\000\000\000\000\015\178\000\000\015\234\015\n\000\000\000\000\000\000\000\000\001\173\015j\000\000\000\000\000\000\000\000\001\173\000\000\000\000\015\130\015\154\000\000\000\000\000\000\000\000\000\000\002\174\000\000\001\173\000\000\023\022\001\173\000\000\000\000\000\000\000\000\001\173\001\173\001\173\000\000\000\000\000\000\000\000\000\000\000\000\000\000\r\154\000\000\000\000\000\000\023\026\000\000\001\173\001\173\000\000\000\000\003\210\000\000\000\000\000\000\014\002\014J\014b\014\026\014z\000\000\001\173\001\173\000\000\000\000\001\173\001\173\000\000\000\000\014\146\014\170\000\000\000\000\000\000\000\000\000\000\001\173\000\000\000\000\000\000\000\000\014\194\000\000\001\173\000\000\000\000\000\000\000\000\001\173\000\242\000\000\000\000\000\000\000\000\001\173\000\000\000\000\000\000\r\178\0142\014\218\014\242\015\"\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015:\000\250\001\206\001\210\002&\000\000\000\000\000\000\000\000\015R\000\000\000\000\000\000\000\000\024v\000\000\000\000\000\000\005\229\000\000\005\138\001\214\001\254\001\234\015\178\023\030\015\234\015\n\023.\000\000\000\000\001\246\024z\015j\000\000\000\000\000\000\000\000\024\162\000\000\000\000\015\130\015\154\000\000\000\000\000\000\000\000\001\250\002\166\000\000\000\000\000\000\002\178\023\198\002\190\003\022\003\"\006\129\023\222\000\000\000\000\003.\006\129\000\000\006\129\006\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\129\025B\006\129\000\000\006\129\0032\006\129\000\000\006\129\000\000\000\000\000\000\000\000\000\000\000\000\023\250\025V\000\000\000\000\000\000\006\129\000\000\000\000\000\000\000\000\000\000\006\129\006\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\129\025f\000\000\000\000\000\000\006\129\003f\000\000\003j\000\000\006\129\006\129\006\129\007A\007A\000\000\000\000\000\000\007A\000\000\000\000\007A\000\000\000\000\000\000\000\000\006\129\000\000\000\000\000\000\006\129\007A\000\000\007A\000\000\007A\000\000\007A\000\000\000\000\006\129\006\129\006\129\000\000\006\129\006\129\000\000\000\000\000\000\007A\000\000\000\000\000\000\000\000\000\000\007A\007A\000\000\000\000\000\000\000\000\026\242\006\129\000\000\n\214\000\000\000\000\007A\000\000\000\000\007A\000\000\000\000\006\129\000\000\007A\007A\000\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007A\000\000\000\000\000\000\007A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007A\007A\007A\000\000\007A\007A\000\000\005\221\000\000\007\214\005\221\000\000\000\000\000\000\000\000\004\242\002\202\000\000\007A\002\150\005\221\007\218\007A\000\000\004\218\000\000\005\221\000\000\000\000\000\000\000\000\000\000\000\000\007A\001\214\000\000\000\000\000\000\005\221\000\000\000\000\005.\000\000\000\000\005\221\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005:\000\000\005\221\000\000\000\000\005\221\005F\001\194\000\000\000\000\005\221\002\238\000\000\002\190\000\000\000\000\006R\000\000\000\000\000\000\006V\000\000\006^\006\134\007\246\006\146\005\221\000\000\000\000\000\000\005\221\007=\t\250\000\000\000\000\000\000\007=\006\150\000\000\007=\005\221\005\221\000\000\000\000\005\221\006\158\006\162\000\000\007\"\007=\000\000\007=\000\000\007=\007.\007=\000\000\007\254\000\000\000\000\000\000\000\000\005\221\000\000\000\000\000\000\000\000\007=\000\000\000\000\006\166\000\000\000\000\007=\nz\000\000\003j\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007=\000\000\000\000\007=\000\000\000\000\000\000\000\000\007=\007=\000\242\015\213\015\213\000\000\000\000\000\000\015\213\000\000\000\000\015\213\000\000\000\000\000\000\000\000\007=\000\000\000\000\000\000\007=\015\213\000\000\015\213\000\000\015\213\000\000\015\213\000\000\000\000\007=\007=\007=\000\000\007=\007=\000\000\000\000\000\000\015\213\000\000\000\000\000\000\000\000\000\000\015\213\015\213\000\000\007=\000\000\000\000\000\000\007=\000\000\000\000\000\000\000\000\015\213\000\000\000\000\015\213\000\000\000\000\007=\000\000\015\213\015\213\000\242\015\217\015\217\000\000\000\000\000\000\015\217\000\000\000\000\015\217\000\000\000\000\000\000\000\000\015\213\000\000\000\000\000\000\015\213\015\217\000\000\015\217\000\000\015\217\000\000\015\217\000\000\000\000\015\213\015\213\015\213\000\000\015\213\015\213\000\000\000\000\000\000\015\217\000\000\000\000\000\000\000\000\000\000\015\217\nz\000\000\015\213\000\000\000\000\000\000\015\213\000\000\000\000\000\000\000\000\015\217\000\000\000\000\015\217\000\000\000\000\015\213\000\000\015\217\015\217\000\242\007U\t\250\000\000\000\000\000\000\007U\000\000\000\000\007U\000\000\000\000\000\000\000\000\015\217\000\000\000\000\000\000\015\217\007U\000\000\007U\000\000\007U\000\000\007U\000\000\000\000\015\217\015\217\015\217\000\000\015\217\015\217\000\000\000\000\000\000\007U\000\000\000\000\000\000\000\000\000\000\007U\nz\000\000\015\217\000\000\000\000\000\000\015\217\000\000\000\000\000\000\000\000\007U\000\000\000\000\007U\000\000\000\000\015\217\000\000\007U\007U\000\242\007Y\007Y\000\000\000\000\000\000\007Y\000\000\000\000\007Y\000\000\000\000\000\000\000\000\007U\000\000\000\000\000\000\007U\007Y\000\000\007Y\000\000\007Y\000\000\007Y\000\000\000\000\007U\007U\007U\000\000\007U\007U\000\000\000\000\000\000\007Y\000\000\000\000\000\000\000\000\000\000\007Y\007Y\000\000\007U\000\000\000\000\000\000\007U\000\000\000\000\000\000\000\000\007Y\000\000\000\000\007Y\000\000\000\000\007U\000\000\007Y\007Y\007Y\0079\t\250\000\000\000\000\000\000\0079\000\000\000\000\0079\000\000\000\000\000\000\000\000\007Y\000\000\000\000\000\000\007Y\0079\000\000\0079\000\000\0079\000\000\0079\000\000\000\000\007Y\007Y\007Y\000\000\007Y\007Y\000\000\000\000\000\000\0079\000\000\000\000\000\000\000\000\000\000\0079\nz\000\000\007Y\000\000\000\000\000\000\007Y\000\000\000\000\000\000\000\000\0079\000\000\000\000\0079\000\000\000\000\n\162\000\000\0079\0079\000\242\003\253\000\000\000\000\000\000\000\000\003\253\000\000\001\210\003\253\000\000\000\000\000\000\000\000\0079\000\000\000\000\000\000\0079\003\253\000\000\000\000\000\000\003\253\000\000\003\253\000\000\000\000\0079\0079\0079\000\000\0079\0079\000\000\000\000\000\000\003\253\000\000\000\000\000\000\000\000\000\000\003\253\000\000\000\000\0079\000\000\000\000\003\249\0079\000\000\000\000\002\174\003\249\003\253\001\210\003\249\003\253\000\000\000\000\0079\000\000\003\253\003\253\003\253\000\000\003\249\000\000\000\000\000\000\003\249\000\000\003\249\000\000\000\000\000\000\000\000\000\000\003\253\003\253\000\000\000\000\003\210\000\000\003\249\000\000\000\000\000\000\000\000\000\000\003\249\000\000\003\253\003\253\000\000\000\000\003\253\003\253\000\000\000\000\002\174\000\000\003\249\000\000\000\000\003\249\000\000\003\253\000\000\000\000\003\249\003\249\003\249\000\000\003\253\0011\000\000\000\000\000\000\003\253\0011\000\000\000\000\0011\000\000\003\253\003\249\003\249\000\000\000\000\003\210\000\000\000\000\0011\000\000\0011\000\000\0011\000\000\0011\003\249\003\249\000\000\000\000\003\249\003\249\000\000\000\000\000\000\000\000\000\000\0011\000\000\000\000\000\000\003\249\000\000\0011\b\165\000\000\000\000\0011\003\249\b\165\000\000\000\000\b\165\003\249\000\000\0011\000\000\000\000\0011\003\249\000\000\000\000\b\165\0011\0011\000\242\b\165\001-\b\165\000\000\000\000\000\000\001-\0011\000\000\001-\000\000\000\000\000\000\0011\b\165\000\000\000\000\0011\000\000\001-\b\165\001-\000\000\001-\000\000\001-\000\000\0011\0011\0011\000\000\0011\0011\000\000\000\000\b\165\000\000\001-\000\000\000\000\b\165\b\165\0011\001-\000\000\000\000\000\000\001-\000\000\0011\000\000\000\000\000\000\000\000\000\000\001-\b\165\000\000\001-\000\000\0011\000\000\000\000\001-\001-\000\242\000\000\000\000\000\000\000\000\b\165\b\165\023v\001-\b\165\b\165\000\000\000\000\000\000\001-\000\000\000\000\000\000\001-\000\000\000\000\000\000\000\000\000\000\024\182\000\000\000\000\b\165\001-\001-\001-\001i\001-\001-\000\000\000\000\001i\000\000\015%\001i\000\000\000\000\000\000\001-\000\000\000\000\000\000\015%\000\000\001i\001-\001i\000\000\001i\000\000\001i\000\000\000\000\000\000\000\000\000\000\001-\000\000\000\000\000\000\000\000\000\000\001i\000\000\000\000\000\000\000\000\000\000\001i\015%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015%\000\000\000\000\000\000\000\000\001i\000\000\000\000\000\000\000\000\001i\001i\001i\001\029\000\000\000\000\000\000\000\000\001\029\000\000\002\025\001\029\000\000\000\000\000\000\000\000\001i\000\000\000\000\002\025\015%\001\029\000\000\001\029\000\000\001\029\000\000\001\029\000\000\000\000\001i\001i\001i\000\000\001i\001i\000\000\000\000\000\000\001\029\000\000\000\000\000\000\000\000\000\000\001\029\002\025\000\000\000\000\000\000\000\000\001\185\001i\000\000\000\000\002\025\001\185\000\000\021r\001\185\001\029\002\150\000\000\001i\000\000\001\029\001\029\001\029\000\000\001\185\000\000\000\000\000\000\001\185\000\000\001\185\000\000\000\000\000\000\000\000\000\000\001\029\000\000\000\000\000\000\002\025\000\000\001\185\000\000\000\000\000\000\000\000\000\000\001\185\000\000\001\029\001\029\001\029\000\000\001\029\001\029\000\000\021v\000\000\000\000\001\185\000\000\000\000\001\185\000\000\000\000\000\000\000\000\001\185\001\185\000\000\021\130\001\029\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\029\001\185\000\000\000\000\000\000\001\185\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\162\001\185\001\185\005\197\005\197\001\185\001\185\005\197\000\000\005\197\000\000\000\000\005\197\000\000\000\000\000\000\001\185\000\000\005\197\000\000\000\000\000\000\005\197\001\185\000\000\000\000\000\000\000\000\000\000\005\197\029\214 \142\000\000\029\238\001\185\000\000\000\000\004\242\002\202\000\000\000\000\002\150\005\197\004\246\000\000\000\000\004\218\000\000\005\197\005\197\000\000\000\000\000\000\bZ\000\000\005\197\001\214\000\000\005\197\000\000\000\000\000\242\005\197\005.\005\197\005\197\005\197\005\197\000\000\000\000\000\000\000\250\000\000\000\000\002\206\000\000\005:\000\000\000\000\005\197\000\000\000\000\005F\001\194\006\017\000\000\000\000\005\197\005\197\002\190\005\138\000\000\006R\000\000\000\000\000\000\006V\000\000\006^\006\134\006\230\006\146\005\150\000\000\000\000\000\000\000\000\000\000\023b\000\000\004\242\002\202\005\197\006\150\002\150\000\000\005\018\000\000\005\197\004\218\0316\006\158\006\162\023\198\007\"\000\000\000\000\000\000\023\222\001\214\007.\000\000\000\000\000\000\000\000\000\000\005.\000\000\000\000\000\000\000\000\000\000\000\000\000\000\023\230\000\000\006\166\000\000\000\000\005:\011\218\000\000\003j\000\000\000\000\005F\001\194\000\000\023\250\0246\000\000\000\000\002\190\000\000\000\000\006R\000\000\000\000\000\000\006V\000\000\006^\006\134\031\198\006\146\000\000\000\000\000\000\000\000\000\000\028v\000\000\000\000\000\000\000\000\000\000\006\150\000\000\000\000\007\237\000\000\000\000\000\000\000\000\006\158\006\162\002\202\007\"\000\000\002\150\000\000\000\000\000\000\007.\004\218\000\000\031\206\000\000\000\000\007\237\000\000\000\000\000\000\000\000\001\214\000\000\000\000\000\000\004\222\006\166\000\000\000\000\000\000\000\000\000\000\003j\000\000\004\226\000\000\005\186\000\000\000\000\000\000\000\000\000\000\000\000\005\238\005\242\000\000\000\000\006\002\001\194\000\000\000\000\000\000\000\000\000\000\002\190\000\000\000\000\006\n\000\000\000\000\000\000\011\018\011\022\011\"\000\000\000\000\006\146\000\000\000\000\004\242\002\202\000\000\000\000\002\150\000\000\006\242\000\000\000\000\004\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\158\006\162\001\214\000\000\000\000\000\000\000\000\000\000\000\000\005.\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005:\000\000\000\000\006\166\011*\000\000\005F\001\194\011B\003j\bm\bm\000\000\002\190\000\000\000\000\006R\000\000\000\000\000\000\006V\000\000\006^\006\134\007\014\006\146\000\000\000\000\000\000\bm\bm\bm\004\242\002\202\000\000\000\000\002\150\006\150\007b\bm\000\000\004\218\000\000\000\000\000\000\006\158\006\162\000\000\007\"\000\000\000\000\001\214\000\000\000\000\007.\bm\bm\b:\005.\000\000\bm\000\000\bm\bm\bm\000\000\000\000\000\000\000\000\bm\006\166\005:\000\000\000\000\000\000\000\000\003j\005F\001\194\000\000\000\000\001\206\001\210\029*\002\190\000\000\bm\006R\000\000\000\000\000\000\006V\000\000\006^\006\134\007~\006\146\007\146\000\000\000\000\001\214\001\218\001\234\004\242\002\202\000\000\000\000\002\150\006\150\004\246\001\246\000\000\004\218\000\000\000\000\000\000\006\158\006\162\000\000\007\"\000\000\000\000\001\214\000\000\000\000\007.\001\250\002\166\007\134\005.\0046\002\178\000\000\002\190\003\022\003\"\000\000\000\000\000\000\000\000\003.\006\166\005:\000\000\000\000\000\000\000\000\003j\005F\001\194\000\000\000\000\001\206\001\210\029\138\002\190\000\000\0032\006R\000\000\000\000\000\000\006V\000\000\006^\006\134\006\230\006\146\b\030\000\000\000\000\001\214\001\218\001\234\004\242\002\202\000\000\000\000\002\150\006\150\004\246\001\246\000\000\004\218\000\000\000\000\000\000\006\158\006\162\000\000\007\"\000\000\000\000\001\214\000\000\000\000\007.\001\250\002\166\000\000\005.\000\000\002\178\000\000\002\190\003\022\003\"\000\000\000\000\000\000\000\000\003.\006\166\005:\000\000\000\000\000\000\000\000\003j\005F\001\194\000\000\000\000\001\206\001\210\000\000\002\190\000\000\0032\006R\000\000\000\000\000\000\006V\000\000\006^\006\134\006\230\006\146\b\190\000\000\000\000\001\214\001\254\000\000\004\242\002\202\000\000\000\000\002\150\006\150\004\246\000\000\000\000\004\218\000\000\000\000\000\000\006\158\006\162\000\000\007\"\000\000\000\000\001\214\000\000\000\000\007.\001\250\002\182\000\000\005.\000\000\002\178\000\000\002\190\003\022\003\"\000\000\000\000\000\000\000\000\003.\006\166\005:\000\000\000\000\000\000\000\000\003j\005F\001\194\000\000\000\000\000\000\000\000\000\000\002\190\000\000\0032\006R\000\000!F\000\000\006V\000\000\006^\006\134\006\230\006\146\016\210\000\000\000\000\000\000\000\000\000\000\004\242\002\202\000\000!2\002\150\006\150\004\246\000\000\000\000\004\218\000\000\000\000\000\000\006\158\006\162\000\000\007\"\000\000\000\000\001\214\000\000\000\000\007.\000\000\000\000\000\000\005.\000\000\000\000\005\221\000\000\000\000\000\000\000\000\005\221\000\000\000\000\005\221\006\166\005:\000\000\000\000\000\000\000\000\003j\005F\001\194\005\221\000\000\000\000\000\000\005\221\002\190\005\221\000\000\006R\000\000\000\000\000\000\006V\000\000\006^\006\134\006\230\006\146\005\221\000\000\000\000\000\000\000\000\000\000\005\221\000\000\000\000\000\000\005\221\006\150\000\000\000\000\000\000\003:\000\000\000\000\005\221\006\158\006\162\005\221\007\"\000\000\000\000\000\000\005\221\002\238\007.\000\000\000\000\000\000\000\000\000\000\000\000\005\221\005\221\000\000\000\000\000\000\000\000\000\000\005\221\005\221\006\166\000\000\005\221\000\000\b\021\000\000\003j\000\000\000\000\000\000\000\000\002\202\005\221\005\221\002\150\000\000\005\221\005\221\000\000\004\218\000\000\000\000\000\000\003J\b\021\000\000\000\000\005\221\000\000\001\214\000\000\000\000\000\000\004\222\005\221\014\229\000\000\000\000\014\229 \174\000\000\000\000\004\226\000\000\005\186\005\221\000\000\000\000\014\229\000\000\000\000\005\238\005\242\000\000\014\229\006\002\001\194\000\000\000\000\000\000\000\000\000\000\002\190\000\000\000\000\006\n\014\229\000\000\000\000\011\018\011\022\011\"\014\229\000\000\006\146\t\197\000\000\000\000\000\000\000\000\t\197\000\000\000\000\t\197\014\229\000\000\000\000\014\229\000\000\000\000\000\000\000\000\014\229\t\197\006\158\006\162\000\000\t\197\000\000\t\197\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\229\000\000\000\000\t\197\014\229\000\000\000\000\000\000\000\000\t\197\000\000\006\166\011*\t\197\014\229\014\229\011B\003j\014\229\000\000\000\000\t\197\000\000\000\000\t\197#V\000\000\000\000\000\000\t\197\t\197\000\242\000\000\000\000\000\000\000\000\014\229\000\000\t\197\t\197\000\000\000\000\000\000\000\000\000\000\t\197\000\000\t\193\000\000\t\197\000\000\000\000\t\193\000\000\000\000\t\193\000\000\000\000\000\000\t\197\t\197\t\197\000\000\t\197\t\197\t\193\000\000\000\000\000\000\t\193\003\241\t\193\000\000\000\000\t\197\003\241\000\000\000\000\003\241\000\000\000\000\t\197\000\000\t\193\000\000\000\000\000\000\000\000\003\241\t\193\000\000\000\000\003\241\t\193\003\241\000\000\000\000\000\000\000\000\000\000\000\000\t\193\000\000\000\000\t\193\000\000\003\241\021\138\000\000\t\193\t\193\000\242\003\241\000\000\000\000\000\000\000\000\000\000\t\193\t\193\000\000\000\000\000\000\000\000\003\241\t\193\000\000\003\241\000\000\t\193\000\000\000\000\003\241\003\241\003\241\000\000\000\000\000\000\000\000\t\193\t\193\t\193\000\000\t\193\t\193\000\000\000\000\000\000\003\241\000\000\000\000\000\000\003\241\000\000\t\193\000\000\000\000\000\000\000\000\000\000\000\000\t\193\003\241\003\241 \182\000\000\003\241\003\241\000\000\000\000\000\000\000\000\004\242\002\202\000\000\000\000\002\150\003\241\tv\000\000\000\000\004\218\000\000\021\234\003\241\000\000\000\000\000\000\000\000\003\241\000\000\001\214\000\000\t\150\000\000\003\241\000\000\000\000\005.\000\000\000\000\011\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000\030\030\000\000\005:\000\000\000\000\000\000\000\000\000\000\005F\001\194\000\000\000\000\bq\bq\000\000\002\190\000\000\000\000\006R\000\000\000\000\000\000\006V\000\000\006^\000\000\012.\006\146\003&\000\000\000\000\bq\bq\bq\004\242\002\202\000\000\000\000\002\150\006\150\tv\bq\000\000\004\218\000\000\000\000\000\000\006\158\006\162\000\000\000\000\028\142\000\000\001\214\000\000\t\150\000\000\bq\bq\000\000\005.\000\000\bq\011\242\bq\bq\bq\000\000\000\000\000\000\030\234\bq\006\166\005:\000\000\000\000\000\000\000\000\003j\012\030\001\194\000\000\000\000\001\206\001\210\000\000\002\190\000\000\bq\006R\000\000\000\000\000\000\006V\000\000\006^\000\000\012.\006\146\006Z\000\000\000\000\001\214\001\254\001\234\004\242\002\202\000\000\000\000\002\150\006\150\tv\001\246\000\000\004\218\000\000\000\000\000\000\006\158\006\162\000\000\000\000\016\014\000\000\001\214\003\026\t\150\bq\001\250\002\166\000\000\005.\000\000\002\178\011\242\002\190\003\022\003\"\000\000\000\000\000\000\029&\003.\006\166\005:\000\000\000\000\000\000\000\000\003j\012\030\001\194\000\000\000\000\001\206\001\210\000\000\002\190\000\000\0032\006R\000\000\000\000\000\000\006V\000\000\006^\000\000\012.\006\146\000\000\000\000\000\000\001\214\001\254\000\000\004\242\002\202\000\000\000\000\002\150\006\150\031\222\000\000\000\000\004\218\000\000\000\000\000\000\006\158\006\162\000\000\000\000\016\014\000\000\001\214\003f\000\000\003j\001\250\002\182\000\000\005.\000\000\002\178\000\000\002\190\003\022\003\"\000\000\000\000\000\000\029\134\003.\006\166\005:\000\000\000\000\000\000\000\000\003j\005F\001\194\000\000\000\000\000\000\000\000\000\000\002\190\000\000\0032\006R\000\000\006Q\000\000\006V\000\000\006^\006\134\031\250\006\146\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000!2\000\000\006\150\000\000\000\000\000\000\000\000\000\000\007\241\000\000\006\158\006\162\000\000\007\"\004\242\002\202\000\000\000\000\002\150\007.\006\026\000\000 \002\004\218\000\000\000\000\000\000\000\000\007\241\000\000\000\000\000\000\000\000\001\214\000\000\006\166\016\158\000\000\000\000\000\000\005.\003j\004\242\002\202\000\000\000\000\002\150\000\000\016\162\000\000\000\000\004\218\000\000\005:\000\000\000\000\000\000\000\000\000\000\005F\001\194\001\214\000\000\000\000\000\000\000\000\002\190\000\000\005.\006R\000\000\000\000\000\000\006V\000\000\006^\006\134\t:\006\146\000\000\000\000\005:\000\000\000\000\000\000\000\000\000\000\005F\001\194\000\000\006\150\000\000\000\000\000\000\002\190\000\000\000\000\006R\006\158\006\162\000\000\006V\000\000\006^\006\134\016\190\006\146\000\000\000\000\000\000\000\000\000\000\003\241\000\000\000\000\000\000\000\000\003\241\006\150\000\000\003\241\000\000\000\000\006\166\000\000\000\000\006\158\006\162\000\000\003j\003\241\000\000\000\000\000\000\003\241\000\000\003\241\000\000\016\198\000\000\000\000\003\241\000\000\000\000\003\241\000\000\000\000\000\000\003\241\021\138\000\000\006\166\000\000\000\000\003\241\000\000\000\000\003j\003\241\015\029\003\241\000\000\000\000\000\000\015\029\000\000\003\241\015\029\000\000\003\241\000\000\000\000\003\241\021\138\003\241\003\241\003\241\015\029\003\241\000\000\000\000\015\029\000\000\015\029\000\000\000\000\000\000\000\000\000\000\006\129\003\241\000\000\000\000\003\241\003\241\015\029\000\000\000\000\003\241\003\241\003\241\015\029\000\000\000\000\003\241\003\241 \230\000\000\003\241\003\241\000\000\000\000\000\000\015\029\003\241\000\000\015\029\000\000\003\241\000\000\000\000\015\029\015\029\000\000\000\000\021\234\003\241\000\000\003\241\003\241\024F\003\241\003\241\003\241\000\000\000\000\000\000\015\029\000\000\000\000\000\000\015\029\000\000\000\000\000\000\000\000\000\000\000\000\000\000\021\234\003\241\015\029\015\029\002\142\000\000\015\029\015\029\000\000\000\000\004\242\002\202\000\000\000\000\002\150\000\000\b\218\015\029\000\000\004\218\000\000!\182\000\000\000\000\015\029\000\000\000\000\000\000\000\000\001\214\000\000\000\000\000\000\000\000\000\000\015\029\005.\000\000\004\242\002\202\000\000\000\000\002\150\000\000\t\014\000\000\000\000\004\218\000\000\005:\000\000\000\000\000\000\000\000\000\000\005F\001\194\001\214\000\000\000\000\000\000\000\000\002\190\000\000\005.\006R\000\000\000\000\000\000\006V\000\000\006^\006\134\b\246\006\146\000\000\000\000\005:\000\000\000\000\000\000\000\000\000\000\005F\001\194\000\000\006\150\000\000\000\000\000\000\002\190\000\000\000\000\006R\006\158\006\162\000\000\006V\000\000\006^\006\134\t*\006\146\000\000\000\000\000\000\b\254\000\000\000\000\004\242\002\202\000\000\000\000\002\150\006\150\tF\000\000\000\000\004\218\006\166\000\000\000\000\006\158\006\162\000\000\003j\000\000\000\000\001\214\000\000\000\000\000\000\000\000\000\000\t2\005.\000\000\000\000\006\217\000\000\000\000\000\000\000\000\006\217\000\000\000\000\006\217\006\166\005:\000\000\000\000\000\000\000\000\003j\005F\001\194\006\217\000\000\000\000\000\000\006\217\002\190\006\217\000\000\006R\000\000\000\000\000\000\006V\000\000\006^\006\134\tb\006\146\006\217\000\000\000\000\000\000\000\000\000\000\006\217\000\000\000\000\000\000\000\000\006\150\000\000\000\000\000\000\n\214\000\000\006\225\006\217\006\158\006\162\006\217\006\225\000\000\000\000\006\225\006\217\006\217\000\242\000\000\000\000\tj\000\000\000\000\000\000\006\225\000\000\000\000\000\000\006\225\000\000\006\225\006\217\006\217\006\166\000\000\006\217\000\000\000\000\000\000\003j\000\000\000\000\006\225\000\000\000\000\006\217\006\217\000\000\006\225\006\217\006\217\000\000\000\000\000\000\000\000\000\000\000\000\n\214\000\000\000\000\006\225\000\000\000\000\006\225\000\000\000\000\000\000\006\217\006\225\006\225\000\242\t\245\t\245\000\000\000\000\t\245\000\000\t\245\006\217\000\000\t\245\000\000\000\000\000\000\006\225\006\225\0222\000\000\006\225\000\000\t\245\000\000\000\000\000\000\000\000\000\000\000\000\t\245\006\225\006\225\007\157\000\000\006\225\006\225\000\000\007\157\000\000\000\000\007\157\000\000\t\245\000\000\000\000\000\000\000\000\000\000\t\245\t\245\007\157\000\000\006\225\000\000\007\157\t\245\007\157\000\000\t\245\000\000\000\000\000\000\t\245\006\225\t\245\t\245\t\245\t\245\007\157\000\000\000\000\000\000\000\000\000\000\007\157\000\000\000\000\000\000\000\000\t\245\000\000\000\000\000\000\000\000\000\000\000\000\007\157\t\245\t\245\007\157\000\000\000\000\000\000\000\000\007\157\007\157\000\242\000\000\b\169\t\250\000\000\000\000\000\000\b\169\000\000\000\000\b\169\000\000\000\000\000\000\007\157\000\000\t\245\000\000\007\157\000\000\b\169\000\000\t\245\000\000\b\169\000\000\b\169\000\000\007\157\007\157\028\026\000\000\007\157\007\157\000\000\000\000\000\000\000\000\b\169\000\000\000\000\000\000\000\000\007\157\b\169\nz\000\000\000\000\000\000\001\189\007\157\000\000\000\000\000\000\001\189\000\000\b\169\001\189\000\000\b\169\000\000\007\157\000\000\000\000\b\169\b\169\000\242\001\189\000\000\000\000\000\000\001\189\000\000\001\189\000\000\000\000\000\000\000\000\000\000\000\000\b\169\000\000\000\000\000\000\b\169\001\189\000\000\000\000\000\000\000\000\000\000\001\189\000\000\000\000\b\169\b\169\000\000\007\161\b\169\b\169\000\000\000\000\007\161\001\189\000\000\007\161\001\189\000\000\000\000\000\000\000\000\001\189\001\189\000\000\000\000\007\161\b\169\000\000\000\000\007\161\000\000\007\161\000\000\000\000\000\000\000\000\000\000\001\189\000\000\000\000\000\000\001\189\000\000\007\161\000\000\000\000\000\000\000\000\000\000\007\161\000\000\001\189\001\189\000\000\000\000\001\189\001\189\000\000\000\000\000\000\000\000\007\161\000\000\000\000\007\161\000\000\001\189\000\000\000\000\007\161\007\161\000\242\000\000\001\189\000\000\000\000\000\000\000\000\027\246\000\000\000\000\000\000\000\000\015\029\001\189\007\161\000\000\000\000\015\029\007\161\000\000\015\029\000\000\000\000\000\000\000\000\000\000\001\206\001\210\007\161\007\161\015\029\000\000\007\161\007\161\015\029\000\000\015\029\000\000\000\000\000\000\000\000\000\000\006\129\007\161\000\000\001\214\001\254\000\000\015\029\000\000\007\161\000\000\000\000\000\000\015\029\000\000\000\000\000\000\000\000\000\000\000\000\007\161\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\029\000\000\001\250\002\174\000\000\015\029\015\029\002\178\000\000\002\190\003\022\003\"\014\213\000\000\002\202\014\213\003.#f\021\142\000\000\000\000\015\029#j\000\000\000\000\014\213\000\000\000\000\000\000\000\000\000\000\014\213\000\000\0032\000\000\015\029\015\029\002\142\000\000\015\029\015\029\000\000\000\000\014\213\000\000\000\000\000\000\000\000\005\221\014\213\015\029\000\000\000\000\005\221!\238\000\000\005\221\015\029\001\006\001\194\000\000\014\213\000\000\000\000\014\213\000\000\005\221\000\000\015\029\014\213\005\221\000\000\005\221\000\000\000\000\000\000\000\000#n\000\000\000\000\000\000\000\000\000\000\005\221\005\221\014\213\005\221\t\250\005\221\014\213\005\221\005\221\000\000\000\000\005\221\000\000\000\000\000\000#r\014\213\014\213\005\221\005\221\014\213\005\221\005\221\000\000\005\221\005\221\000\000\005\221\002\238\000\242\000\000\000\000\000\000\000\000\000\000\000\000\005\221\000\000\014\213\005\221\000\000\000\000\005\221\005\221\000\000\005\221\nz\005\221\000\000\000\000\000\000\n\214\000\000\000\000\005\221\000\000\000\000\005\221\005\221\000\000\005\221\005\221\005\221\002\238\000\242\005\221\002\238\000\242\n\142\000\000\000\000\000\000\n&\000\000\000\000\000\000\000\000\000\000\005\221\005\221\000\000\005\221\005\221\001U\027\246\000\000\000\000\000\000\001U\000\000\005\221\001U\005\221\005\221\000\000\005\221\005\221\005\221\000\000\005\221\005\221\001U\000\000\001U\000\000\001U\000\000\001U\000\209\000\000\000\000\000\000\000\000\000\209\005\221\000\000\000\209\005\221\000\000\001U\000\000\000\000\000\000\000\000\000\000\001U\000\209\000\000\005\221\000\000\000\209\000\213\000\209\000\000\000\000\000\000\000\213\000\000\000\000\000\213\001U\000\000\000\000\000\000\000\209\001U\001U\000\242\000\000\000\213\000\209\000\000\000\000\000\213\000\000\000\213\000\000\000\000\000\000\000\000\000\000\001U\000\209\000\000\000\000\000\209\000\000\000\213\000\000\000\000\000\209\000\209\000\242\000\213\000\000\001U\001U\001U\000\000\001U\001U\000\000\000\000\000\000\000\000\000\213\000\209\000\000\000\213\000\000\000\209\000\000\000\000\000\213\000\213\000\242\000\000\001U\000\000\000\000\000\209\000\209\000\000\000\000\000\209\000\209\000\000\000\000\001U\000\213\000\000\000\000\000\000\000\213\000\000\001\206\002\146\000\000\000\000\002\150\000\000\000\000\000\209\000\213\000\213\000\000\000\000\000\213\000\213\000\000\000\000\000\000\000\000\000\209\001\214\001\254\001\234\002\154\000\000\000\000\000\000\000\000\000\000\000\000\001\246\000\213\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\213\000\000\000\000\000\000\002\158\002\166\000\000\001\206\001\210\002\178\000\000\002\190\003\022\003\"\b\165\000\000\000\000\000\000\027\206\b\165\027\210\000\000\b\165\000\000\000\000\000\000\001\214\001\254\000\000\000\000\000\000\000\000\b\165\000\000\000\000\0032\b\165\000\000\b\165\000\000\000\000\000\000\000\000\000\000\006\162\000\000\000\000\000\000\000\000\000\000\b\165\000\000\001\250\002\182\000\000\027\222\b\165\002\178\000\000\002\190\003\022\003\"\000\000\000\000\000\000\000\000\003.\000\000\b\165\000\000\000\000\b\165\027\226\007\149\000\000\000\000\b\165\b\165\007\149\000\000\000\000\007\149\000\000\0032\000\000\000\000\006U\000\000\024\"\000\000\000\000\007\149\b\165\000\000\000\000\007\149\b\165\007\149\000\000\000\000\000\000\000\000\000\000!2\000\000\000\000\b\165\b\165\023v\007\149\b\165\b\165\000\000\000\000\000\000\007\149\006\233\t\250\000\000\000\000\000\000\006\233\000\000\000\000\006\233\000\000\000\000\007\149\b\165\000\000\007\149\000\000\000\000\000\000\006\233\007\149\007\149\000\000\006\233\000\000\006\233\000\000\000\000\001\206\002\146\000\000\000\000\002\150\000\000\000\000\000\000\007\149\006\233\000\000\000\000\007\149\000\000\000\000\006\233\nz\000\000\000\000\001\214\001\254\001\234\007\149\007\149\000\000\000\000\007\149\007\149\000\000\001\246\006\233\000\000\000\000\000\000\000\000\006\233\006\233\000\242\000\000\000\000\000\000\000\000\000\000\000\000\007\149\002\158\002\166\000\000\000\000\000\000\002\178\006\233\002\190\003\022\003\"\005\189\000\000\000\000\000\000\027\206\005\189!\154\000\000\005\189\000\000\006\233\006\233\000\000\000\000\006\233\006\233\000\000\000\000\005\189\000\000\000\000\0032\005\189\000\000\005\189\000\000\000\000\000\000\000\000\000\000\006\162\000\000\006\233\000\000\000\000\000\000\005\189\000\000\000\000\000\000\000\000!\166\005\189\005\165\000\000\000\000\000\000\000\000\005\165\000\000\000\000\005\165\000\000\000\000\000\000\000\000\000\000\005\189\027\226\000\000\000\000\005\165\005\189\000\000\000\000\005\165\005\213\005\165\000\000\000\000\000\000\005\213\000\000\000\000\005\213\000\000\000\000\000\000\005\189\005\165\000\000\000\000\000\000\000\000\005\213\005\165\000\000\000\000\005\213\000\000\005\213\000\000\005\189\005\189\000\000\000\000\005\189\005\189\000\000\000\000\005\165\000\000\005\213\000\000\000\000\005\165\000\000\000\000\005\213\000\000\000\000\000\000\000\000\000\000\005\189\000\000\000\000\000\000\000\000\005\241\000\000\005\165\000\000\005\213\000\250\024\242\tA\002\206\005\213\tA\000\000\000\000\000\000\000\000\000\000\005\165\005\165\005\134\000\000\005\165\005\165\005\241\000\000\005\138\005\213\tA\tA\000\000\tA\tA\000\000\000\000\000\000\000\000\000\000\005\150\000\000\005\165\005\213\005\213\000\000\023b\005\213\005\213\004\169\000\000\000\000\004\169\027:\tA\000\000\000\000\000\000\0316\000\000\000\000\023\198\000\000\000\000\000\000\005\213\023\222\000\000\004\169\004\169\000\000\004\169\004\169\000\000\000\000\tA\027\186\000\000\000\000\000\000\000\000\000\000\023\230\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\169\000\000\000\000\000\000\023\250\0246\000\000\000\000\005\241\005\241\000\000\000\000\000\000\tA\000\000\tA\000\000\000\000\000\000\000\000\000\000\000\242\000\000\000\000\t]\000\000\028v\t]\tA\000\000\000\000\007\142\tA\000\000\000\000\000\000\tA\000\000\tA\000\000\000\000\000\000\tA\t]\t]\000\000\t]\t]\000\000\000\000\000\000\004\169\000\000\004\169\000\000\000\000\000\000\000\000\000\000\004\185\000\000\000\000\004\185\000\000\000\000\000\000\004\169\t]\000\000\007\142\004\169\000\000\000\000\000\000\004\169\000\000\004\169\000\000\004\185\004\185\004\169\004\185\004\185\000\000\000\000\000\000\000\000\000\000\000\242\000\000\000\000\000\000\005\229\000\000\000\000\000\000\000\000\000\250\000\000\000\000\002&\000\000\004\185\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024v\000\000\000\000\000\000\005\229\000\000\005\138\000\000\t]\000\000\t]\000\000\000\000\000\242\000\000\000\000\000\000\000\000\024z\000\000\000\000\000\000\000\000\007\210\024\162\000\000\007\142\t]\000\000\000\000\000\000\t]\000\000\t]\000\000\000\000\000\000\t]\000\000\023\198\000\000\000\000\000\000\004\185\023\222\004\185\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\185\000\000\025B\007\142\004\185\000\000\004\217\000\000\004\185\004\217\004\185\000\000\000\000\000\000\004\185\000\000\023\250\025V\000\000\000\000\005\229\005\229\000\000\000\000\000\000\004\217\004\217\000\000\004\217\004\217\000\000\000\000\004\201\000\000\000\000\004\201\000\000\000\000\025f\000\000\015\221\015\221\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\217\000\000\004\201\004\201\000\000\004\201\004\201\000\000\000\000\000\000\015\221\015\221\015\221\n\014\000\000\000\000\000\000\000\000\000\000\000\000\015\221\000\242\000\000\000\000\000\000\000\000\004\201\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\221\015\221\000\000\000\000\000\000\015\221\000\000\015\221\015\221\015\221\000\000\000\242\000\000\000\000\015\221\004\217\000\000\004\217\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\206\001\210\000\000\000\000\004\217\015\221\000\000\007\142\004\217\000\000\000\000\000\000\004\217\000\000\004\217\004\201\000\000\004\201\004\217\001\214\001\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\206\001\210\004\201\000\000\000\000\007\142\004\201\000\000\000\000\000\000\004\201\000\000\004\201\000\000\000\000\000\000\004\201\001\250\002\174\001\214\001\254\000\000\002\178\000\000\002\190\003\022\003\"\000\000\000\000\000\000\000\000\003.\000\000\021\142\000\000\000\000\001\206\001\210\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\250\003\198\000\000\0032\000\000\002\178\000\000\002\190\003\022\003\"\001\214\001\254\000\000\000\000\003.\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0032\000\000\000\000\000\000\000\000\001\250\003\230\000\000\000\000\000\000\002\178\000\000\002\190\003\022\003\"\000\000\000\000\000\000\000\000\003.\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0032")) and lhs = - (8, "\014\r\012\011\n\t\b\007\006\005\004\003\002\001\000\231\231\230\230\229\228\228\227\227\227\227\227\227\227\227\227\227\226\226\225\224\223\223\223\223\223\223\223\223\222\222\222\222\222\222\222\222\221\221\221\220\220\219\218\218\218\217\217\216\216\216\216\216\216\215\215\215\215\215\215\215\215\214\214\214\214\214\214\214\214\213\213\213\213\212\211\210\210\210\210\209\209\209\209\208\208\208\207\207\207\207\206\205\205\205\204\204\203\203\202\202\202\201\201\201\201\201\201\201\201\201\200\200\199\199\198\198\197\196\195\194\193\193\192\192\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\190\190\189\188\188\188\188\187\187\187\187\186\186\185\185\185\185\185\185\184\183\182\182\181\181\180\180\179\178\178\177\176\176\175\174\173\173\173\172\172\171\170\170\170\170\170\170\169\169\169\169\169\169\169\169\168\168\167\167\167\167\167\167\166\166\165\165\165\164\164\163\163\163\163\162\162\161\161\160\160\159\159\158\158\157\157\156\156\155\155\154\154\153\153\152\152\152\151\151\151\151\150\150\149\149\148\148\147\147\147\147\147\146\146\146\146\145\145\145\144\144\144\144\144\144\144\143\143\143\143\143\143\143\142\142\141\141\140\140\140\140\140\140\139\139\138\138\137\137\136\136\135\135\135\134\133\133\133\133\132\132\132\131\131\131\131\131\131\131\131\131\131\130\130\129\129\128\128\128\128\128\128\128\128\128\128\128\128\128\127~}||{{{{{zyyxxwwwwwwwwwwwwwwvvuuttsssssssssssssssssssssssssssssssrrqqppoonnmmlllkkjjiihhggffffffffffffffffffedcba`_^]\\[ZZZZZZZZZZZYYYXXXWWWWWVVVVVVVVVUUTTTTTSSRRQPOONNNNNMMLLKKKJJJJJJIIIHHGGFFEEDDCCBBBAA@@??>>==<<;;::::::998877777766655544433210000000000000000000/////.......-------------------------------------------------------------------,,++++++++++++++++++++++***************************************************))((''&&&&&&&&&&&&&&&&%%$$#######\"\"\"\"!! \031\031\030\029\028\028\028\027\027\026\026\026\026\026\026\026\026\026\026\025\025\024\024\024\024\023\023\022\021\021\021\021\021\020\019\019\018\018\018\017\017\017\016\016\016\016\016\016\015\015") + (8, "\014\r\012\011\n\t\b\007\006\005\004\003\002\001\000\235\235\234\234\233\232\232\231\231\231\231\231\231\231\231\231\231\230\230\229\228\227\227\227\227\227\227\227\227\226\226\226\226\226\226\226\226\225\225\225\224\224\223\222\222\222\221\221\220\220\220\220\220\220\219\219\219\219\219\219\219\219\218\218\218\218\218\218\218\218\217\217\217\217\216\215\214\214\214\214\213\213\213\213\212\212\212\211\211\211\211\210\209\209\209\208\208\207\207\206\206\206\205\205\205\205\205\205\205\205\205\204\204\203\203\202\202\201\200\199\198\197\197\196\196\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\195\194\194\193\192\192\192\192\191\191\191\191\191\191\190\190\189\189\189\189\189\189\188\187\186\186\185\185\184\184\183\182\182\181\180\180\179\178\177\177\177\176\176\175\174\174\174\174\174\174\173\173\173\173\173\173\173\173\172\172\172\172\172\172\172\172\172\172\172\172\172\172\172\172\172\172\172\172\172\171\171\171\171\171\171\171\171\171\171\171\171\171\171\171\171\171\171\171\171\171\170\169\168\168\167\167\167\167\167\167\166\166\165\165\165\164\164\163\163\163\163\162\162\161\161\160\160\159\159\158\158\157\157\156\156\155\155\154\154\153\153\152\152\152\151\151\151\151\150\150\149\149\148\148\147\147\147\147\147\146\146\146\146\145\145\145\144\144\144\144\144\144\144\143\143\143\143\143\143\143\142\142\141\141\140\140\140\140\140\140\139\139\138\138\137\137\136\136\135\135\135\134\133\133\133\133\132\132\132\131\131\131\131\131\131\131\131\131\131\130\130\129\129\128\128\128\128\128\128\128\128\128\128\128\128\128\127~}||{{{{{zyyxxwwwwwwwwwwwwwwvvuuttsssssssssssssssssssssssssssssssrrqqppoonnmmlllkkjjiihhggffffffffffffffffffedcba`_^]\\[ZZZZZZZZZZZYYYYYXXXXXXXXXWWVVVVVUUTTSRQQPPPPPOONNMMMLLLLLLKKKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJIIIIIIHHHHHHGGFFEEDDCCBBAAA@@??>>==<<;;::::998877777766655544433210000000000000000000/////.......-------------------------------------------------------------------,,++++++++++++++++++++++****************************************************))((''&&&&&&&&&&&&&&&&%%$$#######\"\"\"\"!! \031\031\030\029\028\028\028\027\027\026\026\026\026\026\026\026\026\026\026\025\025\024\024\024\024\023\023\022\021\021\021\021\021\020\019\019\018\018\018\017\017\017\016\016\016\016\016\016\015\015") and goto = - ((16, "\001\164\001{\000G\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\019\000\000\000\000\000\239\000\006\000)\000\199\000\219\000j\000\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\000\000\000\000\000~\000\000\000\000\000\000\000\144\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 R\000\000\000\000\000\000\000\226\000\000\000\000\000\000\000\000\000\000\000\000\000\0009p\0018\000\000\001\026\000\145\007\016\000\000\000\000\000\000\000{.\150\001*\000\200\005\150\000\000\000\000\000\000\007\"\000\000\000\000\000\222\000\000\000\000\000\000\000\000\002\174\000\000\001\142\000\000\000\000\000\000\000\000\000\000\0006\000\000\001p\002\218\b\184\000\000\000\000\n69p\000\000\000\000\019F\000\000\016\238\000\0009\186\000\214\003\006\000\000\000\000\002t\001\208\007p\b\002\001\230\002\218\003\132\000%\002\216\0008\002\200\002*\r\174\000\000\007\200\003\002\002@\003:L\180\000\000\000\000\000\000\000\000\000\000\000\000\000\000:F\000\000\003\140\002\158\004.\000\000\000\000\000\000\000\000\015\234\000\000\000\000\003\168\003 \004H\0064\007\160\000\000\000\000\000\000\003\168\0042\004\228\004\130\000\000\000\000\004\176\004\236:V\004F\005\014\001\003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\136\000\000\000\000\000\000\027\018\014\002\004\146\005\224\0146\004\210\007\200 \246\000\000:\190\001\184;\020;b\000\000\001F\000\000\000\000\000\000\000\000\005\188L\150\005\200\000\000\011\004\005\204\000\000\0110\r\170\000\203\000\000\000\208\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\190\005J\000\000\000\000\000\000\027\180\000\000\nb\000\000\000\000\005DM`U\248\000\000ZR\000\000\000\000\000\000\000\000\000\000\000\000\002\182\028j\002\182\000y\000\000\000\000\000\000\005D\000\000\000\000\000\000\000\000\005\174\000\000\000\000\002\182\000\000\000\000\000\000\000\000\000\000\015\026\000\000\006\n\0066\000\000Mx\006x,\128\000\000\000\000\000\000\000\000\005D\000\000\000\000\000\000\011\234\000\000\000\000\000\000\000\000\000\000\000\000\001\004\0066\000\000\000\000\000\000\005D\006\158M\172\005\232\006\168\rD\000\000\004\150\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\220\000\000\000\000\000\000\000\000\007\005D\000\000\000\000\000\000\000\000\000\000[\192\000\000\000\000\000\000\001*\018$\000\000\000\000\000\000\000\000>@\n\026\t\218#\192\000\000[\208\000\000\000\000\000\000\000\000\000\000\n\n\018\216\000\000\000\000\n >J\nd\t\220#\206\000\000\n >\148\nz\t\240$\128\000\000\n \000\000\\\000\000\000>\158\n\128\t\246$\142\000\000\n \019$\005\182\019\170\000\000\000\000?\202\n\130\t\248%\"\000\000\n ?\212\n\148\t\254%V\000\000\n @\030\n\156\n\004%`\000\000\n @(\n\166\n\006%\148\000\000\n @\202\n\182\n\016&\030\000\000\n A\138\n\186\n\028&(\000\000\n A\178\n\192\n\"&\\\000\000\n A\240\n\194\n$&\230\000\000\n BT\n\196\n&'$\000\000\n B\176\n\200\nL'.\000\000\n B\196\n\210\nV'\230\000\000\n Cj\n\222\nX(\134\000\000\n C\184\n\224\n\162(\166\000\000\n C\240\n\232\n\166(\186\000\000\n D>\n\238\n\178(\242\000\000\n D`\011\000\n\180)\140\000\000\n D\228\011\030\n\210*D\000\000\n ET\0110\n\220*^\000\000\n E\204\011N\n\226*\144\000\000\n E\244\011V\011\b+\006\000\000\n \011\014+H\019\190\020\014\000\000D\248\011\250\000\000R|\005D\020\176\000\000\000\000\011\134\000\000R\224\005D\021\020\000\000\000\000\021p\000\000\000\000\001T\000\000\000\000\021\188\000\000\000\000\000\000\000\000S8\005D\022v\000\000\011:\022\170\000\000S\136\000\000\006(T\004\000\000\006(T:\000\000\006(\004h\000\000\000\000\000\000\000\000\000\000T\164\006(\000\000\003\n\003\130\000\000\000\000\000\000\n \022\210\000\000\000\000\000\000\023\030\000\000\000\000\000\000\000\000\000\000+d\000\000\000\000\000\000\n ,\024\000\000,\204\000\000\000\000\000\000,\238\000\000\000\000\000\000\000\000\\\026\000\000\000\000-\022\000\000\000\000\000\000F\154\011t\011 -\"\000\000\n -\154\000\000\000\000\000\000F\238\011\132\011&. \000\000\n .\188\000\000\000\000\000\000F\248\011\134\0112.\196\000\000\n \002,\024\012\000\000\000\000G\002\011\138\011@/*\000\000\n \0244\000\000\000\000G\194\011\146\011H/^\000\000\n \024\128\000\000\000\000H\000\011\148\011J/\202\000\000\n \000\000\000\000/\"\000\000\000\000H\172\011\156\011L0\130\000\000\n 0\164\000\000\000\000H\192\011\160\011N0\198\000\000\n 1P\000\000\000\000H\212\011\164\011P1\166\000\000\n \000\000Iz\011\190\011f2\030\000\000\n \000\000\023\216\000\000\000\000\n \000\000\000\000\000\0002f\000\000\000\0002\142\000\000\000\000\011\206\000\000\000\000\024\220\000\000\025\150\000\000\000\000\000\000\n \000\000\000\000\025\226\000\000\025\234\000\000\000\000\000\000\000\000\000\000I\206\011\216\011h2\178\000\000I\226\012\n\011l3t\000\000\n \n J\130\012\016\011p3\152\000\000\n \000\000\011:\026>\000\000\000\000\026\138\000\000J\142\000\000\000\000C\192\000\000\000\000\000\00044\000\000\000\000\000\000\000\0004>\000\000\000\000\000\000\000\000\rL\000\000\000\000\000\000T\176\000\000\000N\000\000\004 \012\228\000\000\003$\000\000\000\000\000\000\000\000\000\000\000\000\003\238\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012>\011v4l\000\000\n \000\000\rx\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011x\bJ\000\133\027t\000\000\012Z\011\154\r\002\000Y\b\176\000\133+P\000\000\003\028\t\138\000\133\000\000\027~\000\000\004\006\000\000\012\132\011\156\004\198\000\000\000\000\000\000\000\000\000\000\012\164\002b\001(\000\000\000\000\000\000J\208\000\000Y\242\000\000\011\170\000\000\011\230\000\000\000\000\000\000\000\000\005\\\000\000\000\000\000\0006\178\002\182\000\000\002\182(D\000\000\005`\000\000A&\002\182\002\182\000\000G8\002\182\002\182\012\002\000\000\028>\000\000\000\000\012\004\r\144\000\0004\172\003\218\000\000\000\000\000\000\000\000\000\000\000\000\012\168\012\b5@\000\000\n \000\000\000\000\000\000\000\000\000\000\012\188\012\n\t\148\000\133\000\000+R\000\000\003\028\000\000\014\014\000\000\000\000\000\000\000\000\000\0005\228\000\000\000\000\000\000\000\000\012\210\012\0165\254\000\000\000\000\000\0003*\000\000\003\028\000\0005\028\000\000\003\028\000\0007\b\003\028\000\000\n \000\000\000\0007\\\000\000\003\028\000\000=\246\000\000\003\028\000\000>f\003\028\000\000\000\133\000\000\012\022\t\204\002\b\000\000\012\224\012\252\012 \r$\r\216?\242\003\028\005\242\000\000\012*\r\176\r\178\006\136\006\224\r\188\0120\014\020\006\254\0078\r\226\000\000\000\000\007\026\b\226\000\000\007:\003fT\196\006(\028H\000\000\007\246\001D\r\150\0126\t\226\004\252\000\000\r\210\012@\006\242\000\0005\230\000\000T\250\005D\000\000\014x\014\142\000\000\tT\000\000\005D\014\b\012B\007\b\014N\000\223\000\000\000\000\000\000\000\000\012l\t\206\000\000\012\134\t\230\000\000\b|\023\244\0146\014X\012\136\007\232\n.\000\000\012\154\b\164\nx\000\000\014z\014~\012\188\014\208\r\216D\182\003\028\000\000\012\194\0156\000\000\t\b\000\000\n\130\000\000\015<\000\000O\222\003\230\015\b\012\196\015B\000\000P\232\004X\015\028\000\000\000\000\001\004\002\230\000\000\011\016\000\000T\134\003\028\011b\000\000\005R\000\000\000\000\014\210\012\216\\ \006\188\000\000\014\212\012\224\b\014\014N\014\220\014\228\012\230\016R\000\000\014\248\0014\000\000\000\000\000\000\000\000\0012\012\240\014\206U\018\005D\000\000\002\222\r\002\015\140\000\000\000\000\000\000\000\000\000\000\000\000U$\b\000\000\000\r\n\015\232\000\000\000\000\000\000\000\000\000\000\000\0006D\012\130\000\000\r\026\003N\000\000\r \r2\0034\000\000\006\160J\212\000\000\001\012\000\000U\146\005D\005D\000\000\000\000\b \000\000\004\156\000\000\007l\b \b \000\000\r\000\000\000\000\014,\000\000\002\216\000\000\000\000\000\000\000\000\000\000\000\0007\128\000\000\000\0007\1888$\0162\000\000W\138\005D\030\254\000\000\000\000\0312\000\000\000\000\014\018\031<\014R\000\000\014.\014<\000\191\000\161\014@\b\248\014P\016\1408~\014\184\000\000\014Z\014\\\bv\000\000\000\133K\144\000\000\002\208\000\000\014`\004\230@L\002R\015^\002\142\000\000:\n\023\216\000\000\005\140\000\000\000\000\005\140\000\000\000\000\005\140\t\184\000\000\003\174\005\140\016\1468\202\014\200\000\000\005\140\000\000\000\000W\182\000\000\000\000\000\000\005\140\000\000\000\000\014\204\000\000\005\228\007\220\014\228\000\000\014fK\164\014\250\000\000\000\000\000\000\000\000\015\026\000\000\000\000\005x\000\000\005\140X\n\000\000\007F\005\140Z.\000\000\015\028\015\236\014j\017\012\015\182\000\000Z\152\015&\016\000\000\000\000\000\000\000\000T\006\240\000\000\000\000\000\000\000\000\000\000\000\000\n\n\015(\000\000\016\014\000\000\000\000\000\000\000\000\015*\003\130\000\000\000\000\000\000\n\n\000\000\000\000\000\000\000\000\015,\029\208\000\000\000\000\000\000\000\000\000\000\000\133\003\028\000\000\000\000\006(\000\000XL\005D\000\000\007\138\000\000\000\000\000\000\000\0009@\000\000\000\000\000\000\000\000\000\000\000\000\016\170\000\242\b|\015~\002\140\014\164\000\000\002V\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\144\005\182\014\166\000\000\b\006\017\014\016\190\015J\000\000\000\000\016\178\003\192\003\182\000\000\000\000\000\000\014\168\000\000\014\172\027F\000\000\000\000\002\182\030\142\000\000\000\000\000\000\000\000\000\000[R\000\000\000\000\b\212\004\210\000\000\000\000Xr\005D\005DX\138\005D\007\222\000\000\000\000\000\000\005D\000\000\000\000\tf\016\198\015`\000\000\000\000\016\188\000\188\004&\000\000\000\000\000\000\000\000\b\234\017\014\t\244\016\204\015h\000\000\000\000\016\194\003\176\004T\000\000\000\000\000\000\000\000\003\028\000\000\015r\000\000\000\000\000\000\031\252\000\000 \006\000\000\000\000\000\000\000\000\000\000\000\000YJ\000\000\000\000\000\000\001\004\000\028\000\000\000\000\000\000\000\000\000\000\003\012\000\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005<\000\000\000\000\000\000LR\000\000\005D\000\000\r`\000\000\000\000\000\000\002\012\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\003\000\000\000\133\000\000\r&\000\000\003\028\000\000\006\"\000\000\000\000\000\000L\154\006(\000\000\000\000\002\004\000\000\000\000\000\000\000\000\003\238\004r\015\252\000\023\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\019\130\000\000\015v\000\000\000\000\000\000\000\000\005F\007\"\000\r\003\"\000\000\000\000\015\142\021\172\000\000\000\000\000\000\015\156?f\000\000\000\000\000\000\000\000"), (16, "\007\028\002\025\002D\002E\001u\000\238\002\003\0007\000\242\000\243\000;\b\002\002E\001u\007\028\003\156\002\007\002\161\007\029\007,\002\011\007\031\001\029\005d\000\238\002\166\000\242\000\242\000\243\b\017\007 \007-\b\018\0007\001\022\007\031\0021\007\178\002\192\000\238\001\029\001 \000\242\000\243\007 \0007\006\165\000@\007\028\002\026\002D\002E\001u\000\151\000\238\006\217\000\160\000\242\000\243\006\167\007!\002\012\007\028\003\156\0070\002\161\007\029\007,\000\238\007\031\006\217\000\242\000\243\002\166\007!\001\022\000q\001u\007 \007-\007\029\001\029\001 \007\031\000\131\006\217\002\192\005$\006\219\004\165\000\244\004o\007 \007\002\007\230\000\136\005g\007\"\001\141\006\217\000?\002&\002\198\006\219\006\220\000\245\007\226\007#\007!\006\222\001!\007\"\0070\007\n\002H\000\245\002\200\000\242\006\219\006\220\007\005\007#\007!\b\003\006\222\002\200\000\242\000\245\006\245\000m\007\231\0071\006\219\0023\006\220\007Q\000\242\000\151\007\007\006\222\000\156\b\020\004\168\006\238\007\227\007\"\0072\000\242\006\220\0007\002\198\001;\000\245\006\222\007\195\007#\007&\006\229\0022\007\"\007%\007(\002H\000\245\002\200\000\242\007\b\007\153\002\207\007#\007&\002\208\000\157\000\238\007*\007(\000\242\001\b\002\201\0071\000\151\000\\\007\028\000\156\002D\002E\001u\002\222\007*\001\141\002\203\000:\007+\007$\0072\007Z\006\130\0024\001d\002\161\007\029\007,\003{\007\031\007&\007\176\007+\002\166\007%\007(\004p\002\224\007 \007-\007\150\005\177\002\207\0009\007&\002\208\002\192\000\238\007*\007(\000\242\001\b\002\201\001\178\001u\000=\007\028\007\196\002D\002E\001u\002\222\007*\001\141\002\203\001\025\007+\000`\007!\001\207\001u\001\029\0070\002\161\007\029\007\184\000d\007\031\001g\007O\007+\002\166\000\139\002$\001\244\002\224\007 \007-\005\156\001v\002Y\007\197\001x\001y\002\192\001\022\007\204\001\029\004\182\007R\003|\001\029\001 \007\156\007\157\007\"\007\246\002E\001u\003\169\002\198\001{\000\242\001\b\001\022\007#\007!\001t\001u\000y\001\029\001 \002H\000\238\002\200\000\242\000\242\001\b\006^\004\218\007^\007_\004Q\003\150\003\151\001\t\007\205\001v\001\135\0071\001x\001y\005\158\007`\007a\001\022\003\186\004\193\004\195\004\197\000\245\001\029\0011\007\"\0072\007b\004\218\006\132\002\198\000\176\001\012\001%\000\128\007#\007&\007\206\000\130\003\156\001\142\007(\002H\005\221\002\200\000\242\000\138\007\248\002\207\005\225\001\235\002\208\001~\001\136\007*\000\242\007\207\007\222\002\201\0071\0021\000\238\005\226\004\198\000\242\001\b\005\250\002\222\000\155\001\141\002\203\002\r\007+\001\202\0072\001<\001\022\000\154\003\156\006\172\004T\004Y\001\029\0011\007&\0073\000\181\007\186\001\142\007(\007\249\002\224\002\200\000\242\000\185\007\223\002\207\000\245\001\012\002\208\001~\001\029\007*\000\242\0007\007\028\002\201\002D\002E\001u\003\248\005(\007\202\000\242\001\b\002\222\001\139\001\141\002\203\007\028\007+\001*\002\161\007\029\007,\001\151\007\031\001\141\001|\000\238\002\166\000\191\000\242\000\243\b\017\007 \007-\b\018\001+\002\224\007\031\006\176\000\196\002\192\001\029\0011\001|\004\021\002\019\007 \007[\000\242\004t\007\028\000\245\002D\002E\001u\005d\000\238\006\217\000\242\000\242\000\243\001\139\007!\002\r\007\028\003\156\007p\002\161\007\029\007,\001\151\007\031\001\141\001|\003\156\002\166\007!\001\022\007\\\0022\007 \007-\007\029\001\029\0011\007\031\000\209\006\217\002\192\000\238\006\219\007]\000\242\000\243\007 \0013\000\245\002&\0014\007\"\005\152\0015\0016\000\242\002\198\004\201\006\220\000\245\000\180\007#\007!\006\222\005\242\007\"\0075\006\226\002H\000\186\002\200\000\242\006\219\004|\001u\007#\007!\003\156\007>\004\202\007X\0023\001\141\000\238\000\242\0071\000\242\001\b\006\220\003\158\005\245\005\216\007\167\006\222\000\242\b\019\006M\006\223\005\128\007\"\0072\007n\000\190\003\156\002\198\001\022\000\245\003{\005\247\007#\007&\001\029\001 \007\"\007%\007(\002H\007\203\002\200\000\242\004p\003\156\002\207\007#\007&\002\208\006\212\003\156\007*\007(\005\248\000\195\002\201\0071\003\148\001u\007\028\000\188\002D\002E\001u\002\222\007*\001\141\002\203\0024\007+\007/\0072\003\157\b\005\b\006\000\238\002\161\b\b\000\242\000\243\007\031\007&\003\156\007+\002\166\007%\007(\001p\002\224\007 \b\n\005\225\002\006\002\207\000\218\007&\002\208\002\192\007o\007*\007(\007G\004q\002\201\005\226\003\156\006\217\003\156\005\233\002D\002E\001u\002\222\007*\001\141\002\203\004\224\007+\004\169\007!\001t\001u\005\140\000\208\002\161\007\156\007\157\006T\006U\007\\\006M\007+\002\166\007^\007_\000\212\002\224\005%\004\249\006\219\001v\002z\007]\001x\001y\002\192\007`\007a\006e\002&\006^\004\218\006^\004\218\007\154\006\220\007\"\002\021\007b\004\218\006\222\002\198\000\245\001\029\006\233\007\028\007#\002D\002E\001u\b\025\004\168\002&\002H\000\220\002\200\000\242\007\168\005#\005\146\b\017\0023\002\161\b\018\000\242\007\155\007\031\b\r\001%\003\156\002\166\005\249\001\022\002\006\005\230\007 \b\026\000\242\001\029\0011\001\237\002*\000m\002\192\0023\0072\000\227\000\242\007\155\002\198\0021\000\151\002&\007\158\002\000\007&\000\235\005\245\004\198\001}\007(\002H\001\022\002\200\000\242\007!\002\024\002\207\001\029\001 \002\208\001~\001\029\007*\000\242\005\247\006\137\002\201\006T\006U\007\210\0025\000\245\0007\0023\0024\002\222\000\242\001\141\002\203\002\006\007+\000\228\002\204\000\252\001\239\000\233\005\248\002\031\006]\001\229\005N\007\"\006^\004\218\002\007\006\215\002\198\0024\002\011\002\224\001\029\007#\000\236\005d\002\207\001*\000\242\002\208\002H\004\182\002\200\000\242\005\160\007\028\002\201\002D\002E\001u\004\178\004\218\006\248\b\030\001+\002\222\001\139\001\141\002\203\007\132\001\029\0011\002\161\007\029\007;\001\140\007\031\001\141\001|\0024\002\166\002\012\0072\003\156\001i\007 \007-\002\r\006\228\002\224\007\t\000\245\007&\002\192\001\016\000\245\001\019\007(\001$\002\014\004\196\004\195\004\197\0022\002\207\000\246\005d\002\208\005\158\000\242\007*\002&\000\245\006\141\002\201\007!\001E\007\005\007\211\007\238\001\141\001t\001u\002\222\0013\001\141\002\203\0014\007+\000\238\0015\0016\000\242\000\243\004\206\007\007\002D\002E\001u\001@\002'\001v\001\135\0023\001x\001y\000\242\002\224\001D\000\253\001Q\007\239\007\"\005R\001u\0051\004\209\002\198\001f\004m\006\217\002\007\007#\007\b\004<\002\011\004u\001\029\002&\002H\001W\002\200\000\242\000\245\007\028\006\224\002D\002E\001u\007d\000\151\001\141\000\161\002\000\003\156\001\143\0071\001\144\002d\b\017\004\130\002\161\b\018\006\219\001\197\007\031\001l\002Q\002\232\002\166\0023\0072\003\156\000\242\007 \b\021\002\012\0024\0007\006\220\0056\007&\002\192\001\195\006\222\001\237\007(\000\245\006\251\000\151\001\142\007f\002\000\002\207\001\022\001U\002\208\001\132\004\182\007*\001\029\001 \001~\002\201\007!\000\242\002G\007\028\000\245\002D\002E\001u\002\222\002\142\001\141\002\203\003\156\007+\004y\001m\002\200\000\242\001\b\001\150\002\161\007\029\005\165\001\156\007\031\002D\002E\001u\002\166\004\168\0024\004\182\002\224\007 \0077\005;\001\239\007\"\001\155\007\172\0057\002\192\002\198\006F\004\195\004\197\002\007\007#\004\239\005@\002\011\004p\001\029\005\225\002H\001\201\002\200\000\242\000\151\000\245\000\183\002\000\001\139\007!\007k\001\133\005\226\b\024\0007\001\213\005\227\001\151\000\238\001\141\001|\000\242\000\243\001\218\002\201\001\224\006Z\004\195\004\197\000\245\005<\004\226\0072\002\202\004\168\001\141\002\203\002\012\001\022\002\006\004\219\004\182\007&\002\r\001\029\001 \007\"\007(\004\168\006\217\000\151\002\198\001\243\002\000\002\207\002\014\007#\002\208\003\156\006)\007*\005a\004\218\002H\002\201\002\200\000\242\007H\004\149\001%\006\252\002G\001&\002\222\003\156\001\141\002\203\001\223\007+\000\245\007:\001\226\006\219\002H\004\182\002\200\000\242\006*\006k\006+\006b\004\195\004\197\000\245\007\005\0072\001(\002\224\006\220\001%\005s\005\225\001&\006\222\005C\007&\001\029\007\014\001t\001u\007(\001\234\007\007\007\133\005\226\001\022\002&\002\207\005\232\006,\002\208\001\029\0011\007*\007\164\003\156\001(\002\201\001v\002z\005\198\001x\001y\007\140\004\195\004\197\002\222\003\156\001\141\002\203\007\b\007+\001.\0007\006M\004\151\005\234\002\201\0023\000\245\001%\000\242\002\029\001&\001\249\006-\002\202\001*\001\141\002\203\002\224\000\151\002?\0067\002\000\006.\006/\002&\0060\001\022\006\207\003\156\001.\000\242\001+\001\029\001 \001(\002B\000\245\001\029\0011\000\151\006\224\006A\002\000\001%\001*\007\145\001&\002P\006l\005\169\004\218\005w\006M\004\159\005\251\005I\0023\001\029\001@\000\242\001\251\001+\006J\004\218\001}\002\n\006\003\001\029\0011\0024\001(\002_\0062\002\028\005\228\001\022\001~\0064\006>\000\242\001.\001\029\0011\001=\004\142\003\156\001\022\000\245\006M\005\225\006h\0013\001\029\0011\0014\001*\006P\0015\0016\006m\005A\005\134\005\226\000\245\007V\004\218\006\002\001\029\006i\006T\006U\007\015\001+\001=\001%\000\245\001.\001&\001\029\0011\0024\0013\002b\0017\0014\005\228\001A\0015\0016\006V\006f\001*\007\147\002&\006^\004\218\004\138\005\228\002&\000\245\001\139\001(\002h\002>\002A\002\133\003\156\001%\001+\001\140\001&\001\141\001|\0017\001\029\0011\001A\005\\\003\156\006M\006T\006U\004\164\007\017\001=\0023\002&\004\243\000\242\001%\0023\002\138\0013\000\242\001(\0014\002\145\002&\0015\0016\006V\006f\002O\002\150\006\199\006^\004\218\001.\006\231\002^\000\245\000\242\006M\002\158\003\156\005'\006T\006U\0023\002a\001=\000\242\001*\007\161\0017\002g\005M\001A\0013\0023\000\245\0014\000\242\000\245\0015\0016\006V\006f\005i\001+\001.\006^\004\218\002\164\002s\001\029\0011\002\196\002\212\0024\005l\003\156\002p\002v\0024\001*\003\156\002\129\002\218\000\245\0017\002\227\002\238\001A\000\245\002\244\002\132\002\137\002\250\003\000\001%\000\245\001+\001&\003\006\002\144\001H\001*\001\029\0011\003\012\000\245\0024\003\018\003\024\003\030\005t\006T\006U\002\149\002\157\001=\001%\0024\001+\001&\001I\001(\001H\0013\001\029\0011\0014\001a\003$\0015\0016\006V\006f\003*\0030\000\245\006^\004\218\002\163\000\245\000\245\002\178\001I\001(\006T\006U\002\195\005x\001=\001_\000\245\003\156\005\135\000\245\000\245\0017\0013\000\245\001A\0014\000\245\000\245\0015\0016\007\143\007\144\000\245\001.\003\159\006^\004\218\0036\000\245\003<\002\221\000\245\000\245\000\245\0013\003B\003H\0014\001*\002\211\0015\0016\001N\001%\0017\001.\001&\001A\003\156\001H\002\217\003N\000\245\002\226\002\237\001+\003T\000\245\000\245\003Z\001*\001\029\0011\002\243\001N\001%\001F\002\249\001&\001I\001(\001H\002\255\002D\002E\001u\001J\001+\003`\005\153\003\005\003d\003\011\001\029\0011\003\017\003\023\003\029\002\161\003#\003\197\001I\001(\003\207\003)\000\245\002\166\000\245\001]\003\217\003/\0035\004[\000\245\000\245\003;\003\227\001=\003A\002\192\003\236\003\245\004\000\004\t\004\018\0013\001.\003G\0014\000\245\005\157\0015\0016\001X\000\245\004\025\004A\000\245\004F\001=\004M\001*\003M\004\135\004\150\001N\001%\0013\001.\001&\0014\003S\001Y\0015\0016\001X\000\245\0017\001+\000\245\001A\004\156\004\172\001*\001\029\0011\003Y\001N\000\245\004\189\003_\000\245\001[\001(\003j\003q\000m\000\245\005\219\0017\001+\003\149\001A\002\198\000\245\003\196\001\029\0011\000\245\000\245\000\245\000\245\000\245\003\206\003\216\002H\003\226\002\200\000\242\004\191\003\235\003\244\003\156\000\245\000\245\003\255\000\245\004\b\000\245\004\017\001=\000\245\000\245\004\215\004\220\003\156\004\232\004\242\0013\001.\005\006\0014\004\024\005&\0015\0016\001X\002\204\005,\000\245\000\245\004-\001=\0053\001*\004@\0059\000\245\001N\005L\0013\001t\001u\0014\005Q\005`\0015\0016\001X\002\207\0017\001+\002\208\001A\002D\002E\001u\001\029\0011\002\201\004E\001v\001w\004L\001x\001y\005h\000\245\002\222\002\161\001\141\002\203\0017\001\237\005\209\001A\004i\002\166\004r\005k\005r\000\245\000\245\007\218\000\245\000\245\004\134\005\241\000\245\005v\002\192\000\245\002\224\002D\002E\001u\000\245\007\234\004\140\001%\004\155\000\245\001&\001=\000\245\001Y\005|\000\245\002\161\005\130\005\142\0013\000\245\000\245\0014\004\157\002\166\0015\0016\006\017\005\163\004\171\007K\004\214\005\168\001[\001(\005\173\001\239\002\192\007\220\007\235\005\183\004\222\000\245\002D\002E\001u\002\007\004\231\001}\005\189\002\011\0017\001\029\005\200\001A\000\245\000\245\004\241\002\161\004\252\001~\005\211\002\198\000\242\005\229\000\245\002\166\003\156\005\005\002D\002E\001u\005\001\005\215\002H\0052\002\200\000\242\005\236\002\192\001.\003\156\000\245\005\253\002\161\000\245\000\245\003\156\006\007\005+\005-\002\012\002\166\003\156\006 \001*\000\245\002\r\004\254\001N\000\245\002\198\003\156\000\245\003\156\002\192\002\204\0050\000\245\002\014\005?\0055\001+\002H\0066\002\200\000\242\000\245\001\029\0011\003\156\000\245\006@\003\156\001\139\002D\002E\001u\002\207\000\245\006L\002\208\000\245\001\140\006`\001\141\001|\006p\002\201\005\246\002\161\000\245\003\156\002\198\005>\002\204\000\245\002\222\002\166\001\141\002\203\000\245\006v\006\030\004\225\002H\000\245\002\200\000\242\006&\005:\002\192\000\245\005=\001=\0063\005K\002\207\006z\002\198\002\208\002\224\0013\006\150\006;\0014\006R\002\201\0015\0016\001X\002H\000\245\002\200\000\242\006\190\002\222\002\204\001\141\002\203\000\245\001%\006\131\003\156\001&\006\166\005P\001H\000\245\006\250\005[\003\156\000\245\003\156\0017\000\245\006\195\001A\006\234\002\207\002\224\005Z\002\208\002\204\006\192\003\156\006\200\001M\001(\002\201\000\245\006\230\006\206\005_\006\214\002\198\003\156\006\255\002\222\007\020\001\141\002\203\002D\002E\001u\002\207\000\245\002H\002\208\002\200\000\242\000\245\003\156\003\156\005j\002\201\005u\002\161\003\156\003\156\003\156\003\156\002\224\000\245\002\222\002\166\001\141\002\203\007Y\007e\007s\004\148\007u\005q\001.\006\203\003\156\000\245\002\192\002\204\002D\002E\001u\006\237\000\245\006\249\000\245\003\156\002\224\001*\005\129\003\156\005{\001N\000\245\002\161\003\156\006\253\003\156\000\245\000\245\002\207\000\245\002\166\002\208\000\245\001+\000\245\007\001\004\127\003\156\002\201\001\029\0011\005}\005\149\002\192\003\156\005\137\005\148\002\222\005\143\001\141\002\203\007\006\007\018\002D\002E\001u\005\147\007\025\007'\007.\0078\005\162\005\167\000\245\000\245\000\245\006\006\000\245\002\161\002\198\005\172\002\224\001\237\005\175\005\179\007j\002\166\005\187\005\194\005\205\006\005\002H\004P\002\200\000\242\001=\007\149\005\254\005\255\002\192\007\163\001t\001u\0013\006\004\007\175\0014\b\011\006\b\0015\0016\001X\006\t\002D\002E\001u\006(\002\198\006!\b\022\006\"\001v\002z\002\204\001x\001y\b\027\006'\002\161\002H\006=\002\200\000\242\0069\006:\0017\002\166\001\239\001A\006<\007?\006g\004=\006K\006O\002\207\006Q\002\007\002\208\002\192\006S\002\011\006_\001\029\006o\002\201\006q\006r\006w\006{\006\127\002\204\006\145\002\198\002\222\006\152\001\141\002\203\006\156\006\180\006\201\006\225\001%\006\235\007\027\002H\007\021\002\200\000\242\007\022\002D\002E\001u\002\207\007\026\007)\002\208\007T\002\224\007h\007i\007m\002\012\002\201\007\148\002\161\007\152\007\162\002\r\007\166\001}\007\253\002\222\002\166\001\141\002\203\000\000\002\204\000\000\0045\002\014\000\000\001~\002\198\000\000\000\242\002\192\000\000\002D\002E\001u\000\000\000\000\000\000\000\000\002H\002\224\002\200\000\242\002\207\000\000\000\000\002\208\002\161\000\000\000\000\000\000\000\000\000\000\002\201\000\000\002\166\000\000\000\000\000\000\000\000\000\000\002|\002\222\000\000\001\141\002\203\000\000\000\000\002\192\000\000\000\000\002\204\000\000\000\000\001*\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002}\000\000\000\000\000\000\002\224\000\000\000\000\000\000\001\139\001+\000\000\002\207\002\198\000\000\002\208\001\029\0011\001\140\007|\001\141\001|\002\201\000\000\000\000\002H\000\000\002\200\000\242\000\000\000\000\002\222\000\000\001\141\002\203\002D\002E\001u\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\161\002\198\002D\002E\001u\002\224\000\000\002\204\002\166\000\000\001\237\000\000\000\000\002H\004*\002\200\000\242\002\161\000\000\000\000\0013\002\192\000\000\0014\000\000\002\166\0015\0016\000\000\002\207\000\000\002\189\002\208\000\000\000\000\000\000\000\000\000\000\002\192\002\201\000\000\000\000\000\000\000\000\000\000\002\204\000\000\000\000\002\222\000\000\001\141\002\203\007x\001\237\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\239\000\000\003~\002\"\000\000\002\208\0044\002\224\000\000\000\000\002\007\000\000\002\201\000\000\002\011\000\000\001\029\000\000\000\000\000\000\002\198\002\222\000\000\001\141\002\203\000\000\000\000\002D\002E\001u\000\000\000\000\002H\000\000\002\200\000\242\000\000\002\198\000\000\000\000\000\000\000\000\002\161\001\239\000\000\002\224\002\030\000\000\000\000\002H\002\166\002\200\000\242\002\007\000\000\002\012\002\206\002\011\000\000\001\029\000\000\002\r\000\000\002\192\002\204\002D\002E\001u\000\000\000\000\000\000\000\000\000\000\002\014\000\000\000\000\000\000\000\000\000\000\000\000\002\161\002\204\000\000\000\000\000\000\000\000\002\207\000\000\002\166\002\208\001%\000\000\000\000\007~\002\234\000\000\002\201\000\000\002\012\000\000\000\000\002\192\000\000\002\207\002\r\002\222\002\208\001\141\002\203\000\000\007\028\000\000\000\000\002\201\000\000\000\000\002\014\001(\000\000\000\000\000\000\000\000\002\222\000\000\001\141\002\203\000\000\002\198\b\b\002\224\000\000\007\031\002D\002E\001u\000\000\000\000\000\000\000\000\002H\007 \002\200\000\242\001t\001u\000\000\002\224\002\161\000\000\000\000\000\000\000\000\003v\000\000\000\000\002\166\000\000\000\000\000\000\000\000\003y\002\233\000\000\001v\002z\002\198\001x\001y\002\192\000\000\007!\002\204\000\000\000\000\000\000\000\000\000\000\002H\001*\002\200\000\242\000\000\002D\002E\001u\000\000\000\000\000\000\000\000\000\000\000\000\002{\000\000\002\207\000\000\001+\002\208\002\161\000\000\000\000\000\000\001\029\0011\002\201\000\000\002\166\000\000\007\"\000\000\002\204\000\000\003g\002\222\000\000\001\141\002\203\000\000\007#\002\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\207\002\198\000\000\002\208\000\000\002\224\000\000\b\t\000\000\000\000\002\201\001}\000\000\002H\000\000\002\200\000\242\000\000\000\000\002\222\000\000\001\141\002\203\001~\0013\007%\000\242\0014\000\000\000\000\0015\0016\002D\002E\001u\007&\000\000\000\000\000\000\000\000\007(\000\000\000\000\002\224\000\000\002\204\000\000\002\161\000\000\000\000\000\000\002\198\000\000\007*\000\000\002\166\0017\000\000\002|\000\000\000\000\003n\000\000\002H\000\000\002\200\000\242\002\207\002\192\000\000\002\208\007+\000\000\000\000\000\000\000\000\000\000\002\201\003z\003\128\000\000\000\000\002D\002E\001u\000\000\002\222\001\139\001\141\002\203\001\237\000\000\000\000\000\000\000\000\002\204\001\140\002\161\001\141\001|\000\000\000\000\000\000\000\000\000\000\002\166\000\000\000\000\000\000\000\000\002\224\003u\000\000\000\000\000\000\000\000\000\000\002\207\002\192\000\000\002\208\000\000\000\000\000\000\000\000\000\000\000\000\002\201\002D\002E\001u\000\000\002\198\000\000\000\000\000\000\002\222\000\000\001\141\002\203\000\000\000\000\000\000\002\161\002H\001\239\002\200\000\242\001\240\000\000\000\000\002\166\000\000\000\000\000\000\002\007\007\028\003x\000\000\002\011\002\224\001\029\000\000\000\000\002\192\000\000\002D\002E\001u\000\000\000\000\b\017\000\000\000\000\b\018\000\000\002\204\007\031\000\000\000\000\000\000\002\161\002\198\000\000\000\000\000\000\007 \000\000\000\000\002\166\000\000\000\000\000\000\000\000\002H\000\000\002\200\000\242\002\207\000\000\002\012\002\208\002\192\000\000\000\000\000\000\002\r\000\000\002\201\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007!\002\222\002\014\001\141\002\203\000\000\000\000\000\000\000\000\000\000\002\204\000\000\002\198\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002H\002\224\002\200\000\242\000\000\000\000\000\000\000\000\002\207\000\000\000\000\002\208\000\000\007\"\000\000\000\000\000\000\000\000\002\201\002D\002E\001u\000\000\007#\000\000\000\000\002\198\002\222\000\000\001\141\002\203\000\000\002\204\000\000\002\161\000\000\000\000\000\000\002H\000\000\002\200\000\242\002\166\b\023\000\000\002D\002E\001u\003\133\000\000\000\000\002\224\000\000\000\000\002\207\002\192\000\000\002\208\000\000\000\000\002\161\000\000\007%\000\000\002\201\002D\002E\001u\002\166\000\000\002\204\000\000\007&\002\222\003\136\001\141\002\203\007(\000\000\000\000\002\161\002\192\000\000\000\000\000\000\000\000\000\000\000\000\002\166\000\000\007*\000\000\003~\000\000\003\162\002\208\003\127\002\224\000\000\000\000\000\000\002\192\002\201\002D\002E\001u\000\000\000\000\007+\000\000\000\000\002\222\000\000\001\141\002\203\000\000\000\000\000\000\002\161\002\198\000\000\000\000\000\000\000\000\000\000\000\000\002\166\000\000\000\000\000\000\000\000\002H\003\166\002\200\000\242\002\224\000\000\000\000\000\000\002\192\000\000\000\000\000\000\000\000\000\000\002\198\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002H\000\000\002\200\000\242\000\000\000\000\002\204\000\000\002\198\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002H\000\000\002\200\000\242\000\000\000\000\000\000\000\000\002\207\000\000\000\000\002\208\002\204\000\000\001\237\000\000\000\000\000\000\002\201\002D\002E\001u\000\000\000\000\000\000\000\000\002\198\002\222\000\000\001\141\002\203\006)\002\204\000\000\002\207\000\000\000\000\002\208\002H\000\000\002\200\000\242\004\028\000\000\002\201\002D\002E\001u\000\000\000\000\000\000\002\224\000\000\002\222\002\207\001\141\002\203\002\208\000\000\006*\002\161\006+\000\000\000\000\002\201\002D\002E\001u\002\166\001\239\002\204\000\000\002\005\002\222\003\222\001\141\002\203\002\224\000\000\002\007\002\161\002\192\000\000\002\011\000\000\001\029\000\000\000\000\002\166\000\000\000\000\006,\002\207\000\000\003\231\002\208\000\000\002\224\000\000\000\000\000\000\002\192\002\201\002D\002E\001u\000\000\000\000\000\000\000\000\000\000\002\222\000\000\001\141\002\203\000\000\000\000\000\000\002\161\002G\000\000\000\000\000\000\000\000\002\012\000\000\002\166\006-\000\000\000\000\002\r\002H\003\240\002\200\000\242\002\224\000\000\006.\006/\002\192\0060\000\000\002\014\000\000\000\000\002\198\000\000\000\000\000\000\002D\002E\001u\000\000\000\000\000\000\000\000\000\000\002H\000\000\002\200\000\242\000\000\000\000\006j\002\161\002\198\000\000\004\030\000\000\000\000\000\000\000\000\002\166\000\000\000\000\000\000\000\000\002H\004.\002\200\000\242\000\000\000\000\000\000\000\000\002\192\000\000\0062\000\000\002\204\000\000\000\000\0064\006>\000\000\002\201\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\198\002\202\006h\001\141\002\203\000\000\002\204\000\000\002\207\000\000\000\000\002\208\002H\000\000\002\200\000\242\000\000\000\000\002\201\000\000\006i\000\000\000\000\000\000\000\000\000\000\000\000\002\222\002\207\001\141\002\203\002\208\000\000\000\000\000\000\000\000\000\000\000\000\002\201\002D\002E\001u\000\000\000\000\002\204\000\000\002\198\002\222\000\000\001\141\002\203\002\224\000\000\000\000\002\161\000\000\000\000\000\000\002H\000\000\002\200\000\242\002\166\000\000\000\000\000\000\002\207\000\000\0040\002\208\000\000\002\224\001\237\000\000\000\000\002\192\002\201\002D\002E\001u\000\000\002D\002E\001u\000\000\002\222\000\000\001\141\002\203\000\000\002\204\000\000\002\161\000\000\000\000\000\000\002\161\000\000\000\000\000\000\002\166\000\000\000\000\000\000\002\166\000\000\0047\000\000\000\000\002\224\004:\000\000\002\207\002\192\000\000\002\208\000\000\002\192\000\000\000\000\000\000\000\000\002\201\002D\002E\001u\000\000\001\239\000\000\000\000\002\016\002\222\000\000\001\141\002\203\000\000\000\000\002\007\002\161\002\198\000\000\002\011\000\000\001\029\000\000\000\000\002\166\000\000\000\000\000\000\000\000\002H\004S\002\200\000\242\002\224\000\000\000\000\000\000\002\192\000\000\002D\002E\001u\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\161\002\198\000\000\000\000\000\000\002\198\002\012\002\204\002\166\000\000\000\000\000\000\002\r\002H\004V\002\200\000\242\002H\000\000\002\200\000\242\002\192\000\000\000\000\002\014\000\000\000\000\000\000\000\000\002\207\000\000\000\000\002\208\000\000\000\000\000\000\000\000\000\000\000\000\002\201\000\000\000\000\000\000\000\000\000\000\002\204\000\000\002\198\002\222\002\204\001\141\002\203\000\000\002D\002E\001u\000\000\000\000\000\000\002H\000\000\002\200\000\242\000\000\000\000\000\000\000\000\002\207\000\000\000\000\002\208\002\207\002\224\000\000\002\208\000\000\005\003\002\201\000\000\000\000\000\000\002\201\000\000\000\000\000\000\002\198\002\222\001%\001\141\002\203\002\222\002\204\001\141\002\203\000\000\000\000\000\000\002H\000\000\002\200\000\242\000\000\002D\002E\001u\000\000\000\000\002D\002E\001u\002\224\000\000\000\000\002\207\002\224\000\000\002\208\002\161\000\000\000\000\000\000\000\000\002\161\002\201\000\000\002\166\000\000\000\000\000\000\002\204\002\166\004\153\002\222\000\000\001\141\002\203\004\167\000\000\002\192\000\000\000\000\000\000\001%\002\192\000\000\001&\000\000\000\000\000\000\000\000\000\000\002\207\000\000\002G\002\208\000\000\002\224\000\000\000\000\000\000\000\000\002\201\000\000\000\000\000\000\002H\000\000\002\200\000\242\001(\002\222\000\000\001\141\002\203\000\000\001*\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001+\000\000\002\224\000\000\000\000\000\000\001\029\0011\000\000\007w\002\198\002D\002E\001u\000\000\002\198\002D\002E\001u\000\000\000\000\000\000\002H\001.\002\200\000\242\002\161\002H\000\000\002\200\000\242\002\161\000\000\000\000\002\166\000\000\000\000\002\201\001*\002\166\004\217\001%\002D\002E\001u\005G\002\202\002\192\001\141\002\203\000\000\000\000\002\192\000\000\002\204\001+\000\000\002\161\000\000\002\204\0013\001\029\0011\0014\000\000\002\166\0015\0016\000\000\000\000\000\000\006~\000\000\000\000\000\000\000\000\002\207\000\000\002\192\002\208\000\000\002\207\000\000\000\000\002\208\000\000\002\201\000\000\000\000\000\000\000\000\002\201\007x\000\000\000\000\002\222\000\000\001\141\002\203\000\000\002\222\000\000\001\141\002\203\000\000\000\000\000\000\001G\000\000\000\000\000\000\002\198\000\000\000\000\000\000\0013\002\198\000\000\0014\002\224\000\000\0015\0016\002H\002\224\002\200\000\242\000\000\002H\001*\002\200\000\242\000\000\000\000\000\000\002D\002E\001u\000\000\000\000\000\000\000\000\002\198\000\000\000\000\000\000\001+\0017\000\000\000\000\002\161\000\000\001\029\0011\002H\002\204\002\200\000\242\002\166\000\000\002\204\002D\002E\001u\006\129\000\000\002D\002E\001u\000\000\000\000\002\192\000\000\000\000\000\000\000\000\002\161\002\207\000\000\000\000\002\208\002\161\002\207\000\000\002\166\002\208\002\204\002\201\000\000\002\166\006\144\000\000\002\201\000\000\000\000\006\147\002\222\002\192\001\141\002\203\000\000\002\222\002\192\001\141\002\203\000\000\0013\000\000\002\207\0014\007\028\002\208\0015\0016\000\000\000\000\000\000\000\000\002\201\000\000\002\224\000\000\000\000\000\000\000\000\002\224\000\000\002\222\007\029\001\141\002\203\007\031\000\000\000\000\000\000\002\198\000\000\000\000\0019\000\000\007 \000\000\000\000\000\000\000\000\000\000\000\000\002H\000\000\002\200\000\242\002\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\198\002D\002E\001u\000\000\002\198\002D\002E\001u\007!\000\000\000\000\002H\000\000\002\200\000\242\002\161\002H\002\204\002\200\000\242\002\161\000\000\000\000\002\166\000\000\000\000\000\000\000\000\002\166\006\160\000\000\000\000\000\000\000\000\006\163\000\000\002\192\000\000\000\000\002\207\000\000\002\192\002\208\002\204\000\000\007\"\000\000\000\000\002\204\002\201\000\000\000\000\000\000\001%\000\000\007#\000\000\000\000\002\222\000\000\001\141\002\203\000\000\000\000\000\000\002\207\000\000\000\000\002\208\000\000\002\207\000\000\000\000\002\208\000\000\002\201\000\000\000\000\000\000\0079\002\201\000\000\002\224\000\000\002\222\000\000\001\141\002\203\000\000\002\222\000\000\001\141\002\203\000\000\007%\000\000\000\000\000\000\000\000\000\000\002\198\002D\002E\001u\007&\002\198\000\000\000\000\002\224\007(\000\000\000\000\002H\002\224\002\200\000\242\002\161\002H\000\000\002\200\000\242\000\000\007*\000\000\002\166\000\000\000\000\002D\002E\001u\006\184\000\000\002D\002E\001u\000\000\000\000\002\192\000\000\000\000\007+\001*\002\161\000\000\002\204\000\000\000\000\002\161\000\000\002\204\002\166\000\000\000\000\000\000\000\000\002\166\006\187\000\000\001+\000\000\000\000\006\191\000\000\002\192\001\029\0011\002\207\007z\002\192\002\208\000\000\002\207\000\000\000\000\002\208\000\000\002\201\000\000\000\000\000\000\000\000\002\201\000\000\000\000\000\000\002\222\000\000\001\141\002\203\000\000\002\222\000\000\001\141\002\203\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\198\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\224\000\000\000\000\000\000\002H\002\224\002\200\000\242\000\000\0013\000\000\000\000\0014\000\000\000\000\0015\0016\000\000\002\198\002D\002E\001u\000\000\002\198\002D\002E\001u\000\000\000\000\000\000\002H\000\000\002\200\000\242\002\161\002H\002\204\002\200\000\242\002\161\000\000\007x\002\166\000\000\000\000\000\000\000\000\002\166\007\179\001%\000\000\000\000\006\018\007\181\000\000\002\192\000\000\000\000\002\207\000\000\002\192\002\208\002\204\000\000\000\000\000\000\000\000\002\204\002\201\000\000\001%\000\000\000\000\001&\000\000\000\000\001(\002\222\000\000\001\141\002\203\000\000\000\000\000\000\002\207\000\000\000\000\002\208\000\000\002\207\000\000\000\000\002\208\000\000\002\201\000\000\000\000\001(\000\000\002\201\000\000\002\224\000\000\002\222\000\000\001\141\002\203\005T\002\222\000\000\001\141\002\203\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\198\000\000\000\000\006\020\007\174\002\198\000\000\000\000\002\224\000\000\000\000\000\000\002H\002\224\002\200\000\242\000\000\002H\001*\002\200\000\242\000\000\000\000\000\000\001.\002D\002E\001u\000\000\000\000\001t\001u\000\000\000\000\000\000\001+\000\000\000\000\000\000\001*\002\161\001\029\006\023\000\000\002\204\000\000\000\000\004\229\002\166\002\204\001v\002z\000\000\001x\001y\000\000\001+\000\000\004\236\000\000\000\000\002\192\001\029\0011\000\000\000\000\002\207\000\000\000\000\002\208\000\000\002\207\000\000\000\000\002\208\000\000\002\201\000\000\002{\000\000\000\000\002\201\000\000\000\000\000\000\002\222\000\000\001\141\002\203\000\000\002\222\000\000\001\141\002\203\000\000\0013\000\000\000\000\006\024\000\000\000\000\0015\0016\000\000\000\000\000\000\000\000\000\000\001=\002\224\000\000\005\226\000\000\006\029\002\224\006\026\0013\000\000\000\000\0014\000\000\000\000\0015\0016\005]\002\198\000\000\0017\000\000\001}\002D\002E\001u\000\000\000\000\000\000\000\000\002H\000\000\002\200\000\242\001~\000\000\000\000\000\242\002\161\000\000\000\000\0017\000\000\000\000\001A\000\000\002\166\000\000\000\000\000\000\001t\001u\000\000\000\000\000\000\000\000\004\145\000\000\000\000\002\192\000\000\000\000\002\204\000\000\000\000\000\000\000\000\000\000\000\000\002|\001v\001\135\000\000\001x\001y\000\000\001t\001u\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\175\000\000\003z\003\128\000\000\000\000\002\134\002\201\000\000\001v\001\135\001\139\001x\001y\000\000\000\000\002\222\000\000\001\141\002\203\001\140\000\000\001\141\001|\000\000\000\000\000\000\001\143\000\000\001\144\002d\000\000\002\139\000\000\000\000\000\000\002\198\000\000\000\000\000\000\002\224\000\000\002D\002E\001u\000\000\000\000\000\000\002H\000\000\002\200\000\242\000\000\001\143\000\000\001\144\002d\002\161\000\000\000\000\000\000\000\000\001\142\001t\001u\002\166\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001~\004\"\000\000\000\242\002\192\000\000\002\204\000\000\000\000\001v\001\135\002\142\001x\001y\001\142\000\000\000\000\000\000\002D\002E\001u\000\000\000\000\000\000\000\000\000\000\001~\000\000\000\000\000\242\000\000\003\175\002\159\002\161\000\000\000\000\000\000\002\142\002\201\000\000\000\000\002\166\000\000\000\000\000\000\000\000\000\000\002\222\000\000\001\141\002\203\004!\000\000\001\143\002\192\001\144\002d\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\139\000\000\000\000\000\000\002\198\000\000\000\000\002\224\000\000\001\151\000\000\001\141\001|\000\000\000\000\000\000\002H\000\000\002\200\000\242\000\000\001t\001u\000\000\001\142\000\000\001\139\000\000\001\237\000\000\000\000\000\000\000\000\000\000\000\000\001\151\001~\001\141\001|\000\242\000\000\001v\001\135\000\000\001x\001y\000\000\002\142\002\204\000\000\000\000\001t\001u\000\000\002\198\000\000\000\000\000\000\001t\001u\000\000\000\000\000\000\000\000\002\165\000\000\002H\000\000\002\200\000\242\000\000\001v\001\135\003\175\001x\001y\000\000\000\000\001v\001\135\002\201\001x\001y\001\239\000\000\001\143\002\018\001\144\002d\002\222\000\000\001\141\002\203\002\007\002\197\000\000\000\000\002\011\002\204\001\029\001\139\002\213\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\151\000\000\001\141\001|\002\224\000\000\001\143\000\000\001\144\002d\000\000\001\142\000\000\001\143\003\175\001\144\002d\000\000\000\000\000\000\000\000\002\201\000\000\001~\000\000\000\000\000\242\000\000\000\000\002\012\002\222\000\000\001\141\002\203\002\142\002\r\000\000\000\000\001t\001u\000\000\001\142\000\000\000\000\000\000\001t\001u\002\014\001\142\000\000\000\000\000\000\000\000\001~\002\224\000\000\000\242\000\000\001v\001\135\001~\001x\001y\000\242\002\142\001v\001\135\000\000\001x\001y\000\000\002\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\219\000\000\000\000\000\000\000\000\000\000\001\139\002\228\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\151\000\000\001\141\001|\000\000\000\000\001\143\000\000\001\144\002d\000\000\000\000\000\000\001\143\000\000\001\144\002d\000\000\000\000\000\000\000\000\001\139\000\000\001t\001u\000\000\000\000\000\000\001\139\000\000\001\151\000\000\001\141\001|\000\000\000\000\000\000\001\151\000\000\001\141\001|\001\142\000\000\001v\001\135\000\000\001x\001y\001\142\001t\001u\000\000\000\000\001~\001t\001u\000\242\000\000\000\000\000\000\001~\000\000\000\000\000\242\002\142\000\000\002\239\000\000\000\000\001v\001\135\002\142\001x\001y\001v\001\135\000\000\001x\001y\000\000\001t\001u\000\000\000\000\000\000\000\000\000\000\001\143\000\000\001\144\002d\000\000\002\245\000\000\000\000\000\000\000\000\002\251\000\000\000\000\001v\001\135\000\000\001x\001y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\143\000\000\001\144\002d\001\139\001\143\000\000\001\144\002d\001\142\003\001\001\139\000\000\001\151\000\000\001\141\001|\000\000\000\000\000\000\001\151\001~\001\141\001|\000\242\000\000\000\000\000\000\000\000\000\000\000\000\001\143\002\142\001\144\002d\001\142\001t\001u\000\000\000\000\001\142\001t\001u\000\000\000\000\000\000\000\000\001~\000\000\000\000\000\242\000\000\001~\000\000\000\000\000\242\001v\001\135\002\142\001x\001y\001v\001\135\002\142\001x\001y\001\142\001t\001u\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001~\003\007\000\000\000\242\000\000\000\000\003\r\001\139\000\000\001v\001\135\002\142\001x\001y\000\000\000\000\001\151\000\000\001\141\001|\000\000\000\000\001\143\000\000\001\144\002d\000\000\001\143\000\000\001\144\002d\000\000\003\019\001\139\000\000\000\000\000\000\000\000\001\139\000\000\000\000\000\000\001\151\000\000\001\141\001|\000\000\001\151\000\000\001\141\001|\000\000\000\000\001\143\000\000\001\144\002d\001\142\001t\001u\000\000\000\000\001\142\000\000\001\139\000\000\001%\000\000\000\000\001~\000\000\000\000\000\242\001\151\001~\001\141\001|\000\242\001v\001\135\002\142\001x\001y\000\000\000\000\002\142\000\000\000\000\001\142\001t\001u\000\000\000\000\000\000\001t\001u\000\000\000\000\000\000\000\000\001~\003\025\000\000\000\242\000\000\000\000\000\000\000\000\000\000\001v\001\135\002\142\001x\001y\001v\001\135\000\000\001x\001y\000\000\000\000\000\000\001\143\000\000\001\144\002d\000\000\000\000\000\000\000\000\000\000\000\000\003\031\001\139\000\000\000\000\000\000\003%\001\139\000\000\000\000\000\000\001\151\000\000\001\141\001|\000\000\001\151\000\000\001\141\001|\000\000\000\000\001\143\001*\001\144\002d\001\142\001\143\000\000\001\144\002d\000\000\000\000\001\139\000\000\000\000\000\000\000\000\001~\000\000\001+\000\242\001\151\000\000\001\141\001|\001\029\0011\000\000\002\142\000\000\000\000\000\000\000\000\000\000\001t\001u\001\142\000\000\000\000\001\237\000\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\001~\000\000\000\000\000\242\000\000\001~\001v\001\135\000\242\001x\001y\002\142\000\000\000\000\000\000\000\000\002\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003+\000\000\0013\000\000\001\139\0014\000\000\000\000\0015\0016\000\000\001%\000\000\001\151\000\000\001\141\001|\001\239\000\000\000\000\002.\001\143\000\000\001\144\002d\000\000\000\000\002\007\000\000\000\000\000\000\002\011\000\000\001\029\002\128\001\139\000\000\001t\001u\000\000\001\139\004\198\000\000\000\000\001\151\000\000\001\141\001|\004\204\001\151\000\000\001\141\001|\001t\001u\000\000\001\142\001v\001\135\000\000\001x\001y\000\000\001t\001u\000\000\000\000\000\000\001~\000\000\000\000\000\242\002\012\001v\001\135\000\000\001x\001y\002\r\002\142\0031\000\000\000\000\001v\001\135\000\000\001x\001y\000\000\000\000\002\014\001t\001u\000\000\000\000\000\000\0037\000\000\000\000\001*\000\000\001\143\000\000\001\144\002d\000\000\003=\000\000\000\000\000\000\000\000\001v\001\135\000\000\001x\001y\001+\001\143\000\000\001\144\002d\000\000\001\029\0011\000\000\000\000\000\000\001\143\000\000\001\144\002d\000\000\001\139\000\000\003C\000\000\001\142\000\000\000\000\000\000\000\000\001\151\000\000\001\141\001|\000\000\000\000\000\000\001~\000\000\000\000\000\242\001\142\000\000\000\000\001\143\000\000\001\144\002d\002\142\001\237\000\000\001\142\000\000\001~\000\000\000\000\000\242\001t\001u\000\000\000\000\000\000\000\000\001~\002\142\0013\000\242\000\000\0014\000\000\000\000\0015\0016\000\000\002\142\004\210\000\000\001v\001\135\001\142\001x\001y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001~\000\000\000\000\000\242\000\000\000\000\004\213\000\000\000\000\003I\001\139\002\142\000\000\001\239\000\000\000\000\002T\000\000\000\000\001\151\000\000\001\141\001|\002\007\000\000\000\000\001\139\002\011\000\000\001\029\001\143\000\000\001\144\002d\000\000\001\151\001\139\001\141\001|\000\000\000\000\000\000\000\000\000\000\000\000\001\151\000\000\001\141\001|\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001t\001u\000\000\000\000\000\000\000\000\001\139\001\142\000\000\000\000\002\012\000\000\000\000\001t\001u\001\151\002\r\001\141\001|\001~\001v\001\135\000\242\001x\001y\000\000\000\000\000\000\002\014\000\000\002\142\000\000\000\000\001v\001\135\000\000\001x\001y\001t\001u\000\000\000\000\000\000\003O\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003U\000\000\001v\001\135\000\000\001x\001y\000\000\001\143\000\000\001\144\002d\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\143\000\000\001\144\002d\003[\000\000\001\139\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\151\000\000\001\141\001|\000\000\001t\001u\001\142\000\000\000\000\001\143\000\000\001\144\002d\000\000\000\000\000\000\000\000\000\000\001~\001\142\000\000\000\242\000\000\000\000\001v\001\135\000\000\001x\001y\002\142\000\000\001~\000\000\000\000\000\242\000\000\000\000\003e\001u\000\000\000\000\000\000\002\142\000\000\001\142\000\000\000\000\003a\000\000\000\000\002D\002E\001u\000\000\000\000\000\000\001~\003\129\001\135\000\242\001x\001y\000\000\000\000\000\000\002\161\000\000\002\142\001\143\000\000\001\144\002d\000\000\002\166\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\139\003\172\000\000\000\000\002\192\000\000\001\237\001\237\000\000\001\151\000\000\001\141\001|\001\139\000\000\000\000\000\000\000\000\003\134\003\150\003\151\001\142\001\151\000\000\001\141\001|\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001~\000\000\000\000\000\242\000\000\001\139\000\000\000\000\000\000\000\000\000\000\002\142\000\000\000\000\001\151\000\000\001\141\001|\000\000\000\000\000\000\001\142\000\000\000\000\000\000\002D\002E\001u\001\239\001\239\000\000\004\162\004\247\001~\000\000\002\198\000\242\000\000\002\007\002\007\002\161\000\000\002\011\002\011\001\029\001\029\000\000\002H\002\166\002\200\000\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\177\000\000\000\000\002\192\000\000\000\000\001\139\000\000\003\154\003\155\000\000\000\000\000\000\000\000\000\000\001\151\000\000\001\141\001|\000\000\000\000\002\204\000\000\000\000\000\000\002\012\002\012\001%\000\000\000\000\001&\002\r\002\r\000\000\000\000\000\000\000\000\000\000\000\000\001\139\000\000\000\000\000\000\002\014\002\014\000\000\003\175\000\000\001\151\000\000\001\141\001|\000\000\002\201\001(\000\000\000\000\002D\002E\001u\000\000\000\000\002\222\000\000\001\141\002\203\000\000\002\198\000\000\000\000\000\000\000\000\002\161\000\000\002D\002E\001u\000\000\000\000\002H\002\166\002\200\000\242\000\000\000\000\000\000\002\224\000\000\000\000\002\161\003\179\000\000\000\000\002\192\002D\002E\001u\002\166\000\000\000\000\001.\001t\001u\000\000\000\000\000\000\000\000\003\183\000\000\002\161\002\192\002\204\000\000\000\000\000\000\001*\000\000\002\166\000\000\000\000\000\000\001v\001\135\000\000\001x\001y\000\000\003\191\000\000\000\000\002\192\000\000\001+\000\000\000\000\000\000\003\175\000\000\001\029\0011\000\000\000\000\000\000\002\201\003\198\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\222\000\000\001\141\002\203\000\000\002\198\000\000\000\000\002D\002E\001u\000\000\000\000\001\143\000\000\001\144\002d\002H\000\000\002\200\000\242\000\000\002\198\002\161\002\224\000\000\000\000\000\000\000\000\000\000\000\000\002\166\001=\000\000\002H\000\000\002\200\000\242\000\000\000\000\0013\003\201\002\198\0014\002\192\000\000\0015\0016\001\142\002\204\000\000\000\000\000\000\000\000\002H\000\000\002\200\000\242\000\000\000\000\001~\000\000\000\000\000\242\000\000\000\000\002\204\000\000\000\000\000\000\000\000\002\142\0017\000\000\003\175\001T\001t\001u\000\000\000\000\000\000\002\201\000\000\000\000\000\000\000\000\002\204\000\000\000\000\000\000\002\222\003\175\001\141\002\203\000\000\000\000\001v\001\135\002\201\001x\001y\000\000\000\000\000\000\000\000\000\000\000\000\002\222\002\198\001\141\002\203\003\175\000\000\000\000\002\224\000\000\000\000\000\000\002\201\003\208\002H\000\000\002\200\000\242\001\139\000\000\000\000\002\222\000\000\001\141\002\203\002\224\006)\001\151\000\000\001\141\001|\000\000\000\000\000\000\001\143\000\000\001\144\002d\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\224\002\204\002D\002E\001u\000\000\000\000\001t\001u\006*\007\169\006+\000\000\000\000\000\000\000\000\000\000\002\161\000\000\000\000\000\000\000\000\000\000\000\000\001\142\002\166\003\175\001v\001\135\000\000\001x\001y\000\000\002\201\000\000\003\211\001~\000\000\002\192\000\242\000\000\006,\002\222\000\000\001\141\002\203\000\000\002\142\000\000\000\000\003\218\000\000\000\000\002D\002E\001u\000\000\000\000\001t\001u\000\000\000\000\000\000\000\000\000\000\000\000\002\224\000\000\002\161\000\000\000\000\001\143\000\000\001\144\002d\000\000\002\166\006-\001v\001\135\000\000\001x\001y\000\000\001t\001u\003\251\006.\006/\002\192\0060\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\139\003\228\002\198\000\000\001v\001\135\001\142\001x\001y\001\151\000\000\001\141\001|\006l\002H\000\000\002\200\000\242\001~\000\000\000\000\000\242\001\143\000\000\001\144\002d\000\000\003\237\000\000\002\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0062\001t\001u\000\000\000\000\0064\006>\000\000\000\000\002\204\000\000\001\143\000\000\001\144\002d\000\000\002\198\000\000\006h\000\000\001\142\001v\001\135\000\000\001x\001y\000\000\000\000\002H\000\000\002\200\000\242\001~\000\000\003\175\000\242\006i\000\000\000\000\000\000\000\000\002\201\000\000\002\142\003\246\001\139\001\142\000\000\000\000\000\000\002\222\000\000\001\141\002\203\001\151\000\000\001\141\001|\001~\000\000\002\204\000\242\000\000\000\000\000\000\001\143\000\000\001\144\002d\002\142\000\000\000\000\000\000\000\000\002\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\175\000\000\000\000\000\000\000\000\000\000\000\000\002\201\001t\001u\000\000\001\139\000\000\000\000\000\000\001\142\002\222\000\000\001\141\002\203\001\151\000\000\001\141\001|\002D\002E\001u\001~\001v\001\135\000\242\001x\001y\000\000\000\000\000\000\000\000\001\139\002\142\002\161\002\224\000\000\001t\001u\000\000\000\000\001\151\002\166\001\141\001|\000\000\004\001\000\000\000\000\000\000\000\000\000\000\004\004\000\000\000\000\002\192\000\000\001v\001\135\000\000\001x\001y\000\000\000\000\000\000\000\000\000\000\001\143\000\000\001\144\002d\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\n\000\000\000\000\000\000\000\000\000\000\001\139\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\151\000\000\001\141\001|\000\000\000\000\001\143\001\142\001\144\002d\002D\002E\001u\000\000\000\000\000\000\000\000\000\000\000\000\001~\000\000\000\000\000\242\000\000\002\198\002\161\000\000\000\000\000\000\000\000\002\142\000\000\000\000\002\166\000\000\000\000\002H\000\000\002\200\000\242\000\000\001\142\000\000\004\r\000\000\000\000\002\192\002D\002E\001u\000\000\000\000\000\000\001~\001t\001u\000\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\142\000\000\000\000\000\000\002\204\000\000\004}\000\000\000\000\000\000\001v\001\135\000\000\001x\001y\000\000\000\000\000\000\000\000\001\139\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\151\003\175\001\141\001|\000\000\004\019\000\000\000\000\002\201\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\222\002\198\001\141\002\203\000\000\001t\001u\000\000\001\139\001\143\000\000\001\144\002d\002H\000\000\002\200\000\242\001\151\000\000\001\141\001|\000\000\000\000\000\000\002\224\001v\001\135\000\000\001x\001y\000\000\000\000\000\000\000\000\000\000\002D\002E\001u\002G\000\000\002D\002E\001u\000\000\001\142\002\204\000\000\000\000\004\026\000\000\002H\000\000\002\200\000\242\000\000\002\161\001~\000\000\004\028\000\242\002D\002E\001u\002\166\000\000\000\000\000\000\002\142\000\000\001\143\003\175\001\144\002d\004%\000\000\002\161\002\192\002\201\000\000\001t\001u\000\000\004\029\002\166\000\000\000\000\002\222\000\000\001\141\002\203\000\000\000\000\000\000\004(\000\000\000\000\002\192\000\000\000\000\001v\001\135\000\000\001x\001y\001\142\000\000\000\000\000\000\000\000\000\000\002\224\000\000\000\000\000\000\002\201\000\000\001~\000\000\000\000\000\242\001\139\000\000\004B\002\202\000\000\001\141\002\203\002\142\000\000\001\151\000\000\001\141\001|\000\000\000\000\002G\000\000\000\000\000\000\000\000\002\198\000\000\000\000\001\143\000\000\001\144\002d\002H\000\000\002\200\000\242\000\000\002H\000\000\002\200\000\242\000\000\000\000\000\000\000\000\002\198\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002H\000\000\002\200\000\242\001t\001u\001\142\000\000\001\139\000\000\000\000\004\031\002\204\000\000\001\237\000\000\000\000\001\151\001~\001\141\001|\000\242\001t\001u\001v\001\135\000\000\001x\001y\002\142\000\000\000\000\002\204\000\000\000\000\000\000\000\000\003\175\000\000\002\201\000\000\000\000\001v\001\135\002\201\001x\001y\004G\002\202\000\000\001\141\002\203\000\000\002\222\000\000\001\141\002\203\003\175\000\000\000\000\000\000\000\000\000\000\000\000\002\201\004N\000\000\000\000\001\143\001\239\001\144\002d\005\012\002\222\000\000\001\141\002\203\002\224\000\000\002\007\000\000\000\000\001\139\002\011\000\000\001\029\001\143\000\000\001\144\002d\000\000\001\151\000\000\001\141\001|\000\000\000\000\002\224\000\000\002D\002E\001u\000\000\001\142\002D\002E\001u\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\161\001~\000\000\000\000\000\242\002\161\000\000\001\142\002\166\000\000\002\012\000\000\002\142\002\166\001t\001u\002\r\000\000\004`\001~\000\000\002\192\000\242\004e\000\000\000\000\002\192\000\000\002\014\000\000\002\142\000\000\000\000\000\000\001v\001\135\000\000\001x\001y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003e\001u\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\136\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\139\003\129\001\135\000\000\001x\001y\000\000\000\000\000\000\001\151\000\000\001\141\001|\001\143\000\000\001\144\002d\000\000\001\139\000\000\002\198\000\000\000\000\000\000\000\000\002\198\000\000\001\151\000\000\001\141\001|\000\000\002H\000\000\002\200\000\242\000\000\002H\000\000\002\200\000\242\000\000\000\000\000\000\003\134\003\150\003\151\000\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\001t\001u\000\000\000\000\000\000\001~\000\000\000\000\000\242\002\204\000\000\000\000\000\000\000\000\002\204\000\000\002\142\000\000\000\000\000\000\001v\001\135\000\000\001x\001y\001\142\000\000\000\000\000\000\001\237\000\000\000\000\000\000\000\000\003\175\000\000\000\000\001~\000\000\003\175\000\242\002\201\000\000\004\233\000\000\000\000\002\201\000\000\000\000\000\000\002\222\000\000\001\141\002\203\000\000\002\222\000\000\001\141\002\203\000\000\000\000\000\000\000\000\000\000\001\143\000\000\001\144\002d\000\000\001\139\003\154\004\223\000\000\000\000\002\224\000\000\000\000\000\000\001\151\002\224\001\141\001|\001t\001u\001\239\000\000\000\000\005\016\000\000\000\000\001%\000\000\000\000\001&\002\007\001t\001u\000\000\002\011\001\142\001\029\001\139\001v\001\135\000\000\001x\001y\000\000\000\000\000\000\001\151\001~\001\141\001|\000\242\001v\001\135\001(\001x\001y\000\000\000\000\002\142\000\000\000\000\005\000\000\000\005T\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001%\005\007\002\012\001&\000\000\000\000\005W\000\000\002\r\001\143\000\000\001\144\002d\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\014\000\000\001\143\000\000\001\144\002d\001.\001(\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005T\001\139\000\000\000\000\001*\000\000\000\000\001\142\000\000\000\000\001\151\000\000\001\141\001|\000\000\000\000\005\208\000\000\001%\001~\001\142\001+\000\242\000\000\000\000\000\000\000\000\001\029\0011\000\000\002\142\000\000\001~\000\000\000\000\000\242\001.\000\000\001t\001u\000\000\000\000\000\000\002\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001*\000\000\000\000\000\000\006\164\000\000\000\000\001v\002z\000\000\001x\001y\000\000\000\000\000\000\001%\000\000\001+\001&\000\000\000\000\000\000\001=\001\029\0011\000\000\000\000\000\000\000\000\000\000\0013\000\000\001\139\0014\000\000\002{\0015\0016\005]\000\000\000\000\001\151\001(\001\141\001|\001\139\000\000\000\000\000\000\000\000\001\237\000\000\005T\000\000\001\151\001*\001\141\001|\000\000\000\000\000\000\000\000\0017\000\000\000\000\001A\000\000\000\000\006\161\001=\001%\000\000\001+\001&\000\000\000\000\000\000\0013\001\029\0011\0014\000\000\000\000\0015\0016\005]\001}\000\000\001.\000\000\000\000\000\000\001\237\001t\001u\000\000\000\000\001(\001~\000\000\000\000\000\242\000\000\001*\000\000\001\239\000\000\005T\005\019\0017\006\188\000\000\001A\001v\002z\002\007\001x\001y\000\000\002\011\001+\001\029\000\000\006\175\000\000\000\000\001\029\0011\000\000\000\000\000\000\000\000\0013\002|\000\000\0014\000\000\000\000\0015\0016\000\000\002{\000\000\001.\000\000\000\000\000\000\001\239\000\000\000\000\005\026\000\000\001%\003z\003\128\001&\000\000\002\007\001*\000\000\002\012\002\011\001\139\001\029\004\200\000\000\002\r\000\000\000\000\000\000\000\000\001\140\001=\001\141\001|\001+\000\000\000\000\002\014\001(\0013\001\029\0011\0014\000\000\000\000\0015\0016\005]\005T\003e\001u\001}\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\012\000\000\001~\006\185\000\000\000\242\002\r\000\000\003\129\001\135\0017\001x\001y\001A\000\000\000\000\000\000\000\000\002\014\000\000\000\000\000\000\000\000\001.\000\000\001=\003e\001u\000\000\000\000\000\000\000\000\000\000\0013\000\000\000\000\0014\002|\001*\0015\0016\005]\000\000\000\000\000\000\000\000\003\129\001\135\000\000\001x\001y\003\134\003\150\003\151\000\000\001+\000\000\003z\003\128\000\000\000\000\001\029\0011\000\000\000\000\0017\001\139\000\000\001A\000\000\000\000\000\000\000\000\000\000\000\000\001\140\000\000\001\141\001|\000\000\000\000\000\000\000\000\000\000\000\000\001t\001u\001\142\000\000\003\134\003\150\003\151\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001~\000\000\000\000\000\242\000\000\000\000\001v\001\135\001=\001x\001y\000\000\000\000\000\000\000\000\000\000\0013\001%\000\000\0014\001&\000\000\0015\0016\005]\000\000\001\142\000\000\000\000\007N\000\000\000\000\000\000\003\154\006\202\000\000\000\000\000\000\001~\000\000\000\000\000\242\000\000\000\000\001(\000\000\007\129\000\000\0017\000\000\001\143\001A\001\144\002d\001%\000\000\000\000\001&\000\000\000\000\000\000\000\000\000\000\000\000\001\139\000\000\000\000\000\000\000\000\000\000\000\000\003\154\006\236\001\151\000\000\001\141\001|\000\000\000\000\000\000\000\000\001(\000\000\000\000\000\000\001\142\002D\002E\001u\000\000\001.\004\185\000\000\000\000\000\000\000\000\000\000\001~\000\000\000\000\000\242\000\000\001\139\000\000\000\000\001*\007r\000\000\002\142\004\028\000\000\001\151\000\000\001\141\001|\000\000\000\000\001t\001u\000\000\000\000\000\000\001+\000\000\002D\002E\001u\001.\001\029\0011\000\000\000\000\000\000\006\221\000\000\000\000\000\000\001v\001\135\002\161\001x\001y\001*\000\000\000\000\000\000\000\000\002\166\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001+\002\192\001\139\000\000\000\000\000\000\001\029\0011\000\000\000\000\000\000\001\151\000\000\001\141\001|\001=\000\000\002D\002E\001u\000\000\000\000\001\143\0013\001\144\001\162\0014\002G\000\000\0015\0016\007\136\002\161\000\000\000\000\000\000\000\000\000\000\000\000\002H\002\166\002\200\000\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000m\000\000\001=\002\192\000\000\0017\000\000\001\142\001A\000\000\0013\001t\001u\0014\000\000\002\198\0015\0016\000\000\001~\000\000\000\000\000\242\000\000\000\000\004\031\000\000\002H\000\000\002\200\000\242\001v\001\135\000\000\001x\001y\000\000\000\000\000\000\000\000\000\000\001\204\0017\000\000\000\000\004\192\000\000\000\000\000\000\000\000\001t\001u\000\000\002\201\000\000\000\000\000\000\000\000\000\000\002\204\000\000\000\000\002\202\000\000\001\141\002\203\000\000\002\198\000\000\000\000\001v\001\135\000\000\001x\001y\001\143\000\000\001\144\001\192\002H\001\189\002\200\000\242\001\139\005\021\000\000\000\000\000\000\000\000\000\000\000\000\002\201\001\151\000\000\001\141\001|\000\000\000\000\000\000\000\000\002\222\000\000\001\141\002\203\000\000\000\000\000\000\001t\001u\000\000\001\142\002\204\000\000\000\000\001\143\000\000\001\144\001\192\000\000\000\000\000\000\000\000\001~\000\000\002\224\000\242\000\000\001v\001\135\000\000\001x\001y\000\000\002D\002E\001u\004\234\001\194\000\000\000\000\000\000\000\000\000\000\002\201\000\000\000\000\000\000\000\000\002\161\001\142\000\000\000\000\002\222\000\000\001\141\002\203\002\166\000\000\000\000\001t\001u\001~\000\000\000\000\000\242\000\000\000\000\000\000\000\000\002\192\000\000\001\143\000\000\001\144\001\192\000\000\002\224\000\000\000\000\001v\002z\000\000\001x\001y\000\000\000\000\001\139\000\000\000\000\001t\001u\000\000\000\000\000\000\000\000\001\151\000\000\001\141\001|\001t\001u\000\000\000\000\000\000\000\000\000\000\001\142\002{\000\000\001v\001\135\000\000\001x\001y\000\000\002D\002E\001u\001~\001v\001\135\000\242\001x\001y\000\000\001\139\000\000\000\000\000\000\000\000\002\161\000\000\000\000\002\198\001\151\000\000\001\141\001|\002\166\000\000\000\000\000\000\000\000\000\000\000\000\002H\000\000\002\200\000\242\000\000\000\000\002\192\000\000\001\143\000\000\001\144\002d\000\000\001}\000\000\000\000\000\000\000\000\001\143\000\000\001\144\002l\000\000\000\000\000\000\001~\000\000\000\000\000\242\000\000\000\000\000\000\002\204\000\000\000\000\000\000\000\000\001\139\000\000\000\000\000\000\000\000\000\000\001\142\000\000\000\000\001\151\000\000\001\141\001|\000\000\000\000\000\000\001\142\000\000\001~\000\000\004\137\000\242\000\000\002|\000\000\000\000\000\000\002\201\001~\004;\000\000\000\242\000\000\002\198\000\000\000\000\002\222\000\000\001\141\002\203\000\000\000\000\000\000\002~\003\128\002H\000\000\002\200\000\242\001t\001u\000\000\001\139\002D\002E\001u\000\000\000\000\002o\000\000\002\224\001\140\000\000\001\141\001|\000\000\000\000\000\000\002\161\001v\001\135\000\000\001x\001y\000\000\000\000\002\166\002\204\000\000\000\000\000\000\000\000\001\139\000\000\000\000\000\000\000\000\000\000\000\000\002\192\000\000\001\151\001\139\001\141\001|\000\000\000\000\000\000\000\000\000\000\000\000\001\151\0043\001\141\001|\000\000\000\000\000\000\000\000\002\201\000\000\000\000\000\000\001\143\000\000\001\144\002d\000\000\002\222\000\000\001\141\002\203\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002D\002E\001u\000\000\000\000\002D\002E\001u\002\224\000\000\000\000\001\237\000\000\000\000\001\142\002\161\000\000\000\000\000\000\002\198\002\161\000\000\000\000\002\166\000\000\000\000\001~\000\000\002\166\000\242\000\000\002H\000\000\002\200\000\242\000\000\002\192\002\141\000\000\000\000\000\000\002\192\002D\002E\001u\000\000\000\000\002D\002E\001u\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\161\000\000\000\000\000\000\000\000\002\161\002\204\000\000\002\166\001\239\001\237\000\000\005\030\002\166\000\000\000\000\000\000\000\000\000\000\002\007\000\000\002\192\000\000\002\011\000\000\001\029\002\192\000\000\000\000\000\000\000\000\004 \000\000\001\139\000\000\000\000\000\000\000\000\002\201\000\000\000\000\000\000\001\151\002\198\001\141\001|\000\000\002\222\002\198\001\141\002\203\000\000\000\000\000\000\000\000\002H\000\000\002\200\000\242\000\000\002H\000\000\002\200\000\242\002\012\001\239\000\000\000\000\005!\000\000\002\r\002\224\000\000\000\000\000\000\002\007\000\000\000\000\000\000\002\011\000\000\001\029\002\014\000\000\000\000\002\198\000\000\002\204\007\028\000\000\002\198\000\000\002\204\000\000\000\000\000\000\000\000\002H\000\000\002\200\000\242\000\000\002H\b\017\002\200\000\242\b\018\000\000\000\000\007\031\000\000\000\000\003\160\000\000\000\000\000\000\000\000\002\214\007 \002\201\002\012\000\000\000\000\000\000\002\201\000\000\002\r\000\000\002\222\002\204\001\141\002\203\000\000\002\222\002\204\001\141\002\203\000\000\002\014\000\000\002D\002E\001u\000\000\000\000\002D\002E\001u\007!\000\000\000\000\000\000\002\224\000\000\002\220\002\161\000\000\002\224\000\000\002\229\002\161\002\201\000\000\002\166\000\000\000\000\002\201\000\000\002\166\000\000\002\222\000\000\001\141\002\203\000\000\002\222\002\192\001\141\002\203\000\000\000\000\002\192\002D\002E\001u\007\"\000\000\002D\002E\001u\000\000\000\000\000\000\000\000\002\224\007#\000\000\002\161\000\000\002\224\000\000\000\000\002\161\000\000\000\000\002\166\001t\001u\001\237\000\000\002\166\000\000\000\000\000\000\000\000\b\028\000\000\000\000\002\192\000\000\000\000\000\000\000\000\002\192\000\000\000\000\001v\002z\000\000\001x\001y\000\000\000\000\000\000\007%\000\000\000\000\000\000\000\000\000\000\002\198\000\000\000\000\000\000\007&\002\198\000\000\000\000\000\000\007(\000\000\000\000\002H\000\000\002\200\000\242\000\000\002H\000\000\002\200\000\242\000\000\007*\001\239\000\000\000\000\005/\000\000\002D\002E\001u\000\000\000\000\002\007\000\000\000\000\000\000\002\011\000\000\001\029\007+\000\000\002\198\002\161\002\204\000\000\000\000\002\198\000\000\002\204\000\000\002\166\000\000\000\000\002H\000\000\002\200\000\242\000\000\002H\000\000\002\200\000\242\000\000\002\192\001}\000\000\000\000\000\000\002\240\000\000\000\000\000\000\000\000\002\246\000\000\002\201\001~\002\012\000\000\000\242\002\201\001%\000\000\002\r\002\222\002\204\001\141\002\203\000\000\002\222\002\204\001\141\002\203\000\000\001%\002\014\000\000\006\018\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\224\000\000\002\252\006\215\000\000\002\224\000\000\003\002\000\000\002\201\000\000\000\000\000\000\001(\002\201\002D\002E\001u\002\222\002\198\001\141\002\203\000\000\002\222\000\000\001\141\002\203\000\000\000\000\000\000\002\161\002H\001\139\002\200\000\242\002D\002E\001u\002\166\000\000\000\000\001\140\002\224\001\141\001|\000\000\000\000\002\224\000\000\000\000\002\161\002\192\000\000\000\000\006\227\000\000\000\000\000\000\002\166\006\020\000\000\001*\000\000\002\204\000\000\000\000\002D\002E\001u\000\000\000\000\002\192\000\000\000\000\001*\000\000\000\000\000\000\001+\000\000\000\000\002\161\000\000\000\000\001\029\0011\000\000\000\000\003\b\002\166\000\000\001+\000\000\000\000\000\000\002\201\000\000\001\029\006\023\000\000\000\000\000\000\002\192\000\000\002\222\000\000\001\141\002\203\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\198\002D\002E\001u\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002H\002\224\002\200\000\242\002\161\000\000\000\000\000\000\002\198\000\000\000\000\0013\002\166\000\000\0014\000\000\000\000\0015\0016\000\000\002H\000\000\002\200\000\242\0013\002\192\000\000\006\024\000\000\000\000\0015\0016\002\204\000\000\000\000\002D\002E\001u\000\000\002\198\005\226\000\000\006\028\004\208\006\026\002D\002E\001u\000\000\000\000\002\161\002H\002\204\002\200\000\242\000\000\0017\003\014\002\166\000\000\002\161\000\000\000\000\000\000\002\201\000\000\000\000\000\000\002\166\000\000\000\000\002\192\000\000\002\222\000\000\001\141\002\203\003\020\000\000\000\000\000\000\002\192\000\000\002\204\002\201\000\000\000\000\000\000\000\000\002\198\000\000\000\000\000\000\002\222\000\000\001\141\002\203\002\224\000\000\000\000\000\000\002H\000\000\002\200\000\242\000\000\000\000\000\000\003\026\000\000\000\000\000\000\000\000\000\000\000\000\002\201\000\000\002\224\000\000\000\000\000\000\000\000\000\000\000\000\002\222\000\000\001\141\002\203\002D\002E\001u\000\000\000\000\002\204\000\000\002\198\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\161\000\000\002\198\000\000\002H\002\224\002\200\000\242\002\166\000\000\000\000\000\000\000\000\000\000\002H\003 \002\200\000\242\000\000\000\000\000\000\002\192\002\201\000\000\002D\002E\001u\000\000\002D\002E\001u\002\222\000\000\001\141\002\203\000\000\002\204\000\000\000\000\002\161\000\000\000\000\000\000\000\000\000\000\000\000\002\204\002\166\000\000\000\000\000\000\002F\002D\002E\001u\002\224\000\000\000\000\000\000\000\000\002\192\003&\000\000\000\000\000\000\000\000\000\000\002\161\002\201\000\000\000\000\003,\000\000\000\000\000\000\002\166\000\000\002\222\002\201\001\141\002\203\000\000\000\000\000\000\000\000\002\198\000\000\002\222\002\192\001\141\002\203\002D\002E\001u\000\000\000\000\000\000\002H\000\000\002\200\000\242\002\224\000\000\000\000\000\000\000\000\002\161\000\000\002D\002E\001u\002\224\000\000\000\000\002\166\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\161\002\198\000\000\000\000\002\192\002G\002\204\000\000\002\166\000\000\000\000\000\000\000\000\002H\000\000\002\200\000\242\002H\000\000\002\200\000\242\002\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\198\000\000\0032\000\000\000\000\000\000\000\000\000\000\000\000\002\201\000\000\000\000\002H\000\000\002\200\000\242\002\204\000\000\002\222\000\000\001\141\002\203\002D\002E\001u\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\161\000\000\002\198\001%\0038\002\224\001&\002\204\002\166\000\000\001\237\002\201\000\000\000\000\002H\002\201\002\200\000\242\000\000\002\198\002\222\002\192\001\141\002\203\002\202\000\000\001\141\002\203\000\000\000\000\001(\002H\003>\002\200\000\242\002D\002E\001u\000\000\002\201\003o\002D\002E\001u\002\224\000\000\002\204\000\000\002\222\000\000\001\141\002\203\000\000\000\000\000\000\000\000\002\161\000\000\002\151\000\000\000\000\000\000\000\000\002\204\002\166\001\239\000\000\000\000\005\127\000\000\000\000\003D\002\224\000\000\000\000\002\007\001.\002\192\002\201\002\011\000\000\001\029\000\000\000\000\000\000\002\198\000\000\002\222\003J\001\141\002\203\001*\000\000\000\000\000\000\002\201\000\000\002H\000\000\002\200\000\242\002D\002E\001u\002\222\000\000\001\141\002\203\001+\000\000\000\000\002\224\000\000\000\000\001\029\0011\002\161\000\000\000\000\000\000\002\012\002D\002E\001u\002\166\000\000\002\r\000\000\002\224\002\204\000\000\000\000\000\000\000\000\000\000\002G\002\161\002\192\002\014\000\000\000\000\002\198\000\000\000\000\002\166\000\000\000\000\002H\000\000\002\200\000\242\000\000\000\000\002H\003P\002\200\000\242\002\192\000\000\000\000\001=\002\201\000\000\000\000\000\000\000\000\000\000\000\000\0013\000\000\002\222\0014\001\141\002\203\0015\0016\002\175\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\204\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\224\000\000\000\000\000\000\000\000\000\000\0017\002\198\000\000\001A\002D\002E\001u\000\000\000\000\000\000\003V\002\201\000\000\002H\000\000\002\200\000\242\002\201\000\000\002\161\002\202\002\198\001\141\002\203\000\000\000\000\002\222\002\166\001\141\002\203\000\000\000\000\000\000\002H\000\000\002\200\000\242\000\000\000\000\000\000\002\192\000\000\000\000\000\000\000\000\002\204\002D\002E\001u\000\000\002\224\002D\002E\001u\000\000\000\000\002D\002E\001u\000\000\000\000\002\161\000\000\000\000\000\000\002\204\002\161\000\000\000\000\002\166\003\\\002\161\000\000\000\000\002\166\000\000\000\000\002\201\000\000\002\166\000\000\000\000\002\192\000\000\000\000\000\000\002\222\002\192\001\141\002\203\003b\001%\002\192\000\000\000\000\000\000\000\000\002\201\000\000\000\000\000\000\000\000\000\000\000\000\002\198\000\000\002\222\000\000\001\141\002\203\002\224\000\000\000\000\000\000\000\000\000\000\002H\000\000\002\200\000\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\224\000\000\000\000\000\000\000\000\001%\000\000\000\000\006\018\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\198\000\000\002\204\000\000\000\000\002\198\002D\002E\001u\000\000\002\198\000\000\002H\000\000\002\200\000\242\001(\002H\000\000\002\200\000\242\002\161\002H\000\000\002\200\000\242\000\000\003\199\000\000\002\166\000\000\000\000\000\000\001*\002\201\000\000\000\000\002D\002E\001u\000\000\000\000\002\192\002\222\002\204\001\141\002\203\000\000\000\000\002\204\001+\000\000\002\161\000\000\002\204\000\000\001\029\0011\000\000\000\000\002\166\000\000\006\020\000\000\000\000\000\000\000\000\002\224\000\000\003\209\000\000\000\000\000\000\002\192\003\219\000\000\002\201\001*\000\000\003\229\000\000\002\201\000\000\000\000\000\000\002\222\002\201\001\141\002\203\000\000\002\222\000\000\001\141\002\203\001+\002\222\000\000\001\141\002\203\000\000\001\029\006\023\000\000\000\000\000\000\000\000\002\198\000\000\000\000\002\224\0013\000\000\000\000\0014\002\224\000\000\0015\0016\002H\002\224\002\200\000\242\000\000\002D\002E\001u\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002D\002E\001u\000\000\002\198\002\161\000\000\000\000\000\000\004\212\002D\002E\001u\002\166\000\000\002\161\002H\002\204\002\200\000\242\000\000\0013\000\000\002\166\006\024\002\161\002\192\0015\0016\000\000\000\000\000\000\000\000\002\166\000\000\000\000\002\192\005\226\000\000\006\027\000\000\006\026\003\238\000\000\000\000\000\000\002\192\000\000\002\204\002\201\000\000\000\000\000\000\0017\000\000\000\000\000\000\000\000\002\222\000\000\001\141\002\203\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\247\000\000\000\000\000\000\000\000\000\000\000\000\002\201\000\000\002\224\000\000\000\000\000\000\000\000\000\000\000\000\002\222\002\198\001\141\002\203\002D\002E\001u\000\000\000\000\000\000\000\000\002\198\000\000\002H\000\000\002\200\000\242\000\000\000\000\002\161\000\000\002\198\000\000\002H\002\224\002\200\000\242\002\166\000\000\000\000\000\000\000\000\000\000\002H\000\000\002\200\000\242\000\000\000\000\000\000\002\192\000\000\000\000\001t\001u\002\204\002D\002E\001u\000\000\000\000\000\000\000\000\000\000\000\000\002\204\002D\002E\001u\000\000\000\000\002\161\000\000\001v\001\138\002\204\001x\001y\000\000\002\166\004\002\002\161\000\000\000\000\000\000\000\000\000\000\002\201\000\000\002\166\004\011\000\000\002\192\000\000\000\000\000\000\002\222\002\201\001\141\002\203\004\020\000\000\002\192\000\000\000\000\000\000\002\222\002\201\001\141\002\203\000\000\000\000\000\000\000\000\002\198\000\000\002\222\000\000\001\141\002\203\002\224\000\000\000\000\000\000\000\000\000\000\002H\000\000\002\200\000\242\002\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\224\000\000\000\000\000\000\000\000\000\000\002D\002E\001u\000\000\000\000\000\000\001}\001\207\001u\000\000\002\198\000\000\002\204\000\000\000\000\002\161\000\000\000\000\001~\000\000\002\198\000\242\002H\002\166\002\200\000\242\000\000\001v\002Y\000\000\001x\001y\002H\000\000\002\200\000\242\002\192\004\027\000\000\000\000\000\000\000\000\000\000\000\000\002\201\000\000\000\000\001%\000\000\001%\001&\000\000\001&\002\222\002\204\001\141\002\203\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\204\000\000\000\000\000\000\000\000\000\000\004Q\003\150\003\151\000\000\001(\000\000\001(\002\224\000\000\004I\000\000\005\219\001\139\000\000\004\185\000\000\002\201\000\000\000\000\004H\000\000\001\140\000\000\001\141\001|\002\222\002\201\001\141\002\203\004\188\002\198\000\000\000\000\000\000\000\000\002\222\001\142\001\141\002\203\000\000\000\000\000\000\002H\000\000\002\200\000\242\000\000\000\000\001~\002\224\001.\000\242\001.\001%\000\000\000\000\001&\000\000\000\000\002\224\000\000\000\000\000\000\000\000\000\000\001*\000\000\001*\000\000\000\000\000\000\000\000\000\000\001%\002\204\000\000\001&\004X\000\000\000\000\001(\000\000\001+\001%\001+\000\000\001&\000\000\001\029\0011\001\029\0011\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004O\001(\000\000\000\000\000\000\000\000\006\210\002\201\000\000\000\000\000\000\001(\000\000\001\139\000\000\000\000\002\222\000\000\001\141\002\203\000\000\000\000\001\151\000\000\001\141\001|\000\000\001.\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001=\000\000\001=\000\000\000\000\002\224\000\000\001*\0013\000\000\0013\0014\001.\0014\0015\0016\0015\0016\005\224\000\000\000\000\000\000\001.\000\000\001+\000\000\000\000\001*\000\000\000\000\001\029\0011\000\000\000\000\000\000\000\000\001%\001*\000\000\001&\0017\000\000\0017\004\192\001+\001A\000\000\000\000\000\000\000\000\001\029\0011\000\000\000\000\001+\000\000\000\000\000\000\000\000\000\000\001\029\0011\000\000\001(\000\000\001t\001u\000\000\000\000\000\000\001%\000\000\000\000\001&\000\000\000\000\001=\000\000\001t\001u\000\000\000\000\000\000\000\000\0013\001v\001\135\0014\001x\001y\0015\0016\005\237\000\000\000\000\005\240\001=\001(\001v\001\135\000\000\001x\001y\000\000\0013\007\214\001=\0014\000\000\001.\0015\0016\005\224\000\000\0013\000\000\0017\0014\000\000\001A\0015\0016\005\237\000\000\001*\007\000\000\000\000\000\000\000\001\143\000\000\001\144\007\242\000\000\007\244\000\000\0017\000\000\000\000\001A\000\000\001+\001\143\001.\001\144\007B\0017\001\029\0011\001A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001*\000\000\000\000\000\000\000\000\000\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\001%\000\000\000\000\001&\001+\001~\001\142\000\000\000\242\000\000\001\029\0011\001%\000\000\000\000\001&\000\000\000\000\001~\000\000\000\000\000\242\001=\000\000\000\000\000\000\000\000\001(\000\000\000\000\0013\001t\001u\0014\000\000\000\000\0015\0016\007\215\001(\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001R\000\000\000\000\000\000\001v\001\135\000\000\001x\001y\001=\000\000\000\000\000\000\000\000\000\000\0017\000\000\0013\001A\000\000\0014\000\000\001\139\0015\0016\001h\001.\000\000\000\000\000\000\000\000\001\151\000\000\001\141\001|\001\139\000\000\000\000\001.\000\000\000\000\001*\000\000\000\000\001\151\000\000\001\141\001|\001\143\0017\001\144\001\196\001A\001*\000\000\000\000\000\000\000\000\001+\000\000\000\000\000\000\000\000\000\000\001\029\0011\000\000\000\000\001t\001u\001+\000\000\000\000\000\000\000\000\000\000\001\029\0011\000\000\000\000\000\000\001t\001u\001\142\000\000\000\000\000\000\000\000\001v\001\135\000\000\001x\001y\000\000\000\000\001~\000\000\000\000\000\242\000\000\000\000\001v\001\135\000\000\001x\001y\000\000\000\000\000\000\000\000\001=\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0013\001t\001u\0014\001=\000\000\0015\0016\001>\000\000\000\000\000\000\0013\000\000\001\143\0014\001\144\001\184\0015\0016\000\000\001v\001\135\000\000\001x\001y\000\000\001\143\000\000\001\144\001\181\000\000\0017\000\000\000\000\001A\000\000\000\000\000\000\000\000\000\000\001\139\000\000\000\000\0017\000\000\000\000\001V\000\000\001\142\001\151\000\000\001\141\001|\000\000\001t\001u\000\000\000\000\000\000\000\000\001~\001\142\000\000\000\242\001\143\000\000\001\144\001\180\000\000\000\000\000\000\000\000\000\000\001~\001v\001\135\000\242\001x\001y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001t\001u\000\000\000\000\000\000\000\000\000\000\001\142\001%\000\000\000\000\001&\000\000\001t\001u\000\000\000\000\000\000\000\000\001~\001v\001\135\000\242\001x\001y\000\000\001\143\000\000\001\144\001\146\000\000\000\000\001\139\001v\001\135\001(\001x\001y\000\000\001t\001u\001\151\000\000\001\141\001|\001\139\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\151\000\000\001\141\001|\000\000\001v\001\135\001\142\001x\001y\001\143\000\000\001\144\001\149\000\000\000\000\000\000\000\000\000\000\001~\000\000\000\000\000\242\001\143\000\000\001\144\001\179\001.\000\000\001\139\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\151\000\000\001\141\001|\001*\000\000\000\000\001\142\000\000\001\237\000\000\001\143\001%\001\144\001\167\001&\000\000\000\000\000\000\001~\001\142\001+\000\242\000\000\000\000\000\000\000\000\001\029\0011\000\000\000\000\000\000\001~\001%\000\000\000\242\001&\000\000\000\000\001(\000\000\000\000\000\000\000\000\000\000\001\139\001\142\000\000\001t\001u\000\000\000\000\000\000\000\000\001\151\000\000\001\141\001|\001~\000\000\001(\000\242\000\000\000\000\001\239\000\000\000\000\005\139\001v\001\135\000\000\001x\001y\001=\002\007\000\000\000\000\000\000\002\011\000\000\001\029\0013\000\000\001\139\0014\001.\000\000\0015\0016\001\170\000\000\000\000\001\151\000\000\001\141\001|\001\139\000\000\000\000\000\000\001*\000\000\000\000\000\000\000\000\001\151\001.\001\141\001|\000\000\000\000\000\000\001\143\0017\001\144\001\175\001A\001+\000\000\002\012\000\000\001*\001\139\001\029\0011\002\r\001%\000\000\000\000\001&\000\000\001\151\000\000\001\141\001|\000\000\000\000\002\014\001+\000\000\000\000\000\000\001\237\000\000\001\029\0011\000\000\001\142\001%\000\000\000\000\001&\000\000\001(\000\000\000\000\000\000\000\000\000\000\001~\000\000\000\000\000\242\000\000\000\000\000\000\000\000\001%\000\000\001=\001&\000\000\000\000\000\000\000\000\001(\000\000\0013\000\000\000\000\0014\000\000\000\000\0015\0016\001\212\000\000\000\000\000\000\000\000\001=\000\000\000\000\000\000\001(\000\000\000\000\001\239\0013\001.\005\145\0014\000\000\000\000\0015\0016\001\253\002\007\000\000\0017\000\000\002\011\001A\001\029\001*\000\000\000\000\000\000\000\000\000\000\000\000\001.\001%\001\139\000\000\001&\000\000\000\000\000\000\000\000\0017\001+\001\151\001A\001\141\001|\001*\001\029\0011\000\000\001.\000\000\001t\001u\000\000\000\000\000\000\000\000\000\000\001(\000\000\000\000\002\012\001+\000\000\001*\000\000\000\000\002\r\001\029\0011\000\000\001v\001\135\000\000\001x\001y\000\000\000\000\000\000\002\014\000\000\001+\001%\000\000\000\000\001&\000\000\001\029\0011\000\000\000\000\000\000\001=\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0013\000\000\000\000\0014\001.\000\000\0015\0016\001\255\001(\000\000\000\000\000\000\001%\001=\001\143\001&\001\144\002\146\001*\000\000\000\000\0013\000\000\000\000\0014\000\000\000\000\0015\0016\002[\000\000\0017\001=\000\000\001A\001+\000\000\000\000\000\000\001(\0013\001\029\0011\0014\000\000\000\000\0015\0016\002n\001\142\000\000\000\000\000\000\0017\001.\000\000\001A\001t\001u\000\000\000\000\001~\001%\000\000\000\242\001&\000\000\000\000\000\000\001*\000\000\000\000\0017\000\000\000\000\001A\000\000\001v\001\158\000\000\001x\001y\000\000\000\000\000\000\001.\001+\001=\000\000\001(\000\000\000\000\001\029\0011\000\000\0013\000\000\000\000\0014\000\000\001*\0015\0016\002\172\000\000\000\000\001%\000\000\000\000\001&\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001+\000\000\000\000\000\000\000\000\000\000\001\029\0011\001\139\000\000\0017\000\000\000\000\001A\000\000\000\000\001(\001\151\001.\001\141\001|\001=\001t\001u\000\000\000\000\000\000\000\000\000\000\0013\000\000\000\000\0014\001*\000\000\0015\0016\002\177\000\000\001}\000\000\000\000\001v\001\135\000\000\001x\001y\000\000\000\000\000\000\001+\001~\001=\000\000\000\242\000\000\001\029\0011\000\000\000\000\0013\0017\001.\0014\001A\000\000\0015\0016\003l\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001*\000\000\000\000\000\000\000\000\000\000\000\000\001t\001u\001\143\000\000\001\144\003\139\000\000\000\000\0017\000\000\001+\001A\000\000\000\000\000\000\000\000\001\029\0011\001=\000\000\001v\001\135\000\000\001x\001y\000\000\0013\001t\001u\0014\000\000\001\139\0015\0016\003s\000\000\000\000\001\142\000\000\000\000\001\140\000\000\001\141\001|\000\000\000\000\000\000\001v\001\135\001~\001x\001y\000\242\000\000\000\000\000\000\000\000\000\000\0017\000\000\000\000\001A\001=\000\000\001\143\000\000\001\144\003\142\000\000\000\000\0013\000\000\000\000\0014\000\000\000\000\0015\0016\003\131\000\000\001t\001u\000\000\000\000\000\000\002D\002E\001u\000\000\000\000\000\000\001\143\000\000\001\144\003\145\000\000\001t\001u\000\000\001\142\001v\001\135\0017\001x\001y\001A\000\000\000\000\004m\000\000\000\000\001~\001\237\001\139\000\242\004u\001v\001\135\000\000\001x\001y\000\000\001\151\000\000\001\141\001|\001\142\000\000\000\000\000\000\001%\000\000\000\000\001&\000\000\000\000\000\000\000\000\001~\004v\000\000\000\242\001%\000\000\001\143\001&\001\144\003\153\000\000\000\000\000\000\001%\000\000\000\000\001&\000\000\000\000\001(\000\000\000\000\001\143\000\000\001\144\005E\000\000\000\000\000\000\001\239\000\000\001(\005\155\000\000\000\000\000\000\000\000\001\139\000\000\002\007\001(\001\142\000\000\002\011\000\000\001\029\001\151\002G\001\141\001|\000\000\000\000\000\000\001~\000\000\000\000\000\242\001\142\000\000\004y\000\000\002\200\000\242\001\b\001\139\001.\000\000\000\000\001%\001~\000\000\001&\000\242\001\151\000\000\001\141\001|\001.\000\000\000\000\001*\000\000\000\000\000\000\002\012\000\000\001.\000\000\000\000\000\000\002\r\000\000\001*\000\000\000\000\001(\004p\001+\000\000\000\000\000\000\001*\002\014\001\029\0011\000\000\000\000\000\000\000\000\001+\001%\000\000\000\000\001&\000\000\001\029\0011\001\139\001+\001%\000\000\000\000\001/\002\201\001\029\0011\001\151\000\000\001\141\001|\000\000\000\000\002\202\001\139\001\141\002\203\000\000\001(\000\000\000\000\000\000\001.\001\151\000\000\001\141\001|\001(\001%\000\000\001=\006\018\000\000\000\000\000\000\000\000\000\000\001*\0013\000\000\000\000\0014\001=\000\000\0015\0016\005V\000\000\000\000\000\000\0013\001=\000\000\0014\001+\001(\0015\0016\005\185\0013\001\029\0011\0014\000\000\001.\0015\0016\005\197\000\000\000\000\0017\000\000\001%\001A\000\000\006\018\000\000\000\000\000\000\001*\000\000\000\000\0017\000\000\000\000\001A\000\000\000\000\001*\000\000\000\000\0017\000\000\000\000\001A\000\000\001+\000\000\000\000\001(\000\000\006\020\001\029\0011\000\000\001+\001=\001%\000\000\000\000\001&\001\029\0011\000\000\0013\000\000\001*\0014\000\000\000\000\0015\0016\005\223\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001+\001(\000\000\000\000\000\000\000\000\001\029\006\023\000\000\000\000\000\000\000\000\006\020\0017\000\000\001=\001A\000\000\001%\000\000\000\000\001&\000\000\0013\000\000\000\000\0014\001*\000\000\0015\0016\005\239\0013\000\000\000\000\0014\000\000\000\000\0015\0016\000\000\000\000\000\000\000\000\001+\001(\000\000\001.\000\000\000\000\001\029\006\023\000\000\000\000\000\000\0017\000\000\000\000\001A\000\000\0013\000\000\001*\006\024\0017\000\000\0015\0016\001%\000\000\000\000\001&\000\000\000\000\000\000\000\000\005\226\000\000\006\025\001+\006\026\000\000\000\000\000\000\000\000\001\029\0011\000\000\000\000\000\000\001%\001.\0017\006\018\000\000\001(\000\000\000\000\002D\002E\001u\000\000\000\000\000\000\0013\000\000\001*\006\024\000\000\000\000\0015\0016\000\000\000\000\000\000\000\000\000\000\001(\000\000\000\000\005\226\002\153\006%\001+\006\026\000\000\000\000\000\000\000\000\001\029\0011\001=\001%\000\000\000\000\006\018\0017\000\000\000\000\0013\000\000\001.\0014\000\000\000\000\0015\0016\006\140\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001*\000\000\000\000\001(\000\000\000\000\000\000\006\020\000\000\001%\000\000\000\000\001&\000\000\000\000\0017\000\000\001+\001A\001=\000\000\000\000\001*\001\029\0011\000\000\000\000\0013\001%\000\000\0014\001&\000\000\0015\0016\006\158\001(\000\000\000\000\001+\001%\000\000\002G\001&\000\000\001\029\006\023\000\000\000\000\006\020\000\000\000\000\000\000\000\000\002H\001(\002\200\000\242\000\000\0017\000\000\000\000\001A\000\000\001*\000\000\000\000\001(\000\000\001=\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0013\000\000\000\000\0014\001+\001.\0015\0016\006\182\000\000\001\029\006\023\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001*\000\000\0013\000\000\001.\006\024\000\000\000\000\0015\0016\000\000\000\000\0017\000\000\000\000\001A\001.\001+\005\226\001*\006\242\002\201\006\026\001\029\0011\000\000\000\000\000\000\000\000\006)\002\202\001*\001\141\002\203\0017\000\000\001+\000\000\000\000\000\000\000\000\000\000\001\029\0011\0013\000\000\000\000\006\024\001+\000\000\0015\0016\000\000\000\000\001\029\0011\000\000\006*\007\188\006+\005\226\000\000\007\012\000\000\006\026\000\000\000\000\000\000\001%\001=\000\000\001&\000\000\000\000\000\000\000\000\0017\0013\000\000\000\000\0014\000\000\000\000\0015\0016\007E\000\000\000\000\001=\006,\001%\000\000\000\000\001&\000\000\001(\0013\000\000\000\000\0014\001=\000\000\0015\0016\007\135\000\000\000\000\000\000\0013\0017\000\000\0014\001A\000\000\0015\0016\007\138\001(\000\000\000\000\000\000\000\000\000\000\001%\000\000\006-\001&\000\000\0017\000\000\000\000\001A\000\000\000\000\000\000\006.\006/\000\000\0060\000\000\0017\001.\000\000\001A\000\000\000\000\001t\001u\000\000\000\000\001(\000\000\000\000\000\000\000\000\000\000\001*\000\000\000\000\000\000\000\000\006l\000\000\001.\000\000\000\000\001v\002z\000\000\001x\001y\001%\000\000\001+\001&\000\000\000\000\000\000\001*\001\029\0011\000\000\000\000\000\000\000\000\0062\007\190\000\000\000\000\000\000\0064\006>\000\000\000\000\000\000\001+\001.\000\000\001(\001t\001u\001\029\0011\006h\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001*\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001v\002z\006i\001x\001y\000\000\001=\000\000\000\000\001+\000\000\000\000\000\000\000\000\0013\001\029\0011\0014\000\000\000\000\0015\0016\000\000\000\000\000\000\001.\001}\000\000\001=\000\000\000\000\001t\001u\000\000\000\000\000\000\0013\006)\001~\0014\001*\000\242\0015\0016\000\000\000\000\0017\000\000\000\000\001\248\000\000\001v\002y\000\000\001x\001y\000\000\001+\000\000\000\000\000\000\001=\000\000\001\029\0011\006*\000\000\006+\0017\0013\000\000\001\250\0014\007\015\000\000\0015\0016\000\000\000\000\001}\001%\000\000\000\000\001&\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001~\001%\000\000\000\242\006\014\000\000\006,\000\000\000\000\000\000\0017\001\139\000\000\004\187\000\000\000\000\001(\000\000\0012\000\000\001\140\000\000\001\141\001|\000\000\000\000\0013\000\000\001(\0014\000\000\000\000\0015\0016\007\016\007\015\002D\002E\001u\001}\000\000\000\000\006-\000\000\002D\002E\001u\000\000\000\000\000\000\000\000\001~\006.\006/\000\242\0060\000\000\000\000\0017\002\184\000\000\000\000\001.\000\000\001\139\000\000\000\000\002\199\002D\002E\001u\000\000\000\000\001\140\000\000\001\141\001|\001*\0061\000\000\000\000\002D\002E\001u\000\000\000\000\000\000\007\024\000\000\001*\000\000\002\223\000\000\000\000\001+\000\000\000\000\000\000\000\000\000\000\001\029\0011\0062\000\000\003\188\000\000\001+\0064\006>\000\000\000\000\000\000\001\029\0011\001%\001\139\000\000\006\021\000\000\000\000\006h\000\000\000\000\000\000\001\140\000\000\001\141\001|\000\000\000\000\000\000\000\000\001\237\000\000\000\000\000\000\002G\000\000\006i\000\000\000\000\001(\000\000\000\000\002G\000\000\007\128\000\000\002H\000\000\002\200\000\242\000\000\000\000\0013\000\000\002H\0014\002\200\000\242\0015\0016\000\000\000\000\000\000\000\000\0013\000\000\002G\0014\000\000\000\000\0015\0016\000\000\000\000\000\000\000\000\000\000\000\000\002H\002G\002\200\000\242\000\000\000\000\0017\001\239\000\000\000\000\005\164\000\000\000\000\002H\000\000\002\200\000\242\002\007\0017\000\000\000\000\002\011\001*\001\029\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\201\000\000\000\000\000\000\000\000\000\000\000\000\001+\002\201\002\202\000\000\001\141\002\203\001\029\0011\000\000\000\000\002\202\000\000\001\141\002\203\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\012\000\000\002\201\000\000\000\000\000\000\002\r\000\000\000\000\000\000\000\000\002\202\000\000\001\141\002\203\002\201\000\000\000\000\002\014\000\000\000\000\000\000\000\000\000\000\002\202\000\000\001\141\002\203\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0013\000\000\000\000\0014\000\000\000\000\0015\0016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0017")) + ((16, "\001\218\0011\000%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\150\000\000\000\000\001+\002\226\000)\001\011\000s\0004\000X\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\030\000\000\000\000\000\000\000\000\000\000\000.\000\000\000\000\000\000\000\162\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000D\194\000\000\000\000\000\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\014\001\000\000\000\001<\001D\003\028\000\000\000\000\000\000\001\242F\210\001X\002\030\000\016\000\000\000\000\000\000\005R\000\000\000\000\001\196\000\000\000\000\000\000\000\000\002\252\000\000\001\204\000\000\000\000\000\000\000\000\000\000\000\007\000\000\003L\003\018\004D\000\000\000\000\n4\014\014\000\000\000\000\005\218\000\000\006F\000\000O\192\003H\003D\000\000\000\000\001\246\002$\005\140\007\192\004\176\003\018\003\018\000@\003\206\000$\002N\002v <\000\000\000\000\003\188V\156\000\000\003l\000\000\000\130\003\176\000\000\00285p\004\192\000\000\000\127\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031\254\003f\000\000\000\000\000\0001\018\t\016\000\000b\136\000\000\000\000\003JV\180\000\000\000\000\000\000\000\000\000\000\000\000\003 \000\000\000\000\005\026\006.\000\000\029\142\005\026\005\020\000\000\000\000\000\000%\156\000\000%\192\005\026\005\026\005\026\000\000\000\000\003\184\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0006\162\000\000\002\150\004h\000\000WR\002\182`\188\000\000\000\000\002\214\000\000\000\000\000\000\003 \000\000\000\000\000\000 \150\000\000\000\000\000\000\000\000\000\000\000\000\000\029\004`\000\000\000\000\000\000\003 \004\186\000\000\003 V\248\003 \000\000\000\000E(\000\000\000\000\005P\000\000\000\000\000\000\000\000%>\004T\002\220\004X7\000\000\000\000\000\000\000\000\000W\164\003 \000\0007P\000\000\000\000\000\000W\206\003 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\132\000\000\004\182\005d\005V\000\000\000\000\000\000\000\000\005$\000\000\000\000\006D\000\141\006V\006\160\b2\000\000\000\000\000\000\004\214\004\230\006r\000\154\000\000\000\000\000\186\006\128E\150\005\016\007j\001\003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\158 \250\005@\007\130!F\n\170%>7\166\000\000E\184\011\144\000\000\000\000\000\000W\226\003 \000\0007l\000\000\000\000\000\000X<\003 \000\000\000\000!\194\",\000\000\000\210\000\000\000\000\000\000\000\000\006\022Xz\003 \006:8r\005\154\007\206c\006\000\000\005Z\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\006\000\000\000\000\000\000\000\000\007&8\176\000\000\000\000c\138\000\0009\000\000\000\000\000\000\000X\184\003 \000\000\000\000c\208\000\000\000\000\000\000\000\000\006\n\007\2149\026\b\158\000\000\000\000c\218\000\0009>\000\000\000\000\006\\\000\000\000\000\000\000:\b\000\000\000\000\000\000X\210\003 \000\000\000\000d\026\000\000\000\000\006\\:F\000\000\006\\:\132\006\132\0076\007\158\000\000\000\000d4\000\000\000\000\000\000\000\000\006\\\000\000\000\000:\212\000\000\000\000\000\000\000\000YN\003 \000\000\000\000d\152\000\000\000\000\006\\Yv\000\000\003 \000\000\000\000:\238\000\000\006\\\002\022\000\000\000\000\006\\\006\\\000\000\006\\\000\000\000\000\006\\\000\000\000\000\",\000\000\000\000\000\000\000\000\006\\\"\168\000\000\000\000\006\\\000\000\001F\007\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000d\164\000\000\000\000\000\000\007\n;\018\000\000\006\\\000\000\000\000\000\000\000\000;d\000\000\000\000\000\000Y\202\003 \000\000\000\000d\242\000\000\000\000\007\n\000\000;\220\000\000\000\000\000\000Y\226\003 \000\000\000\000e\020\000\000\000\000\007\nex\000\000\022\000\000\000\000G\150\000\000\000\000\011\192\000\000\000\000\000\000h\028\000\000\n\132\t*\r\198\000\000%\254\000\000hz\000\000\nJ'\026\000\000\000\000\ndG\206\n\152\t0\014r\000\000\ndH\028\n\178\t4\014\176\000\000\nd\000\000h\154\000\000H>\n\180\t6\015X\000\000\nd'h\004$'\154\000\000\000\000Hp\n\182\tP\015\204\000\000\ndH\196\n\184\tR\0162\000\000\ndH\204\n\204\tT\016@\000\000\ndI\242\n\206\t\\\017\000\000\000\ndI\250\n\212\tj\017P\000\000\ndJ8\n\230\t\128\017l\000\000\ndJ\162\n\236\t\140\018:\000\000\ndJ\230\n\240\t\144\018r\000\000\ndK2\n\242\t\164\018\176\000\000\ndK\212\n\252\t\170\019B\000\000\ndL\012\0118\t\176\019\\\000\000\ndLZ\011:\t\178\019\208\000\000\ndL\188\011b\t\180\020\026\000\000\ndL\200\011f\t\182\020\238\000\000\ndMj\011j\t\194\021\002\000\000\ndM\184\011\184\t\210\021z\000\000\ndM\204\011\206\t\222\021\242\000\000\ndNZ\011\228\t\230\022\012\000\000\ndN\140\000\000\000\000\r<\000\000\000\000\000\000h\192\000\000\012\002\t\240\022\132\000\000\ndN\160\012\024\t\252\022\250\000\000\nd\n\002\023\020(@(\210\000\000\004\186\012\198\000\000[\184\003 )<\000\000\000\000\012X\000\000\\\000\003 )\130\000\000\000\000)\222\000\000\000\000\011\006\000\000\000\000*\016\000\000\000\000\000\000\000\000\\&\003 +\006\000\000\007\n+\150\000\000>6\000\000\000\000\000\000\000\000\\\148\003 \000\000\000\000f\002\000\000\000\000\007\n>\160\000\000\006\\\002\176\000\000\000\000\000\000\004\028\005*\000\000\000\000\000\000\nd\nd?\012\000\000\000\000\000\000\000\000N\252\0126\n\018\023\140\000\000\nd?\186\000\000\000\000\000\000O\136\012T\n\026\023\166\000\000\nd?\226\000\000\000\000\000\000P*\012X\n(\024\026\000\000\nd\006r+\212\000\000\000\000\000\000Pp\012\130\n*\024\150\000\000\nd+\220\000\000\000\000\000\000P\152\012\156\n<\025\000\000\000\nd,>\000\000\000\000\000\000P\204\012\160\nP\025|\000\000\nd\000\000\000\000@&\000\000\000\000\000\000Q\024\012\172\nV\025\240\000\000\nd@\144\000\000\000\000\000\000Qn\012\182\np\026\n\000\000\ndA@\000\000\000\000\000\000R:\012\216\n\160\026\130\000\000\nd\000\000R\\\012\236\n\168\026\156\000\000\nd\000\000\000\025\000\000\000\000\nd\012\246\000\000\000\000,\144\000\000-b\000\000\000\000\000\000\000\000\000\000-\196\000\000\000\000-\206\000\000\000\000\000\000\000\000A\132\000\000\000\000A\238\000\000\000\000B4\000\000\000\000\000\000\012\254\n\178\027\016\000\000\nd\000\000\000\000.\018\000\000.\204\000\000\000\000\000\000\000\000\000\000R\220\r\002\n\198\027*\000\000S\016\r\028\n\206\027\162\000\000\nd\ndS2\r\"\n\210\027\188\000\000\nd\000\000\000\000B\158\000\000\000\000B\226\000\000\000\000SF\000\000\000\000\014\174\000\000\000\000\000\000h\230\000\000\r\158\n\214\0280\000\000\nd\000\000\007\n/p\000\000\000\000/\152\000\000.:\000\000\000\000F\000\000\000\000\000\000\000C\136\000\000\000\000\000\000\000\000C\146\000\000\000\000\000\000\000\000\014\202\000\000\000\000\000\000\r\178\000\000\002\230\000\000\011\228\014t\000\000\004\244\000\000\000\000\000\000\000\000\000\000\000\000\002Z\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\r\184\n\240\028J\000\000\nd\000\000\014\252\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n\254\005t\000\014/\220\000\000\r\226\011\004\014\142\001\164\006\174\000\014)\156\000\000\000(\007\172\000\014\000\0000l\000\000\005h\000\000\014\002\011.\004\154\000\000\000\000\000\000\000\000\000\000\014$\001v\000\179\000\000\000\000\000\000U.\000\000aT\000\000\011@\000\000\011F\000\000\000\000\000\000\000\000\004\006\000\000\000\000\000\000&\232\005\026\000\000\005\026\012\226\000\000\003,\000\000'P\005\026\005\026\000\0002\156\005\026\005\026\011R\000\0001*\000\000\000\000\011T\0150\000\000\029P\005\230\000\000\000\000\000\000\000\000\000\000\000\000\014J\011h\028\194\000\000\nd\000\000\000\000\000\000\000\000\000\000\014N\011l\bj\000\014\000\000+\"\000\000\000(\000\000\015\168\000\000\000\000\000\000\000\000\000\000\028\220\000\000\000\000\000\000\000\000\014X\011x\029j\000\000\000\000\000\000-\012\000\000\000(\000\000-8\000\000\000(\000\000/$\000(\000\000\nd\000\000\000\0000P\000\000\000(\000\000\002\156\000\213\007\142\007\216\007\\\000\233\007\146\007\225\000\234\004<\003e\000\235\000\236\003f\006H\005~\007\218\001w\000\206\000\220\0032\002\194\007\226\006\253\000\213\000\216\001\003\006\145\000\239\003t\b)\001\200\0034\002\148\007\219\000\221\007\214\005\129\000\222\005f\006\146\007\216\005f\006\136\006\152\b\175\001w\001\200\003e\000\224\000\177\003f\b\131\003v\007\218\b\222\002\211\001\172\0032\007\204\001\002\002\210\002\211\001\172\000\227\bm\0008\003t\007`\001\200\0034\004\r\007\219\b\225\b\226\005f\0035\b\228\001\015\004>\007\207\000\228\001&\000\247\003;\006\145\005$\000\213\000\231\007\208\b\230\003v\005t\005s\005u\006\246\005s\005u\006\146\007\004\007\005\007\204\006\178\002\210\002\211\001\172\b\245\000\152\000\224\000\162\002\142\004<\0014\003P\004<\001\167\b\237\000\189\0035\b\238\007\r\007\209\007\207\000\227\007\014\005\138\003;\002{\007\n\005s\005u\007\208\b\246\007\004\007\005\000\206\000\152\000\232\b=\002\142\000\228\000\213\000\231\000\206\004<\000\233\000\213\000\231\000\234\000\213\000\216\000\235\000\236\007\006\007\022\003P\007\210\001:\007\014\005\138\003~\003`\0008\007\209\bx\by\007\211\b\223\001s\0031\001w\001w\001\153\002\214\004<\0031\001w\000\240\b\b\000\221\000\255\bv\bU\002}\006B\000\206\007\239\b\233\000\206\007\014\005\138\000\213\000\216\002\149\000\213\000\231\000\232\002\153\007\210\000\213\002\180\005b\005\138\003`\000\233\007\226\001U\000\234\007\211\005 \000\235\000\236\001+\001Y\004=\002\214\bw\0031\001w\007\214\000\206\000\221\005\213\000\217\007\216\005Y\000\213\000\231\b\250\005G\001h\003e\002\193\000\221\003f\001w\000\240\007\218\004<\000\255\006\150\0032\002\154\001w\006U\002{\001V\007\226\002\155\000\248\003t\001p\001\200\0034\005\243\007\219\000\206\001\171\001\172\002\148\002\156\007\214\000\213\000\216\004<\000\246\007\216\000\227\007\204\004<\002\210\002\211\001\172\003e\003v\001\127\003f\001\173\001\205\007\218\001\175\001\176\005X\0032\000\228\0035\007\205\007\235\001\160\007\207\000\213\000\231\003t\003;\001\200\0034\005\230\007\219\007\208\007\221\002\194\002}\004\189\002 \002\176\001w\001\153\001\210\005\144\000\227\007\204\002\149\002\210\002\211\001\172\002\153\003v\000\213\001\020\002\148\001\163\000\227\003P\001\211\001\242\b\237\000\228\0035\b\238\b\166\007\209\007\207\000\213\000\231\b\132\003;\006\141\005\235\000\228\bF\007\208\b\241\007\178\004\200\000\213\000\231\007\185\bS\000\233\000n\005\249\000\234\b\t\005X\000\235\000\236\001\209\002\180\001_\004\128\002\154\002\030\001w\001\153\003P\007\210\002\155\001a\001\181\bw\003`\001w\007\209\007\181\b3\007\211\001\202\007\181\002\156\004<\bX\001i\002\214\007\181\0031\001w\005O\b4\001n\002\193\000\233\007\183\001w\000\234\005X\007\183\000\235\000\236\007\168\007\225\004\160\007\183\000\233\0008\001\214\000\234\001\215\007\210\000\235\000\236\006\002\001\172\003`\005f\007\226\006\017\005\138\007\211\000\152\007\184\000\184\002\142\000\254\007\184\002\214\004<\0031\001w\007\214\007\184\001\020\001\171\001\172\007\216\bO\006\020\001\198\b\244\001w\001\020\003e\b\159\001\213\003f\001\236\001\231\007\218\001\200\001\179\005\225\0032\001\173\001\205\001\020\001\175\001\176\007\226\002\194\004<\003t\001\020\001\200\0034\bB\007\219\005\240\007\018\005s\005u\007\204\007\214\002\210\002\211\001\172\004<\007\216\ba\006\020\004<\005f\001w\001\210\003e\003v\002\180\003f\0035\007\205\007\218\b\167\007\207\004<\0032\b\128\003;\006v\001\235\001\211\002\248\007\208\007\231\003t\000\206\001\200\0034\001q\007\219\007\127\000\213\000\216\001w\006\217\b/\005T\001\200\007\144\002\193\001\128\b\160\001w\002$\000\221\005X\003P\000\222\003v\001\171\001\172\006\154\0022\001\209\007\209\bh\005s\005u\000\152\004<\002\129\002\142\006\218\007\027\006\219\001\181\002c\005\231\001w\001\173\001\205\006\171\001\175\001\176\002h\b\161\004\213\b;\001\164\001\200\b\168\000\213\001\203\000\152\006\179\006\231\002\142\006Y\005\138\007\210\005\146\000\206\000\221\000\239\003`\000\222\006\220\000\213\000\231\007\211\001\020\001\214\002\180\001\215\000\206\b`\002\214\002\194\0031\001w\000\213\000\231\001\020\000\221\007w\001\206\000\225\000\224\002n\002p\002x\000\206\000\221\007\234\b\169\000\222\006\148\000\213\000\231\005\236\006\221\005\163\000\227\001\198\002\193\005\139\002\205\001w\007\226\006\253\006\222\006\223\001\231\006\224\001\200\001\179\006\148\004<\001\209\000\228\001\020\002\208\007\214\b\170\001\020\000\213\000\231\007\216\001s\006\148\001\181\001w\001x\001w\003e\000\224\007\028\003f\005E\006\253\007\218\002\222\b\171\000\152\0032\006\241\002\142\006\250\005\138\002m\000\227\007\000\002\243\003t\002\246\001\200\0034\002\171\007\219\007\137\001\020\001\020\001\020\002\252\006\226\000\224\002\135\000\228\007\172\006\228\006\238\000\227\002\194\000\213\000\231\000\232\003\025\003v\001\020\002\180\000\227\bo\007\024\000\233\003*\003/\000\234\005\241\000\228\000\235\000\236\007\029\004<\001\020\000\213\000\231\007\139\000\228\001\198\000\221\007\025\002\180\000\222\000\213\000\231\0038\003L\001\231\005\215\001\200\001\179\002\193\007\140\001\020\001w\000\240\002\137\007\142\000\255\007\004\007\005\007\143\003\\\000\232\001\020\003j\001\020\003p\003y\000\221\005\253\000\233\000\222\002\193\000\234\001\020\001w\000\235\000\236\007\006\007\022\003\132\003\138\003\144\007\014\005\138\006\253\003\150\001\020\007\004\007\005\002\152\000\233\000\232\003\156\000\234\001\020\001\020\000\235\000\236\002\170\000\233\006\012\000\240\000\234\003\162\000\255\000\235\000\236\007\006\007\022\003\168\000\224\003\174\007\014\005\138\006\253\001\020\001\020\002\194\002\210\002\211\001\172\003\180\000\240\007\144\003\186\000\227\b}\003\192\003\198\003\204\003\210\000\240\001\020\0035\000\255\001\020\003\216\001\020\001\020\002\194\000\224\003;\000\228\007\151\003\222\005>\001w\005\169\000\213\000\231\003\228\001\020\001\020\001\020\003\234\000\227\005:\001\020\002\204\003\248\0066\002\210\002\211\001\172\001\020\003\254\000\213\002\207\004\002\002\221\003P\002\242\000\228\002\245\004\025\001\020\004J\002\251\000\213\000\231\004T\001\020\003\007\001\020\005\029\b-\005\138\004^\004i\003\004\003\n\005%\003\021\001\020\007\004\007\005\001\020\004s\000\232\001\020\001\020\001\020\001\020\003\024\003\031\003)\000\233\004}\001\020\000\234\004\137\000n\000\235\000\236\007\006\007\022\001\020\0052\003`\007\014\005\138\003.\001\020\004\147\007\004\007\005\001\020\0037\000\232\003?\002\214\001\020\0031\001w\002]\001\172\000\233\001\020\000\240\000\234\001\020\000\255\000\235\000\236\bk\bl\004\026\004\157\001\020\007\014\005\138\004\164\001\020\003K\001\173\002\231\004\203\001\175\001\176\001\020\001\020\002\213\003b\002\210\002\211\001\172\004\219\003U\000\240\001\020\004\224\000\255\004\231\005)\004\253\0031\001w\001\153\0035\001\020\003[\004?\001\020\002-\004<\004\025\003;\0057\003e\003s\003i\003f\005\011\000\221\005F\001\020\006\190\005L\0032\005\001\0023\001\171\001\172\003o\003x\003\131\003\137\003t\001s\001\200\0034\001w\001x\004<\005 \003P\003\143\003\149\005\\\001\020\003\155\001\173\001\205\001\020\001\175\001\176\004<\005m\001\020\003\161\005o\003v\003\167\001\209\003\173\003\179\005\135\005\140\001\020\007\137\003\185\0032\001\020\004\214\001\020\001\181\001\020\005\152\001w\005\162\0033\001\210\001\200\0034\006\025\005\182\000n\005!\001s\001\020\005\214\001w\001x\003`\001\171\001\172\001\020\001\211\002\248\001\020\003\191\003\197\005\220\005\004\005\t\002\214\007\139\0031\001w\004<\0024\000\227\0025\006\028\001\173\001\205\005\227\001\175\001\176\007\137\001\020\003\203\007\140\003\209\005\233\003\215\006$\007\142\000\228\001\020\001\209\007\153\001\020\004<\000\213\000\231\003\026\003b\001\020\001\020\000\221\004<\001\181\001\198\001\210\001w\005\252\001\171\001\172\001\020\004<\001\020\001\231\003:\001\200\001\179\007\139\001\020\006\001\006\016\001\211\002\248\001\020\003e\003\221\004<\003f\001\173\001\205\005v\001\175\001\176\007\140\0032\001\020\003\227\005|\007\142\001\214\006(\001\215\007\171\003t\006\024\001\200\0034\003\233\003\241\001\020\0039\006\027\006\"\000\233\001\209\004<\000\234\001\020\001\210\000\235\000\236\006&\003\247\006,\0067\0062\001\181\003v\006>\001w\006S\001\198\006I\003\253\001\211\002\248\006X\003:\004\b\001\020\001\231\006M\001\200\001\179\006]\000\240\004\015\006g\004I\000\227\006m\001\020\001\020\006x\001\171\001\172\006\129\002\210\002\211\001\172\006\131\004<\001\214\004S\001\215\004]\000\228\001\209\001\171\001\172\006\149\006\135\000\213\000\231\001\173\001\205\001\020\001\175\001\176\001\181\005\029\004<\001w\001\020\001\020\006\161\004h\005%\001\173\001\205\003:\001\175\001\176\001\020\001\198\001\020\003M\001\020\006\156\004r\001\020\004|\001\020\001\231\001\210\001\200\001\179\004\136\001\020\006\173\003]\000\221\004\146\005&\000\222\001\214\001\020\001\215\001\210\001\020\001\211\002\248\001\020\006\183\004<\001\020\006\208\004<\006\230\004\156\000\233\006\166\001\020\000\234\001\211\002\248\000\235\000\236\b]\004\163\005\130\004<\001\020\001\020\004<\004\175\006\240\001\198\004\202\004<\004\218\006\206\006\252\001\209\001\171\001\172\001\231\002\213\001\200\001\179\007\016\004<\005\133\004\223\007 \001\181\004\230\001\209\001w\005)\001\020\0031\001w\001\153\001\173\001\205\003:\001\175\001\176\001\181\004<\001\020\001w\007&\000\224\001\171\001\172\004<\007*\007F\003:\007n\007\170\004\246\006\214\001\020\003k\006\227\001\020\000\227\001\020\001\214\007s\001\215\001\210\001\173\001\205\007\154\001\175\001\176\005 \006\235\000\221\007x\007\002\001\214\000\228\001\215\001\020\0073\001\211\002\248\000\213\000\231\001\020\004<\007\150\003q\004\252\005\025\007~\007V\001\020\001\198\007\134\001\210\001\020\0032\002{\004<\005\"\0056\001\231\004<\001\200\001\179\0033\001\198\001\200\0034\007p\001\211\002\248\001\209\005<\001\020\001\231\007{\001\200\001\179\001\020\001\020\005K\001\020\001\020\001\181\007\175\004<\001w\001\171\001\172\004<\000\232\004<\001\020\005M\003:\007\196\005[\001\020\000\233\005\134\004<\000\234\001\209\001\020\000\235\000\236\bd\001\173\001\205\004<\001\175\001\176\002}\007\157\001\181\002\172\001\020\001w\000\227\001\214\001\020\001\215\002\149\005\142\001\020\003:\002\153\007\169\000\213\003z\000\240\007\173\005\151\000\255\005\161\000\228\005\172\001\210\004<\005\181\004<\000\213\000\231\b\016\bN\001\171\001\172\005\226\004<\b\031\001\214\001\198\001\215\001\211\002\248\007\177\001\020\b0\b<\007\182\001\231\007\194\001\200\001\179\005\219\001\173\001\205\001\020\001\175\001\176\007\201\002\154\004<\004<\005\221\bJ\bL\002\155\005\224\007\215\004<\004<\001\198\005\239\004<\004<\001\209\003\133\005\229\002\156\005\238\001\231\005\234\001\200\001\179\001\210\001\171\001\172\001\181\000\233\005\237\001w\000\234\001\171\001\172\000\235\000\236\005\251\007\222\003:\007\232\001\211\002\248\006\000\006\011\001\020\001\173\001\205\bA\001\175\001\176\001\020\006\n\001\173\001\205\006\015\001\175\001\176\006\026\001\020\001\020\bO\006%\006!\001\214\0061\001\215\001s\003\139\006+\001w\001x\bq\b\127\001\209\003\145\001\210\001\020\001\020\006-\b\139\b\231\006E\001\210\b\242\b\247\001\181\0069\006D\001w\006?\006C\001\211\002\248\006R\006W\001\198\003:\007\137\001\211\002\248\006\182\006\\\006_\006c\001\231\006k\001\200\001\179\006r\006}\006\181\006\174\006\175\006\180\006\184\006\185\006\216\006\209\006\210\006\215\006\237\001\214\006\233\001\215\001\209\006\234\006\236\007\023\001\171\001\172\006\251\001\209\006\255\007\001\007\139\007\003\001\181\007\015\007\031\001w\007!\007\"\007'\001\181\007+\007/\001w\003:\001\173\001\205\007\140\001\175\001\176\001\198\003:\007\142\007A\007H\007L\007\190\007d\007y\001\231\007\145\001\200\001\179\007\155\007\203\001\171\001\172\003\151\007\197\001\214\007\198\001\215\007\202\007\217\b\015\001\210\001\214\b\024\001\215\001\171\001\172\b\030\b+\b?\b@\001\173\001\205\bD\001\175\001\176\bp\001\211\002\248\bt\b~\b\130\b\217\000\000\000\000\001\173\001\205\001\198\001\175\001\176\000\000\000\000\000\000\003\157\001\198\000\000\001\231\000\000\001\200\001\179\000\000\001\210\000\000\001\231\000\000\001\200\001\179\003\163\007\204\000\000\001\209\000\000\000\000\000\000\000\000\001\210\000\000\001\211\002\248\000\000\000\000\000\000\001\181\000\000\000\000\001w\b\228\000\000\000\000\007\207\000\000\001\211\002\248\003:\000\000\000\000\000\000\000\000\007\208\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\209\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\214\000\000\001\215\000\000\001\181\000\000\001\209\001w\000\000\000\000\001\171\001\172\007\209\000\000\000\000\003:\000\000\000\000\001\181\000\000\000\000\001w\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003:\001\173\001\205\001\198\001\175\001\176\000\000\000\000\000\000\001\171\001\172\001\214\001\231\001\215\001\200\001\179\000\000\000\000\007\210\000\000\000\000\000\000\000\000\003\169\000\000\001\214\000\000\001\215\007\211\001\173\001\205\001\210\001\175\001\176\000\000\000\000\000\000\000\000\000\000\000\000\001\171\001\172\000\000\001\198\000\000\000\000\000\000\001\211\002\248\b\229\000\000\003\175\001\231\000\000\001\200\001\179\000\000\001\198\000\000\001\210\001\173\001\205\000\000\001\175\001\176\000\000\001\231\007\213\001\200\001\179\000\000\000\000\000\000\000\000\000\000\001\211\002\248\000\000\000\000\000\000\001\209\007\214\003\181\000\000\000\000\000\000\007\216\000\000\000\000\000\000\001\210\000\000\001\181\000\000\000\000\001w\000\000\000\000\000\000\007\218\000\000\000\000\000\000\003:\000\000\000\000\001\211\002\248\001\209\000\000\000\000\000\000\000\000\001\171\001\172\000\000\000\000\007\219\000\000\000\000\001\181\000\000\000\000\001w\000\000\000\000\001\171\001\172\001\214\000\000\001\215\003:\000\000\001\173\001\205\000\000\001\175\001\176\000\000\001\209\000\000\000\000\000\000\000\000\000\000\000\000\001\173\001\205\000\000\001\175\001\176\001\181\000\000\000\000\001w\003\187\001\214\000\000\001\215\000\000\001\198\000\000\003:\001\210\000\000\000\000\000\000\000\000\003\193\001\231\000\000\001\200\001\179\000\000\000\000\000\000\001\210\000\000\000\000\001\211\002\248\000\000\000\000\000\000\001\171\001\172\000\000\001\214\001\198\001\215\000\000\000\000\001\211\002\248\000\000\000\000\000\000\001\231\000\000\001\200\001\179\000\000\000\000\000\000\001\173\001\205\000\000\001\175\001\176\000\000\000\000\000\000\001\209\000\000\000\000\000\000\000\000\000\000\000\000\001\198\000\000\001\171\001\172\000\000\001\181\001\209\003\199\001w\001\231\000\000\001\200\001\179\000\000\000\000\001\210\003:\000\000\001\181\000\000\000\000\001w\001\173\001\205\000\000\001\175\001\176\000\000\000\000\003:\000\000\001\211\002\248\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\214\000\000\001\215\003\205\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\210\000\000\001\214\000\000\001\215\002\210\002\211\001\172\000\000\000\000\000\000\000\000\001\209\000\000\000\000\000\000\001\211\002\248\000\000\000\000\000\000\001\198\000\000\000\000\001\181\000\000\000\000\001w\004\167\000\000\001\231\000\000\001\200\001\179\001\198\003:\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\231\000\000\001\200\001\179\000\000\000\000\001\209\000\000\004\168\000\000\000\000\000\000\000\000\001\171\001\172\000\000\000\000\001\214\001\181\001\215\000\000\001w\000\000\001\171\001\172\000\000\000\000\000\000\000\000\003:\000\000\000\000\000\000\001\173\001\205\000\000\001\175\001\176\000\000\000\000\000\000\000\000\000\000\001\173\001\205\000\000\001\175\001\176\000\000\001\198\000\000\000\000\000\000\000\000\001\214\003\211\001\215\000\000\001\231\000\000\001\200\001\179\002\213\001\210\000\000\003\217\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\210\002\214\000\000\0031\001w\000\000\001\211\002\248\000\000\000\000\001\171\001\172\000\000\001\198\000\000\000\000\001\211\002\248\000\000\000\000\000\000\000\000\001\231\000\000\001\200\001\179\000\000\000\000\000\000\000\000\001\173\001\205\000\000\001\175\001\176\000\000\000\000\000\000\000\000\001\209\000\000\004\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\209\000\000\001\181\003\223\000\000\001w\000\000\000\000\000\000\000\000\000\000\001\210\001\181\003:\000\000\001w\000\221\000\000\000\000\006\197\0032\001\171\001\172\003:\000\000\000\000\000\000\001\211\002\248\0033\000\000\001\200\0034\000\000\001\171\001\172\000\000\000\000\001\214\000\000\001\215\001\173\001\205\000\000\001\175\001\176\000\000\000\000\001\214\000\000\001\215\000\000\000\000\000\000\001\173\001\205\000\000\001\175\001\176\000\000\001\209\000\000\000\000\003\229\000\000\000\000\000\000\000\000\000\000\000\000\001\198\001\210\001\181\000\000\000\000\001w\003\235\000\000\000\000\001\231\001\198\001\200\001\179\003:\001\210\000\000\000\000\001\211\002\248\001\231\000\000\001\200\001\179\000\000\001\171\001\172\000\000\000\000\000\000\000\000\001\211\002\248\000\000\000\000\000\227\000\000\000\000\000\000\001\214\000\000\001\215\000\000\000\000\000\000\001\173\001\205\000\000\001\175\001\176\000\000\001\209\000\228\000\000\000\000\000\000\000\000\000\000\000\213\000\231\000\000\000\000\000\000\001\181\001\209\000\000\001w\003\249\000\000\000\000\000\000\001\198\000\000\000\000\003:\001\210\001\181\000\000\000\000\001w\001\231\000\000\001\200\001\179\001\171\001\172\000\000\003:\000\000\000\000\000\000\001\211\002\248\000\000\000\000\000\000\000\000\004\003\001\172\001\214\000\000\001\215\000\000\000\000\001\173\001\205\000\000\001\175\001\176\000\000\000\000\000\000\001\214\000\000\001\215\000\000\000\233\004\031\001\205\000\234\001\175\001\176\000\235\000\236\001\209\000\000\003\255\000\000\000\000\000\000\000\000\001\198\000\000\000\000\001\210\000\000\001\181\000\000\000\000\001w\001\231\000\000\001\200\001\179\001\198\000\000\002-\003:\000\240\000\000\001\211\002\248\000\000\001\231\000\000\001\200\001\179\001\171\001\172\000\000\000\000\000\000\004$\0023\000\000\000\000\000\000\000\000\000\000\000\000\001\171\001\172\001\214\000\000\001\215\000\000\000\000\001\173\001\205\000\000\001\175\001\176\000\000\001\209\000\000\000\000\000\000\000\000\002{\000\000\001\173\001\205\000\000\001\175\001\176\001\181\001\209\000\000\001w\004K\000\000\000\000\000\000\000\000\001\198\000\000\003:\001\210\001\181\000\000\000\000\001w\004U\001\231\000\000\001\200\001\179\000\000\000\000\000\221\001\210\000\000\000\000\001\211\002\248\000\000\000\000\000\000\001\171\001\172\000\000\001\214\000\000\001\215\000\000\000\000\001\211\002\248\000\000\000\000\000\000\004:\004;\0024\002}\0025\000\000\002~\001\173\001\205\000\000\001\175\001\176\000\000\002\149\000\000\001\209\000\000\002\153\000\000\000\213\000\000\000\000\001\198\000\000\000\000\000\000\000\000\001\181\001\209\004_\001w\001\231\000\000\001\200\001\179\001\198\000\000\001\210\003:\000\000\001\181\000\000\000\000\001w\001\231\000\000\001\200\001\179\000\000\001\171\001\172\003:\000\000\001\211\002\248\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\154\001\214\000\000\001\215\000\227\000\000\002\155\001\173\001\205\002{\001\175\001\176\000\000\000\000\001\214\000\000\001\215\002{\002\156\000\000\000\000\000\228\000\000\000\000\001\209\000\000\000\000\000\213\000\231\004j\bQ\000\000\000\000\001\198\000\000\000\000\001\181\001\210\000\000\001w\001\171\001\172\001\231\000\000\001\200\001\179\001\198\003:\000\000\000\000\000\000\000\000\000\000\001\211\002\248\001\231\000\000\001\200\001\179\000\000\001\173\001\205\000\000\001\175\001\176\002}\000\000\000\000\002\147\000\000\000\000\000\000\001\214\002}\001\215\002\149\002\158\000\000\000\000\002\153\000\000\000\213\004t\002\149\000\000\000\233\001\209\002\153\000\234\000\213\001\210\000\235\000\236\000\000\000\000\000\000\000\000\000\000\001\181\000\000\000\000\001w\001\171\001\172\001\198\000\000\001\211\002\248\000\000\003:\000\000\000\000\000\000\001\231\000\000\001\200\001\179\bO\000\000\000\000\000\000\000\000\001\173\001\205\002\154\001\175\001\176\000\000\000\000\000\000\002\155\000\000\002\154\000\000\001\214\000\000\001\215\000\000\002\155\001\209\000\000\000\000\002\156\000\000\004~\000\000\000\000\000\000\000\000\000\000\002\156\001\181\001\210\000\000\001w\000\000\000\000\000\000\000\000\000\000\001\171\001\172\003:\000\000\000\000\000\000\001\198\000\000\001\211\002\248\000\000\000\000\000\000\001\171\001\172\001\231\000\000\001\200\001\179\000\000\001\173\001\205\000\000\001\175\001\176\000\000\000\000\001\214\000\000\001\215\000\000\000\000\000\000\001\173\001\205\000\000\001\175\001\176\000\000\000\000\000\000\001\209\004\138\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\210\000\000\000\000\001\181\000\000\004\148\001w\000\000\000\000\001\198\000\000\000\000\000\000\001\210\003:\000\000\001\211\002\248\001\231\000\000\001\200\001\179\000\000\001\171\001\172\000\000\000\000\000\000\000\000\001\211\002\248\000\000\000\000\000\000\000\000\000\000\001\171\001\172\000\000\001\214\000\000\001\215\000\000\001\173\001\205\000\000\001\175\001\176\000\000\001\209\000\000\000\000\000\000\000\000\000\000\000\000\001\173\001\205\000\000\001\175\001\176\001\181\001\209\000\000\001w\004\158\000\000\000\000\000\000\000\000\000\000\001\198\003:\001\210\001\181\000\000\000\000\001w\004\165\000\000\001\231\000\000\001\200\001\179\000\000\003:\001\210\000\000\000\000\001\211\002\248\000\000\000\000\000\000\001\171\001\172\000\000\001\214\000\000\001\215\000\000\000\000\001\211\002\248\000\000\000\000\000\000\001\171\001\172\000\000\001\214\000\000\001\215\000\000\001\173\001\205\000\000\001\175\001\176\000\000\000\000\000\000\001\209\000\000\000\000\000\000\000\000\001\173\001\205\001\198\001\175\001\176\000\000\000\000\001\181\001\209\004\204\001w\001\231\000\000\001\200\001\179\001\198\000\000\001\210\003:\000\000\001\181\000\000\004\220\001w\001\231\000\000\001\200\001\179\000\000\000\000\001\210\003:\000\000\001\211\002\248\000\000\000\000\000\000\000\000\000\000\001\171\001\172\000\000\001\214\000\000\001\215\001\211\002\248\000\000\000\000\000\000\000\000\000\000\001\171\001\172\000\000\001\214\000\000\001\215\000\000\001\173\001\205\000\000\001\175\001\176\000\000\001\209\000\000\000\000\000\000\000\000\000\000\000\000\001\173\001\205\001\198\001\175\001\176\001\181\001\209\000\000\001w\004\225\000\000\001\231\000\000\001\200\001\179\001\198\003:\001\210\001\181\000\000\000\000\001w\004\232\000\000\001\231\000\000\001\200\001\179\000\000\003:\001\210\000\000\000\000\001\211\002\248\000\000\000\000\000\000\001\171\001\172\000\000\001\214\000\000\001\215\000\000\000\000\001\211\002\248\000\000\000\000\000\000\001\171\001\172\000\000\001\214\000\000\001\215\000\000\001\173\001\205\000\000\001\175\001\176\000\000\000\000\000\000\001\209\000\000\000\000\000\000\000\000\001\173\001\205\001\198\001\175\001\176\000\000\000\000\001\181\001\209\004\254\001w\001\231\000\000\001\200\001\179\001\198\000\000\001\210\003:\000\000\001\181\000\000\0058\001w\001\231\000\000\001\200\001\179\000\000\000\000\001\210\003:\000\000\001\211\002\248\000\000\000\000\000\000\000\000\000\000\001\171\001\172\000\000\001\214\000\000\001\215\001\211\002\248\000\000\000\000\000\000\000\000\000\000\001\171\001\172\000\000\001\214\000\000\001\215\000\000\001\173\001\205\000\000\001\175\001\176\000\000\001\209\000\000\000\000\000\000\000\000\000\000\000\000\001\173\001\205\001\198\001\175\001\176\001\181\001\209\000\000\001w\005\153\000\000\001\231\000\000\001\200\001\179\001\198\003:\001\210\001\181\000\000\000\000\001w\005\176\000\000\001\231\000\000\001\200\001\179\000\000\003:\001\210\000\000\000\000\001\211\002\248\000\000\000\000\000\000\004\003\001\172\000\000\001\214\000\000\001\215\000\000\000\000\001\211\002\248\000\000\000\000\000\000\001\171\001\172\000\000\001\214\000\000\001\215\000\000\004\031\001\205\000\000\001\175\001\176\000\000\000\000\000\000\001\209\000\000\000\000\000\000\000\000\001\173\001\205\001\198\001\175\001\176\000\221\000\000\001\181\001\209\000\000\001w\001\231\000\000\001\200\001\179\001\198\002-\000\000\003:\000\000\001\181\000\000\005\183\001w\001\231\000\000\001\200\001\179\000\000\000\000\001\210\003:\004$\0023\000\000\000\000\000\000\000\000\000\000\000\000\004\003\001\172\000\000\001\214\000\000\001\215\001\211\002\248\000\000\000\000\000\000\000\000\000\000\001\171\001\172\000\000\001\214\000\000\001\215\000\000\004\031\001\205\000\000\001\175\001\176\000\000\001\209\000\000\000\000\000\000\000\000\000\000\000\000\001\173\001\205\001\198\001\175\001\176\001\181\001\209\000\000\001w\000\000\000\000\001\231\000\000\001\200\001\179\001\198\002-\000\000\001\181\000\000\000\227\001w\b\017\000\000\001\231\000\000\001\200\001\179\000\000\003:\001\210\000\000\004$\0023\000\000\000\000\000\000\000\228\004:\005\143\0024\000\000\0025\000\213\000\231\000\000\001\211\002\248\000\000\000\000\000\000\004\003\001\172\000\000\001\214\000\000\001\215\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\209\000\000\000\000\000\000\000\000\004\031\001\205\001\198\001\175\001\176\000\000\000\000\001\181\001\209\000\000\001w\001\231\000\000\001\200\001\179\001\198\000\000\000\000\000\000\000\000\001\181\000\000\000\000\001w\001\231\000\000\001\200\001\179\000\000\002-\000\233\003:\000\000\000\234\000\000\000\000\000\235\000\236\000\000\000\000\004:\007z\0024\000\000\0025\004$\0023\000\000\000\000\000\000\000\000\000\000\000\000\001\171\001\172\000\000\001\214\000\000\001\215\000\000\000\000\000\000\000\244\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\173\001\205\001\198\001\175\001\176\000\000\001\209\000\000\001\171\001\172\000\000\001\231\000\000\001\200\001\179\001\198\000\000\000\000\001\181\000\000\000\000\001w\b \000\000\001\231\000\000\001\200\001\179\001\173\001\205\001\210\001\175\001\176\002\210\002\211\001\172\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002{\001\211\002\248\0035\000\000\b%\004:\007\156\0024\000\000\0025\003;\000\000\001\210\000\000\000\000\000\000\b\182\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\211\002\248\000\000\000\000\000\000\001\209\000\000\000\000\000\000\000\000\000\000\003P\001\198\000\000\000\000\000\000\000\000\001\181\000\000\000\000\001w\001\231\000\000\001\200\001\179\000\000\000\221\002}\003:\000\222\002\160\000\000\001\006\001\209\000\000\b\184\000\000\002\149\000\000\000\000\000\000\002\153\000\000\000\213\000\000\001\181\000\000\000\000\001w\002\210\002\211\001\172\001\007\001\214\000\000\001\215\003:\000\000\001\b\003`\000\000\000\000\000\000\000\000\0035\000\000\000\000\000\000\000\000\000\000\000\000\002\214\003;\0031\001w\000\000\000\000\000\000\b\"\000\000\000\000\001\214\000\000\001\215\000\000\001\198\002\154\000\000\000\000\000\000\000\000\000\000\002\155\000\000\001\231\000\000\001\200\001\179\000\000\000\224\000\000\003P\000\221\003b\002\156\000\222\000\000\000\000\001\006\000\000\000\000\000\000\000\000\001\198\000\227\000\000\000\000\000\000\001\012\000\000\000\000\000\000\001\231\000\000\001\200\001\179\000\000\000\000\001\007\003e\000\000\000\228\003f\000\000\001\029\000\000\000\000\000\213\000\231\0032\000\000\000\000\000\000\000\000\002\210\002\211\001\172\000\000\003t\003`\001\200\0034\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0035\000\000\002\214\000\000\0031\001w\000\000\000\000\003;\000\000\000\000\000\000\000\000\003v\005\177\000\000\000\224\000\000\000\000\000\000\000\000\000\000\000\000\002\210\002\211\001\172\000\000\000\000\000\232\000\000\000\000\000\227\000\000\000\000\003b\001\012\000\233\003P\0035\000\234\000\000\000\000\000\235\000\236\001\024\000\000\003;\000\000\000\228\000\000\000\000\000\000\005\174\000\000\000\213\000\231\000\000\000\000\002{\000\000\003e\000\000\000\000\003f\000\000\000\000\000\000\000\000\000\240\000\000\0032\000\255\000\000\000\000\000\000\003P\000\000\000\000\000\000\003t\000\000\001\200\0034\000\000\000\000\003`\001\171\001\172\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\214\000\000\0031\001w\000\000\000\000\003v\000\232\000\000\001\173\001\205\000\000\001\175\001\176\000\000\000\233\000\000\002}\000\234\002'\002\188\000\235\000\236\001\024\000\000\000\000\003`\002\149\000\000\000\000\000\000\002\153\003b\000\213\000\000\000\000\000\000\000\000\002\214\001\210\0031\001w\001\171\001\172\000\000\000\000\000\000\000\240\000\000\000\000\000\255\000\000\000\000\000\000\000\000\001\211\002\027\000\000\003e\000\000\000\000\003f\001\173\001\205\000\000\001\175\001\176\000\000\0032\000\000\003b\000\000\002\024\000\000\000\000\000\000\002\154\003t\000\000\001\200\0034\000\000\002\155\000\000\000\000\000\000\000\000\000\000\001\209\000\000\000\221\000\000\001\210\006\194\002\156\000\221\003e\000\000\000\000\003f\001\181\003v\000\000\001w\001\171\001\172\0032\000\000\001\211\002\027\000\000\000\000\000\000\000\000\000\000\003t\000\000\001\200\0034\000\000\000\000\000\000\000\000\bZ\001\173\001\205\000\000\001\175\001\176\002\210\002\211\001\172\000\000\000\000\002\029\000\000\001\214\000\000\001\215\003v\000\000\001\209\000\000\000\000\0035\000\000\002\210\002\211\001\172\000\000\000\000\000\000\003;\001\181\001\210\000\000\001w\000\000\005\145\000\000\000\000\0035\000\000\006\196\000\000\000\000\000\000\000\000\001\198\003;\001\211\002\027\000\000\001\171\001\172\005D\000\000\001\231\000\227\001\200\001\179\003P\000\000\000\227\000\000\000\000\000\000\000\000\000\000\001\214\000\000\001\215\000\000\001\173\003\014\000\228\001\175\001\176\003P\000\000\000\228\000\213\006\199\001\209\000\000\000\000\000\213\000\231\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\181\000\000\000\000\001w\000\000\000\000\001\198\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003`\001\231\000\000\001\200\001\179\002\210\002\211\001\172\000\000\000\000\000\000\000\000\002\214\000\000\0031\001w\000\000\003`\000\000\000\000\0035\000\000\001\214\000\000\001\215\000\000\000\000\000\000\003;\002\214\000\233\0031\001w\006\200\005/\000\233\000\235\000\236\000\234\000\000\000\000\000\235\000\236\001\180\003b\000\000\006\146\000\000\006\205\000\000\006\202\000\000\000\000\000\000\001\198\001\181\000\000\003P\001w\000\000\000\000\003b\000\240\001\231\000\000\001\200\001\179\000\254\000\000\000\000\003e\000\000\000\000\003f\000\000\000\000\000\000\000\000\000\000\000\000\0032\000\000\000\000\000\000\000\000\000\000\000\000\003e\000\000\003t\003f\001\200\0034\000\000\003\016\000\000\000\000\0032\000\000\002\210\002\211\001\172\002{\000\000\000\000\003`\003t\000\000\001\200\0034\000\000\000\000\000\000\003v\0035\003\017\000\000\002\214\000\000\0031\001w\000\000\003;\001\198\002\210\002\211\001\172\000\000\005\000\000\000\003v\000\000\001\199\000\000\001\200\001\179\000\000\000\000\000\000\0035\000\000\002\210\002\211\001\172\000\000\000\000\000\000\003;\000\000\003b\000\000\003P\000\000\004\215\000\000\000\000\0035\000\000\002}\001\171\001\172\002\226\000\000\000\000\003;\000\000\000\000\000\000\002\149\000\000\004\207\000\000\002\153\000\000\000\213\003e\003P\000\000\003f\001\173\001\205\000\000\001\175\001\176\000\000\0032\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003P\003t\000\000\001\200\0034\000\000\003`\000\000\000\000\000\000\000\000\000\000\002\210\002\211\001\172\000\000\001\210\000\000\002\214\000\000\0031\001w\000\000\000\000\002\154\003v\000\000\000\000\000\000\000\000\002\155\003`\001\211\003\000\000\000\005\159\002\210\002\211\001\172\000\000\000\000\000\000\002\156\002\214\000\000\0031\001w\000\000\003`\000\000\003b\0035\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003;\002\214\000\000\0031\001w\000\000\001\209\000\000\000\221\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003b\003e\001\181\000\000\003f\001w\000\000\000\000\000\000\000\000\000\221\0032\000\000\003P\000\000\000\000\000\000\003b\000\000\000\000\003t\000\000\001\200\0034\000\000\000\000\003e\000\000\000\000\003f\000\000\000\000\003\003\000\000\001\171\001\172\0032\002\213\001\214\000\000\001\215\000\000\000\000\003e\003v\003t\003f\001\200\0034\002\214\000\000\0031\001w\0032\001\173\001\205\000\000\001\175\001\176\000\000\000\000\003`\003t\000\000\001\200\0034\000\000\000\000\000\000\003v\001\198\000\000\000\000\002\214\000\000\0031\001w\000\000\000\000\001\231\000\227\001\200\001\179\000\221\001\210\000\000\003v\002\210\002\211\001\172\000\000\002\210\002\211\001\172\000\000\000\000\000\000\000\228\000\227\000\000\001\211\002\248\0035\000\213\000\231\003b\0035\000\000\000\000\000\000\003;\000\000\000\000\000\000\003;\000\228\004\181\0032\000\000\000\000\004\172\000\213\000\231\000\000\000\000\000\000\0033\000\000\001\200\0034\000\000\004\028\000\000\001\209\003f\004\206\000\000\000\000\000\000\003P\000\000\0032\000\000\003P\000\000\001\181\000\000\000\000\001w\000\000\003t\000\000\001\200\0034\000\000\000\000\003_\000\000\000\221\000\000\000\000\000\233\000\000\000\000\000\234\000\000\000\000\000\235\000\236\000\000\000\000\000\227\000\000\000\000\003v\002\210\002\211\001\172\000\000\000\233\000\000\001\214\000\234\001\215\000\000\000\235\000\236\003`\000\228\000\000\0035\003`\000\000\000\253\000\213\000\231\000\000\000\000\003;\002\214\000\000\0031\001w\002\214\003d\0031\001w\000\000\000\000\000\000\000\221\000\252\000\000\001\198\002\210\002\211\001\172\000\000\000\000\000\000\000\000\000\000\001\231\000\000\001\200\001\179\000\000\003P\000\000\0035\000\000\003b\000\000\000\000\000\000\003b\000\000\003;\000\000\002\210\002\211\001\172\000\000\003\128\000\000\000\000\000\227\000\000\000\000\000\000\000\000\000\000\000\233\000\000\0035\000\234\000\000\003e\000\235\000\236\003f\003e\003;\000\228\003f\000\000\003P\0032\003\127\000\213\000\231\0032\000\000\000\000\000\000\003`\003t\000\000\001\200\0034\003t\000\000\001\200\0034\003\020\000\000\000\000\002\214\000\000\0031\001w\003P\000\000\000\000\000\000\000\000\000\000\000\000\000\227\000\000\003v\000\000\000\000\000\221\003v\000\000\006\194\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003`\000\228\000\000\000\000\000\000\003b\000\000\000\213\000\231\001\171\001\172\000\000\002\214\000\233\0031\001w\000\234\000\000\004\020\000\235\000\236\000\000\000\000\000\000\000\000\003`\004\023\000\000\000\000\001\173\003\014\003e\001\175\001\176\003f\000\000\000\000\002\214\000\000\0031\001w\0032\000\000\000\000\003b\005x\000\000\000\000\000\000\000\000\003t\000\000\001\200\0034\000\000\000\000\003\015\000\000\000\000\000\000\000\000\000\000\006\196\000\000\000\000\000\233\000\000\000\000\000\234\003b\003e\000\235\000\236\003f\003v\000\000\000\000\000\227\000\000\000\000\0032\002\210\002\211\001\172\000\000\000\000\000\000\000\000\000\000\003t\000\000\001\200\0034\000\000\000\228\003e\0035\005\128\003f\000\221\000\213\006\199\000\222\000\000\003;\0032\000\000\000\000\001\180\000\000\004\005\000\000\000\000\003v\003t\000\000\001\200\0034\000\000\000\000\001\181\000\221\000\000\001w\006\194\000\000\000\000\000\000\000\000\000\000\006\139\000\000\000\000\003P\002\210\002\211\001\172\000\000\003v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0035\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003;\000\233\003\016\000\000\006\200\000\000\004\012\000\235\000\236\000\000\000\000\000\000\002\210\002\211\001\172\000\224\000\000\006\146\000\000\006\204\000\000\006\202\004\024\004\030\003`\000\000\000\000\0035\000\000\003P\000\227\001\198\000\000\000\240\000\000\003;\002\214\006\196\0031\001w\001\199\004\019\001\200\001\179\000\000\000\000\000\000\000\228\000\000\000\000\000\000\000\000\000\227\000\213\000\231\000\000\000\000\000\000\002\210\002\211\001\172\000\000\000\000\000\000\003P\000\000\000\000\000\000\003b\000\228\000\000\000\000\002{\0035\000\000\000\213\006\199\003`\000\000\000\000\000\000\003;\000\000\002\210\002\211\001\172\000\000\004\022\000\000\002\214\000\000\0031\001w\000\000\003e\000\000\000\000\003f\0035\000\000\000\000\000\000\000\000\000\232\0032\000\000\003;\000\000\000\000\000\000\003P\000\233\003`\003t\000\234\001\200\0034\000\235\000\236\006\144\000\000\003b\000\000\000\000\002\214\000\000\0031\001w\002}\000\000\000\000\005R\000\000\000\233\000\000\003P\006\200\003v\002\149\000\235\000\236\000\000\002\153\000\240\000\213\000\000\000\255\003e\000\000\006\146\003f\006\203\000\000\006\202\000\000\000\000\003b\0032\003`\000\000\000\000\000\000\000\000\000\000\000\000\000\240\003t\000\000\001\200\0034\002\214\000\221\0031\001w\006\194\000\000\000\000\002\210\002\211\001\172\000\000\000\000\003e\003`\000\000\003f\000\000\002\154\000\000\000\000\003v\000\000\0032\002\155\000\000\002\214\000\000\0031\001w\000\000\004\167\003t\003b\001\200\0034\002\156\002\210\002\211\001\172\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0035\000\000\007\141\000\000\003v\000\000\003b\003e\003;\000\000\003f\000\000\000\000\000\000\004#\000\000\000\000\0032\000\000\000\000\000\000\000\000\000\000\006\196\000\000\000\000\003t\000\000\001\200\0034\000\000\000\000\004\028\000\000\000\000\003f\004\029\003P\000\227\000\000\000\000\000\000\0032\000\000\000\000\000\000\002{\000\000\000\000\000\000\003v\003t\000\000\001\200\0034\000\228\002\213\002\210\002\211\001\172\000\000\000\213\006\199\000\000\000\000\000\000\000\000\000\000\002\214\000\000\0031\001w\0035\000\000\000\000\003v\000\000\000\000\000\000\000\000\003;\000\000\000\000\000\000\000\000\003`\004&\000\000\002\210\002\211\001\172\000\000\002\210\002\211\001\172\000\000\000\000\002\214\000\000\0031\001w\000\000\002}\0035\000\000\005\167\000\000\0035\004\170\003P\000\000\003;\002\149\000\000\000\000\003;\002\153\004c\000\213\000\233\000\000\004m\006\200\000\000\000\000\000\235\000\236\000\000\000\000\003b\000\000\000\000\000\000\000\000\000\000\006\146\0032\006\201\000\000\006\202\003P\002\210\002\211\001\172\003P\0033\000\000\001\200\0034\000\000\000\000\000\240\000\000\000\000\000\000\003e\0035\003`\003f\000\000\000\000\002\154\000\000\000\000\003;\0032\000\000\002\155\000\000\002\214\004w\0031\001w\000\000\003t\000\000\001\200\0034\000\000\002\156\000\000\000\000\002\210\002\211\001\172\000\000\000\000\000\000\003`\000\000\000\000\000\000\003`\003P\000\000\000\000\000\000\0035\003v\000\000\002\214\003b\0031\001w\002\214\003;\0031\001w\000\000\000\000\000\000\004\176\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003e\000\000\000\000\003f\000\000\003b\000\000\003P\000\000\003b\0032\000\000\000\000\000\000\003`\000\000\000\000\000\000\000\000\003t\000\000\001\200\0034\000\000\000\000\000\000\002\214\000\000\0031\001w\000\000\003e\000\000\000\000\003f\003e\000\000\000\000\003f\000\000\000\000\0032\000\000\003v\000\000\0032\000\000\000\000\000\000\000\000\003t\000\000\001\200\0034\003t\003`\001\200\0034\003b\000\000\002\210\002\211\001\172\000\000\002{\000\000\000\000\002\214\000\000\0031\001w\000\000\000\000\000\000\003v\0035\000\000\000\000\003v\000\000\000\000\000\000\000\000\003;\003e\000\000\002{\003f\000\000\004\178\000\000\000\000\000\000\000\000\0032\000\000\000\000\000\000\000\000\003b\000\000\000\000\000\000\003t\000\000\001\200\0034\000\000\000\000\002\210\002\211\001\172\003P\000\000\002\210\002\211\001\172\000\000\000\000\000\000\002}\000\000\000\000\005\188\0035\003e\000\000\003v\003f\0035\002\149\000\000\003;\000\000\002\153\0032\000\213\003;\004\184\000\000\000\000\000\000\002}\004\187\003t\005\192\001\200\0034\002\210\002\211\001\172\000\000\002\149\000\000\000\000\000\000\002\153\000\000\000\213\000\000\003`\003P\000\000\0035\000\000\000\000\003P\000\000\003v\002]\001\172\003;\002\214\000\000\0031\001w\000\000\004\209\000\000\002\154\000\000\000\000\000\000\000\000\000\000\002\155\000\000\000\000\000\000\001\173\002\231\000\000\001\175\001\176\000\000\000\000\000\000\002\156\000\000\000\000\003P\002\154\000\000\000\000\003b\000\000\000\000\002\155\000\000\003`\000\000\000\000\000\000\000\000\003`\000\000\000\000\000\000\002-\002\156\000\000\002\214\000\000\0031\001w\000\000\002\214\000\000\0031\001w\003e\000\000\000\000\003f\005\001\0023\000\000\000\000\000\000\000\000\0032\002\210\002\211\001\172\000\000\000\000\000\000\000\000\003`\003t\000\000\001\200\0034\003b\000\000\000\000\0035\000\000\003b\000\000\002\214\000\000\0031\001w\003;\000\000\000\000\000\000\001\209\000\000\004\212\000\000\000\000\003v\000\000\000\000\000\000\000\000\000\000\003e\001\181\000\000\003f\001w\003e\000\000\000\000\003f\000\000\0032\000\000\000\000\003b\003P\0032\000\000\000\000\000\000\003t\000\000\001\200\0034\000\000\003t\000\000\001\200\0034\000\000\000\000\005\b\000\000\000\000\000\000\000\000\000\000\0024\000\000\0025\003e\000\000\000\000\003f\003v\002\210\002\211\001\172\000\000\003v\0032\000\000\000\000\000\000\002{\000\000\000\000\000\000\000\000\003t\0035\001\200\0034\003`\000\000\002\210\002\211\001\172\003;\000\000\001\198\000\000\000\000\000\000\005\003\002\214\000\000\0031\001w\001\231\0035\001\200\001\179\003v\000\000\000\000\000\000\000\000\003;\000\000\000\000\000\000\000\000\000\000\005\006\000\000\000\000\003P\000\000\002\210\002\211\001\172\000\000\000\000\000\000\000\000\000\000\003b\000\000\000\000\002}\000\000\000\000\005\195\0035\000\000\000\000\003P\000\000\000\000\002\149\000\000\003;\000\000\002\153\000\000\000\213\000\000\005I\000\000\000\000\000\000\000\000\003e\000\000\000\000\003f\000\000\000\000\000\000\000\000\000\000\000\000\0032\000\000\003`\000\000\000\000\000\000\000\000\000\000\003P\003t\000\000\001\200\0034\000\000\002\214\000\000\0031\001w\000\000\000\000\000\000\000\000\003`\000\000\000\000\000\000\002\154\000\000\002\210\002\211\001\172\000\000\002\155\003v\002\214\000\000\0031\001w\000\000\000\000\000\000\000\000\000\000\0035\002\156\000\000\003b\000\000\000\000\000\000\000\000\003;\000\000\002\210\002\211\001\172\003`\005W\000\000\000\000\000\000\002{\000\000\000\000\000\000\000\000\003b\000\000\002\214\000\000\0031\001w\003e\000\000\000\000\003f\005\179\000\000\000\221\000\000\003P\000\222\0032\000\000\001\025\000\000\000\000\000\000\000\000\000\000\000\000\003t\003e\001\200\0034\003f\000\000\000\000\000\000\000\000\003b\000\000\0032\000\000\001\027\000\000\000\000\000\000\000\000\006\139\000\000\003t\000\000\001\200\0034\003v\000\000\002}\000\000\000\221\005\202\000\000\000\222\002\210\002\211\001\172\003e\002\149\003`\003f\000\000\002\153\000\000\000\213\000\000\003v\0032\000\000\0035\000\000\002\214\000\000\0031\001w\000\000\003t\003;\001\200\0034\000\000\000\000\000\224\005\137\002\213\000\000\000\000\000\000\000\000\002\210\002\211\001\172\000\000\002\210\002\211\001\172\002\214\000\227\0031\001w\003v\001\012\000\000\003b\0035\000\000\003P\002\154\0035\000\000\000\000\000\000\003;\002\155\000\228\000\000\003;\000\000\005\247\000\000\000\213\000\231\007.\000\224\000\000\002\156\000\000\000\000\000\000\003e\000\000\000\000\003f\000\000\000\000\000\000\000\000\000\000\000\227\0032\000\000\003P\002\210\002\211\001\172\003P\000\000\000\000\003t\000\000\001\200\0034\000\000\000\000\003`\000\228\000\000\0035\000\000\000\000\000\000\000\213\000\231\000\000\0032\003;\002\214\000\000\0031\001w\000\232\0071\003v\0033\000\000\001\200\0034\000\000\000\233\000\000\000\000\000\234\000\000\000\000\000\235\000\236\006\193\000\000\000\000\003`\000\000\000\000\000\000\003`\003P\000\000\000\000\000\000\003b\000\000\000\000\002\214\000\000\0031\001w\002\214\000\000\0031\001w\000\000\000\240\001\005\000\000\000\255\000\000\000\000\000\000\000\000\000\000\000\233\000\000\000\000\000\234\000\000\003e\000\235\000\236\003f\000\000\000\000\000\000\000\000\000\000\003b\0032\000\000\000\000\003b\000\000\000\000\000\000\000\000\003`\003t\000\000\001\200\0034\000\221\000\000\000\000\000\000\000\240\000\000\000\000\002\214\000\000\0031\001w\000\000\003e\000\000\000\000\003f\003e\000\000\000\000\003f\003v\000\000\0032\000\000\000\000\000\000\0032\002\210\002\211\001\172\000\000\003t\000\000\001\200\0034\003t\000\000\001\200\0034\003b\000\000\000\000\0035\000\000\000\000\000\000\000\000\002\210\002\211\001\172\003;\000\000\000\000\000\000\000\000\003v\007@\000\000\000\000\003v\000\000\000\000\0035\000\000\000\000\003e\000\000\000\000\003f\000\000\003;\000\000\000\000\000\000\000\000\0032\007C\000\000\000\000\003P\000\000\002\210\002\211\001\172\003t\000\000\001\200\0034\000\227\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0035\000\000\000\000\003P\000\000\000\000\000\000\000\000\003;\000\228\000\000\000\000\003v\000\000\007P\000\213\000\231\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\204\000\000\003`\000\000\000\000\000\000\000\000\000\000\003P\002\210\002\211\001\172\000\000\000\000\002\214\000\000\0031\001w\007\205\000\000\000\000\007\207\003`\000\000\0035\000\000\000\000\000\000\000\000\000\000\007\208\000\000\003;\000\000\002\214\000\000\0031\001w\007S\000\000\000\000\000\000\000\000\000\000\000\233\000\000\003b\000\234\000\000\000\000\000\235\000\236\000\000\000\000\000\000\000\000\003`\000\000\002\210\002\211\001\172\003P\007\209\000\000\000\000\000\000\003b\000\000\002\214\000\000\0031\001w\003e\0035\000\000\003f\005\132\000\000\000\000\000\000\000\000\003;\0032\000\000\000\000\000\000\000\000\007h\000\000\000\000\000\000\003t\003e\001\200\0034\003f\000\000\007\210\000\000\000\000\003b\000\000\0032\000\000\002\210\002\211\001\172\007\211\000\000\003`\003P\003t\000\000\001\200\0034\003v\000\000\000\000\000\000\0035\000\000\002\214\000\000\0031\001w\000\000\003e\003;\000\000\003f\000\000\007\212\000\000\007k\000\000\003v\0032\000\000\000\000\002\210\002\211\001\172\000\000\000\000\000\000\003t\007\213\001\200\0034\000\000\000\000\000\000\000\000\003b\0035\000\000\003P\000\000\003`\000\000\007\214\000\000\003;\000\000\000\000\007\216\000\000\000\000\007o\003v\002\214\000\000\0031\001w\000\000\000\000\000\000\000\000\007\218\003e\000\000\000\000\003f\000\000\000\000\000\000\000\000\000\000\000\000\0032\000\000\003P\002\210\002\211\001\172\000\000\007\219\000\000\003t\000\000\001\200\0034\003b\000\000\003`\000\000\000\000\0035\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003;\002\214\000\000\0031\001w\000\000\b\143\003v\000\000\000\000\000\000\000\000\000\000\003e\000\000\000\000\003f\000\000\000\000\000\000\000\000\000\000\000\221\0032\003`\000\222\000\000\000\000\001\025\003P\001\171\001\172\003t\003b\001\200\0034\002\214\000\000\0031\001w\001\171\001\172\000\000\000\000\000\000\000\000\000\000\000\000\001\027\000\000\001\173\003\014\000\000\001\175\001\176\000\000\003v\000\000\000\000\003e\001\173\001\205\003f\001\175\001\176\000\000\000\000\000\000\003b\0032\002\210\002\211\001\172\000\000\000\000\000\000\000\000\003`\003t\000\000\001\200\0034\000\000\000\000\000\000\0035\000\000\000\000\000\000\002\214\001\210\0031\001w\003;\003e\000\224\000\000\003f\000\000\b\145\000\000\000\000\003v\000\000\0032\000\000\001\211\b\206\000\000\b\208\000\227\000\000\000\000\003t\001\012\001\200\0034\000\000\000\000\000\000\000\000\003b\003P\000\000\000\000\000\000\000\000\000\228\000\000\001\180\000\000\000\000\000\000\000\213\000\231\000\000\000\000\003v\000\000\001\209\000\000\001\181\000\000\000\000\001w\000\000\000\000\003e\000\000\000\000\003f\001\181\000\000\000\000\001w\000\000\000\000\0032\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003t\000\000\001\200\0034\003`\000\000\000\000\000\000\000\000\000\221\000\000\000\000\000\222\000\000\007\191\001\006\002\214\000\232\0031\001w\000\000\001\214\000\000\001\215\003v\000\233\000\000\000\000\000\234\000\000\000\000\000\235\000\236\001\024\000\000\001\011\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\198\000\000\000\000\000\000\000\000\003b\001\171\001\172\000\000\001\199\001\198\001\200\001\179\000\000\000\240\000\000\000\000\000\255\000\000\001\231\000\000\001\200\001\179\007\193\000\000\000\000\001\173\001\205\000\000\001\175\001\176\003e\000\000\000\000\003f\000\000\000\000\000\000\000\000\000\224\000\000\0032\000\000\000\000\000\000\000\000\001\171\001\172\000\000\000\000\003t\000\000\001\200\0034\000\227\000\000\001\210\000\000\001\012\000\000\001\171\001\172\000\000\000\000\000\000\000\000\001\173\001\205\000\000\001\175\001\176\000\228\001\211\b\003\003v\000\000\000\000\000\213\000\231\000\000\001\173\001\205\000\000\001\175\001\176\000\000\000\000\000\000\002\210\002\211\001\172\000\000\000\000\000\000\000\000\000\000\001\210\000\000\000\000\000\000\000\000\000\000\000\000\0035\000\000\001\209\000\000\000\000\000\000\002-\000\000\003;\001\211\007\245\000\000\000\000\000\000\001\181\000\000\000\000\001w\005\156\000\000\000\000\000\000\002.\0023\000\232\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\233\000\000\000\000\000\234\000\000\003P\000\235\000\236\001\024\000\000\001\209\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\214\000\000\001\215\000\000\001\181\000\000\001\209\001w\000\000\000\000\000\000\000\000\000\000\000\000\000\240\000\000\000\000\000\255\001\181\000\000\000\000\001w\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\198\000\000\000\000\003`\000\000\000\000\001\171\001\172\001\214\001\231\001\215\001\200\001\179\000\000\000\000\002\214\000\000\0031\001w\000\000\000\000\0024\000\000\0025\000\000\000\000\001\173\001\205\000\000\001\175\001\176\000\000\000\000\000\000\000\000\000\000\000\000\001\171\001\172\000\000\001\198\000\000\000\000\000\000\000\000\000\000\000\000\003b\000\000\001\231\000\000\001\200\001\179\000\000\001\198\000\000\001\210\001\173\001\205\000\000\001\175\001\176\000\000\001\231\000\000\001\200\001\179\000\000\000\000\000\000\000\000\000\000\001\211\002\031\000\000\000\000\004A\001\171\001\172\000\000\000\000\000\000\000\000\0032\000\000\000\000\000\000\001\210\000\000\000\000\001\171\001\172\003t\000\000\001\200\0034\000\000\001\173\001\205\000\000\001\175\001\176\000\000\001\211\002\019\001\209\000\000\000\000\001\171\001\172\001\173\001\205\000\000\001\175\001\176\000\000\003v\001\181\000\000\000\000\001w\000\000\000\000\000\000\000\000\000\000\000\000\001\210\001\173\001\205\000\000\001\175\001\176\000\000\000\000\000\000\001\209\000\000\000\000\000\000\001\210\000\000\000\000\001\211\002\016\000\000\000\000\000\000\001\181\000\000\000\000\001w\000\000\001\214\000\000\001\215\001\211\002\014\001\210\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\211\001\212\001\209\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\214\001\198\001\215\000\000\001\181\001\209\000\000\001w\000\000\000\000\001\231\000\000\001\200\001\179\000\000\000\000\000\000\001\181\000\000\000\000\001w\000\000\000\000\001\209\000\000\001\171\001\172\000\000\000\000\000\000\000\000\000\000\001\198\000\000\000\000\001\181\000\000\000\000\001w\000\000\001\214\001\231\001\215\001\200\001\179\001\173\001\205\000\000\001\175\001\176\000\000\000\000\000\000\001\214\000\000\001\215\001\171\001\172\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\214\001\198\001\215\000\000\001\210\001\173\001\205\000\000\001\175\001\176\001\231\000\000\001\200\001\179\001\198\000\000\001\171\001\172\000\000\000\000\001\211\001\227\000\000\001\231\000\000\001\200\001\179\000\000\000\000\000\000\000\000\000\000\001\198\000\000\000\000\001\210\001\173\001\205\000\000\001\175\001\176\001\231\000\000\001\200\001\179\000\000\000\000\000\000\000\000\000\000\000\000\001\211\001\230\001\209\000\000\000\000\001\171\001\172\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\181\001\210\000\000\001w\001\171\001\172\000\000\000\000\000\000\000\000\000\000\001\173\001\205\000\000\001\175\001\176\000\000\001\211\002\r\001\209\000\000\000\000\001\171\001\172\001\173\001\205\000\000\001\175\001\176\000\000\000\000\001\181\000\000\000\000\001w\000\000\001\214\000\000\001\215\000\000\000\000\001\210\001\173\001\205\000\000\001\175\001\176\000\000\000\000\000\000\001\209\000\000\000\000\000\000\001\210\000\000\000\000\001\211\002\001\000\000\000\000\000\000\001\181\001\171\001\172\001w\000\000\001\214\001\198\001\215\001\211\002\t\001\210\000\000\000\000\000\000\000\000\001\231\000\000\001\200\001\179\000\000\000\000\001\173\001\205\000\000\001\175\001\176\001\211\0021\001\209\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\214\001\198\001\215\000\000\001\181\001\209\000\000\001w\000\000\000\000\001\231\000\000\001\200\001\179\002-\000\000\000\000\001\181\000\000\000\000\001w\000\000\000\000\001\209\000\000\001\171\001\172\000\000\000\000\000\000\002A\0023\001\198\000\000\000\000\001\181\000\000\000\000\001w\000\000\001\214\001\231\001\215\001\200\001\179\001\173\001\205\000\000\001\175\001\176\000\000\000\000\000\000\001\214\000\000\001\215\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\209\002\210\002\211\001\172\000\000\000\000\000\000\001\214\001\198\001\215\002-\000\000\001\181\000\000\000\000\001w\0035\001\231\000\000\001\200\001\179\001\198\001\171\001\172\003;\000\000\002N\0023\000\000\000\000\001\231\000\000\001\200\001\179\005A\000\000\000\000\000\000\000\000\001\198\000\000\000\000\001\173\001\205\000\000\001\175\001\176\0024\001\231\0025\001\200\001\179\000\000\003P\000\000\000\000\000\000\000\000\002{\000\000\001\209\001\171\001\172\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002-\001\181\000\000\000\000\001w\000\000\000\000\005\149\000\000\001\198\001\173\003\014\000\000\001\175\001\176\000\000\002\\\0023\001\231\000\000\001\200\001\179\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003`\000\000\000\000\002\210\002\211\001\172\0024\003\015\0025\000\000\000\000\000\000\002\214\002}\0031\001w\005\206\000\000\0035\000\000\001\209\000\000\000\000\002\149\000\000\000\000\003;\002\153\000\000\000\213\000\000\000\000\001\181\000\000\000\000\001w\004\234\000\000\000\000\001\198\000\000\000\000\000\000\000\000\003b\000\000\000\000\000\000\001\231\000\000\001\200\001\179\000\000\000\000\000\000\003P\002\210\002\211\001\172\001\180\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0024\000\000\0025\000\000\001\181\002\154\004A\001w\001\171\001\172\000\000\002\155\005-\0032\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003t\002\156\001\200\0034\000\000\000\000\001\173\001\205\000\000\001\175\001\176\001\198\000\000\000\000\003`\000\000\002\210\002\211\001\172\000\000\001\231\003\016\001\200\001\179\003v\000\000\002\214\000\000\0031\001w\000\000\0035\000\000\000\000\000\000\000\000\001\210\000\000\000\000\003;\000\000\004\024\004\030\000\000\000\000\000\000\000\000\000\000\000\000\004D\001\198\000\000\001\211\003+\000\000\002\210\002\211\001\172\003b\001\199\000\000\001\200\001\179\000\000\000\000\000\000\000\000\002\213\003P\000\000\0035\000\000\001\171\001\172\000\000\000\000\000\000\000\000\003;\002\214\000\000\0031\001w\000\000\000\000\001\209\000\000\004A\003O\000\000\000\000\000\000\001\173\001\205\0032\001\175\001\176\001\181\000\000\000\000\001w\000\000\000\000\003t\000\000\001\200\0034\003P\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003`\000\000\000\000\000\000\000\000\002-\000\000\000\000\000\000\001\171\001\172\003v\002\214\000\000\0031\001w\000\000\001\214\000\000\001\215\000\000\0043\0023\000\000\000\000\000\000\000\000\000\000\000\000\001\173\001\205\0032\001\175\001\176\000\000\000\000\000\000\000\000\000\000\003`\0033\000\000\001\200\0034\003b\000\000\000\000\000\000\000\000\001\198\000\000\002\214\000\000\0031\001w\001\209\000\000\000\000\001\231\001\210\001\200\001\179\002\210\002\211\001\172\000\000\000\000\001\181\000\000\000\000\001w\000\000\000\000\004A\000\000\001\211\0046\0035\000\000\000\000\0032\000\000\000\000\003b\000\000\003;\000\000\000\000\000\000\003t\000\000\001\200\0034\000\000\000\000\004C\000\000\000\000\000\000\000\000\000\000\000\000\0024\000\000\0025\000\000\000\000\000\000\001\209\000\000\000\000\000\000\004A\003v\003P\000\000\001\171\001\172\000\000\0032\001\181\000\000\000\000\001w\000\000\000\000\000\000\000\000\003t\000\000\001\200\0034\000\000\007T\000\000\001\198\001\173\003\014\000\000\001\175\001\176\000\000\000\000\000\000\001\231\000\000\001\200\001\179\000\000\002\210\002\211\001\172\003v\000\000\000\000\000\000\001\214\000\000\001\215\000\000\000\000\000\000\003`\003\015\0035\000\000\000\000\000\000\000\000\002\210\002\211\001\172\003;\000\000\002\214\000\000\0031\001w\000\000\000\000\000\000\000\000\004N\000\000\0035\000\000\000\000\000\000\001\198\000\000\000\000\000\000\003;\000\000\000\000\000\000\000\000\001\231\000\000\001\200\001\179\003P\004X\002\210\002\211\001\172\003b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\180\000\000\000\000\0035\000\000\000\000\003P\000\000\000\000\000\000\000\000\003;\001\181\000\000\000\000\001w\000\000\000\000\000\000\000\000\004A\004\131\000\000\000\000\000\000\000\000\000\000\0032\000\000\000\000\000\000\000\000\000\000\000\000\003`\000\000\003t\000\000\001\200\0034\003P\002\210\002\211\001\172\000\000\000\000\002\214\000\000\0031\001w\000\000\003\016\000\000\000\000\003`\000\000\0035\000\000\000\000\000\000\003v\000\000\000\000\000\000\003;\000\000\002\214\000\000\0031\001w\000\000\004\024\004\030\000\000\004\141\000\000\000\000\000\000\003b\000\000\001\198\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003`\001\199\000\000\001\200\001\179\003P\000\000\000\000\000\000\000\000\003b\000\000\002\214\000\000\0031\001w\000\000\000\000\000\000\004A\000\000\000\000\000\000\000\000\000\000\000\000\0032\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003t\000\000\001\200\0034\004A\000\000\002\210\002\211\001\172\003b\000\000\0032\000\000\000\000\000\000\000\000\000\000\000\000\003`\000\000\003t\0035\001\200\0034\003v\000\000\000\000\000\000\000\000\003;\002\214\000\000\0031\001w\000\000\000\000\000\000\000\000\004A\004\151\002\210\002\211\001\172\000\000\003v\0032\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003t\0035\001\200\0034\003P\000\000\000\000\000\000\003b\003;\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\192\000\000\000\000\000\000\000\000\003v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004A\003P\002\210\002\211\001\172\000\000\000\000\0032\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003`\003t\0035\001\200\0034\000\000\000\000\000\000\007\204\000\000\003;\000\000\002\214\000\000\0031\001w\000\000\000\000\000\000\000\000\004\195\000\000\002\210\002\211\001\172\003v\007\205\000\000\000\000\007\207\000\000\000\000\000\000\000\000\003`\000\000\000\000\0035\007\208\003P\000\000\000\000\000\000\000\000\003b\003;\002\214\000\000\0031\001w\000\000\000\000\000\000\000\000\000\000\004\198\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\209\000\000\000\000\004A\003P\002\210\002\211\001\172\003b\000\000\0032\000\000\000\000\000\000\000\000\000\000\000\000\003`\000\000\003t\0035\001\200\0034\000\000\000\000\000\000\000\000\000\000\003;\002\214\000\000\0031\001w\000\000\000\000\007\210\000\000\004A\004\237\002\210\002\211\001\172\000\000\003v\0032\007\211\000\000\000\000\000\000\000\000\000\000\000\000\003`\003t\0035\001\200\0034\003P\000\000\001\171\001\172\003b\003;\000\000\002\214\000\000\0031\001w\000\000\007\223\000\000\000\000\004\240\000\000\000\000\000\000\000\000\003v\000\000\001\173\003\014\000\000\001\175\001\176\007\213\000\000\000\000\000\000\000\000\000\000\004A\003P\000\000\000\000\000\000\000\000\003b\0032\007\214\000\000\000\000\000\000\000\000\007\216\000\000\003`\003t\000\000\001\200\0034\000\000\000\000\000\000\000\000\000\000\000\000\007\218\002\214\000\000\0031\001w\000\000\002\210\002\211\001\172\004A\000\000\002\210\002\211\001\172\003v\000\000\0032\000\000\007\219\000\000\000\000\0035\000\000\003`\000\000\003t\0035\001\200\0034\003;\000\000\000\000\000\000\003b\003;\002\214\000\000\0031\001w\005\016\000\000\000\000\001\180\000\000\005\021\000\000\000\000\000\000\000\000\003v\000\000\000\000\000\000\000\000\001\181\000\000\000\000\001w\003P\000\000\000\000\000\000\004A\003P\000\000\000\000\000\000\003b\000\000\0032\000\000\000\000\000\000\000\000\001\171\001\172\000\000\000\000\003t\000\000\001\200\0034\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\135\001\173\001\205\004A\001\175\001\176\000\000\000\000\000\000\003v\0032\000\000\000\000\003`\000\000\000\000\000\000\000\000\003`\003t\000\000\001\200\0034\000\000\000\000\002\214\000\000\0031\001w\001\198\002\214\001\210\0031\001w\000\000\001\171\001\172\000\000\001\199\000\000\001\200\001\179\000\000\003v\000\000\000\000\000\000\001\211\005\245\000\000\000\000\007\148\007l\001\171\001\172\001\173\003\014\003b\001\175\001\176\000\000\000\000\003b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\173\001\205\000\000\001\175\001\176\000\221\000\000\001\209\000\222\003\015\000\000\000\000\000\000\004A\000\000\000\000\002{\000\000\004A\001\181\0032\000\000\001w\000\000\000\000\0032\000\000\000\000\000\000\003t\001\210\001\200\0034\000\000\003t\000\000\001\200\0034\000\000\000\000\000\000\006\004\000\000\000\000\000\000\000\000\001\211\b\002\002\210\002\211\001\172\000\000\000\000\003v\000\000\001\214\000\000\001\215\003v\000\000\b\138\001\180\000\000\0035\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003;\002}\001\181\000\000\005\209\001w\000\000\000\224\001\209\000\000\000\000\002\149\000\000\000\000\000\000\002\153\001\198\000\213\000\000\000\000\001\181\000\000\000\227\001w\000\000\001\231\000\000\001\200\001\179\003P\000\000\000\000\002\210\002\211\001\172\000\000\000\000\000\000\000\000\000\228\000\000\003\016\000\000\000\000\000\000\000\213\000\231\0035\000\000\002\210\002\211\001\172\000\000\000\000\000\000\003;\001\214\000\000\001\215\000\000\002\154\004\024\004\030\000\000\0035\000\000\002\155\000\000\000\000\000\000\001\198\000\000\003;\000\000\000\000\000\000\000\000\003`\002\156\001\199\000\000\001\200\001\179\000\000\003P\002\210\002\211\001\172\001\198\002\214\000\000\0031\001w\000\000\000\000\000\232\000\000\001\231\000\000\001\200\001\179\003P\000\000\000\233\000\000\000\000\000\234\000\000\002\212\000\235\000\236\006\r\000\000\002\210\002\211\001\172\000\000\000\000\000\000\000\000\000\000\003b\000\000\000\000\000\000\000\000\000\000\000\000\0035\000\000\000\000\000\000\003`\000\000\000\000\000\240\003;\000\000\000\255\000\000\000\000\000\000\000\000\000\000\002\214\000\000\0031\001w\000\000\003`\b\018\000\000\002\210\002\211\001\172\000\000\000\000\0032\000\000\001\171\001\172\002\214\000\000\0031\001w\003P\003t\0035\001\200\0034\000\000\000\000\000\000\000\000\000\000\003;\003b\000\000\000\000\001\173\003\014\000\000\001\175\001\176\000\000\002\213\000\000\000\000\006\217\000\000\003v\000\000\000\000\003b\000\000\000\000\000\000\002\214\000\000\0031\001w\000\000\000\000\000\000\003P\005\197\003\015\000\000\000\000\000\000\000\000\000\000\0032\003`\000\000\000\000\006\218\b\133\006\219\000\000\000\000\003t\005\154\001\200\0034\002\214\000\000\0031\001w\0032\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003t\000\000\001\200\0034\000\000\000\000\000\000\003v\002\210\002\211\001\172\000\000\006\220\000\000\003`\000\000\000\000\000\000\000\000\003b\001\180\000\000\000\000\0035\003v\000\000\002\214\0032\0031\001w\000\000\003;\001\181\000\000\000\000\001w\0033\000\000\001\200\0034\000\000\000\000\000\000\000\000\000\000\000\000\006\221\000\000\0059\000\000\002\210\002\211\001\172\000\000\000\000\0032\006\222\006\223\003b\006\224\003P\000\000\000\000\000\000\003t\0035\001\200\0034\000\000\000\000\000\000\003\016\000\000\003;\000\000\000\000\000\000\000\000\002\210\002\211\001\172\000\000\007\028\000\000\000\000\000\000\000\000\004\205\003v\000\000\000\000\003\018\004\030\0035\0032\000\000\000\000\000\000\000\000\000\000\001\198\003;\003P\003t\000\000\001\200\0034\000\000\003`\001\199\006\226\001\200\001\179\000\000\000\000\006\228\006\238\002\210\002\211\001\172\002\214\000\000\0031\001w\000\000\000\000\000\000\003v\007\024\000\000\003P\000\000\0035\000\000\002\210\002\211\001\172\000\000\000\000\000\000\003;\000\000\000\000\000\000\000\000\000\000\007\025\000\000\000\000\0035\003`\000\000\003b\000\000\000\000\000\000\000\000\003;\000\000\002\210\002\211\001\172\002\214\000\000\0031\001w\000\000\000\000\000\000\003P\000\000\000\000\000\000\000\000\0035\000\000\000\000\000\000\003`\000\000\000\000\004\171\003;\000\000\000\000\000\000\003P\000\000\0032\000\000\002\214\000\000\0031\001w\003b\000\000\000\000\003t\000\000\001\200\0034\002\210\002\211\001\172\000\000\002\210\002\211\001\172\000\000\000\000\000\000\003P\000\000\000\000\000\000\000\000\0035\003`\000\000\000\000\0035\003v\003b\004@\003;\000\000\000\000\000\000\003;\002\214\0032\0031\001w\000\000\003`\000\000\000\000\000\000\000\000\003t\000\000\001\200\0034\000\000\000\000\000\000\002\214\000\000\0031\001w\000\000\003l\000\000\003P\000\000\000\000\000\000\003P\0032\003`\000\000\003b\000\000\003v\000\000\002{\000\000\003t\000\000\001\200\0034\002\214\000\000\0031\001w\000\000\000\000\000\000\003b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003r\003v\000\000\000\000\000\000\000\000\000\000\0032\000\000\000\000\000\000\003`\000\000\003b\000\000\003`\003t\003{\001\200\0034\000\000\000\000\000\000\002\214\0032\0031\001w\002\214\000\000\0031\001w\002}\000\000\003t\005\223\001\200\0034\000\000\000\000\000\000\003v\002\149\003\134\000\000\000\000\002\153\000\000\000\213\000\000\0032\000\000\000\000\000\000\000\000\000\000\003b\000\000\003v\003t\003b\001\200\0034\002\210\002\211\001\172\000\000\002\210\002\211\001\172\000\000\000\000\000\000\000\000\000\000\000\000\002{\000\000\0035\000\000\000\000\000\000\0035\003v\000\000\003\140\003;\000\000\000\000\003\146\003;\002\154\0032\000\000\000\000\000\000\0032\002\155\002\210\002\211\001\172\003t\000\000\001\200\0034\003t\000\000\001\200\0034\002\156\000\000\000\000\000\000\0035\000\000\003P\000\000\000\000\000\000\003P\000\000\003;\000\000\000\000\002{\003v\000\000\000\000\000\000\003v\000\000\000\000\002}\000\000\000\000\006/\000\000\000\000\000\000\000\000\000\000\000\000\002\149\000\000\000\000\000\000\002\153\000\000\000\213\000\000\003P\002\210\002\211\001\172\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003`\000\000\000\000\0035\003`\000\000\000\000\000\000\000\000\000\000\000\000\003;\002\214\000\000\0031\001w\002\214\002}\0031\001w\006;\000\000\002\210\002\211\001\172\000\000\000\000\002\149\002\154\000\000\000\000\002\153\000\000\000\213\002\155\003`\000\000\0035\000\000\000\000\003P\000\000\000\000\000\000\003b\003;\002\156\002\214\003b\0031\001w\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\210\002\211\001\172\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\152\003P\0035\002\154\003\158\000\000\003b\0032\000\000\002\155\003;\0032\000\000\000\000\000\000\003`\003t\000\000\001\200\0034\003t\002\156\001\200\0034\000\000\000\000\000\000\002\214\000\000\0031\001w\000\000\000\000\000\000\000\000\003\164\000\000\000\000\000\000\003P\003v\000\000\0032\000\000\003v\000\000\000\000\000\000\000\000\003`\000\000\003t\000\000\001\200\0034\000\000\000\000\000\000\000\000\003b\000\000\002\214\000\000\0031\001w\000\000\000\000\000\000\002\210\002\211\001\172\000\000\000\000\000\000\000\000\003v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0035\000\000\000\000\000\000\003`\003\170\000\000\000\000\003;\000\000\003b\000\000\0032\002\210\002\211\001\172\002\214\002{\0031\001w\000\000\003t\002{\001\200\0034\000\000\000\000\000\000\0035\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003;\003P\000\000\003\176\000\000\000\000\000\000\000\000\000\000\003v\0032\000\000\003b\000\000\000\000\000\000\002\210\002\211\001\172\003t\000\000\001\200\0034\000\000\000\000\000\000\000\000\000\000\000\000\003P\000\000\0035\000\000\000\000\000\000\000\000\000\000\002}\000\000\003;\006A\003\182\002}\003v\000\000\006K\000\000\002\149\0032\003`\000\000\002\153\002\149\000\213\000\000\000\000\002\153\003t\000\213\001\200\0034\002\214\000\000\0031\001w\002\210\002\211\001\172\003P\000\000\000\000\002\210\002\211\001\172\000\000\000\000\000\000\003`\000\000\000\000\0035\003v\000\000\000\000\000\000\000\000\0035\000\000\003;\002\214\000\000\0031\001w\003b\003;\000\000\002\154\000\000\000\000\000\000\000\000\002\154\002\155\000\000\000\000\000\000\000\000\002\155\000\000\000\000\000\000\000\000\000\000\000\000\002\156\000\000\003`\003P\000\000\002\156\000\000\003b\003\188\003P\000\000\000\000\000\000\000\000\002\214\0032\0031\001w\000\000\000\000\000\000\000\000\000\000\000\000\003t\000\000\001\200\0034\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\194\000\000\002\210\002\211\001\172\000\000\000\000\0032\000\000\000\000\003b\000\000\003v\000\000\000\000\003`\003t\0035\001\200\0034\000\000\003`\000\000\000\000\000\000\003;\000\000\002\214\000\000\0031\001w\000\000\000\000\002\214\000\000\0031\001w\000\000\000\000\003\200\003v\002\210\002\211\001\172\000\000\000\000\0032\000\000\000\000\000\000\000\000\002\210\002\211\001\172\003P\003t\0035\001\200\0034\003b\000\000\000\000\001\171\001\172\003;\003b\0035\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003;\000\000\000\000\000\000\000\000\003v\000\000\000\000\001\173\003\014\000\000\001\175\001\176\000\000\003\206\000\000\000\000\000\000\000\000\003P\003\212\0032\000\000\000\000\000\000\000\000\000\000\0032\003`\003P\003t\000\000\001\200\0034\000\000\000\000\003t\000\000\001\200\0034\002\214\000\000\0031\001w\000\000\000\000\000\000\000\000\002\210\002\211\001\172\000\000\000\000\000\000\003v\000\000\000\000\000\000\000\000\000\000\003v\000\000\000\000\0035\000\000\000\000\000\000\003`\000\000\000\000\000\000\003;\003b\002\210\002\211\001\172\000\000\003`\000\000\002\214\000\000\0031\001w\002\210\002\211\001\172\000\000\001\180\0035\002\214\000\000\0031\001w\000\000\000\000\000\000\003;\000\000\0035\001\181\003P\003\218\001w\000\000\000\000\000\000\003;\000\000\0032\000\000\000\000\003b\000\000\000\000\000\000\000\000\000\000\003t\000\000\001\200\0034\003b\000\000\000\000\000\000\003P\000\000\000\000\000\000\002\210\002\211\001\172\000\000\000\000\000\000\003P\000\000\002{\007\135\000\000\003\224\003v\000\000\000\000\0035\000\000\000\000\0032\003`\000\000\003\230\000\000\003;\000\000\000\000\000\000\003t\0032\001\200\0034\002\214\000\000\0031\001w\000\000\000\000\003t\001\198\001\200\0034\000\000\000\000\000\000\003`\000\000\000\000\001\199\000\000\001\200\001\179\003v\003P\000\000\003`\000\000\002\214\000\000\0031\001w\007\147\003v\000\000\003b\002}\000\000\002\214\006T\0031\001w\002\210\002\211\001\172\000\000\002\149\000\000\000\000\000\000\002\153\000\000\000\213\000\000\000\000\000\000\000\000\0035\000\000\000\000\003b\000\000\000\000\000\000\003\236\003;\000\000\000\000\000\000\000\000\003b\0032\003`\000\000\000\000\000\000\000\000\000\000\000\221\000\000\003t\000\222\001\200\0034\002\214\000\000\0031\001w\000\000\003\250\000\000\000\000\000\000\000\000\003P\002\154\0032\000\000\000\000\004\000\000\000\002\155\000\000\000\000\003v\003t\0032\001\200\0034\000\000\000\000\000\000\000\000\002\156\005i\003t\003b\001\200\0034\000\000\000\000\000\000\000\000\002\210\002\211\001\172\000\000\000\000\000\000\003v\000\000\000\000\bI\000\000\000\000\000\000\000\000\000\000\0035\003v\000\000\000\000\003`\000\000\000\000\004L\003;\000\000\000\000\000\000\000\000\000\224\0032\000\000\002\214\000\000\0031\001w\002\210\002\211\001\172\003t\000\000\001\200\0034\000\000\000\227\000\000\000\000\000\000\000\000\000\000\000\000\0035\000\000\003P\000\000\000\000\002\210\002\211\001\172\003;\000\000\000\228\000\000\003v\003b\000\000\000\000\000\213\000\231\000\000\000\000\0035\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003;\000\000\000\000\002\210\002\211\001\172\000\000\000\000\000\000\003P\000\000\000\000\000\000\000\000\004V\000\000\000\000\000\000\0035\000\000\000\000\0032\003`\000\000\000\000\000\000\003;\000\000\000\000\003P\003t\000\000\001\200\0034\002\214\000\000\0031\001w\000\232\000\000\000\000\002\210\002\211\001\172\000\000\000\000\000\233\000\000\000\000\000\234\000\000\000\000\000\235\000\236\003v\003P\0035\003`\000\000\000\000\000\000\000\000\000\000\000\000\003;\000\000\003b\000\000\000\000\002\214\000\221\0031\001w\000\222\000\000\000\000\000\000\003`\000\240\000\000\000\000\005p\000\000\000\000\002\210\002\211\001\172\000\000\000\000\002\214\000\000\0031\001w\003P\000\000\004`\000\000\000\000\000\000\0035\000\000\003b\0032\003`\000\000\000\000\006\004\003;\000\000\000\000\000\000\003t\000\000\001\200\0034\002\214\000\000\0031\001w\000\000\000\000\003b\000\000\000\000\000\000\006\007\000\000\000\000\000\000\000\000\004k\000\000\000\000\000\000\000\000\003v\003P\0032\000\000\000\000\000\000\003`\000\000\000\224\000\000\000\000\003t\003b\001\200\0034\004u\000\000\000\000\002\214\000\000\0031\001w\0032\000\227\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003t\000\000\001\200\0034\003v\000\000\000\000\000\000\000\000\000\228\004\127\000\000\000\000\000\000\000\000\000\213\000\231\0032\003`\003b\002\210\002\211\001\172\000\000\003v\000\000\003t\000\000\001\200\0034\002\214\000\000\0031\001w\000\000\0035\000\000\002\210\002\211\001\172\000\000\000\000\000\000\003;\000\000\000\000\000\000\000\000\004\139\000\000\003v\000\000\0035\000\000\000\000\0032\000\000\000\000\000\000\000\000\003;\000\000\003b\000\000\003t\000\232\001\200\0034\000\000\000\000\000\000\000\000\003P\000\233\000\000\000\000\000\234\000\000\000\000\000\235\000\236\006\r\000\000\000\000\000\000\000\000\000\000\000\000\003v\003P\000\000\004\149\000\000\000\000\000\000\000\000\000\000\000\000\0032\000\000\000\000\002\210\002\211\001\172\000\000\000\240\000\000\003t\000\255\001\200\0034\000\000\000\000\000\000\000\000\000\000\0035\000\000\000\000\000\000\003`\000\000\000\000\000\000\003;\000\000\000\000\002\210\002\211\001\172\000\000\003v\002\214\000\000\0031\001w\000\000\003`\000\000\000\000\000\000\000\000\0035\000\000\002\210\002\211\001\172\000\000\000\000\002\214\003;\0031\001w\003P\002\210\002\211\001\172\000\000\000\000\0035\000\000\000\000\000\000\000\000\003b\000\000\000\000\003;\000\000\0035\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003;\000\000\003P\000\000\003b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\159\000\221\000\000\003P\000\222\000\000\000\000\0032\003`\000\000\000\000\000\000\000\000\003P\000\000\000\000\003t\004\166\001\200\0034\002\214\000\000\0031\001w\0032\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003t\003`\001\200\0034\006\004\000\000\000\000\003v\000\000\000\000\000\000\000\000\000\000\002\214\000\000\0031\001w\000\000\003`\003b\000\000\000\000\000\000\006\128\003v\000\000\000\000\000\000\003`\000\000\002\214\000\000\0031\001w\000\000\000\000\000\000\000\000\000\000\000\000\002\214\000\224\0031\001w\000\000\003b\000\000\000\000\004\227\000\000\000\221\000\000\000\000\000\222\000\000\0032\000\227\000\000\000\000\000\000\000\000\000\000\003b\000\000\003t\000\000\001\200\0034\000\000\000\000\000\000\000\000\003b\000\228\004\226\000\000\000\000\000\000\000\000\000\213\000\231\0032\000\000\000\000\000\000\000\000\006\004\000\000\003v\000\000\003t\004\233\001\200\0034\000\221\000\000\000\000\000\222\0032\000\000\000\000\004\255\000\000\000\221\000\000\007Q\000\222\003t\0032\001\200\0034\000\000\000\000\000\000\003v\000\000\000\000\003t\000\000\001\200\0034\000\000\000\000\000\224\000\000\000\221\000\000\000\000\000\222\000\232\006\004\003v\000\000\002\210\002\211\001\172\000\000\000\233\000\227\006\004\000\234\003v\000\000\000\235\000\236\006\r\000\000\000\000\0035\007_\000\000\000\000\000\000\000\000\000\000\000\228\003;\000\000\007i\000\000\000\000\000\213\000\231\000\000\000\000\000\000\000\000\000\224\000\000\000\240\000\000\000\000\000\255\000\000\000\000\000\000\000\224\000\000\000\000\000\000\000\221\000\000\000\227\000\222\000\000\003P\000\000\000\000\000\000\000\000\000\000\000\227\000\000\000\000\000\000\000\000\000\000\000\000\000\224\000\228\000\000\000\000\000\000\000\000\000\000\000\213\000\231\000\000\000\228\000\000\000\000\000\232\000\000\000\227\000\213\000\231\005i\000\000\000\000\000\233\000\000\000\000\000\234\000\000\000\000\000\235\000\236\006\r\000\000\000\000\000\228\000\000\000\000\003`\005l\000\000\000\213\000\231\000\000\000\221\000\000\000\000\000\222\000\000\000\000\002\214\000\000\0031\001w\000\000\000\000\000\240\000\000\000\224\000\255\000\232\000\000\000\221\000\000\000\000\000\222\000\000\000\000\000\233\000\232\000\000\000\234\000\000\000\227\000\235\000\236\006\r\000\233\000\000\000\000\000\234\000\000\003b\000\235\000\236\006\r\006\217\000\000\000\000\000\000\000\228\000\232\000\000\007\130\000\000\000\000\000\213\000\231\000\000\000\233\000\240\000\000\000\234\000\255\000\000\000\235\000\236\006\157\000\000\000\240\006\160\b!\000\255\000\000\006\218\b\152\006\219\000\224\0032\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003t\000\000\001\200\0034\000\240\000\227\000\000\000\255\000\224\000\000\000\000\000\221\000\000\000\000\000\222\000\000\000\000\000\000\000\000\000\232\000\000\006\220\000\228\000\227\003v\000\000\000\000\000\233\000\213\000\231\000\234\000\000\000\000\000\235\000\236\000\000\000\000\000\000\000\000\000\000\000\228\000\221\000\000\007\204\000\222\000\000\000\213\000\231\000\000\000\000\000\000\000\000\000\000\000\221\000\000\006\221\000\222\000\000\b\237\000\240\000\000\b\238\005p\000\000\007\207\006\222\006\223\000\000\006\224\000\000\000\000\000\000\000\000\007\208\000\000\000\000\000\000\000\000\000\232\000\000\b\178\000\000\000\000\000\000\000\224\000\000\000\233\000\221\000\000\000\234\000\222\007\028\000\235\000\236\006\157\000\000\000\232\007\176\000\000\000\227\000\000\000\000\000\000\000\000\000\233\007\209\000\000\000\234\000\000\000\000\000\235\000\236\006\144\000\000\000\224\000\000\000\228\000\000\000\240\006\226\b\154\000\255\000\213\000\231\006\228\006\238\000\224\000\000\000\000\000\227\000\000\000\000\000\221\000\000\000\000\000\222\000\240\007\024\000\000\000\255\007\210\000\227\000\000\000\000\000\000\000\000\000\228\000\000\000\000\000\000\007\211\000\000\000\213\000\231\000\000\007\025\000\000\000\000\000\228\000\000\000\224\000\000\000\000\000\000\000\213\000\231\001\016\000\000\000\000\000\000\b\240\000\000\000\232\000\221\000\000\000\227\000\222\000\000\000\000\000\000\000\233\000\000\000\000\000\234\000\000\000\000\000\235\000\236\b\179\007\213\000\000\000\000\000\228\000\000\000\221\000\000\000\000\000\222\000\213\000\231\000\000\000\000\000\232\007\214\000\221\000\224\000\000\000\222\007\216\000\000\000\233\000\000\000\240\000\234\000\232\000\255\000\235\000\236\001(\000\000\000\227\007\218\000\233\000\000\000\000\000\234\000\000\000\000\000\235\000\236\000\237\000\000\000\000\000\000\000\000\000\000\000\000\000\228\000\000\007\219\000\000\000\000\000\240\000\213\000\231\000\255\000\224\000\000\000\232\000\221\000\000\000\000\000\222\000\000\000\240\000\000\000\233\000\255\000\000\000\234\000\000\000\227\000\235\000\236\001-\000\000\000\000\000\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\224\000\228\000\000\000\221\000\000\000\227\000\222\000\213\000\231\000\000\000\000\000\240\000\000\000\000\000\255\000\227\000\232\000\000\000\000\000\000\000\000\000\000\000\228\000\000\000\233\000\000\000\000\000\234\000\213\000\231\000\235\000\236\000\228\000\000\000\221\000\000\000\000\000\222\000\213\000\231\000\000\000\000\000\000\000\000\000\000\000\224\000\000\000\221\000\000\000\000\000\222\000\000\000\000\000\000\000\000\000\000\000\240\000\232\000\000\001\022\000\227\000\000\000\000\000\000\000\000\000\233\000\000\000\000\000\234\000\000\000\000\000\235\000\236\001B\000\000\000\000\000\224\000\228\000\232\000\000\000\000\000\000\000\000\000\213\000\231\000\000\000\233\000\000\000\232\000\234\000\000\000\227\000\235\000\236\001I\000\000\000\233\000\240\000\000\000\234\000\255\000\000\000\235\000\236\001\139\000\000\000\000\000\224\000\228\000\221\000\000\000\000\000\222\000\000\000\213\000\231\000\000\000\000\000\240\000\000\000\224\000\255\000\227\000\000\000\000\000\000\000\000\000\000\000\240\000\221\000\000\000\255\000\222\000\232\000\000\000\227\000\000\000\000\000\000\000\228\000\000\000\233\000\000\000\000\000\234\000\213\000\231\000\235\000\236\001\146\000\000\000\000\000\228\000\000\000\000\000\000\000\000\000\000\000\213\000\231\000\000\000\000\000\000\000\000\000\232\000\000\000\000\000\000\000\000\000\000\000\000\000\221\000\233\000\240\000\222\000\234\000\255\000\000\000\235\000\236\001\159\000\000\000\224\000\221\000\000\000\000\000\222\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\232\000\000\000\227\000\000\000\000\000\000\000\000\000\224\000\233\000\240\000\000\000\234\000\255\000\232\000\235\000\236\001\193\000\000\000\000\000\228\000\000\000\233\000\227\000\000\000\234\000\213\000\231\000\235\000\236\001\221\000\000\000\000\000\000\000\000\000\000\000\221\000\000\000\000\000\222\000\228\000\240\000\000\000\000\000\255\000\000\000\213\000\231\000\000\000\000\000\224\000\000\000\000\000\000\000\240\000\000\000\000\000\255\000\000\000\000\000\000\000\000\000\224\000\000\000\000\000\227\000\000\000\000\000\000\000\000\000\000\000\000\000\221\000\000\000\000\000\222\000\232\000\227\000\000\000\000\000\000\000\000\000\228\000\000\000\233\000\000\000\000\000\234\000\213\000\231\000\235\000\236\001\251\000\000\000\228\000\000\000\232\000\000\000\000\000\000\000\213\000\231\000\000\000\000\000\233\000\000\000\000\000\234\000\000\000\224\000\235\000\236\002\004\000\000\000\221\000\000\000\240\000\222\000\000\000\255\000\000\000\000\000\000\000\000\000\227\000\000\000\000\000\221\000\000\000\000\000\222\000\000\000\000\000\000\000\000\000\000\000\240\000\000\000\232\000\255\000\000\000\228\000\000\000\000\000\000\000\224\000\233\000\213\000\231\000\234\000\232\000\000\000\235\000\236\002;\000\000\000\000\000\000\000\233\000\000\000\227\000\234\000\000\000\000\000\235\000\236\002H\000\000\000\000\000\221\000\000\000\000\000\222\000\000\000\000\000\000\000\000\000\228\000\240\000\000\000\000\000\255\000\221\000\213\000\231\000\222\000\000\000\224\000\000\000\000\000\240\000\000\000\000\000\255\000\000\000\000\000\000\000\232\000\000\000\000\000\224\000\000\000\227\000\000\000\000\000\233\000\000\000\000\000\234\000\000\000\000\000\235\000\236\002V\000\000\000\227\000\000\000\000\000\000\000\228\000\000\000\000\000\000\000\000\000\221\000\213\000\231\000\222\000\000\000\000\000\000\000\000\000\228\000\232\000\000\000\000\000\000\000\240\000\213\000\231\000\255\000\233\000\224\000\000\000\234\000\000\000\000\000\235\000\236\002b\000\000\000\000\000\000\000\000\000\000\000\224\000\000\000\227\000\000\000\000\000\221\000\000\000\000\000\222\000\000\000\000\000\000\000\000\000\000\000\000\000\227\000\000\000\000\000\240\000\228\000\232\000\255\000\000\000\000\000\221\000\213\000\231\000\222\000\233\000\000\000\000\000\234\000\228\000\232\000\235\000\236\002\139\000\000\000\213\000\231\000\000\000\233\000\224\000\000\000\234\000\000\000\000\000\235\000\236\002\141\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\227\000\000\000\000\000\240\000\000\000\000\000\255\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\240\000\228\000\232\000\255\000\000\000\224\000\221\000\213\000\231\000\222\000\233\000\000\000\000\000\234\000\000\000\232\000\235\000\236\002\233\000\000\000\227\000\000\000\000\000\233\000\224\000\000\000\234\000\000\000\000\000\235\000\236\003\002\000\000\000\000\000\000\000\000\000\000\000\228\000\000\000\227\000\000\000\000\000\240\000\213\000\231\000\255\000\000\000\000\000\000\000\000\000\000\000\221\000\000\000\000\000\222\000\240\000\228\000\232\000\255\000\000\000\000\000\221\000\213\000\231\000\222\000\233\000\000\000\000\000\234\000\000\000\000\000\235\000\236\004\n\000\000\000\000\000\000\000\000\000\000\000\224\000\000\000\221\000\000\000\000\000\222\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\232\000\227\000\000\000\000\000\240\000\000\000\000\000\255\000\233\000\000\000\221\000\234\000\000\000\222\000\235\000\236\004\017\000\000\000\228\000\232\000\000\000\000\000\000\000\000\000\213\000\231\000\000\000\233\000\000\000\000\000\234\000\224\000\000\000\235\000\236\004!\000\000\000\000\000\000\000\000\000\240\000\224\000\000\000\255\000\000\000\000\000\227\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\227\000\000\000\000\000\240\000\000\000\224\000\255\000\228\000\000\000\221\000\000\000\000\000\222\000\213\000\231\000\000\000\000\000\228\000\232\000\000\000\227\000\000\000\000\000\213\000\231\000\000\000\233\000\224\000\000\000\234\000\000\000\000\000\235\000\236\004-\000\000\000\000\000\228\000\000\000\000\000\000\000\000\000\227\000\213\000\231\000\000\000\000\000\000\000\000\000\221\000\000\000\221\006\194\000\000\000\222\000\000\000\000\000\000\000\240\000\228\000\000\000\255\000\000\000\232\000\000\000\213\000\231\000\000\000\000\000\000\000\000\000\233\000\000\000\232\000\234\000\000\000\000\000\235\000\236\006\006\000\000\000\233\000\224\000\000\000\234\000\000\000\000\000\235\000\236\006i\000\000\000\000\000\221\000\232\000\000\000\222\000\000\000\227\000\000\000\000\000\000\000\233\000\000\000\240\000\234\000\000\000\255\000\235\000\236\006u\000\000\000\000\000\000\000\240\000\228\000\232\000\255\000\000\000\000\000\000\000\213\000\231\006\196\000\233\000\224\000\000\000\234\000\000\000\000\000\235\000\236\006\143\000\000\000\240\000\000\000\000\000\255\000\227\000\000\000\227\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\228\000\240\000\228\000\000\000\255\000\000\000\213\006\199\000\213\000\231\000\000\000\224\000\221\000\000\000\000\000\222\000\232\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\233\000\000\000\227\000\234\000\000\000\000\000\235\000\236\006\159\000\221\000\000\000\000\006\194\000\000\000\000\000\000\000\000\000\000\000\000\000\228\000\000\000\000\000\000\000\000\000\000\000\213\000\231\000\000\000\221\000\000\000\000\006\194\000\240\000\000\000\232\000\255\000\000\000\000\000\000\000\000\000\233\000\000\000\233\006\200\000\000\000\234\000\235\000\236\000\235\000\236\007<\000\000\000\000\000\000\000\000\000\000\006\146\000\000\006\213\000\000\006\202\000\224\000\000\000\221\000\000\000\000\000\222\000\000\000\000\000\000\000\000\000\000\000\240\000\000\000\240\000\232\000\227\000\255\000\000\000\000\000\000\000\000\006\196\000\233\000\000\000\000\000\234\000\000\000\000\000\235\000\236\007N\000\000\000\228\000\000\000\000\000\000\000\227\000\000\000\213\000\231\006\196\000\000\000\000\000\000\000\000\000\000\001\171\001\172\000\000\000\000\000\000\000\000\000\000\000\228\000\240\000\227\000\000\000\255\000\000\000\213\006\199\000\000\001\171\001\172\000\000\000\000\001\173\003\014\000\000\001\175\001\176\000\000\000\228\000\000\000\000\000\224\000\000\000\000\000\213\006\199\000\000\000\000\001\173\003\014\000\000\001\175\001\176\000\000\000\232\000\000\000\227\000\000\000\000\000\000\000\000\000\000\000\233\000\221\000\000\000\234\000\222\000\000\000\235\000\236\007f\000\000\000\000\000\228\000\000\000\221\000\000\000\000\000\222\000\213\000\231\000\000\000\000\000\233\000\000\000\221\006\200\000\000\000\222\000\235\000\236\000\000\000\000\000\000\000\240\000\000\000\000\000\255\000\000\006\146\000\000\007\162\000\233\006\202\000\000\006\200\000\000\000\000\000\235\000\236\000\000\001\180\000\000\000\000\000\000\000\240\000\221\000\000\006\146\000\222\007\188\000\000\006\202\001\181\000\000\000\000\001w\001\180\000\000\000\232\000\000\000\000\000\000\000\000\000\240\000\000\000\224\000\233\000\000\001\181\000\234\000\000\001w\000\235\000\236\007\252\000\000\000\000\000\224\000\000\000\000\000\227\000\000\000\000\000\000\000\000\000\000\000\000\000\224\000\000\000\000\000\221\007\191\000\227\000\222\000\000\000\000\000\000\000\228\000\240\000\000\000\000\000\255\000\227\000\213\000\231\000\000\000\000\007\191\000\000\000\228\000\000\000\221\000\000\000\000\000\222\000\213\000\231\000\000\000\224\000\228\001\198\000\221\000\000\000\000\000\222\000\213\000\231\000\000\000\000\001\199\000\000\001\200\001\179\000\227\000\000\000\000\001\198\000\000\000\000\000\000\000\000\000\000\000\000\007\192\000\000\001\199\000\000\001\200\001\179\000\000\000\228\000\000\000\000\000\232\000\000\000\000\000\213\000\231\000\000\007\200\000\000\000\233\000\000\000\224\000\234\000\232\000\000\000\235\000\236\b\006\000\000\000\000\000\000\000\233\000\000\000\232\000\234\000\000\000\227\000\235\000\236\bc\007\204\000\233\000\224\000\000\000\234\000\000\000\000\000\235\000\236\bf\000\000\000\240\000\224\000\228\000\255\b\237\000\000\000\227\b\238\000\213\000\231\007\207\000\000\000\240\000\232\006\217\000\255\000\227\000\000\006\217\007\208\000\000\000\233\000\240\000\228\000\234\000\255\000\000\000\235\000\236\000\213\000\231\000\000\000\000\000\228\000\000\000\000\000\000\000\000\000\000\000\213\000\231\000\000\006\218\000\000\006\219\000\000\006\218\000\000\006\219\000\000\000\000\007\209\000\000\000\240\000\000\000\000\001\018\000\000\000\232\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\233\000\000\000\000\000\234\000\000\000\000\000\235\000\236\000\000\000\000\006\220\000\000\000\000\000\232\006\220\000\000\000\221\000\000\000\000\000\222\007\210\000\233\000\000\000\232\000\234\000\000\000\000\000\235\000\236\000\000\007\211\000\233\000\240\000\000\000\234\002\134\000\000\000\235\000\236\000\000\000\000\000\000\000\000\000\000\006\221\000\000\000\000\000\000\006\221\007\204\b\239\000\000\000\000\000\240\006\222\006\223\002\136\006\224\006\222\006\223\007\204\006\224\000\000\000\240\b\237\000\000\005k\b\238\000\000\007\213\007\207\000\000\001\171\001\172\000\000\b\237\000\000\000\000\b\238\007\208\007\026\007\207\000\000\007\214\006\225\000\000\000\000\000\000\007\216\000\224\007\208\000\000\001\173\001\174\000\000\001\175\001\176\000\000\000\000\000\000\000\000\007\218\000\000\000\000\000\227\000\000\000\000\000\000\006\226\000\000\000\000\007\209\006\226\006\228\006\238\000\000\000\000\006\228\006\238\007\219\000\000\000\228\007\209\000\000\000\000\000\000\007\024\000\213\000\231\000\000\007\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\171\001\172\000\000\000\000\000\000\000\000\007\025\000\000\007\210\000\000\007\025\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\211\007\210\001\173\001\187\000\000\001\175\001\176\000\000\000\000\000\000\000\000\007\211\000\000\000\000\000\000\001\180\000\000\001\171\001\172\000\000\b\243\001\004\001\171\001\172\000\000\000\000\000\000\001\181\000\000\000\233\001w\b\248\000\234\000\000\000\000\000\235\000\236\001\173\001\197\007\213\001\175\001\176\001\173\001\208\000\000\001\175\001\176\000\000\000\000\000\000\007\213\000\000\000\000\007\214\001\171\001\172\000\000\000\000\007\216\000\000\000\000\000\240\000\000\000\000\007\214\000\000\000\000\001\171\001\172\007\216\000\000\007\218\000\000\000\000\001\173\001\225\000\000\001\175\001\176\000\000\000\000\001\180\007\218\000\000\000\000\000\000\000\000\001\173\001\238\007\219\001\175\001\176\000\000\001\181\000\000\001\198\001w\000\000\000\000\000\000\007\219\000\000\000\000\000\000\001\199\000\000\001\200\001\179\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\180\001\171\001\172\000\000\000\000\001\180\000\000\001\171\001\172\000\000\000\000\000\000\001\181\000\000\000\000\001w\000\000\001\181\000\000\000\000\001w\001\173\001\255\000\000\001\175\001\176\000\000\001\173\002+\000\000\001\175\001\176\000\000\000\000\000\000\000\000\000\000\001\180\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\198\001\171\001\172\000\000\001\181\001\180\000\000\001w\000\000\001\199\000\000\001\200\001\179\000\000\000\000\000\000\000\000\001\181\001\171\001\172\001w\001\173\002?\000\000\001\175\001\176\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\198\000\000\000\000\001\173\002L\001\198\001\175\001\176\000\000\001\199\000\000\001\200\001\179\000\000\001\199\000\000\001\200\001\179\000\000\000\000\001\180\000\000\000\000\000\000\000\000\000\000\001\180\000\000\000\000\000\000\000\000\000\000\001\181\001\171\001\172\001w\000\000\001\198\001\181\000\000\000\000\001w\000\000\000\000\000\000\000\000\001\199\000\000\001\200\001\179\001\198\000\000\000\000\001\173\002P\000\000\001\175\001\176\000\000\001\199\000\000\001\200\001\179\000\000\000\000\001\180\001\171\001\172\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\181\000\000\000\000\001w\000\000\001\180\000\000\001\171\001\172\001\173\002Z\000\000\001\175\001\176\000\000\000\000\000\000\001\181\000\000\000\000\001w\000\000\000\000\001\198\000\000\001\171\001\172\001\173\003\r\001\198\001\175\001\176\001\199\000\000\001\200\001\179\007\204\000\000\001\199\000\000\001\200\001\179\000\000\000\000\000\000\001\173\0041\000\000\001\175\001\176\000\000\001\171\001\172\000\000\007\205\001\180\000\000\007\207\000\000\000\000\002\210\002\211\001\172\000\000\000\000\000\000\007\208\001\181\001\198\000\000\001w\001\173\007\243\000\000\001\175\001\176\000\000\001\199\000\000\001\200\001\179\000\000\000\000\002\236\000\000\001\198\000\000\000\000\001\180\001\171\001\172\000\000\000\000\000\000\001\199\000\000\001\200\001\179\007\209\000\000\001\181\000\000\000\000\001w\000\000\000\000\001\180\000\000\000\000\001\173\b\000\000\000\001\175\001\176\000\221\000\000\000\000\000\222\001\181\000\000\000\000\001w\000\000\000\000\001\180\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\210\000\000\001\198\001\181\000\000\000\000\001w\000\000\000\000\000\000\007\211\001\199\000\221\001\200\001\179\000\222\000\000\001\180\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\213\000\000\001\181\000\000\000\000\001w\000\000\007\233\001\198\000\000\000\000\000\000\002\214\000\000\0031\001w\000\000\001\199\000\000\001\200\001\179\000\000\007\213\000\000\000\000\000\000\001\198\000\224\001\180\000\000\000\000\000\000\000\000\000\000\000\000\001\199\007\214\001\200\001\179\000\000\001\181\007\216\000\227\001w\001\198\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\199\007\218\001\200\001\179\000\000\000\224\000\228\000\000\000\000\002\210\002\211\001\172\000\213\000\231\000\000\000\000\000\000\001\198\000\000\007\219\000\227\000\000\002\210\002\211\001\172\000\000\001\199\0032\001\200\001\179\000\000\000\000\002\238\000\000\000\000\000\000\0033\000\228\001\200\0034\002\210\002\211\001\172\000\213\000\231\003#\002\210\002\211\001\172\000\000\000\000\000\000\000\000\000\000\000\000\001\198\002\210\002\211\001\172\000\000\000\000\000\000\bW\0030\001\199\000\000\001\200\001\179\000\000\003E\000\233\000\000\000\000\000\234\000\000\000\000\000\235\000\236\000\000\003G\002\210\002\211\001\172\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\\\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\233\000\240\003Y\000\234\000\000\000\000\000\235\000\236\002\213\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\214\002\213\0031\001w\000\000\000\000\002\210\002\211\001\172\000\000\000\000\000\000\000\240\002\214\000\000\0031\001w\000\000\000\000\002\213\000\000\000\000\002\210\002\211\001\172\002\213\000\000\000\000\000\000\003a\000\000\002\214\000\000\0031\001w\002\213\000\000\002\214\000\000\0031\001w\002\210\002\211\001\172\000\000\003u\000\000\002\214\000\000\0031\001w\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\213\002\210\002\211\001\172\000\000\003\245\002\210\002\211\001\172\0032\000\000\000\000\002\214\000\000\0031\001w\000\000\000\000\0033\000\000\001\200\0034\0032\000\000\004\250\000\000\000\000\000\000\000\000\b\r\000\000\0033\000\000\001\200\0034\000\000\000\000\000\000\000\000\000\000\0032\000\000\000\000\000\000\000\000\000\000\0032\002\213\000\000\0033\000\000\001\200\0034\000\000\000\000\0033\0032\001\200\0034\002\214\000\000\0031\001w\002\213\000\000\0033\000\000\001\200\0034\000\000\002\210\002\211\001\172\000\000\000\000\002\214\000\000\0031\001w\000\000\0032\000\000\002\213\000\000\000\000\000\000\000\000\000\000\000\000\0033\000\000\001\200\0034\b\028\002\214\000\000\0031\001w\000\000\000\000\000\000\002\213\000\000\000\000\000\000\000\000\002\213\000\000\000\000\000\000\000\000\000\000\000\000\002\214\000\000\0031\001w\000\000\002\214\000\000\0031\001w\000\000\000\000\000\000\000\000\000\000\0032\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0033\000\000\001\200\0034\000\000\000\000\000\000\0032\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0033\000\000\001\200\0034\000\000\000\000\000\000\000\000\000\000\000\000\0032\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\213\0033\000\000\001\200\0034\000\000\000\000\000\000\000\000\000\000\000\000\0032\002\214\000\000\0031\001w\0032\000\000\000\000\000\000\0033\000\000\001\200\0034\000\000\0033\000\000\001\200\0034\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0032\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0033\000\000\001\200\0034")) and semantic_action = [| @@ -1486,9 +1474,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4024 "parsing/parser.mly" +# 4195 "parsing/parser.mly" ( "+" ) -# 1492 "parsing/parser.ml" +# 1480 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -1511,9 +1499,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4025 "parsing/parser.mly" +# 4196 "parsing/parser.mly" ( "+." ) -# 1517 "parsing/parser.ml" +# 1505 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -1536,9 +1524,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.core_type) = -# 3514 "parsing/parser.mly" +# 3638 "parsing/parser.mly" ( _1 ) -# 1542 "parsing/parser.ml" +# 1530 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -1590,15 +1578,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3462 "parsing/parser.mly" +# 3586 "parsing/parser.mly" ( mkrhs _2 _sloc ) -# 1596 "parsing/parser.ml" +# 1584 "parsing/parser.ml" in -# 3517 "parsing/parser.mly" +# 3641 "parsing/parser.mly" ( Ptyp_alias(ty, tyvar) ) -# 1602 "parsing/parser.ml" +# 1590 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__2_inlined1_, _startpos_ty_) in @@ -1606,15 +1594,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1021 "parsing/parser.mly" +# 1009 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 1612 "parsing/parser.ml" +# 1600 "parsing/parser.ml" in ( -# 3519 "parsing/parser.mly" +# 3643 "parsing/parser.mly" ( _1 ) -# 1618 "parsing/parser.ml" +# 1606 "parsing/parser.ml" : (Parsetree.core_type)) in { @@ -1663,30 +1651,30 @@ module Tables = struct let attrs2 = let _1 = _1_inlined2 in -# 4110 "parsing/parser.mly" +# 4282 "parsing/parser.mly" ( _1 ) -# 1669 "parsing/parser.ml" +# 1657 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined2_ in let attrs1 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 1678 "parsing/parser.ml" +# 1666 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2747 "parsing/parser.mly" +# 2732 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in mklb ~loc:_sloc false body attrs ) -# 1690 "parsing/parser.ml" +# 1678 "parsing/parser.ml" : (let_binding)) in { @@ -1710,9 +1698,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3908 "parsing/parser.mly" +# 4079 "parsing/parser.mly" ( _1 ) -# 1716 "parsing/parser.ml" +# 1704 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -1735,9 +1723,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3909 "parsing/parser.mly" +# 4080 "parsing/parser.mly" ( Lident _1 ) -# 1741 "parsing/parser.ml" +# 1729 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -1760,9 +1748,9 @@ module Tables = struct let _startpos = _startpos_type__ in let _endpos = _endpos_type__ in let _v : (Parsetree.core_type) = -# 3650 "parsing/parser.mly" +# 3819 "parsing/parser.mly" ( type_ ) -# 1766 "parsing/parser.ml" +# 1754 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -1792,35 +1780,35 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 1798 "parsing/parser.ml" +# 1786 "parsing/parser.ml" in let tys = -# 3683 "parsing/parser.mly" +# 3852 "parsing/parser.mly" ( [] ) -# 1804 "parsing/parser.ml" +# 1792 "parsing/parser.ml" in -# 3654 "parsing/parser.mly" +# 3823 "parsing/parser.mly" ( Ptyp_constr (tid, tys) ) -# 1809 "parsing/parser.ml" +# 1797 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1021 "parsing/parser.mly" +# 1009 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 1818 "parsing/parser.ml" +# 1806 "parsing/parser.ml" in ( -# 3668 "parsing/parser.mly" +# 3837 "parsing/parser.mly" ( _1 ) -# 1824 "parsing/parser.ml" +# 1812 "parsing/parser.ml" : (Parsetree.core_type)) in { @@ -1858,20 +1846,20 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 1864 "parsing/parser.ml" +# 1852 "parsing/parser.ml" in let tys = -# 3685 "parsing/parser.mly" +# 3854 "parsing/parser.mly" ( [ ty ] ) -# 1870 "parsing/parser.ml" +# 1858 "parsing/parser.ml" in -# 3654 "parsing/parser.mly" +# 3823 "parsing/parser.mly" ( Ptyp_constr (tid, tys) ) -# 1875 "parsing/parser.ml" +# 1863 "parsing/parser.ml" in let _startpos__1_ = _startpos_ty_ in @@ -1879,15 +1867,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1021 "parsing/parser.mly" +# 1009 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 1885 "parsing/parser.ml" +# 1873 "parsing/parser.ml" in ( -# 3668 "parsing/parser.mly" +# 3837 "parsing/parser.mly" ( _1 ) -# 1891 "parsing/parser.ml" +# 1879 "parsing/parser.ml" : (Parsetree.core_type)) in { @@ -1940,9 +1928,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 1946 "parsing/parser.ml" +# 1934 "parsing/parser.ml" in let tys = @@ -1950,24 +1938,24 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 1954 "parsing/parser.ml" +# 1942 "parsing/parser.ml" in -# 1167 "parsing/parser.mly" +# 1155 "parsing/parser.mly" ( xs ) -# 1959 "parsing/parser.ml" +# 1947 "parsing/parser.ml" in -# 3687 "parsing/parser.mly" +# 3856 "parsing/parser.mly" ( tys ) -# 1965 "parsing/parser.ml" +# 1953 "parsing/parser.ml" in -# 3654 "parsing/parser.mly" +# 3823 "parsing/parser.mly" ( Ptyp_constr (tid, tys) ) -# 1971 "parsing/parser.ml" +# 1959 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined1_ in @@ -1975,15 +1963,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1021 "parsing/parser.mly" +# 1009 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 1981 "parsing/parser.ml" +# 1969 "parsing/parser.ml" in ( -# 3668 "parsing/parser.mly" +# 3837 "parsing/parser.mly" ( _1 ) -# 1987 "parsing/parser.ml" +# 1975 "parsing/parser.ml" : (Parsetree.core_type)) in { @@ -2021,20 +2009,20 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 2027 "parsing/parser.ml" +# 2015 "parsing/parser.ml" in let tys = -# 3683 "parsing/parser.mly" +# 3852 "parsing/parser.mly" ( [] ) -# 2033 "parsing/parser.ml" +# 2021 "parsing/parser.ml" in -# 3658 "parsing/parser.mly" +# 3827 "parsing/parser.mly" ( Ptyp_class (cid, tys) ) -# 2038 "parsing/parser.ml" +# 2026 "parsing/parser.ml" in let _startpos__1_ = _startpos__2_ in @@ -2042,15 +2030,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1021 "parsing/parser.mly" +# 1009 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 2048 "parsing/parser.ml" +# 2036 "parsing/parser.ml" in ( -# 3668 "parsing/parser.mly" +# 3837 "parsing/parser.mly" ( _1 ) -# 2054 "parsing/parser.ml" +# 2042 "parsing/parser.ml" : (Parsetree.core_type)) in { @@ -2095,20 +2083,20 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 2101 "parsing/parser.ml" +# 2089 "parsing/parser.ml" in let tys = -# 3685 "parsing/parser.mly" +# 3854 "parsing/parser.mly" ( [ ty ] ) -# 2107 "parsing/parser.ml" +# 2095 "parsing/parser.ml" in -# 3658 "parsing/parser.mly" +# 3827 "parsing/parser.mly" ( Ptyp_class (cid, tys) ) -# 2112 "parsing/parser.ml" +# 2100 "parsing/parser.ml" in let _startpos__1_ = _startpos_ty_ in @@ -2116,15 +2104,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1021 "parsing/parser.mly" +# 1009 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 2122 "parsing/parser.ml" +# 2110 "parsing/parser.ml" in ( -# 3668 "parsing/parser.mly" +# 3837 "parsing/parser.mly" ( _1 ) -# 2128 "parsing/parser.ml" +# 2116 "parsing/parser.ml" : (Parsetree.core_type)) in { @@ -2184,9 +2172,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 2190 "parsing/parser.ml" +# 2178 "parsing/parser.ml" in let tys = @@ -2194,24 +2182,24 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 2198 "parsing/parser.ml" +# 2186 "parsing/parser.ml" in -# 1167 "parsing/parser.mly" +# 1155 "parsing/parser.mly" ( xs ) -# 2203 "parsing/parser.ml" +# 2191 "parsing/parser.ml" in -# 3687 "parsing/parser.mly" +# 3856 "parsing/parser.mly" ( tys ) -# 2209 "parsing/parser.ml" +# 2197 "parsing/parser.ml" in -# 3658 "parsing/parser.mly" +# 3827 "parsing/parser.mly" ( Ptyp_class (cid, tys) ) -# 2215 "parsing/parser.ml" +# 2203 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined1_ in @@ -2219,15 +2207,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1021 "parsing/parser.mly" +# 1009 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 2225 "parsing/parser.ml" +# 2213 "parsing/parser.ml" in ( -# 3668 "parsing/parser.mly" +# 3837 "parsing/parser.mly" ( _1 ) -# 2231 "parsing/parser.ml" +# 2219 "parsing/parser.ml" : (Parsetree.core_type)) in { @@ -2272,15 +2260,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 2278 "parsing/parser.ml" +# 2266 "parsing/parser.ml" in -# 3662 "parsing/parser.mly" +# 3831 "parsing/parser.mly" ( Ptyp_open (mod_ident, type_) ) -# 2284 "parsing/parser.ml" +# 2272 "parsing/parser.ml" in let _endpos__1_ = _endpos_type__ in @@ -2288,15 +2276,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1021 "parsing/parser.mly" +# 1009 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 2294 "parsing/parser.ml" +# 2282 "parsing/parser.ml" in ( -# 3668 "parsing/parser.mly" +# 3837 "parsing/parser.mly" ( _1 ) -# 2300 "parsing/parser.ml" +# 2288 "parsing/parser.ml" : (Parsetree.core_type)) in { @@ -2329,24 +2317,24 @@ module Tables = struct let _v = let _1 = let _1 = -# 3664 "parsing/parser.mly" +# 3833 "parsing/parser.mly" ( Ptyp_var ident ) -# 2335 "parsing/parser.ml" +# 2323 "parsing/parser.ml" in let _endpos__1_ = _endpos_ident_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1021 "parsing/parser.mly" +# 1009 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 2344 "parsing/parser.ml" +# 2332 "parsing/parser.ml" in ( -# 3668 "parsing/parser.mly" +# 3837 "parsing/parser.mly" ( _1 ) -# 2350 "parsing/parser.ml" +# 2338 "parsing/parser.ml" : (Parsetree.core_type)) in { @@ -2372,23 +2360,23 @@ module Tables = struct let _v = let _1 = let _1 = -# 3666 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( Ptyp_any ) -# 2378 "parsing/parser.ml" +# 2366 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1021 "parsing/parser.mly" +# 1009 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 2386 "parsing/parser.ml" +# 2374 "parsing/parser.ml" in ( -# 3668 "parsing/parser.mly" +# 3837 "parsing/parser.mly" ( _1 ) -# 2392 "parsing/parser.ml" +# 2380 "parsing/parser.ml" : (Parsetree.core_type)) in { @@ -2414,23 +2402,23 @@ module Tables = struct let _v = let _1 = let _1 = -# 4091 "parsing/parser.mly" +# 4263 "parsing/parser.mly" ( _1 ) -# 2420 "parsing/parser.ml" +# 2408 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1014 "parsing/parser.mly" +# 1002 "parsing/parser.mly" ( mkloc _1 (make_loc _sloc) ) -# 2428 "parsing/parser.ml" +# 2416 "parsing/parser.ml" in ( -# 4093 "parsing/parser.mly" +# 4265 "parsing/parser.mly" ( _1 ) -# 2434 "parsing/parser.ml" +# 2422 "parsing/parser.ml" : (Ast_helper.str)) in { @@ -2470,24 +2458,24 @@ module Tables = struct let _v = let _1 = let _1 = -# 4092 "parsing/parser.mly" +# 4264 "parsing/parser.mly" ( _1 ^ "." ^ _3.txt ) -# 2476 "parsing/parser.ml" +# 2464 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1014 "parsing/parser.mly" +# 1002 "parsing/parser.mly" ( mkloc _1 (make_loc _sloc) ) -# 2485 "parsing/parser.ml" +# 2473 "parsing/parser.ml" in ( -# 4093 "parsing/parser.mly" +# 4265 "parsing/parser.mly" ( _1 ) -# 2491 "parsing/parser.ml" +# 2479 "parsing/parser.ml" : (Ast_helper.str)) in { @@ -2511,11 +2499,11 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.payload) = -# 4148 "parsing/parser.mly" +# 4320 "parsing/parser.mly" ( Builtin_attributes.mark_payload_attrs_used _1; _1 ) -# 2519 "parsing/parser.ml" +# 2507 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2563,9 +2551,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 4097 "parsing/parser.mly" +# 4269 "parsing/parser.mly" ( mk_attr ~loc:(make_loc _sloc) _2 _3 ) -# 2569 "parsing/parser.ml" +# 2557 "parsing/parser.ml" : (Parsetree.attribute)) in { @@ -2589,9 +2577,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.class_expr) = -# 1997 "parsing/parser.mly" +# 1985 "parsing/parser.mly" ( _1 ) -# 2595 "parsing/parser.ml" +# 2583 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2631,18 +2619,18 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 2637 "parsing/parser.ml" +# 2625 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 1999 "parsing/parser.mly" +# 1987 "parsing/parser.mly" ( wrap_class_attrs ~loc:_sloc _3 _2 ) -# 2646 "parsing/parser.ml" +# 2634 "parsing/parser.ml" : (Parsetree.class_expr)) in { @@ -2684,9 +2672,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2001 "parsing/parser.mly" +# 1989 "parsing/parser.mly" ( class_of_let_bindings ~loc:_sloc _1 _3 ) -# 2690 "parsing/parser.ml" +# 2678 "parsing/parser.ml" : (Parsetree.class_expr)) in { @@ -2751,34 +2739,34 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 2757 "parsing/parser.ml" +# 2745 "parsing/parser.ml" in let _endpos__5_ = _endpos__1_inlined2_ in let _4 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 2766 "parsing/parser.ml" +# 2754 "parsing/parser.ml" in let _3 = -# 4016 "parsing/parser.mly" +# 4187 "parsing/parser.mly" ( Fresh ) -# 2772 "parsing/parser.ml" +# 2760 "parsing/parser.ml" in let _endpos = _endpos__7_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2003 "parsing/parser.mly" +# 1991 "parsing/parser.mly" ( let loc = (_startpos__2_, _endpos__5_) in let od = Opn.mk ~override:_3 ~loc:(make_loc loc) _5 in mkclass ~loc:_sloc ~attrs:_4 (Pcl_open(od, _7)) ) -# 2782 "parsing/parser.ml" +# 2770 "parsing/parser.ml" : (Parsetree.class_expr)) in { @@ -2850,34 +2838,34 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 2856 "parsing/parser.ml" +# 2844 "parsing/parser.ml" in let _endpos__5_ = _endpos__1_inlined3_ in let _4 = let _1 = _1_inlined2 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 2865 "parsing/parser.ml" +# 2853 "parsing/parser.ml" in let _3 = -# 4017 "parsing/parser.mly" +# 4188 "parsing/parser.mly" ( Override ) -# 2871 "parsing/parser.ml" +# 2859 "parsing/parser.ml" in let _endpos = _endpos__7_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2003 "parsing/parser.mly" +# 1991 "parsing/parser.mly" ( let loc = (_startpos__2_, _endpos__5_) in let od = Opn.mk ~override:_3 ~loc:(make_loc loc) _5 in mkclass ~loc:_sloc ~attrs:_4 (Pcl_open(od, _7)) ) -# 2881 "parsing/parser.ml" +# 2869 "parsing/parser.ml" : (Parsetree.class_expr)) in { @@ -2908,9 +2896,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.class_expr) = -# 2007 "parsing/parser.mly" +# 1995 "parsing/parser.mly" ( Cl.attr _1 _2 ) -# 2914 "parsing/parser.ml" +# 2902 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2946,18 +2934,18 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 2950 "parsing/parser.ml" +# 2938 "parsing/parser.ml" in -# 1086 "parsing/parser.mly" +# 1074 "parsing/parser.mly" ( xs ) -# 2955 "parsing/parser.ml" +# 2943 "parsing/parser.ml" in -# 2010 "parsing/parser.mly" +# 1998 "parsing/parser.mly" ( Pcl_apply(_1, _2) ) -# 2961 "parsing/parser.ml" +# 2949 "parsing/parser.ml" in let _endpos__1_ = _endpos_xs_ in @@ -2965,15 +2953,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1037 "parsing/parser.mly" +# 1025 "parsing/parser.mly" ( mkclass ~loc:_sloc _1 ) -# 2971 "parsing/parser.ml" +# 2959 "parsing/parser.ml" in ( -# 2013 "parsing/parser.mly" +# 2001 "parsing/parser.mly" ( _1 ) -# 2977 "parsing/parser.ml" +# 2965 "parsing/parser.ml" : (Parsetree.class_expr)) in { @@ -2999,23 +2987,23 @@ module Tables = struct let _v = let _1 = let _1 = -# 2012 "parsing/parser.mly" +# 2000 "parsing/parser.mly" ( Pcl_extension _1 ) -# 3005 "parsing/parser.ml" +# 2993 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1037 "parsing/parser.mly" +# 1025 "parsing/parser.mly" ( mkclass ~loc:_sloc _1 ) -# 3013 "parsing/parser.ml" +# 3001 "parsing/parser.ml" in ( -# 2013 "parsing/parser.mly" +# 2001 "parsing/parser.mly" ( _1 ) -# 3019 "parsing/parser.ml" +# 3007 "parsing/parser.ml" : (Parsetree.class_expr)) in { @@ -3070,33 +3058,33 @@ module Tables = struct let _6 = let _1 = _1_inlined2 in -# 4110 "parsing/parser.mly" +# 4282 "parsing/parser.mly" ( _1 ) -# 3076 "parsing/parser.ml" +# 3064 "parsing/parser.ml" in let _endpos__6_ = _endpos__1_inlined2_ in let _3 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 3085 "parsing/parser.ml" +# 3073 "parsing/parser.ml" in let _2 = -# 4016 "parsing/parser.mly" +# 4187 "parsing/parser.mly" ( Fresh ) -# 3091 "parsing/parser.ml" +# 3079 "parsing/parser.ml" in let _endpos = _endpos__6_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2062 "parsing/parser.mly" +# 2050 "parsing/parser.mly" ( let docs = symbol_docs _sloc in mkcf ~loc:_sloc (Pcf_inherit (_2, _4, self)) ~attrs:(_3@_6) ~docs ) -# 3100 "parsing/parser.ml" +# 3088 "parsing/parser.ml" : (Parsetree.class_field)) in { @@ -3158,33 +3146,33 @@ module Tables = struct let _6 = let _1 = _1_inlined3 in -# 4110 "parsing/parser.mly" +# 4282 "parsing/parser.mly" ( _1 ) -# 3164 "parsing/parser.ml" +# 3152 "parsing/parser.ml" in let _endpos__6_ = _endpos__1_inlined3_ in let _3 = let _1 = _1_inlined2 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 3173 "parsing/parser.ml" +# 3161 "parsing/parser.ml" in let _2 = -# 4017 "parsing/parser.mly" +# 4188 "parsing/parser.mly" ( Override ) -# 3179 "parsing/parser.ml" +# 3167 "parsing/parser.ml" in let _endpos = _endpos__6_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2062 "parsing/parser.mly" +# 2050 "parsing/parser.mly" ( let docs = symbol_docs _sloc in mkcf ~loc:_sloc (Pcf_inherit (_2, _4, self)) ~attrs:(_3@_6) ~docs ) -# 3188 "parsing/parser.ml" +# 3176 "parsing/parser.ml" : (Parsetree.class_field)) in { @@ -3227,9 +3215,9 @@ module Tables = struct let _3 = let _1 = _1_inlined1 in -# 4110 "parsing/parser.mly" +# 4282 "parsing/parser.mly" ( _1 ) -# 3233 "parsing/parser.ml" +# 3221 "parsing/parser.ml" in let _endpos__3_ = _endpos__1_inlined1_ in @@ -3237,11 +3225,11 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2065 "parsing/parser.mly" +# 2053 "parsing/parser.mly" ( let v, attrs = _2 in let docs = symbol_docs _sloc in mkcf ~loc:_sloc (Pcf_val v) ~attrs:(attrs@_3) ~docs ) -# 3245 "parsing/parser.ml" +# 3233 "parsing/parser.ml" : (Parsetree.class_field)) in { @@ -3284,9 +3272,9 @@ module Tables = struct let _3 = let _1 = _1_inlined1 in -# 4110 "parsing/parser.mly" +# 4282 "parsing/parser.mly" ( _1 ) -# 3290 "parsing/parser.ml" +# 3278 "parsing/parser.ml" in let _endpos__3_ = _endpos__1_inlined1_ in @@ -3294,11 +3282,11 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2069 "parsing/parser.mly" +# 2057 "parsing/parser.mly" ( let meth, attrs = _2 in let docs = symbol_docs _sloc in mkcf ~loc:_sloc (Pcf_method meth) ~attrs:(attrs@_3) ~docs ) -# 3302 "parsing/parser.ml" +# 3290 "parsing/parser.ml" : (Parsetree.class_field)) in { @@ -3346,28 +3334,28 @@ module Tables = struct let _4 = let _1 = _1_inlined2 in -# 4110 "parsing/parser.mly" +# 4282 "parsing/parser.mly" ( _1 ) -# 3352 "parsing/parser.ml" +# 3340 "parsing/parser.ml" in let _endpos__4_ = _endpos__1_inlined2_ in let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 3361 "parsing/parser.ml" +# 3349 "parsing/parser.ml" in let _endpos = _endpos__4_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2073 "parsing/parser.mly" +# 2061 "parsing/parser.mly" ( let docs = symbol_docs _sloc in mkcf ~loc:_sloc (Pcf_constraint _3) ~attrs:(_2@_4) ~docs ) -# 3371 "parsing/parser.ml" +# 3359 "parsing/parser.ml" : (Parsetree.class_field)) in { @@ -3415,28 +3403,28 @@ module Tables = struct let _4 = let _1 = _1_inlined2 in -# 4110 "parsing/parser.mly" +# 4282 "parsing/parser.mly" ( _1 ) -# 3421 "parsing/parser.ml" +# 3409 "parsing/parser.ml" in let _endpos__4_ = _endpos__1_inlined2_ in let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 3430 "parsing/parser.ml" +# 3418 "parsing/parser.ml" in let _endpos = _endpos__4_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2076 "parsing/parser.mly" +# 2064 "parsing/parser.mly" ( let docs = symbol_docs _sloc in mkcf ~loc:_sloc (Pcf_initializer _3) ~attrs:(_2@_4) ~docs ) -# 3440 "parsing/parser.ml" +# 3428 "parsing/parser.ml" : (Parsetree.class_field)) in { @@ -3470,9 +3458,9 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4110 "parsing/parser.mly" +# 4282 "parsing/parser.mly" ( _1 ) -# 3476 "parsing/parser.ml" +# 3464 "parsing/parser.ml" in let _endpos__2_ = _endpos__1_inlined1_ in @@ -3480,10 +3468,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2079 "parsing/parser.mly" +# 2067 "parsing/parser.mly" ( let docs = symbol_docs _sloc in mkcf ~loc:_sloc (Pcf_extension _1) ~attrs:_2 ~docs ) -# 3487 "parsing/parser.ml" +# 3475 "parsing/parser.ml" : (Parsetree.class_field)) in { @@ -3509,23 +3497,23 @@ module Tables = struct let _v = let _1 = let _1 = -# 2082 "parsing/parser.mly" +# 2070 "parsing/parser.mly" ( Pcf_attribute _1 ) -# 3515 "parsing/parser.ml" +# 3503 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1035 "parsing/parser.mly" +# 1023 "parsing/parser.mly" ( mkcf ~loc:_sloc _1 ) -# 3523 "parsing/parser.ml" +# 3511 "parsing/parser.ml" in ( -# 2083 "parsing/parser.mly" +# 2071 "parsing/parser.mly" ( _1 ) -# 3529 "parsing/parser.ml" +# 3517 "parsing/parser.ml" : (Parsetree.class_field)) in { @@ -3556,9 +3544,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.class_expr) = -# 1977 "parsing/parser.mly" +# 1965 "parsing/parser.mly" ( _2 ) -# 3562 "parsing/parser.ml" +# 3550 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3604,24 +3592,24 @@ module Tables = struct let _v = let _1 = let _1 = -# 1980 "parsing/parser.mly" +# 1968 "parsing/parser.mly" ( Pcl_constraint(_4, _2) ) -# 3610 "parsing/parser.ml" +# 3598 "parsing/parser.ml" in let _endpos__1_ = _endpos__4_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1037 "parsing/parser.mly" +# 1025 "parsing/parser.mly" ( mkclass ~loc:_sloc _1 ) -# 3619 "parsing/parser.ml" +# 3607 "parsing/parser.ml" in ( -# 1983 "parsing/parser.mly" +# 1971 "parsing/parser.mly" ( _1 ) -# 3625 "parsing/parser.ml" +# 3613 "parsing/parser.ml" : (Parsetree.class_expr)) in { @@ -3654,24 +3642,24 @@ module Tables = struct let _v = let _1 = let _1 = -# 1982 "parsing/parser.mly" +# 1970 "parsing/parser.mly" ( let (l,o,p) = _1 in Pcl_fun(l, o, p, _2) ) -# 3660 "parsing/parser.ml" +# 3648 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1037 "parsing/parser.mly" +# 1025 "parsing/parser.mly" ( mkclass ~loc:_sloc _1 ) -# 3669 "parsing/parser.ml" +# 3657 "parsing/parser.ml" in ( -# 1983 "parsing/parser.mly" +# 1971 "parsing/parser.mly" ( _1 ) -# 3675 "parsing/parser.ml" +# 3663 "parsing/parser.ml" : (Parsetree.class_expr)) in { @@ -3711,24 +3699,24 @@ module Tables = struct let _v = let _1 = let _1 = -# 2038 "parsing/parser.mly" +# 2026 "parsing/parser.mly" ( let (l,o,p) = _1 in Pcl_fun(l, o, p, e) ) -# 3717 "parsing/parser.ml" +# 3705 "parsing/parser.ml" in let _endpos__1_ = _endpos_e_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1037 "parsing/parser.mly" +# 1025 "parsing/parser.mly" ( mkclass ~loc:_sloc _1 ) -# 3726 "parsing/parser.ml" +# 3714 "parsing/parser.ml" in ( -# 2039 "parsing/parser.mly" +# 2027 "parsing/parser.mly" ( _1 ) -# 3732 "parsing/parser.ml" +# 3720 "parsing/parser.ml" : (Parsetree.class_expr)) in { @@ -3761,24 +3749,24 @@ module Tables = struct let _v = let _1 = let _1 = -# 2038 "parsing/parser.mly" +# 2026 "parsing/parser.mly" ( let (l,o,p) = _1 in Pcl_fun(l, o, p, e) ) -# 3767 "parsing/parser.ml" +# 3755 "parsing/parser.ml" in let _endpos__1_ = _endpos_e_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1037 "parsing/parser.mly" +# 1025 "parsing/parser.mly" ( mkclass ~loc:_sloc _1 ) -# 3776 "parsing/parser.ml" +# 3764 "parsing/parser.ml" in ( -# 2039 "parsing/parser.mly" +# 2027 "parsing/parser.mly" ( _1 ) -# 3782 "parsing/parser.ml" +# 3770 "parsing/parser.ml" : (Parsetree.class_expr)) in { @@ -3802,9 +3790,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3898 "parsing/parser.mly" +# 4069 "parsing/parser.mly" ( _1 ) -# 3808 "parsing/parser.ml" +# 3796 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3845,9 +3833,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2047 "parsing/parser.mly" +# 2035 "parsing/parser.mly" ( reloc_pat ~loc:_sloc _2 ) -# 3851 "parsing/parser.ml" +# 3839 "parsing/parser.ml" : (Parsetree.pattern)) in { @@ -3901,24 +3889,24 @@ module Tables = struct let _v = let _1 = let _1 = -# 2049 "parsing/parser.mly" +# 2037 "parsing/parser.mly" ( Ppat_constraint(_2, _4) ) -# 3907 "parsing/parser.ml" +# 3895 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1019 "parsing/parser.mly" +# 1007 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 3916 "parsing/parser.ml" +# 3904 "parsing/parser.ml" in ( -# 2050 "parsing/parser.mly" +# 2038 "parsing/parser.mly" ( _1 ) -# 3922 "parsing/parser.ml" +# 3910 "parsing/parser.ml" : (Parsetree.pattern)) in { @@ -3939,9 +3927,9 @@ module Tables = struct let _symbolstartpos = _endpos in let _sloc = (_symbolstartpos, _endpos) in ( -# 2052 "parsing/parser.mly" +# 2040 "parsing/parser.mly" ( ghpat ~loc:_sloc Ppat_any ) -# 3945 "parsing/parser.ml" +# 3933 "parsing/parser.ml" : (Parsetree.pattern)) in { @@ -3979,9 +3967,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Parsetree.core_type) = -# 2177 "parsing/parser.mly" +# 2165 "parsing/parser.mly" ( _2 ) -# 3985 "parsing/parser.ml" +# 3973 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3997,26 +3985,13 @@ module Tables = struct let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in let _endpos = _startpos in let _v = - let _1 = - let _1 = -# 2178 "parsing/parser.mly" - ( Ptyp_any ) -# 4005 "parsing/parser.ml" - in - let _endpos__1_ = _endpos__0_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _endpos in - let _sloc = (_symbolstartpos, _endpos) in - -# 1021 "parsing/parser.mly" - ( mktyp ~loc:_sloc _1 ) -# 4014 "parsing/parser.ml" - - in + let _endpos = _endpos__0_ in + let _symbolstartpos = _endpos in + let _sloc = (_symbolstartpos, _endpos) in ( -# 2179 "parsing/parser.mly" - ( _1 ) -# 4020 "parsing/parser.ml" +# 2167 "parsing/parser.mly" + ( ghtyp ~loc:_sloc Ptyp_any ) +# 3995 "parsing/parser.ml" : (Parsetree.core_type)) in { @@ -4064,28 +4039,28 @@ module Tables = struct let _4 = let _1 = _1_inlined2 in -# 4110 "parsing/parser.mly" +# 4282 "parsing/parser.mly" ( _1 ) -# 4070 "parsing/parser.ml" +# 4045 "parsing/parser.ml" in let _endpos__4_ = _endpos__1_inlined2_ in let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 4079 "parsing/parser.ml" +# 4054 "parsing/parser.ml" in let _endpos = _endpos__4_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2187 "parsing/parser.mly" +# 2175 "parsing/parser.mly" ( let docs = symbol_docs _sloc in mkctf ~loc:_sloc (Pctf_inherit _3) ~attrs:(_2@_4) ~docs ) -# 4089 "parsing/parser.ml" +# 4064 "parsing/parser.ml" : (Parsetree.class_type_field)) in { @@ -4144,9 +4119,9 @@ module Tables = struct let ty : (Parsetree.core_type) = Obj.magic ty in let _3 : unit = Obj.magic _3 in let _1_inlined2 : ( -# 797 "parsing/parser.mly" +# 785 "parsing/parser.mly" (string) -# 4150 "parsing/parser.ml" +# 4125 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let flags : (Asttypes.mutable_flag * Asttypes.virtual_flag) = Obj.magic flags in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in @@ -4158,9 +4133,9 @@ module Tables = struct let _4 = let _1 = _1_inlined3 in -# 4110 "parsing/parser.mly" +# 4282 "parsing/parser.mly" ( _1 ) -# 4164 "parsing/parser.ml" +# 4139 "parsing/parser.ml" in let _endpos__4_ = _endpos__1_inlined3_ in @@ -4168,44 +4143,44 @@ module Tables = struct let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in let label = let _1 = -# 3765 "parsing/parser.mly" +# 3936 "parsing/parser.mly" ( _1 ) -# 4174 "parsing/parser.ml" +# 4149 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 4182 "parsing/parser.ml" +# 4157 "parsing/parser.ml" in -# 2212 "parsing/parser.mly" +# 2200 "parsing/parser.mly" ( let mut, virt = flags in label, mut, virt, ty ) -# 4191 "parsing/parser.ml" +# 4166 "parsing/parser.ml" in let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 4199 "parsing/parser.ml" +# 4174 "parsing/parser.ml" in let _endpos = _endpos__4_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2190 "parsing/parser.mly" +# 2178 "parsing/parser.mly" ( let docs = symbol_docs _sloc in mkctf ~loc:_sloc (Pctf_val _3) ~attrs:(_2@_4) ~docs ) -# 4209 "parsing/parser.ml" +# 4184 "parsing/parser.ml" : (Parsetree.class_type_field)) in { @@ -4264,9 +4239,9 @@ module Tables = struct let _1_inlined3 : (Parsetree.core_type) = Obj.magic _1_inlined3 in let _5 : unit = Obj.magic _5 in let _1_inlined2 : ( -# 797 "parsing/parser.mly" +# 785 "parsing/parser.mly" (string) -# 4270 "parsing/parser.ml" +# 4245 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let _3 : (Asttypes.private_flag * Asttypes.virtual_flag) = Obj.magic _3 in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in @@ -4278,53 +4253,53 @@ module Tables = struct let _7 = let _1 = _1_inlined4 in -# 4110 "parsing/parser.mly" +# 4282 "parsing/parser.mly" ( _1 ) -# 4284 "parsing/parser.ml" +# 4259 "parsing/parser.ml" in let _endpos__7_ = _endpos__1_inlined4_ in let _6 = let _1 = _1_inlined3 in -# 3480 "parsing/parser.mly" +# 3604 "parsing/parser.mly" ( _1 ) -# 4293 "parsing/parser.ml" +# 4268 "parsing/parser.ml" in let _4 = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in let _1 = -# 3765 "parsing/parser.mly" +# 3936 "parsing/parser.mly" ( _1 ) -# 4301 "parsing/parser.ml" +# 4276 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 4309 "parsing/parser.ml" +# 4284 "parsing/parser.ml" in let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 4317 "parsing/parser.ml" +# 4292 "parsing/parser.ml" in let _endpos = _endpos__7_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2194 "parsing/parser.mly" +# 2182 "parsing/parser.mly" ( let (p, v) = _3 in let docs = symbol_docs _sloc in mkctf ~loc:_sloc (Pctf_method (_4, p, v, _6)) ~attrs:(_2@_7) ~docs ) -# 4328 "parsing/parser.ml" +# 4303 "parsing/parser.ml" : (Parsetree.class_type_field)) in { @@ -4372,28 +4347,28 @@ module Tables = struct let _4 = let _1 = _1_inlined2 in -# 4110 "parsing/parser.mly" +# 4282 "parsing/parser.mly" ( _1 ) -# 4378 "parsing/parser.ml" +# 4353 "parsing/parser.ml" in let _endpos__4_ = _endpos__1_inlined2_ in let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 4387 "parsing/parser.ml" +# 4362 "parsing/parser.ml" in let _endpos = _endpos__4_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2198 "parsing/parser.mly" +# 2186 "parsing/parser.mly" ( let docs = symbol_docs _sloc in mkctf ~loc:_sloc (Pctf_constraint _3) ~attrs:(_2@_4) ~docs ) -# 4397 "parsing/parser.ml" +# 4372 "parsing/parser.ml" : (Parsetree.class_type_field)) in { @@ -4427,9 +4402,9 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4110 "parsing/parser.mly" +# 4282 "parsing/parser.mly" ( _1 ) -# 4433 "parsing/parser.ml" +# 4408 "parsing/parser.ml" in let _endpos__2_ = _endpos__1_inlined1_ in @@ -4437,10 +4412,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2201 "parsing/parser.mly" +# 2189 "parsing/parser.mly" ( let docs = symbol_docs _sloc in mkctf ~loc:_sloc (Pctf_extension _1) ~attrs:_2 ~docs ) -# 4444 "parsing/parser.ml" +# 4419 "parsing/parser.ml" : (Parsetree.class_type_field)) in { @@ -4466,23 +4441,23 @@ module Tables = struct let _v = let _1 = let _1 = -# 2204 "parsing/parser.mly" +# 2192 "parsing/parser.mly" ( Pctf_attribute _1 ) -# 4472 "parsing/parser.ml" +# 4447 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1033 "parsing/parser.mly" +# 1021 "parsing/parser.mly" ( mkctf ~loc:_sloc _1 ) -# 4480 "parsing/parser.ml" +# 4455 "parsing/parser.ml" in ( -# 2205 "parsing/parser.mly" +# 2193 "parsing/parser.mly" ( _1 ) -# 4486 "parsing/parser.ml" +# 4461 "parsing/parser.ml" : (Parsetree.class_type_field)) in { @@ -4513,42 +4488,42 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 4519 "parsing/parser.ml" +# 4494 "parsing/parser.ml" in let tys = let tys = -# 2163 "parsing/parser.mly" +# 2151 "parsing/parser.mly" ( [] ) -# 4526 "parsing/parser.ml" +# 4501 "parsing/parser.ml" in -# 2169 "parsing/parser.mly" +# 2157 "parsing/parser.mly" ( tys ) -# 4531 "parsing/parser.ml" +# 4506 "parsing/parser.ml" in -# 2146 "parsing/parser.mly" +# 2134 "parsing/parser.mly" ( Pcty_constr (cid, tys) ) -# 4537 "parsing/parser.ml" +# 4512 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1031 "parsing/parser.mly" +# 1019 "parsing/parser.mly" ( mkcty ~loc:_sloc _1 ) -# 4546 "parsing/parser.ml" +# 4521 "parsing/parser.ml" in ( -# 2149 "parsing/parser.mly" +# 2137 "parsing/parser.mly" ( _1 ) -# 4552 "parsing/parser.ml" +# 4527 "parsing/parser.ml" : (Parsetree.class_type)) in { @@ -4601,9 +4576,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 4607 "parsing/parser.ml" +# 4582 "parsing/parser.ml" in let tys = @@ -4612,30 +4587,30 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 4616 "parsing/parser.ml" +# 4591 "parsing/parser.ml" in -# 1139 "parsing/parser.mly" +# 1127 "parsing/parser.mly" ( xs ) -# 4621 "parsing/parser.ml" +# 4596 "parsing/parser.ml" in -# 2165 "parsing/parser.mly" +# 2153 "parsing/parser.mly" ( params ) -# 4627 "parsing/parser.ml" +# 4602 "parsing/parser.ml" in -# 2169 "parsing/parser.mly" +# 2157 "parsing/parser.mly" ( tys ) -# 4633 "parsing/parser.ml" +# 4608 "parsing/parser.ml" in -# 2146 "parsing/parser.mly" +# 2134 "parsing/parser.mly" ( Pcty_constr (cid, tys) ) -# 4639 "parsing/parser.ml" +# 4614 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined1_ in @@ -4643,15 +4618,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1031 "parsing/parser.mly" +# 1019 "parsing/parser.mly" ( mkcty ~loc:_sloc _1 ) -# 4649 "parsing/parser.ml" +# 4624 "parsing/parser.ml" in ( -# 2149 "parsing/parser.mly" +# 2137 "parsing/parser.mly" ( _1 ) -# 4655 "parsing/parser.ml" +# 4630 "parsing/parser.ml" : (Parsetree.class_type)) in { @@ -4677,23 +4652,23 @@ module Tables = struct let _v = let _1 = let _1 = -# 2148 "parsing/parser.mly" +# 2136 "parsing/parser.mly" ( Pcty_extension _1 ) -# 4683 "parsing/parser.ml" +# 4658 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1031 "parsing/parser.mly" +# 1019 "parsing/parser.mly" ( mkcty ~loc:_sloc _1 ) -# 4691 "parsing/parser.ml" +# 4666 "parsing/parser.ml" in ( -# 2149 "parsing/parser.mly" +# 2137 "parsing/parser.mly" ( _1 ) -# 4697 "parsing/parser.ml" +# 4672 "parsing/parser.ml" : (Parsetree.class_type)) in { @@ -4752,44 +4727,44 @@ module Tables = struct let _1 = # 271 "" ( List.flatten xss ) -# 4756 "parsing/parser.ml" +# 4731 "parsing/parser.ml" in -# 2183 "parsing/parser.mly" +# 2171 "parsing/parser.mly" ( _1 ) -# 4761 "parsing/parser.ml" +# 4736 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_xss_) in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 979 "parsing/parser.mly" +# 967 "parsing/parser.mly" ( extra_csig _startpos _endpos _1 ) -# 4770 "parsing/parser.ml" +# 4745 "parsing/parser.ml" in -# 2173 "parsing/parser.mly" +# 2161 "parsing/parser.mly" ( Csig.mk _1 _2 ) -# 4776 "parsing/parser.ml" +# 4751 "parsing/parser.ml" in let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 4784 "parsing/parser.ml" +# 4759 "parsing/parser.ml" in let _endpos = _endpos__4_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2151 "parsing/parser.mly" +# 2139 "parsing/parser.mly" ( mkcty ~loc:_sloc ~attrs:_2 (Pcty_signature _3) ) -# 4793 "parsing/parser.ml" +# 4768 "parsing/parser.ml" : (Parsetree.class_type)) in { @@ -4848,43 +4823,43 @@ module Tables = struct let _1 = # 271 "" ( List.flatten xss ) -# 4852 "parsing/parser.ml" +# 4827 "parsing/parser.ml" in -# 2183 "parsing/parser.mly" +# 2171 "parsing/parser.mly" ( _1 ) -# 4857 "parsing/parser.ml" +# 4832 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_xss_) in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 979 "parsing/parser.mly" +# 967 "parsing/parser.mly" ( extra_csig _startpos _endpos _1 ) -# 4866 "parsing/parser.ml" +# 4841 "parsing/parser.ml" in -# 2173 "parsing/parser.mly" +# 2161 "parsing/parser.mly" ( Csig.mk _1 _2 ) -# 4872 "parsing/parser.ml" +# 4847 "parsing/parser.ml" in let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 4880 "parsing/parser.ml" +# 4855 "parsing/parser.ml" in let _loc__4_ = (_startpos__4_, _endpos__4_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in ( -# 2153 "parsing/parser.mly" +# 2141 "parsing/parser.mly" ( unclosed "object" _loc__1_ "end" _loc__4_ ) -# 4888 "parsing/parser.ml" +# 4863 "parsing/parser.ml" : (Parsetree.class_type)) in { @@ -4915,9 +4890,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.class_type) = -# 2155 "parsing/parser.mly" +# 2143 "parsing/parser.mly" ( Cty.attr _1 _2 ) -# 4921 "parsing/parser.ml" +# 4896 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4981,34 +4956,34 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 4987 "parsing/parser.ml" +# 4962 "parsing/parser.ml" in let _endpos__5_ = _endpos__1_inlined2_ in let _4 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 4996 "parsing/parser.ml" +# 4971 "parsing/parser.ml" in let _3 = -# 4016 "parsing/parser.mly" +# 4187 "parsing/parser.mly" ( Fresh ) -# 5002 "parsing/parser.ml" +# 4977 "parsing/parser.ml" in let _endpos = _endpos__7_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2157 "parsing/parser.mly" +# 2145 "parsing/parser.mly" ( let loc = (_startpos__2_, _endpos__5_) in let od = Opn.mk ~override:_3 ~loc:(make_loc loc) _5 in mkcty ~loc:_sloc ~attrs:_4 (Pcty_open(od, _7)) ) -# 5012 "parsing/parser.ml" +# 4987 "parsing/parser.ml" : (Parsetree.class_type)) in { @@ -5080,34 +5055,34 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 5086 "parsing/parser.ml" +# 5061 "parsing/parser.ml" in let _endpos__5_ = _endpos__1_inlined3_ in let _4 = let _1 = _1_inlined2 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 5095 "parsing/parser.ml" +# 5070 "parsing/parser.ml" in let _3 = -# 4017 "parsing/parser.mly" +# 4188 "parsing/parser.mly" ( Override ) -# 5101 "parsing/parser.ml" +# 5076 "parsing/parser.ml" in let _endpos = _endpos__7_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2157 "parsing/parser.mly" +# 2145 "parsing/parser.mly" ( let loc = (_startpos__2_, _endpos__5_) in let od = Opn.mk ~override:_3 ~loc:(make_loc loc) _5 in mkcty ~loc:_sloc ~attrs:_4 (Pcty_open(od, _7)) ) -# 5111 "parsing/parser.ml" +# 5086 "parsing/parser.ml" : (Parsetree.class_type)) in { @@ -5145,9 +5120,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Parsetree.class_expr) = -# 2017 "parsing/parser.mly" +# 2005 "parsing/parser.mly" ( _2 ) -# 5151 "parsing/parser.ml" +# 5126 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5187,9 +5162,9 @@ module Tables = struct let _loc__3_ = (_startpos__3_, _endpos__3_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in ( -# 2019 "parsing/parser.mly" +# 2007 "parsing/parser.mly" ( unclosed "(" _loc__1_ ")" _loc__3_ ) -# 5193 "parsing/parser.ml" +# 5168 "parsing/parser.ml" : (Parsetree.class_expr)) in { @@ -5220,42 +5195,42 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 5226 "parsing/parser.ml" +# 5201 "parsing/parser.ml" in let tys = let tys = -# 2163 "parsing/parser.mly" +# 2151 "parsing/parser.mly" ( [] ) -# 5233 "parsing/parser.ml" +# 5208 "parsing/parser.ml" in -# 2169 "parsing/parser.mly" +# 2157 "parsing/parser.mly" ( tys ) -# 5238 "parsing/parser.ml" +# 5213 "parsing/parser.ml" in -# 2022 "parsing/parser.mly" +# 2010 "parsing/parser.mly" ( Pcl_constr(cid, tys) ) -# 5244 "parsing/parser.ml" +# 5219 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1037 "parsing/parser.mly" +# 1025 "parsing/parser.mly" ( mkclass ~loc:_sloc _1 ) -# 5253 "parsing/parser.ml" +# 5228 "parsing/parser.ml" in ( -# 2029 "parsing/parser.mly" +# 2017 "parsing/parser.mly" ( _1 ) -# 5259 "parsing/parser.ml" +# 5234 "parsing/parser.ml" : (Parsetree.class_expr)) in { @@ -5308,9 +5283,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 5314 "parsing/parser.ml" +# 5289 "parsing/parser.ml" in let tys = @@ -5319,30 +5294,30 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 5323 "parsing/parser.ml" +# 5298 "parsing/parser.ml" in -# 1139 "parsing/parser.mly" +# 1127 "parsing/parser.mly" ( xs ) -# 5328 "parsing/parser.ml" +# 5303 "parsing/parser.ml" in -# 2165 "parsing/parser.mly" +# 2153 "parsing/parser.mly" ( params ) -# 5334 "parsing/parser.ml" +# 5309 "parsing/parser.ml" in -# 2169 "parsing/parser.mly" +# 2157 "parsing/parser.mly" ( tys ) -# 5340 "parsing/parser.ml" +# 5315 "parsing/parser.ml" in -# 2022 "parsing/parser.mly" +# 2010 "parsing/parser.mly" ( Pcl_constr(cid, tys) ) -# 5346 "parsing/parser.ml" +# 5321 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined1_ in @@ -5350,15 +5325,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1037 "parsing/parser.mly" +# 1025 "parsing/parser.mly" ( mkclass ~loc:_sloc _1 ) -# 5356 "parsing/parser.ml" +# 5331 "parsing/parser.ml" in ( -# 2029 "parsing/parser.mly" +# 2017 "parsing/parser.mly" ( _1 ) -# 5362 "parsing/parser.ml" +# 5337 "parsing/parser.ml" : (Parsetree.class_expr)) in { @@ -5419,43 +5394,43 @@ module Tables = struct let _1 = # 271 "" ( List.flatten xss ) -# 5423 "parsing/parser.ml" +# 5398 "parsing/parser.ml" in -# 2056 "parsing/parser.mly" +# 2044 "parsing/parser.mly" ( _1 ) -# 5428 "parsing/parser.ml" +# 5403 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_xss_) in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 978 "parsing/parser.mly" +# 966 "parsing/parser.mly" ( extra_cstr _startpos _endpos _1 ) -# 5437 "parsing/parser.ml" +# 5412 "parsing/parser.ml" in -# 2043 "parsing/parser.mly" +# 2031 "parsing/parser.mly" ( Cstr.mk _1 _2 ) -# 5443 "parsing/parser.ml" +# 5418 "parsing/parser.ml" in let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 5451 "parsing/parser.ml" +# 5426 "parsing/parser.ml" in let _loc__4_ = (_startpos__4_, _endpos__4_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2024 "parsing/parser.mly" +# 2012 "parsing/parser.mly" ( unclosed "object" _loc__1_ "end" _loc__4_ ) -# 5459 "parsing/parser.ml" +# 5434 "parsing/parser.ml" in let _endpos__1_ = _endpos__4_ in @@ -5463,15 +5438,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1037 "parsing/parser.mly" +# 1025 "parsing/parser.mly" ( mkclass ~loc:_sloc _1 ) -# 5469 "parsing/parser.ml" +# 5444 "parsing/parser.ml" in ( -# 2029 "parsing/parser.mly" +# 2017 "parsing/parser.mly" ( _1 ) -# 5475 "parsing/parser.ml" +# 5450 "parsing/parser.ml" : (Parsetree.class_expr)) in { @@ -5525,24 +5500,24 @@ module Tables = struct let _v = let _1 = let _1 = -# 2026 "parsing/parser.mly" +# 2014 "parsing/parser.mly" ( Pcl_constraint(_2, _4) ) -# 5531 "parsing/parser.ml" +# 5506 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1037 "parsing/parser.mly" +# 1025 "parsing/parser.mly" ( mkclass ~loc:_sloc _1 ) -# 5540 "parsing/parser.ml" +# 5515 "parsing/parser.ml" in ( -# 2029 "parsing/parser.mly" +# 2017 "parsing/parser.mly" ( _1 ) -# 5546 "parsing/parser.ml" +# 5521 "parsing/parser.ml" : (Parsetree.class_expr)) in { @@ -5599,9 +5574,9 @@ module Tables = struct let _loc__5_ = (_startpos__5_, _endpos__5_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2028 "parsing/parser.mly" +# 2016 "parsing/parser.mly" ( unclosed "(" _loc__1_ ")" _loc__5_ ) -# 5605 "parsing/parser.ml" +# 5580 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -5609,15 +5584,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1037 "parsing/parser.mly" +# 1025 "parsing/parser.mly" ( mkclass ~loc:_sloc _1 ) -# 5615 "parsing/parser.ml" +# 5590 "parsing/parser.ml" in ( -# 2029 "parsing/parser.mly" +# 2017 "parsing/parser.mly" ( _1 ) -# 5621 "parsing/parser.ml" +# 5596 "parsing/parser.ml" : (Parsetree.class_expr)) in { @@ -5676,44 +5651,44 @@ module Tables = struct let _1 = # 271 "" ( List.flatten xss ) -# 5680 "parsing/parser.ml" +# 5655 "parsing/parser.ml" in -# 2056 "parsing/parser.mly" +# 2044 "parsing/parser.mly" ( _1 ) -# 5685 "parsing/parser.ml" +# 5660 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_xss_) in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 978 "parsing/parser.mly" +# 966 "parsing/parser.mly" ( extra_cstr _startpos _endpos _1 ) -# 5694 "parsing/parser.ml" +# 5669 "parsing/parser.ml" in -# 2043 "parsing/parser.mly" +# 2031 "parsing/parser.mly" ( Cstr.mk _1 _2 ) -# 5700 "parsing/parser.ml" +# 5675 "parsing/parser.ml" in let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 5708 "parsing/parser.ml" +# 5683 "parsing/parser.ml" in let _endpos = _endpos__4_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2031 "parsing/parser.mly" +# 2019 "parsing/parser.mly" ( mkclass ~loc:_sloc ~attrs:_2 (Pcl_structure _3) ) -# 5717 "parsing/parser.ml" +# 5692 "parsing/parser.ml" : (Parsetree.class_expr)) in { @@ -5737,9 +5712,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.class_type) = -# 2134 "parsing/parser.mly" +# 2122 "parsing/parser.mly" ( _1 ) -# 5743 "parsing/parser.ml" +# 5718 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5786,14 +5761,14 @@ module Tables = struct let _1 = let _1 = let label = -# 3543 "parsing/parser.mly" +# 3695 "parsing/parser.mly" ( Optional label ) -# 5792 "parsing/parser.ml" +# 5767 "parsing/parser.ml" in -# 2140 "parsing/parser.mly" +# 2128 "parsing/parser.mly" ( Pcty_arrow(label, domain, codomain) ) -# 5797 "parsing/parser.ml" +# 5772 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in @@ -5801,15 +5776,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1031 "parsing/parser.mly" +# 1019 "parsing/parser.mly" ( mkcty ~loc:_sloc _1 ) -# 5807 "parsing/parser.ml" +# 5782 "parsing/parser.ml" in ( -# 2141 "parsing/parser.mly" +# 2129 "parsing/parser.mly" ( _1 ) -# 5813 "parsing/parser.ml" +# 5788 "parsing/parser.ml" : (Parsetree.class_type)) in { @@ -5857,9 +5832,9 @@ module Tables = struct let domain : (Parsetree.core_type) = Obj.magic domain in let _2 : unit = Obj.magic _2 in let label : ( -# 797 "parsing/parser.mly" +# 785 "parsing/parser.mly" (string) -# 5863 "parsing/parser.ml" +# 5838 "parsing/parser.ml" ) = Obj.magic label in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_label_ in @@ -5868,14 +5843,14 @@ module Tables = struct let _1 = let _1 = let label = -# 3545 "parsing/parser.mly" +# 3697 "parsing/parser.mly" ( Labelled label ) -# 5874 "parsing/parser.ml" +# 5849 "parsing/parser.ml" in -# 2140 "parsing/parser.mly" +# 2128 "parsing/parser.mly" ( Pcty_arrow(label, domain, codomain) ) -# 5879 "parsing/parser.ml" +# 5854 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in @@ -5883,15 +5858,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1031 "parsing/parser.mly" +# 1019 "parsing/parser.mly" ( mkcty ~loc:_sloc _1 ) -# 5889 "parsing/parser.ml" +# 5864 "parsing/parser.ml" in ( -# 2141 "parsing/parser.mly" +# 2129 "parsing/parser.mly" ( _1 ) -# 5895 "parsing/parser.ml" +# 5870 "parsing/parser.ml" : (Parsetree.class_type)) in { @@ -5932,14 +5907,14 @@ module Tables = struct let _1 = let _1 = let label = -# 3547 "parsing/parser.mly" +# 3699 "parsing/parser.mly" ( Nolabel ) -# 5938 "parsing/parser.ml" +# 5913 "parsing/parser.ml" in -# 2140 "parsing/parser.mly" +# 2128 "parsing/parser.mly" ( Pcty_arrow(label, domain, codomain) ) -# 5943 "parsing/parser.ml" +# 5918 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_domain_) in @@ -5947,15 +5922,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1031 "parsing/parser.mly" +# 1019 "parsing/parser.mly" ( mkcty ~loc:_sloc _1 ) -# 5953 "parsing/parser.ml" +# 5928 "parsing/parser.ml" in ( -# 2141 "parsing/parser.mly" +# 2129 "parsing/parser.mly" ( _1 ) -# 5959 "parsing/parser.ml" +# 5934 "parsing/parser.ml" : (Parsetree.class_type)) in { @@ -6039,9 +6014,9 @@ module Tables = struct let csig : (Parsetree.class_type) = Obj.magic csig in let _8 : unit = Obj.magic _8 in let _1_inlined2 : ( -# 797 "parsing/parser.mly" +# 785 "parsing/parser.mly" (string) -# 6045 "parsing/parser.ml" +# 6020 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in let virt : (Asttypes.virtual_flag) = Obj.magic virt in @@ -6058,9 +6033,9 @@ module Tables = struct let attrs2 = let _1 = _1_inlined3 in -# 4110 "parsing/parser.mly" +# 4282 "parsing/parser.mly" ( _1 ) -# 6064 "parsing/parser.ml" +# 6039 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -6070,24 +6045,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 6076 "parsing/parser.ml" +# 6051 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 6084 "parsing/parser.ml" +# 6059 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2279 "parsing/parser.mly" +# 2267 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in @@ -6095,19 +6070,19 @@ module Tables = struct ext, Ci.mk id csig ~virt ~params ~attrs ~loc ~docs ) -# 6099 "parsing/parser.ml" +# 6074 "parsing/parser.ml" in -# 1236 "parsing/parser.mly" +# 1224 "parsing/parser.mly" ( let (x, b) = a in x, b :: bs ) -# 6105 "parsing/parser.ml" +# 6080 "parsing/parser.ml" in ( -# 2267 "parsing/parser.mly" +# 2255 "parsing/parser.mly" ( _1 ) -# 6111 "parsing/parser.ml" +# 6086 "parsing/parser.ml" : (string Asttypes.loc option * Parsetree.class_type_declaration list)) in { @@ -6131,9 +6106,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3895 "parsing/parser.mly" +# 4066 "parsing/parser.mly" ( _1 ) -# 6137 "parsing/parser.ml" +# 6112 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6152,9 +6127,9 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 783 "parsing/parser.mly" +# 771 "parsing/parser.mly" (string * char option) -# 6158 "parsing/parser.ml" +# 6133 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -6164,10 +6139,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 3771 "parsing/parser.mly" +# 3942 "parsing/parser.mly" ( let (n, m) = _1 in mkconst ~loc:_sloc (Pconst_integer (n, m)) ) -# 6171 "parsing/parser.ml" +# 6146 "parsing/parser.ml" : (Parsetree.constant)) in { @@ -6187,9 +6162,9 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 741 "parsing/parser.mly" +# 729 "parsing/parser.mly" (char) -# 6193 "parsing/parser.ml" +# 6168 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -6199,9 +6174,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 3773 "parsing/parser.mly" +# 3944 "parsing/parser.mly" ( mkconst ~loc:_sloc (Pconst_char _1) ) -# 6205 "parsing/parser.ml" +# 6180 "parsing/parser.ml" : (Parsetree.constant)) in { @@ -6221,9 +6196,9 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 835 "parsing/parser.mly" +# 823 "parsing/parser.mly" (string * Location.t * string option) -# 6227 "parsing/parser.ml" +# 6202 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -6233,10 +6208,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 3774 "parsing/parser.mly" +# 3945 "parsing/parser.mly" ( let (s, strloc, d) = _1 in mkconst ~loc:_sloc (Pconst_string (s,strloc,d)) ) -# 6240 "parsing/parser.ml" +# 6215 "parsing/parser.ml" : (Parsetree.constant)) in { @@ -6256,9 +6231,9 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 762 "parsing/parser.mly" +# 750 "parsing/parser.mly" (string * char option) -# 6262 "parsing/parser.ml" +# 6237 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -6268,10 +6243,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 3776 "parsing/parser.mly" +# 3947 "parsing/parser.mly" ( let (f, m) = _1 in mkconst ~loc:_sloc (Pconst_float (f, m)) ) -# 6275 "parsing/parser.ml" +# 6250 "parsing/parser.ml" : (Parsetree.constant)) in { @@ -6302,9 +6277,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.label) = -# 3852 "parsing/parser.mly" +# 4023 "parsing/parser.mly" ( "[]" ) -# 6308 "parsing/parser.ml" +# 6283 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6334,9 +6309,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.label) = -# 3853 "parsing/parser.mly" +# 4024 "parsing/parser.mly" ( "()" ) -# 6340 "parsing/parser.ml" +# 6315 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6359,9 +6334,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = -# 3854 "parsing/parser.mly" +# 4025 "parsing/parser.mly" ( "false" ) -# 6365 "parsing/parser.ml" +# 6340 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6384,9 +6359,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = -# 3855 "parsing/parser.mly" +# 4026 "parsing/parser.mly" ( "true" ) -# 6390 "parsing/parser.ml" +# 6365 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6405,17 +6380,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 848 "parsing/parser.mly" +# 836 "parsing/parser.mly" (string) -# 6411 "parsing/parser.ml" +# 6386 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = -# 3858 "parsing/parser.mly" +# 4029 "parsing/parser.mly" ( _1 ) -# 6419 "parsing/parser.ml" +# 6394 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6453,14 +6428,14 @@ module Tables = struct let _endpos = _endpos__3_ in let _v = let _1 = -# 3849 "parsing/parser.mly" +# 4020 "parsing/parser.mly" ( "::" ) -# 6459 "parsing/parser.ml" +# 6434 "parsing/parser.ml" in ( -# 3859 "parsing/parser.mly" +# 4030 "parsing/parser.mly" ( _1 ) -# 6464 "parsing/parser.ml" +# 6439 "parsing/parser.ml" : (Asttypes.label)) in { @@ -6484,9 +6459,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = -# 3860 "parsing/parser.mly" +# 4031 "parsing/parser.mly" ( _1 ) -# 6490 "parsing/parser.ml" +# 6465 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6509,9 +6484,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3863 "parsing/parser.mly" +# 4034 "parsing/parser.mly" ( _1 ) -# 6515 "parsing/parser.ml" +# 6490 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6563,14 +6538,17 @@ module Tables = struct let _endpos = _endpos__3_ in let _v = let _3 = -# 3849 "parsing/parser.mly" +# 4020 "parsing/parser.mly" ( "::" ) -# 6569 "parsing/parser.ml" +# 6544 "parsing/parser.ml" in + let _startpos__3_ = _startpos__1_inlined1_ in + let _loc__3_ = (_startpos__3_, _endpos__3_) in + let _loc__1_ = (_startpos__1_, _endpos__1_) in ( -# 3864 "parsing/parser.mly" - ( Ldot(_1,_3) ) -# 6574 "parsing/parser.ml" +# 4035 "parsing/parser.mly" + ( ldot _1 _loc__1_ _3 _loc__3_ ) +# 6552 "parsing/parser.ml" : (Longident.t)) in { @@ -6609,14 +6587,14 @@ module Tables = struct let _endpos = _endpos__3_ in let _v = let _1 = -# 3849 "parsing/parser.mly" +# 4020 "parsing/parser.mly" ( "::" ) -# 6615 "parsing/parser.ml" +# 6593 "parsing/parser.ml" in ( -# 3865 "parsing/parser.mly" +# 4036 "parsing/parser.mly" ( Lident _1 ) -# 6620 "parsing/parser.ml" +# 6598 "parsing/parser.ml" : (Longident.t)) in { @@ -6640,9 +6618,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3866 "parsing/parser.mly" +# 4037 "parsing/parser.mly" ( Lident _1 ) -# 6646 "parsing/parser.ml" +# 6624 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6679,9 +6657,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Parsetree.core_type * Parsetree.core_type) = -# 2223 "parsing/parser.mly" +# 2211 "parsing/parser.mly" ( _1, _3 ) -# 6685 "parsing/parser.ml" +# 6663 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6707,26 +6685,26 @@ module Tables = struct let tys = let xs = let xs = -# 1123 "parsing/parser.mly" +# 1111 "parsing/parser.mly" ( [ x ] ) -# 6713 "parsing/parser.ml" +# 6691 "parsing/parser.ml" in # 264 "" ( List.rev xs ) -# 6718 "parsing/parser.ml" +# 6696 "parsing/parser.ml" in -# 1143 "parsing/parser.mly" +# 1131 "parsing/parser.mly" ( xs ) -# 6724 "parsing/parser.ml" +# 6702 "parsing/parser.ml" in ( -# 3346 "parsing/parser.mly" +# 3469 "parsing/parser.mly" ( Pcstr_tuple tys ) -# 6730 "parsing/parser.ml" +# 6708 "parsing/parser.ml" : (Parsetree.constructor_arguments)) in { @@ -6767,26 +6745,26 @@ module Tables = struct let tys = let xs = let xs = -# 1127 "parsing/parser.mly" +# 1115 "parsing/parser.mly" ( x :: xs ) -# 6773 "parsing/parser.ml" +# 6751 "parsing/parser.ml" in # 264 "" ( List.rev xs ) -# 6778 "parsing/parser.ml" +# 6756 "parsing/parser.ml" in -# 1143 "parsing/parser.mly" +# 1131 "parsing/parser.mly" ( xs ) -# 6784 "parsing/parser.ml" +# 6762 "parsing/parser.ml" in ( -# 3346 "parsing/parser.mly" +# 3469 "parsing/parser.mly" ( Pcstr_tuple tys ) -# 6790 "parsing/parser.ml" +# 6768 "parsing/parser.ml" : (Parsetree.constructor_arguments)) in { @@ -6824,9 +6802,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Parsetree.constructor_arguments) = -# 3348 "parsing/parser.mly" +# 3471 "parsing/parser.mly" ( Pcstr_record _2 ) -# 6830 "parsing/parser.ml" +# 6808 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6849,9 +6827,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.constructor_declaration list) = -# 3262 "parsing/parser.mly" +# 3385 "parsing/parser.mly" ( [] ) -# 6855 "parsing/parser.ml" +# 6833 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6875,14 +6853,14 @@ module Tables = struct let _endpos = _endpos_xs_ in let _v = let cs = -# 1228 "parsing/parser.mly" +# 1216 "parsing/parser.mly" ( List.rev xs ) -# 6881 "parsing/parser.ml" +# 6859 "parsing/parser.ml" in ( -# 3264 "parsing/parser.mly" +# 3387 "parsing/parser.mly" ( cs ) -# 6886 "parsing/parser.ml" +# 6864 "parsing/parser.ml" : (Parsetree.constructor_declaration list)) in { @@ -6907,14 +6885,14 @@ module Tables = struct let _endpos = _endpos__1_ in let _v = let _1 = -# 3505 "parsing/parser.mly" +# 3629 "parsing/parser.mly" ( _1 ) -# 6913 "parsing/parser.ml" +# 6891 "parsing/parser.ml" in ( -# 3495 "parsing/parser.mly" +# 3619 "parsing/parser.mly" ( _1 ) -# 6918 "parsing/parser.ml" +# 6896 "parsing/parser.ml" : (Parsetree.core_type)) in { @@ -6945,9 +6923,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.core_type) = -# 3497 "parsing/parser.mly" +# 3621 "parsing/parser.mly" ( Typ.attr _1 _2 ) -# 6951 "parsing/parser.ml" +# 6929 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6970,9 +6948,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.core_type) = -# 3645 "parsing/parser.mly" +# 3814 "parsing/parser.mly" ( _1 ) -# 6976 "parsing/parser.ml" +# 6954 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6995,9 +6973,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.core_type) = -# 3645 "parsing/parser.mly" +# 3814 "parsing/parser.mly" ( _1 ) -# 7001 "parsing/parser.ml" +# 6979 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7020,9 +6998,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.core_type) = -# 3645 "parsing/parser.mly" +# 3814 "parsing/parser.mly" ( _1 ) -# 7026 "parsing/parser.ml" +# 7004 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7059,9 +7037,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Parsetree.core_type) = -# 3598 "parsing/parser.mly" +# 3767 "parsing/parser.mly" ( type_ ) -# 7065 "parsing/parser.ml" +# 7043 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7125,36 +7103,35 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3691 "parsing/parser.mly" +# 3860 "parsing/parser.mly" ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in - let descr = Ptyp_package (lid, cstrs) in - mktyp ~loc:_sloc ~attrs descr ) -# 7133 "parsing/parser.ml" + Typ.package_type ~loc:(make_loc _sloc) ~attrs lid cstrs ) +# 7110 "parsing/parser.ml" in - let attrs = + let ext_attrs = let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 7143 "parsing/parser.ml" +# 7120 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 7149 "parsing/parser.ml" +# 7126 "parsing/parser.ml" in let _endpos = _endpos__5_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 3600 "parsing/parser.mly" - ( wrap_typ_attrs ~loc:_sloc (reloc_typ ~loc:_sloc package_type) attrs ) -# 7158 "parsing/parser.ml" +# 3769 "parsing/parser.mly" + ( mktyp_attrs ~loc:_sloc (Ptyp_package package_type) ext_attrs ) +# 7135 "parsing/parser.ml" : (Parsetree.core_type)) in { @@ -7194,24 +7171,24 @@ module Tables = struct let _v = let _1 = let _1 = -# 3603 "parsing/parser.mly" +# 3772 "parsing/parser.mly" ( Ptyp_variant([ field ], Closed, None) ) -# 7200 "parsing/parser.ml" +# 7177 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1021 "parsing/parser.mly" +# 1009 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 7209 "parsing/parser.ml" +# 7186 "parsing/parser.ml" in ( -# 3620 "parsing/parser.mly" +# 3789 "parsing/parser.mly" ( _1 ) -# 7215 "parsing/parser.ml" +# 7192 "parsing/parser.ml" : (Parsetree.core_type)) in { @@ -7263,24 +7240,24 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 7267 "parsing/parser.ml" +# 7244 "parsing/parser.ml" in -# 1139 "parsing/parser.mly" +# 1127 "parsing/parser.mly" ( xs ) -# 7272 "parsing/parser.ml" +# 7249 "parsing/parser.ml" in -# 3697 "parsing/parser.mly" +# 3868 "parsing/parser.mly" ( _1 ) -# 7278 "parsing/parser.ml" +# 7255 "parsing/parser.ml" in -# 3605 "parsing/parser.mly" +# 3774 "parsing/parser.mly" ( Ptyp_variant(fields, Closed, None) ) -# 7284 "parsing/parser.ml" +# 7261 "parsing/parser.ml" in let _endpos__1_ = _endpos__4_ in @@ -7288,15 +7265,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1021 "parsing/parser.mly" +# 1009 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 7294 "parsing/parser.ml" +# 7271 "parsing/parser.ml" in ( -# 3620 "parsing/parser.mly" +# 3789 "parsing/parser.mly" ( _1 ) -# 7300 "parsing/parser.ml" +# 7277 "parsing/parser.ml" : (Parsetree.core_type)) in { @@ -7355,24 +7332,24 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 7359 "parsing/parser.ml" +# 7336 "parsing/parser.ml" in -# 1139 "parsing/parser.mly" +# 1127 "parsing/parser.mly" ( xs ) -# 7364 "parsing/parser.ml" +# 7341 "parsing/parser.ml" in -# 3697 "parsing/parser.mly" +# 3868 "parsing/parser.mly" ( _1 ) -# 7370 "parsing/parser.ml" +# 7347 "parsing/parser.ml" in -# 3607 "parsing/parser.mly" +# 3776 "parsing/parser.mly" ( Ptyp_variant(field :: fields, Closed, None) ) -# 7376 "parsing/parser.ml" +# 7353 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -7380,15 +7357,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1021 "parsing/parser.mly" +# 1009 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 7386 "parsing/parser.ml" +# 7363 "parsing/parser.ml" in ( -# 3620 "parsing/parser.mly" +# 3789 "parsing/parser.mly" ( _1 ) -# 7392 "parsing/parser.ml" +# 7369 "parsing/parser.ml" : (Parsetree.core_type)) in { @@ -7440,24 +7417,24 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 7444 "parsing/parser.ml" +# 7421 "parsing/parser.ml" in -# 1139 "parsing/parser.mly" +# 1127 "parsing/parser.mly" ( xs ) -# 7449 "parsing/parser.ml" +# 7426 "parsing/parser.ml" in -# 3697 "parsing/parser.mly" +# 3868 "parsing/parser.mly" ( _1 ) -# 7455 "parsing/parser.ml" +# 7432 "parsing/parser.ml" in -# 3609 "parsing/parser.mly" +# 3778 "parsing/parser.mly" ( Ptyp_variant(fields, Open, None) ) -# 7461 "parsing/parser.ml" +# 7438 "parsing/parser.ml" in let _endpos__1_ = _endpos__4_ in @@ -7465,15 +7442,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1021 "parsing/parser.mly" +# 1009 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 7471 "parsing/parser.ml" +# 7448 "parsing/parser.ml" in ( -# 3620 "parsing/parser.mly" +# 3789 "parsing/parser.mly" ( _1 ) -# 7477 "parsing/parser.ml" +# 7454 "parsing/parser.ml" : (Parsetree.core_type)) in { @@ -7506,24 +7483,24 @@ module Tables = struct let _v = let _1 = let _1 = -# 3611 "parsing/parser.mly" +# 3780 "parsing/parser.mly" ( Ptyp_variant([], Open, None) ) -# 7512 "parsing/parser.ml" +# 7489 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1021 "parsing/parser.mly" +# 1009 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 7521 "parsing/parser.ml" +# 7498 "parsing/parser.ml" in ( -# 3620 "parsing/parser.mly" +# 3789 "parsing/parser.mly" ( _1 ) -# 7527 "parsing/parser.ml" +# 7504 "parsing/parser.ml" : (Parsetree.core_type)) in { @@ -7575,24 +7552,24 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 7579 "parsing/parser.ml" +# 7556 "parsing/parser.ml" in -# 1139 "parsing/parser.mly" +# 1127 "parsing/parser.mly" ( xs ) -# 7584 "parsing/parser.ml" +# 7561 "parsing/parser.ml" in -# 3697 "parsing/parser.mly" +# 3868 "parsing/parser.mly" ( _1 ) -# 7590 "parsing/parser.ml" +# 7567 "parsing/parser.ml" in -# 3613 "parsing/parser.mly" +# 3782 "parsing/parser.mly" ( Ptyp_variant(fields, Closed, Some []) ) -# 7596 "parsing/parser.ml" +# 7573 "parsing/parser.ml" in let _endpos__1_ = _endpos__4_ in @@ -7600,15 +7577,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1021 "parsing/parser.mly" +# 1009 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 7606 "parsing/parser.ml" +# 7583 "parsing/parser.ml" in ( -# 3620 "parsing/parser.mly" +# 3789 "parsing/parser.mly" ( _1 ) -# 7612 "parsing/parser.ml" +# 7589 "parsing/parser.ml" : (Parsetree.core_type)) in { @@ -7675,18 +7652,18 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 7679 "parsing/parser.ml" +# 7656 "parsing/parser.ml" in -# 1086 "parsing/parser.mly" +# 1074 "parsing/parser.mly" ( xs ) -# 7684 "parsing/parser.ml" +# 7661 "parsing/parser.ml" in -# 3725 "parsing/parser.mly" +# 3896 "parsing/parser.mly" ( _1 ) -# 7690 "parsing/parser.ml" +# 7667 "parsing/parser.ml" in let fields = @@ -7694,24 +7671,24 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 7698 "parsing/parser.ml" +# 7675 "parsing/parser.ml" in -# 1139 "parsing/parser.mly" +# 1127 "parsing/parser.mly" ( xs ) -# 7703 "parsing/parser.ml" +# 7680 "parsing/parser.ml" in -# 3697 "parsing/parser.mly" +# 3868 "parsing/parser.mly" ( _1 ) -# 7709 "parsing/parser.ml" +# 7686 "parsing/parser.ml" in -# 3618 "parsing/parser.mly" +# 3787 "parsing/parser.mly" ( Ptyp_variant(fields, Closed, Some tags) ) -# 7715 "parsing/parser.ml" +# 7692 "parsing/parser.ml" in let _endpos__1_ = _endpos__6_ in @@ -7719,15 +7696,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1021 "parsing/parser.mly" +# 1009 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 7725 "parsing/parser.ml" +# 7702 "parsing/parser.ml" in ( -# 3620 "parsing/parser.mly" +# 3789 "parsing/parser.mly" ( _1 ) -# 7731 "parsing/parser.ml" +# 7708 "parsing/parser.ml" : (Parsetree.core_type)) in { @@ -7751,9 +7728,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.direction_flag) = -# 3961 "parsing/parser.mly" +# 4132 "parsing/parser.mly" ( Upto ) -# 7757 "parsing/parser.ml" +# 7734 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7776,9 +7753,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.direction_flag) = -# 3962 "parsing/parser.mly" +# 4133 "parsing/parser.mly" ( Downto ) -# 7782 "parsing/parser.ml" +# 7759 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7794,9 +7771,9 @@ module Tables = struct let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in let _endpos = _startpos in let _v : (string Asttypes.loc option) = -# 4117 "parsing/parser.mly" +# 4289 "parsing/parser.mly" ( None ) -# 7800 "parsing/parser.ml" +# 7777 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7826,9 +7803,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (string Asttypes.loc option) = -# 4118 "parsing/parser.mly" +# 4290 "parsing/parser.mly" ( Some _2 ) -# 7832 "parsing/parser.ml" +# 7809 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7872,9 +7849,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__4_ in let _v : (Parsetree.extension) = -# 4130 "parsing/parser.mly" +# 4302 "parsing/parser.mly" ( (_2, _3) ) -# 7878 "parsing/parser.ml" +# 7855 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7893,9 +7870,9 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 837 "parsing/parser.mly" +# 825 "parsing/parser.mly" (string * Location.t * string * Location.t * string option) -# 7899 "parsing/parser.ml" +# 7876 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -7905,9 +7882,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 4132 "parsing/parser.mly" +# 4304 "parsing/parser.mly" ( mk_quotedext ~loc:_sloc _1 ) -# 7911 "parsing/parser.ml" +# 7888 "parsing/parser.ml" : (Parsetree.extension)) in { @@ -7962,9 +7939,9 @@ module Tables = struct let attrs = let _1 = _1_inlined3 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 7968 "parsing/parser.ml" +# 7945 "parsing/parser.ml" in let _endpos_attrs_ = _endpos__1_inlined3_ in @@ -7974,9 +7951,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 7980 "parsing/parser.ml" +# 7957 "parsing/parser.ml" in let cid = @@ -7985,19 +7962,19 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 7991 "parsing/parser.ml" +# 7968 "parsing/parser.ml" in let _endpos = _endpos_attrs_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 3415 "parsing/parser.mly" +# 3539 "parsing/parser.mly" ( let info = symbol_info _endpos in Te.rebind cid lid ~attrs ~loc:(make_loc _sloc) ~info ) -# 8001 "parsing/parser.ml" +# 7978 "parsing/parser.ml" : (Parsetree.extension_constructor)) in { @@ -8045,9 +8022,9 @@ module Tables = struct let attrs = let _1 = _1_inlined2 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 8051 "parsing/parser.ml" +# 8028 "parsing/parser.ml" in let _endpos_attrs_ = _endpos__1_inlined2_ in @@ -8057,9 +8034,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 8063 "parsing/parser.ml" +# 8040 "parsing/parser.ml" in let cid = @@ -8067,25 +8044,25 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 8073 "parsing/parser.ml" +# 8050 "parsing/parser.ml" in let _startpos_cid_ = _startpos__1_ in let _1 = -# 3935 "parsing/parser.mly" +# 4106 "parsing/parser.mly" ( () ) -# 8080 "parsing/parser.ml" +# 8057 "parsing/parser.ml" in let _endpos = _endpos_attrs_ in let _symbolstartpos = _startpos_cid_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 3415 "parsing/parser.mly" +# 3539 "parsing/parser.mly" ( let info = symbol_info _endpos in Te.rebind cid lid ~attrs ~loc:(make_loc _sloc) ~info ) -# 8089 "parsing/parser.ml" +# 8066 "parsing/parser.ml" : (Parsetree.extension_constructor)) in { @@ -8111,24 +8088,24 @@ module Tables = struct let _v = let _1 = let _1 = -# 3636 "parsing/parser.mly" +# 3805 "parsing/parser.mly" ( Ptyp_extension ext ) -# 8117 "parsing/parser.ml" +# 8094 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_ext_, _startpos_ext_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1021 "parsing/parser.mly" +# 1009 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 8126 "parsing/parser.ml" +# 8103 "parsing/parser.ml" in ( -# 3638 "parsing/parser.mly" +# 3807 "parsing/parser.mly" ( _1 ) -# 8132 "parsing/parser.ml" +# 8109 "parsing/parser.ml" : (Parsetree.core_type)) in { @@ -8177,10 +8154,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 4105 "parsing/parser.mly" +# 4277 "parsing/parser.mly" ( mark_symbol_docs _sloc; mk_attr ~loc:(make_loc _sloc) _2 _3 ) -# 8184 "parsing/parser.ml" +# 8161 "parsing/parser.ml" : (Parsetree.attribute)) in { @@ -8198,14 +8175,14 @@ module Tables = struct let _endpos = _startpos in let _v = let params = -# 2163 "parsing/parser.mly" +# 2151 "parsing/parser.mly" ( [] ) -# 8204 "parsing/parser.ml" +# 8181 "parsing/parser.ml" in ( -# 1988 "parsing/parser.mly" +# 1976 "parsing/parser.mly" ( params ) -# 8209 "parsing/parser.ml" +# 8186 "parsing/parser.ml" : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list)) in { @@ -8248,24 +8225,24 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 8252 "parsing/parser.ml" +# 8229 "parsing/parser.ml" in -# 1139 "parsing/parser.mly" +# 1127 "parsing/parser.mly" ( xs ) -# 8257 "parsing/parser.ml" +# 8234 "parsing/parser.ml" in -# 2165 "parsing/parser.mly" +# 2153 "parsing/parser.mly" ( params ) -# 8263 "parsing/parser.ml" +# 8240 "parsing/parser.ml" in ( -# 1988 "parsing/parser.mly" +# 1976 "parsing/parser.mly" ( params ) -# 8269 "parsing/parser.ml" +# 8246 "parsing/parser.ml" : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list)) in { @@ -8315,18 +8292,18 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 8319 "parsing/parser.ml" +# 8296 "parsing/parser.ml" in -# 1200 "parsing/parser.mly" +# 1188 "parsing/parser.mly" ( xs ) -# 8324 "parsing/parser.ml" +# 8301 "parsing/parser.ml" in -# 2798 "parsing/parser.mly" +# 2783 "parsing/parser.mly" ( xs ) -# 8330 "parsing/parser.ml" +# 8307 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -8335,22 +8312,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 8341 "parsing/parser.ml" +# 8318 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 8347 "parsing/parser.ml" +# 8324 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2784 "parsing/parser.mly" +# 2769 "parsing/parser.mly" ( let ext, attrs = _2 in match ext with | None -> Pfunction_cases (_3, make_loc _sloc, attrs) @@ -8360,7 +8337,7 @@ module Tables = struct Pfunction_body (mkexp_attrs ~loc:_sloc (mkfunction [] None cases) _2) ) -# 8364 "parsing/parser.ml" +# 8341 "parsing/parser.ml" : (Parsetree.function_body)) in { @@ -8384,9 +8361,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.function_body) = -# 2794 "parsing/parser.mly" +# 2779 "parsing/parser.mly" ( Pfunction_body _1 ) -# 8390 "parsing/parser.ml" +# 8367 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -8409,9 +8386,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.expression) = -# 2421 "parsing/parser.mly" +# 2407 "parsing/parser.mly" ( _1 ) -# 8415 "parsing/parser.ml" +# 8392 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -8490,9 +8467,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 8496 "parsing/parser.ml" +# 8473 "parsing/parser.ml" in let _3 = @@ -8500,21 +8477,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 8506 "parsing/parser.ml" +# 8483 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 8512 "parsing/parser.ml" +# 8489 "parsing/parser.ml" in -# 2457 "parsing/parser.mly" +# 2444 "parsing/parser.mly" ( Pexp_letmodule(_4, _5, _7), _3 ) -# 8518 "parsing/parser.ml" +# 8495 "parsing/parser.ml" in let _endpos__1_ = _endpos__7_ in @@ -8522,10 +8499,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2423 "parsing/parser.mly" +# 2409 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 8529 "parsing/parser.ml" +# 8506 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -8612,9 +8589,9 @@ module Tables = struct let _3 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 8618 "parsing/parser.ml" +# 8595 "parsing/parser.ml" in let _endpos__3_ = _endpos__1_inlined1_ in @@ -8623,19 +8600,19 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 8629 "parsing/parser.ml" +# 8606 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3326 "parsing/parser.mly" +# 3449 "parsing/parser.mly" ( let vars, args, res = _2 in Te.decl _1 ~vars ~args ?res ~attrs:_3 ~loc:(make_loc _sloc) ) -# 8639 "parsing/parser.ml" +# 8616 "parsing/parser.ml" in let _3 = @@ -8643,21 +8620,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 8649 "parsing/parser.ml" +# 8626 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 8655 "parsing/parser.ml" +# 8632 "parsing/parser.ml" in -# 2459 "parsing/parser.mly" +# 2446 "parsing/parser.mly" ( Pexp_letexception(_4, _6), _3 ) -# 8661 "parsing/parser.ml" +# 8638 "parsing/parser.ml" in let _endpos__1_ = _endpos__6_ in @@ -8665,10 +8642,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2423 "parsing/parser.mly" +# 2409 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 8672 "parsing/parser.ml" +# 8649 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -8740,28 +8717,28 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 8746 "parsing/parser.ml" +# 8723 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 8752 "parsing/parser.ml" +# 8729 "parsing/parser.ml" in let _3 = -# 4016 "parsing/parser.mly" +# 4187 "parsing/parser.mly" ( Fresh ) -# 8758 "parsing/parser.ml" +# 8735 "parsing/parser.ml" in -# 2461 "parsing/parser.mly" +# 2448 "parsing/parser.mly" ( let open_loc = make_loc (_startpos__2_, _endpos__5_) in let od = Opn.mk _5 ~override:_3 ~loc:open_loc in Pexp_open(od, _7), _4 ) -# 8765 "parsing/parser.ml" +# 8742 "parsing/parser.ml" in let _endpos__1_ = _endpos__7_ in @@ -8769,10 +8746,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2423 "parsing/parser.mly" +# 2409 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 8776 "parsing/parser.ml" +# 8753 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -8851,28 +8828,28 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 8857 "parsing/parser.ml" +# 8834 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 8863 "parsing/parser.ml" +# 8840 "parsing/parser.ml" in let _3 = -# 4017 "parsing/parser.mly" +# 4188 "parsing/parser.mly" ( Override ) -# 8869 "parsing/parser.ml" +# 8846 "parsing/parser.ml" in -# 2461 "parsing/parser.mly" +# 2448 "parsing/parser.mly" ( let open_loc = make_loc (_startpos__2_, _endpos__5_) in let od = Opn.mk _5 ~override:_3 ~loc:open_loc in Pexp_open(od, _7), _4 ) -# 8876 "parsing/parser.ml" +# 8853 "parsing/parser.ml" in let _endpos__1_ = _endpos__7_ in @@ -8880,10 +8857,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2423 "parsing/parser.mly" +# 2409 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 8887 "parsing/parser.ml" +# 8864 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -8955,23 +8932,23 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 8961 "parsing/parser.ml" +# 8938 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 8967 "parsing/parser.ml" +# 8944 "parsing/parser.ml" in -# 2467 "parsing/parser.mly" +# 2454 "parsing/parser.mly" ( let body_constraint = Option.map (fun x -> Pconstraint x) _4 in mkfunction _3 body_constraint _6, _2 ) -# 8975 "parsing/parser.ml" +# 8952 "parsing/parser.ml" in let _endpos__1_ = _endpos__6_ in @@ -8979,10 +8956,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2423 "parsing/parser.mly" +# 2409 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 8986 "parsing/parser.ml" +# 8963 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -9047,18 +9024,18 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 9051 "parsing/parser.ml" +# 9028 "parsing/parser.ml" in -# 1200 "parsing/parser.mly" +# 1188 "parsing/parser.mly" ( xs ) -# 9056 "parsing/parser.ml" +# 9033 "parsing/parser.ml" in -# 2798 "parsing/parser.mly" +# 2783 "parsing/parser.mly" ( xs ) -# 9062 "parsing/parser.ml" +# 9039 "parsing/parser.ml" in let _2 = @@ -9066,21 +9043,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 9072 "parsing/parser.ml" +# 9049 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 9078 "parsing/parser.ml" +# 9055 "parsing/parser.ml" in -# 2471 "parsing/parser.mly" +# 2458 "parsing/parser.mly" ( Pexp_match(_3, _5), _2 ) -# 9084 "parsing/parser.ml" +# 9061 "parsing/parser.ml" in let _endpos__1_ = _endpos_xs_ in @@ -9088,10 +9065,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2423 "parsing/parser.mly" +# 2409 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 9095 "parsing/parser.ml" +# 9072 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -9156,18 +9133,18 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 9160 "parsing/parser.ml" +# 9137 "parsing/parser.ml" in -# 1200 "parsing/parser.mly" +# 1188 "parsing/parser.mly" ( xs ) -# 9165 "parsing/parser.ml" +# 9142 "parsing/parser.ml" in -# 2798 "parsing/parser.mly" +# 2783 "parsing/parser.mly" ( xs ) -# 9171 "parsing/parser.ml" +# 9148 "parsing/parser.ml" in let _2 = @@ -9175,21 +9152,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 9181 "parsing/parser.ml" +# 9158 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 9187 "parsing/parser.ml" +# 9164 "parsing/parser.ml" in -# 2473 "parsing/parser.mly" +# 2460 "parsing/parser.mly" ( Pexp_try(_3, _5), _2 ) -# 9193 "parsing/parser.ml" +# 9170 "parsing/parser.ml" in let _endpos__1_ = _endpos_xs_ in @@ -9197,10 +9174,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2423 "parsing/parser.mly" +# 2409 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 9204 "parsing/parser.ml" +# 9181 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -9265,21 +9242,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 9271 "parsing/parser.ml" +# 9248 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 9277 "parsing/parser.ml" +# 9254 "parsing/parser.ml" in -# 2475 "parsing/parser.mly" +# 2462 "parsing/parser.mly" ( syntax_error() ) -# 9283 "parsing/parser.ml" +# 9260 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -9287,10 +9264,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2423 "parsing/parser.mly" +# 2409 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 9294 "parsing/parser.ml" +# 9271 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -9367,27 +9344,27 @@ module Tables = struct let _7 = let _1 = _1_inlined4 in let _1 = -# 2309 "parsing/parser.mly" +# 2297 "parsing/parser.mly" ( _1 ) -# 9373 "parsing/parser.ml" +# 9350 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 9378 "parsing/parser.ml" +# 9355 "parsing/parser.ml" in let _5 = let _1 = _1_inlined3 in let _1 = -# 2309 "parsing/parser.mly" +# 2297 "parsing/parser.mly" ( _1 ) -# 9386 "parsing/parser.ml" +# 9363 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 9391 "parsing/parser.ml" +# 9368 "parsing/parser.ml" in let _2 = @@ -9395,21 +9372,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 9401 "parsing/parser.ml" +# 9378 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 9407 "parsing/parser.ml" +# 9384 "parsing/parser.ml" in -# 2477 "parsing/parser.mly" +# 2464 "parsing/parser.mly" ( Pexp_ifthenelse(_3, _5, Some _7), _2 ) -# 9413 "parsing/parser.ml" +# 9390 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined4_ in @@ -9417,10 +9394,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2423 "parsing/parser.mly" +# 2409 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 9424 "parsing/parser.ml" +# 9401 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -9523,18 +9500,18 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 9527 "parsing/parser.ml" +# 9504 "parsing/parser.ml" in -# 1200 "parsing/parser.mly" +# 1188 "parsing/parser.mly" ( xs ) -# 9532 "parsing/parser.ml" +# 9509 "parsing/parser.ml" in -# 2798 "parsing/parser.mly" +# 2783 "parsing/parser.mly" ( xs ) -# 9538 "parsing/parser.ml" +# 9515 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -9543,22 +9520,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 9549 "parsing/parser.ml" +# 9526 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 9555 "parsing/parser.ml" +# 9532 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2311 "parsing/parser.mly" +# 2299 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -9571,26 +9548,26 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 9575 "parsing/parser.ml" +# 9552 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 9581 "parsing/parser.ml" +# 9558 "parsing/parser.ml" in let _5 = let _1 = _1_inlined3 in let _1 = -# 2309 "parsing/parser.mly" +# 2297 "parsing/parser.mly" ( _1 ) -# 9589 "parsing/parser.ml" +# 9566 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 9594 "parsing/parser.ml" +# 9571 "parsing/parser.ml" in let _2 = @@ -9598,21 +9575,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 9604 "parsing/parser.ml" +# 9581 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 9610 "parsing/parser.ml" +# 9587 "parsing/parser.ml" in -# 2477 "parsing/parser.mly" +# 2464 "parsing/parser.mly" ( Pexp_ifthenelse(_3, _5, Some _7), _2 ) -# 9616 "parsing/parser.ml" +# 9593 "parsing/parser.ml" in let _endpos__1_ = _endpos_xs_ in @@ -9620,10 +9597,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2423 "parsing/parser.mly" +# 2409 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 9627 "parsing/parser.ml" +# 9604 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -9721,14 +9698,14 @@ module Tables = struct let _7 = let _1 = _1_inlined6 in let _1 = -# 2309 "parsing/parser.mly" +# 2297 "parsing/parser.mly" ( _1 ) -# 9727 "parsing/parser.ml" +# 9704 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 9732 "parsing/parser.ml" +# 9709 "parsing/parser.ml" in let _5 = @@ -9739,18 +9716,18 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 9743 "parsing/parser.ml" +# 9720 "parsing/parser.ml" in -# 1200 "parsing/parser.mly" +# 1188 "parsing/parser.mly" ( xs ) -# 9748 "parsing/parser.ml" +# 9725 "parsing/parser.ml" in -# 2798 "parsing/parser.mly" +# 2783 "parsing/parser.mly" ( xs ) -# 9754 "parsing/parser.ml" +# 9731 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -9759,22 +9736,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 9765 "parsing/parser.ml" +# 9742 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 9771 "parsing/parser.ml" +# 9748 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2311 "parsing/parser.mly" +# 2299 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -9787,13 +9764,13 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 9791 "parsing/parser.ml" +# 9768 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 9797 "parsing/parser.ml" +# 9774 "parsing/parser.ml" in let _2 = @@ -9801,21 +9778,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 9807 "parsing/parser.ml" +# 9784 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 9813 "parsing/parser.ml" +# 9790 "parsing/parser.ml" in -# 2477 "parsing/parser.mly" +# 2464 "parsing/parser.mly" ( Pexp_ifthenelse(_3, _5, Some _7), _2 ) -# 9819 "parsing/parser.ml" +# 9796 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined6_ in @@ -9823,10 +9800,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2423 "parsing/parser.mly" +# 2409 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 9830 "parsing/parser.ml" +# 9807 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -9950,18 +9927,18 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 9954 "parsing/parser.ml" +# 9931 "parsing/parser.ml" in -# 1200 "parsing/parser.mly" +# 1188 "parsing/parser.mly" ( xs ) -# 9959 "parsing/parser.ml" +# 9936 "parsing/parser.ml" in -# 2798 "parsing/parser.mly" +# 2783 "parsing/parser.mly" ( xs ) -# 9965 "parsing/parser.ml" +# 9942 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -9970,22 +9947,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 9976 "parsing/parser.ml" +# 9953 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 9982 "parsing/parser.ml" +# 9959 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2311 "parsing/parser.mly" +# 2299 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -9998,13 +9975,13 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 10002 "parsing/parser.ml" +# 9979 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 10008 "parsing/parser.ml" +# 9985 "parsing/parser.ml" in let _5 = @@ -10015,18 +9992,18 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 10019 "parsing/parser.ml" +# 9996 "parsing/parser.ml" in -# 1200 "parsing/parser.mly" +# 1188 "parsing/parser.mly" ( xs ) -# 10024 "parsing/parser.ml" +# 10001 "parsing/parser.ml" in -# 2798 "parsing/parser.mly" +# 2783 "parsing/parser.mly" ( xs ) -# 10030 "parsing/parser.ml" +# 10007 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -10035,22 +10012,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 10041 "parsing/parser.ml" +# 10018 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 10047 "parsing/parser.ml" +# 10024 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2311 "parsing/parser.mly" +# 2299 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -10063,13 +10040,13 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 10067 "parsing/parser.ml" +# 10044 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 10073 "parsing/parser.ml" +# 10050 "parsing/parser.ml" in let _2 = @@ -10077,21 +10054,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 10083 "parsing/parser.ml" +# 10060 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 10089 "parsing/parser.ml" +# 10066 "parsing/parser.ml" in -# 2477 "parsing/parser.mly" +# 2464 "parsing/parser.mly" ( Pexp_ifthenelse(_3, _5, Some _7), _2 ) -# 10095 "parsing/parser.ml" +# 10072 "parsing/parser.ml" in let _endpos__1_ = _endpos_xs_inlined1_ in @@ -10099,10 +10076,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2423 "parsing/parser.mly" +# 2409 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 10106 "parsing/parser.ml" +# 10083 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -10165,14 +10142,14 @@ module Tables = struct let _5 = let _1 = _1_inlined3 in let _1 = -# 2309 "parsing/parser.mly" +# 2297 "parsing/parser.mly" ( _1 ) -# 10171 "parsing/parser.ml" +# 10148 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 10176 "parsing/parser.ml" +# 10153 "parsing/parser.ml" in let _2 = @@ -10180,21 +10157,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 10186 "parsing/parser.ml" +# 10163 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 10192 "parsing/parser.ml" +# 10169 "parsing/parser.ml" in -# 2479 "parsing/parser.mly" +# 2466 "parsing/parser.mly" ( Pexp_ifthenelse(_3, _5, None), _2 ) -# 10198 "parsing/parser.ml" +# 10175 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined3_ in @@ -10202,10 +10179,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2423 "parsing/parser.mly" +# 2409 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 10209 "parsing/parser.ml" +# 10186 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -10294,18 +10271,18 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 10298 "parsing/parser.ml" +# 10275 "parsing/parser.ml" in -# 1200 "parsing/parser.mly" +# 1188 "parsing/parser.mly" ( xs ) -# 10303 "parsing/parser.ml" +# 10280 "parsing/parser.ml" in -# 2798 "parsing/parser.mly" +# 2783 "parsing/parser.mly" ( xs ) -# 10309 "parsing/parser.ml" +# 10286 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -10314,22 +10291,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 10320 "parsing/parser.ml" +# 10297 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 10326 "parsing/parser.ml" +# 10303 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2311 "parsing/parser.mly" +# 2299 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -10342,13 +10319,13 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 10346 "parsing/parser.ml" +# 10323 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 10352 "parsing/parser.ml" +# 10329 "parsing/parser.ml" in let _2 = @@ -10356,21 +10333,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 10362 "parsing/parser.ml" +# 10339 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 10368 "parsing/parser.ml" +# 10345 "parsing/parser.ml" in -# 2479 "parsing/parser.mly" +# 2466 "parsing/parser.mly" ( Pexp_ifthenelse(_3, _5, None), _2 ) -# 10374 "parsing/parser.ml" +# 10351 "parsing/parser.ml" in let _endpos__1_ = _endpos_xs_ in @@ -10378,10 +10355,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2423 "parsing/parser.mly" +# 2409 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 10385 "parsing/parser.ml" +# 10362 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -10449,30 +10426,30 @@ module Tables = struct let _v = let _1 = let _4 = -# 2492 "parsing/parser.mly" +# 2479 "parsing/parser.mly" ( e ) -# 10455 "parsing/parser.ml" +# 10432 "parsing/parser.ml" in let _2 = let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 10464 "parsing/parser.ml" +# 10441 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 10470 "parsing/parser.ml" +# 10447 "parsing/parser.ml" in -# 2481 "parsing/parser.mly" +# 2468 "parsing/parser.mly" ( Pexp_while(_3, _4), _2 ) -# 10476 "parsing/parser.ml" +# 10453 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_inlined1_ in @@ -10480,10 +10457,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2423 "parsing/parser.mly" +# 2409 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 10487 "parsing/parser.ml" +# 10464 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -10555,9 +10532,9 @@ module Tables = struct let _loc__2_ = (_startpos__2_, _endpos__2_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2494 "parsing/parser.mly" +# 2481 "parsing/parser.mly" ( unclosed "do" _loc__1_ "done" _loc__2_ ) -# 10561 "parsing/parser.ml" +# 10538 "parsing/parser.ml" in let _2 = @@ -10565,21 +10542,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 10571 "parsing/parser.ml" +# 10548 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 10577 "parsing/parser.ml" +# 10554 "parsing/parser.ml" in -# 2481 "parsing/parser.mly" +# 2468 "parsing/parser.mly" ( Pexp_while(_3, _4), _2 ) -# 10583 "parsing/parser.ml" +# 10560 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_inlined1_ in @@ -10587,10 +10564,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2423 "parsing/parser.mly" +# 2409 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 10594 "parsing/parser.ml" +# 10571 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -10686,30 +10663,30 @@ module Tables = struct let _v = let _1 = let _8 = -# 2492 "parsing/parser.mly" +# 2479 "parsing/parser.mly" ( e ) -# 10692 "parsing/parser.ml" +# 10669 "parsing/parser.ml" in let _2 = let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 10701 "parsing/parser.ml" +# 10678 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 10707 "parsing/parser.ml" +# 10684 "parsing/parser.ml" in -# 2484 "parsing/parser.mly" +# 2471 "parsing/parser.mly" ( Pexp_for(_3, _5, _7, _6, _8), _2 ) -# 10713 "parsing/parser.ml" +# 10690 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_inlined1_ in @@ -10717,10 +10694,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2423 "parsing/parser.mly" +# 2409 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 10724 "parsing/parser.ml" +# 10701 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -10820,9 +10797,9 @@ module Tables = struct let _loc__2_ = (_startpos__2_, _endpos__2_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2494 "parsing/parser.mly" +# 2481 "parsing/parser.mly" ( unclosed "do" _loc__1_ "done" _loc__2_ ) -# 10826 "parsing/parser.ml" +# 10803 "parsing/parser.ml" in let _2 = @@ -10830,21 +10807,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 10836 "parsing/parser.ml" +# 10813 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 10842 "parsing/parser.ml" +# 10819 "parsing/parser.ml" in -# 2484 "parsing/parser.mly" +# 2471 "parsing/parser.mly" ( Pexp_for(_3, _5, _7, _6, _8), _2 ) -# 10848 "parsing/parser.ml" +# 10825 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_inlined1_ in @@ -10852,10 +10829,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2423 "parsing/parser.mly" +# 2409 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 10859 "parsing/parser.ml" +# 10836 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -10906,21 +10883,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 10912 "parsing/parser.ml" +# 10889 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 10918 "parsing/parser.ml" +# 10895 "parsing/parser.ml" in -# 2486 "parsing/parser.mly" +# 2473 "parsing/parser.mly" ( Pexp_assert _3, _2 ) -# 10924 "parsing/parser.ml" +# 10901 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -10928,10 +10905,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2423 "parsing/parser.mly" +# 2409 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 10935 "parsing/parser.ml" +# 10912 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -10982,21 +10959,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 10988 "parsing/parser.ml" +# 10965 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 10994 "parsing/parser.ml" +# 10971 "parsing/parser.ml" in -# 2488 "parsing/parser.mly" +# 2475 "parsing/parser.mly" ( Pexp_lazy _3, _2 ) -# 11000 "parsing/parser.ml" +# 10977 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -11004,10 +10981,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2423 "parsing/parser.mly" +# 2409 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 11011 "parsing/parser.ml" +# 10988 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -11044,18 +11021,18 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 11048 "parsing/parser.ml" +# 11025 "parsing/parser.ml" in -# 1086 "parsing/parser.mly" +# 1074 "parsing/parser.mly" ( xs ) -# 11053 "parsing/parser.ml" +# 11030 "parsing/parser.ml" in -# 2498 "parsing/parser.mly" +# 2485 "parsing/parser.mly" ( Pexp_apply(_1, _2) ) -# 11059 "parsing/parser.ml" +# 11036 "parsing/parser.ml" in let _endpos__1_ = _endpos_xs_ in @@ -11063,15 +11040,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 11069 "parsing/parser.ml" +# 11046 "parsing/parser.ml" in ( -# 2426 "parsing/parser.mly" +# 2412 "parsing/parser.mly" ( _1 ) -# 11075 "parsing/parser.ml" +# 11052 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -11090,7 +11067,7 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let xs : (Parsetree.expression list) = Obj.magic xs in + let xs : ((string option * Parsetree.expression) list) = Obj.magic xs in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_xs_ in let _endpos = _endpos_xs_ in @@ -11098,28 +11075,21 @@ module Tables = struct let _1 = let _1 = let _1 = - let es = - let xs = + let xs = # 264 "" ( List.rev xs ) -# 11106 "parsing/parser.ml" - in - -# 1167 "parsing/parser.mly" - ( xs ) -# 11111 "parsing/parser.ml" - - in +# 11082 "parsing/parser.ml" + in -# 2833 "parsing/parser.mly" - ( es ) -# 11117 "parsing/parser.ml" +# 2893 "parsing/parser.mly" + ( xs ) +# 11087 "parsing/parser.ml" in -# 2500 "parsing/parser.mly" +# 2487 "parsing/parser.mly" ( Pexp_tuple(_1) ) -# 11123 "parsing/parser.ml" +# 11093 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_xs_) in @@ -11127,15 +11097,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 11133 "parsing/parser.ml" +# 11103 "parsing/parser.ml" in ( -# 2426 "parsing/parser.mly" +# 2412 "parsing/parser.mly" ( _1 ) -# 11139 "parsing/parser.ml" +# 11109 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -11173,15 +11143,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 11179 "parsing/parser.ml" +# 11149 "parsing/parser.ml" in -# 2502 "parsing/parser.mly" +# 2489 "parsing/parser.mly" ( Pexp_construct(_1, Some _2) ) -# 11185 "parsing/parser.ml" +# 11155 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in @@ -11189,15 +11159,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 11195 "parsing/parser.ml" +# 11165 "parsing/parser.ml" in ( -# 2426 "parsing/parser.mly" +# 2412 "parsing/parser.mly" ( _1 ) -# 11201 "parsing/parser.ml" +# 11171 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -11230,24 +11200,24 @@ module Tables = struct let _v = let _1 = let _1 = -# 2504 "parsing/parser.mly" +# 2491 "parsing/parser.mly" ( Pexp_variant(_1, Some _2) ) -# 11236 "parsing/parser.ml" +# 11206 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 11245 "parsing/parser.ml" +# 11215 "parsing/parser.ml" in ( -# 2426 "parsing/parser.mly" +# 2412 "parsing/parser.mly" ( _1 ) -# 11251 "parsing/parser.ml" +# 11221 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -11280,9 +11250,9 @@ module Tables = struct } = _menhir_stack in let _1 : (Parsetree.expression) = Obj.magic _1 in let op : ( -# 773 "parsing/parser.mly" +# 761 "parsing/parser.mly" (string) -# 11286 "parsing/parser.ml" +# 11256 "parsing/parser.ml" ) = Obj.magic op in let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -11293,36 +11263,36 @@ module Tables = struct let _1 = let e2 = let _1 = -# 2309 "parsing/parser.mly" +# 2297 "parsing/parser.mly" ( _1 ) -# 11299 "parsing/parser.ml" +# 11269 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 11304 "parsing/parser.ml" +# 11274 "parsing/parser.ml" in let op = let _1 = -# 3822 "parsing/parser.mly" +# 3993 "parsing/parser.mly" ( op ) -# 11311 "parsing/parser.ml" +# 11281 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_op_, _startpos_op_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1011 "parsing/parser.mly" +# 999 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 11320 "parsing/parser.ml" +# 11290 "parsing/parser.ml" in -# 2506 "parsing/parser.mly" +# 2493 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 11326 "parsing/parser.ml" +# 11296 "parsing/parser.ml" in let _startpos__1_ = _startpos_e1_ in @@ -11330,15 +11300,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 11336 "parsing/parser.ml" +# 11306 "parsing/parser.ml" in ( -# 2426 "parsing/parser.mly" +# 2412 "parsing/parser.mly" ( _1 ) -# 11342 "parsing/parser.ml" +# 11312 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -11392,9 +11362,9 @@ module Tables = struct let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let op : ( -# 773 "parsing/parser.mly" +# 761 "parsing/parser.mly" (string) -# 11398 "parsing/parser.ml" +# 11368 "parsing/parser.ml" ) = Obj.magic op in let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -11410,18 +11380,18 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 11414 "parsing/parser.ml" +# 11384 "parsing/parser.ml" in -# 1200 "parsing/parser.mly" +# 1188 "parsing/parser.mly" ( xs ) -# 11419 "parsing/parser.ml" +# 11389 "parsing/parser.ml" in -# 2798 "parsing/parser.mly" +# 2783 "parsing/parser.mly" ( xs ) -# 11425 "parsing/parser.ml" +# 11395 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -11430,22 +11400,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 11436 "parsing/parser.ml" +# 11406 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 11442 "parsing/parser.ml" +# 11412 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2311 "parsing/parser.mly" +# 2299 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -11458,35 +11428,35 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 11462 "parsing/parser.ml" +# 11432 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 11468 "parsing/parser.ml" +# 11438 "parsing/parser.ml" in let op = let _1 = -# 3822 "parsing/parser.mly" +# 3993 "parsing/parser.mly" ( op ) -# 11475 "parsing/parser.ml" +# 11445 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_op_, _startpos_op_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1011 "parsing/parser.mly" +# 999 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 11484 "parsing/parser.ml" +# 11454 "parsing/parser.ml" in -# 2506 "parsing/parser.mly" +# 2493 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 11490 "parsing/parser.ml" +# 11460 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in @@ -11494,15 +11464,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 11500 "parsing/parser.ml" +# 11470 "parsing/parser.ml" in ( -# 2426 "parsing/parser.mly" +# 2412 "parsing/parser.mly" ( _1 ) -# 11506 "parsing/parser.ml" +# 11476 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -11535,9 +11505,9 @@ module Tables = struct } = _menhir_stack in let _1 : (Parsetree.expression) = Obj.magic _1 in let op : ( -# 774 "parsing/parser.mly" +# 762 "parsing/parser.mly" (string) -# 11541 "parsing/parser.ml" +# 11511 "parsing/parser.ml" ) = Obj.magic op in let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -11548,36 +11518,36 @@ module Tables = struct let _1 = let e2 = let _1 = -# 2309 "parsing/parser.mly" +# 2297 "parsing/parser.mly" ( _1 ) -# 11554 "parsing/parser.ml" +# 11524 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 11559 "parsing/parser.ml" +# 11529 "parsing/parser.ml" in let op = let _1 = -# 3823 "parsing/parser.mly" +# 3994 "parsing/parser.mly" ( op ) -# 11566 "parsing/parser.ml" +# 11536 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_op_, _startpos_op_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1011 "parsing/parser.mly" +# 999 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 11575 "parsing/parser.ml" +# 11545 "parsing/parser.ml" in -# 2506 "parsing/parser.mly" +# 2493 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 11581 "parsing/parser.ml" +# 11551 "parsing/parser.ml" in let _startpos__1_ = _startpos_e1_ in @@ -11585,15 +11555,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 11591 "parsing/parser.ml" +# 11561 "parsing/parser.ml" in ( -# 2426 "parsing/parser.mly" +# 2412 "parsing/parser.mly" ( _1 ) -# 11597 "parsing/parser.ml" +# 11567 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -11647,9 +11617,9 @@ module Tables = struct let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let op : ( -# 774 "parsing/parser.mly" +# 762 "parsing/parser.mly" (string) -# 11653 "parsing/parser.ml" +# 11623 "parsing/parser.ml" ) = Obj.magic op in let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -11665,18 +11635,18 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 11669 "parsing/parser.ml" +# 11639 "parsing/parser.ml" in -# 1200 "parsing/parser.mly" +# 1188 "parsing/parser.mly" ( xs ) -# 11674 "parsing/parser.ml" +# 11644 "parsing/parser.ml" in -# 2798 "parsing/parser.mly" +# 2783 "parsing/parser.mly" ( xs ) -# 11680 "parsing/parser.ml" +# 11650 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -11685,22 +11655,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 11691 "parsing/parser.ml" +# 11661 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 11697 "parsing/parser.ml" +# 11667 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2311 "parsing/parser.mly" +# 2299 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -11713,35 +11683,35 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 11717 "parsing/parser.ml" +# 11687 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 11723 "parsing/parser.ml" +# 11693 "parsing/parser.ml" in let op = let _1 = -# 3823 "parsing/parser.mly" +# 3994 "parsing/parser.mly" ( op ) -# 11730 "parsing/parser.ml" +# 11700 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_op_, _startpos_op_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1011 "parsing/parser.mly" +# 999 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 11739 "parsing/parser.ml" +# 11709 "parsing/parser.ml" in -# 2506 "parsing/parser.mly" +# 2493 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 11745 "parsing/parser.ml" +# 11715 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in @@ -11749,15 +11719,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 11755 "parsing/parser.ml" +# 11725 "parsing/parser.ml" in ( -# 2426 "parsing/parser.mly" +# 2412 "parsing/parser.mly" ( _1 ) -# 11761 "parsing/parser.ml" +# 11731 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -11790,9 +11760,9 @@ module Tables = struct } = _menhir_stack in let _1 : (Parsetree.expression) = Obj.magic _1 in let op : ( -# 775 "parsing/parser.mly" +# 763 "parsing/parser.mly" (string) -# 11796 "parsing/parser.ml" +# 11766 "parsing/parser.ml" ) = Obj.magic op in let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -11803,36 +11773,36 @@ module Tables = struct let _1 = let e2 = let _1 = -# 2309 "parsing/parser.mly" +# 2297 "parsing/parser.mly" ( _1 ) -# 11809 "parsing/parser.ml" +# 11779 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 11814 "parsing/parser.ml" +# 11784 "parsing/parser.ml" in let op = let _1 = -# 3824 "parsing/parser.mly" +# 3995 "parsing/parser.mly" ( op ) -# 11821 "parsing/parser.ml" +# 11791 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_op_, _startpos_op_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1011 "parsing/parser.mly" +# 999 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 11830 "parsing/parser.ml" +# 11800 "parsing/parser.ml" in -# 2506 "parsing/parser.mly" +# 2493 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 11836 "parsing/parser.ml" +# 11806 "parsing/parser.ml" in let _startpos__1_ = _startpos_e1_ in @@ -11840,15 +11810,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 11846 "parsing/parser.ml" +# 11816 "parsing/parser.ml" in ( -# 2426 "parsing/parser.mly" +# 2412 "parsing/parser.mly" ( _1 ) -# 11852 "parsing/parser.ml" +# 11822 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -11902,9 +11872,9 @@ module Tables = struct let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let op : ( -# 775 "parsing/parser.mly" +# 763 "parsing/parser.mly" (string) -# 11908 "parsing/parser.ml" +# 11878 "parsing/parser.ml" ) = Obj.magic op in let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -11920,18 +11890,18 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 11924 "parsing/parser.ml" +# 11894 "parsing/parser.ml" in -# 1200 "parsing/parser.mly" +# 1188 "parsing/parser.mly" ( xs ) -# 11929 "parsing/parser.ml" +# 11899 "parsing/parser.ml" in -# 2798 "parsing/parser.mly" +# 2783 "parsing/parser.mly" ( xs ) -# 11935 "parsing/parser.ml" +# 11905 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -11940,22 +11910,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 11946 "parsing/parser.ml" +# 11916 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 11952 "parsing/parser.ml" +# 11922 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2311 "parsing/parser.mly" +# 2299 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -11968,35 +11938,35 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 11972 "parsing/parser.ml" +# 11942 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 11978 "parsing/parser.ml" +# 11948 "parsing/parser.ml" in let op = let _1 = -# 3824 "parsing/parser.mly" +# 3995 "parsing/parser.mly" ( op ) -# 11985 "parsing/parser.ml" +# 11955 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_op_, _startpos_op_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1011 "parsing/parser.mly" +# 999 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 11994 "parsing/parser.ml" +# 11964 "parsing/parser.ml" in -# 2506 "parsing/parser.mly" +# 2493 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 12000 "parsing/parser.ml" +# 11970 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in @@ -12004,15 +11974,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 12010 "parsing/parser.ml" +# 11980 "parsing/parser.ml" in ( -# 2426 "parsing/parser.mly" +# 2412 "parsing/parser.mly" ( _1 ) -# 12016 "parsing/parser.ml" +# 11986 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -12045,9 +12015,9 @@ module Tables = struct } = _menhir_stack in let _1 : (Parsetree.expression) = Obj.magic _1 in let op : ( -# 776 "parsing/parser.mly" +# 764 "parsing/parser.mly" (string) -# 12051 "parsing/parser.ml" +# 12021 "parsing/parser.ml" ) = Obj.magic op in let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -12058,36 +12028,36 @@ module Tables = struct let _1 = let e2 = let _1 = -# 2309 "parsing/parser.mly" +# 2297 "parsing/parser.mly" ( _1 ) -# 12064 "parsing/parser.ml" +# 12034 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 12069 "parsing/parser.ml" +# 12039 "parsing/parser.ml" in let op = let _1 = -# 3825 "parsing/parser.mly" +# 3996 "parsing/parser.mly" ( op ) -# 12076 "parsing/parser.ml" +# 12046 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_op_, _startpos_op_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1011 "parsing/parser.mly" +# 999 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 12085 "parsing/parser.ml" +# 12055 "parsing/parser.ml" in -# 2506 "parsing/parser.mly" +# 2493 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 12091 "parsing/parser.ml" +# 12061 "parsing/parser.ml" in let _startpos__1_ = _startpos_e1_ in @@ -12095,15 +12065,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 12101 "parsing/parser.ml" +# 12071 "parsing/parser.ml" in ( -# 2426 "parsing/parser.mly" +# 2412 "parsing/parser.mly" ( _1 ) -# 12107 "parsing/parser.ml" +# 12077 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -12157,9 +12127,9 @@ module Tables = struct let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let op : ( -# 776 "parsing/parser.mly" +# 764 "parsing/parser.mly" (string) -# 12163 "parsing/parser.ml" +# 12133 "parsing/parser.ml" ) = Obj.magic op in let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -12175,18 +12145,18 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 12179 "parsing/parser.ml" +# 12149 "parsing/parser.ml" in -# 1200 "parsing/parser.mly" +# 1188 "parsing/parser.mly" ( xs ) -# 12184 "parsing/parser.ml" +# 12154 "parsing/parser.ml" in -# 2798 "parsing/parser.mly" +# 2783 "parsing/parser.mly" ( xs ) -# 12190 "parsing/parser.ml" +# 12160 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -12195,22 +12165,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 12201 "parsing/parser.ml" +# 12171 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 12207 "parsing/parser.ml" +# 12177 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2311 "parsing/parser.mly" +# 2299 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -12223,35 +12193,35 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 12227 "parsing/parser.ml" +# 12197 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 12233 "parsing/parser.ml" +# 12203 "parsing/parser.ml" in let op = let _1 = -# 3825 "parsing/parser.mly" +# 3996 "parsing/parser.mly" ( op ) -# 12240 "parsing/parser.ml" +# 12210 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_op_, _startpos_op_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1011 "parsing/parser.mly" +# 999 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 12249 "parsing/parser.ml" +# 12219 "parsing/parser.ml" in -# 2506 "parsing/parser.mly" +# 2493 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 12255 "parsing/parser.ml" +# 12225 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in @@ -12259,15 +12229,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 12265 "parsing/parser.ml" +# 12235 "parsing/parser.ml" in ( -# 2426 "parsing/parser.mly" +# 2412 "parsing/parser.mly" ( _1 ) -# 12271 "parsing/parser.ml" +# 12241 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -12300,9 +12270,9 @@ module Tables = struct } = _menhir_stack in let _1 : (Parsetree.expression) = Obj.magic _1 in let op : ( -# 777 "parsing/parser.mly" +# 765 "parsing/parser.mly" (string) -# 12306 "parsing/parser.ml" +# 12276 "parsing/parser.ml" ) = Obj.magic op in let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -12313,36 +12283,36 @@ module Tables = struct let _1 = let e2 = let _1 = -# 2309 "parsing/parser.mly" +# 2297 "parsing/parser.mly" ( _1 ) -# 12319 "parsing/parser.ml" +# 12289 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 12324 "parsing/parser.ml" +# 12294 "parsing/parser.ml" in let op = let _1 = -# 3826 "parsing/parser.mly" +# 3997 "parsing/parser.mly" ( op ) -# 12331 "parsing/parser.ml" +# 12301 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_op_, _startpos_op_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1011 "parsing/parser.mly" +# 999 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 12340 "parsing/parser.ml" +# 12310 "parsing/parser.ml" in -# 2506 "parsing/parser.mly" +# 2493 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 12346 "parsing/parser.ml" +# 12316 "parsing/parser.ml" in let _startpos__1_ = _startpos_e1_ in @@ -12350,15 +12320,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 12356 "parsing/parser.ml" +# 12326 "parsing/parser.ml" in ( -# 2426 "parsing/parser.mly" +# 2412 "parsing/parser.mly" ( _1 ) -# 12362 "parsing/parser.ml" +# 12332 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -12412,9 +12382,9 @@ module Tables = struct let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let op : ( -# 777 "parsing/parser.mly" +# 765 "parsing/parser.mly" (string) -# 12418 "parsing/parser.ml" +# 12388 "parsing/parser.ml" ) = Obj.magic op in let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -12430,18 +12400,18 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 12434 "parsing/parser.ml" +# 12404 "parsing/parser.ml" in -# 1200 "parsing/parser.mly" +# 1188 "parsing/parser.mly" ( xs ) -# 12439 "parsing/parser.ml" +# 12409 "parsing/parser.ml" in -# 2798 "parsing/parser.mly" +# 2783 "parsing/parser.mly" ( xs ) -# 12445 "parsing/parser.ml" +# 12415 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -12450,22 +12420,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 12456 "parsing/parser.ml" +# 12426 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 12462 "parsing/parser.ml" +# 12432 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2311 "parsing/parser.mly" +# 2299 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -12478,35 +12448,35 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 12482 "parsing/parser.ml" +# 12452 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 12488 "parsing/parser.ml" +# 12458 "parsing/parser.ml" in let op = let _1 = -# 3826 "parsing/parser.mly" +# 3997 "parsing/parser.mly" ( op ) -# 12495 "parsing/parser.ml" +# 12465 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_op_, _startpos_op_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1011 "parsing/parser.mly" +# 999 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 12504 "parsing/parser.ml" +# 12474 "parsing/parser.ml" in -# 2506 "parsing/parser.mly" +# 2493 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 12510 "parsing/parser.ml" +# 12480 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in @@ -12514,15 +12484,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 12520 "parsing/parser.ml" +# 12490 "parsing/parser.ml" in ( -# 2426 "parsing/parser.mly" +# 2412 "parsing/parser.mly" ( _1 ) -# 12526 "parsing/parser.ml" +# 12496 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -12565,35 +12535,35 @@ module Tables = struct let e2 = let _1 = _1_inlined1 in let _1 = -# 2309 "parsing/parser.mly" +# 2297 "parsing/parser.mly" ( _1 ) -# 12571 "parsing/parser.ml" +# 12541 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 12576 "parsing/parser.ml" +# 12546 "parsing/parser.ml" in let op = let _1 = -# 3827 "parsing/parser.mly" +# 3998 "parsing/parser.mly" ("+") -# 12583 "parsing/parser.ml" +# 12553 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1011 "parsing/parser.mly" +# 999 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 12591 "parsing/parser.ml" +# 12561 "parsing/parser.ml" in -# 2506 "parsing/parser.mly" +# 2493 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 12597 "parsing/parser.ml" +# 12567 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_e1_) in @@ -12601,15 +12571,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 12607 "parsing/parser.ml" +# 12577 "parsing/parser.ml" in ( -# 2426 "parsing/parser.mly" +# 2412 "parsing/parser.mly" ( _1 ) -# 12613 "parsing/parser.ml" +# 12583 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -12678,18 +12648,18 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 12682 "parsing/parser.ml" +# 12652 "parsing/parser.ml" in -# 1200 "parsing/parser.mly" +# 1188 "parsing/parser.mly" ( xs ) -# 12687 "parsing/parser.ml" +# 12657 "parsing/parser.ml" in -# 2798 "parsing/parser.mly" +# 2783 "parsing/parser.mly" ( xs ) -# 12693 "parsing/parser.ml" +# 12663 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -12698,22 +12668,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 12704 "parsing/parser.ml" +# 12674 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 12710 "parsing/parser.ml" +# 12680 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2311 "parsing/parser.mly" +# 2299 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -12726,34 +12696,34 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 12730 "parsing/parser.ml" +# 12700 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 12736 "parsing/parser.ml" +# 12706 "parsing/parser.ml" in let op = let _1 = -# 3827 "parsing/parser.mly" +# 3998 "parsing/parser.mly" ("+") -# 12743 "parsing/parser.ml" +# 12713 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1011 "parsing/parser.mly" +# 999 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 12751 "parsing/parser.ml" +# 12721 "parsing/parser.ml" in -# 2506 "parsing/parser.mly" +# 2493 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 12757 "parsing/parser.ml" +# 12727 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in @@ -12761,15 +12731,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 12767 "parsing/parser.ml" +# 12737 "parsing/parser.ml" in ( -# 2426 "parsing/parser.mly" +# 2412 "parsing/parser.mly" ( _1 ) -# 12773 "parsing/parser.ml" +# 12743 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -12812,35 +12782,35 @@ module Tables = struct let e2 = let _1 = _1_inlined1 in let _1 = -# 2309 "parsing/parser.mly" +# 2297 "parsing/parser.mly" ( _1 ) -# 12818 "parsing/parser.ml" +# 12788 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 12823 "parsing/parser.ml" +# 12793 "parsing/parser.ml" in let op = let _1 = -# 3828 "parsing/parser.mly" +# 3999 "parsing/parser.mly" ("+.") -# 12830 "parsing/parser.ml" +# 12800 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1011 "parsing/parser.mly" +# 999 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 12838 "parsing/parser.ml" +# 12808 "parsing/parser.ml" in -# 2506 "parsing/parser.mly" +# 2493 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 12844 "parsing/parser.ml" +# 12814 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_e1_) in @@ -12848,15 +12818,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 12854 "parsing/parser.ml" +# 12824 "parsing/parser.ml" in ( -# 2426 "parsing/parser.mly" +# 2412 "parsing/parser.mly" ( _1 ) -# 12860 "parsing/parser.ml" +# 12830 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -12925,18 +12895,18 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 12929 "parsing/parser.ml" +# 12899 "parsing/parser.ml" in -# 1200 "parsing/parser.mly" +# 1188 "parsing/parser.mly" ( xs ) -# 12934 "parsing/parser.ml" +# 12904 "parsing/parser.ml" in -# 2798 "parsing/parser.mly" +# 2783 "parsing/parser.mly" ( xs ) -# 12940 "parsing/parser.ml" +# 12910 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -12945,22 +12915,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 12951 "parsing/parser.ml" +# 12921 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 12957 "parsing/parser.ml" +# 12927 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2311 "parsing/parser.mly" +# 2299 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -12973,34 +12943,34 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 12977 "parsing/parser.ml" +# 12947 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 12983 "parsing/parser.ml" +# 12953 "parsing/parser.ml" in let op = let _1 = -# 3828 "parsing/parser.mly" +# 3999 "parsing/parser.mly" ("+.") -# 12990 "parsing/parser.ml" +# 12960 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1011 "parsing/parser.mly" +# 999 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 12998 "parsing/parser.ml" +# 12968 "parsing/parser.ml" in -# 2506 "parsing/parser.mly" +# 2493 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 13004 "parsing/parser.ml" +# 12974 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in @@ -13008,15 +12978,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 13014 "parsing/parser.ml" +# 12984 "parsing/parser.ml" in ( -# 2426 "parsing/parser.mly" +# 2412 "parsing/parser.mly" ( _1 ) -# 13020 "parsing/parser.ml" +# 12990 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -13059,35 +13029,35 @@ module Tables = struct let e2 = let _1 = _1_inlined1 in let _1 = -# 2309 "parsing/parser.mly" +# 2297 "parsing/parser.mly" ( _1 ) -# 13065 "parsing/parser.ml" +# 13035 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 13070 "parsing/parser.ml" +# 13040 "parsing/parser.ml" in let op = let _1 = -# 3829 "parsing/parser.mly" +# 4000 "parsing/parser.mly" ("+=") -# 13077 "parsing/parser.ml" +# 13047 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1011 "parsing/parser.mly" +# 999 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 13085 "parsing/parser.ml" +# 13055 "parsing/parser.ml" in -# 2506 "parsing/parser.mly" +# 2493 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 13091 "parsing/parser.ml" +# 13061 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_e1_) in @@ -13095,15 +13065,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 13101 "parsing/parser.ml" +# 13071 "parsing/parser.ml" in ( -# 2426 "parsing/parser.mly" +# 2412 "parsing/parser.mly" ( _1 ) -# 13107 "parsing/parser.ml" +# 13077 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -13172,18 +13142,18 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 13176 "parsing/parser.ml" +# 13146 "parsing/parser.ml" in -# 1200 "parsing/parser.mly" +# 1188 "parsing/parser.mly" ( xs ) -# 13181 "parsing/parser.ml" +# 13151 "parsing/parser.ml" in -# 2798 "parsing/parser.mly" +# 2783 "parsing/parser.mly" ( xs ) -# 13187 "parsing/parser.ml" +# 13157 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -13192,22 +13162,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 13198 "parsing/parser.ml" +# 13168 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 13204 "parsing/parser.ml" +# 13174 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2311 "parsing/parser.mly" +# 2299 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -13220,34 +13190,34 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 13224 "parsing/parser.ml" +# 13194 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 13230 "parsing/parser.ml" +# 13200 "parsing/parser.ml" in let op = let _1 = -# 3829 "parsing/parser.mly" +# 4000 "parsing/parser.mly" ("+=") -# 13237 "parsing/parser.ml" +# 13207 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1011 "parsing/parser.mly" +# 999 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 13245 "parsing/parser.ml" +# 13215 "parsing/parser.ml" in -# 2506 "parsing/parser.mly" +# 2493 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 13251 "parsing/parser.ml" +# 13221 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in @@ -13255,15 +13225,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 13261 "parsing/parser.ml" +# 13231 "parsing/parser.ml" in ( -# 2426 "parsing/parser.mly" +# 2412 "parsing/parser.mly" ( _1 ) -# 13267 "parsing/parser.ml" +# 13237 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -13306,35 +13276,35 @@ module Tables = struct let e2 = let _1 = _1_inlined1 in let _1 = -# 2309 "parsing/parser.mly" +# 2297 "parsing/parser.mly" ( _1 ) -# 13312 "parsing/parser.ml" +# 13282 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 13317 "parsing/parser.ml" +# 13287 "parsing/parser.ml" in let op = let _1 = -# 3830 "parsing/parser.mly" +# 4001 "parsing/parser.mly" ("-") -# 13324 "parsing/parser.ml" +# 13294 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1011 "parsing/parser.mly" +# 999 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 13332 "parsing/parser.ml" +# 13302 "parsing/parser.ml" in -# 2506 "parsing/parser.mly" +# 2493 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 13338 "parsing/parser.ml" +# 13308 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_e1_) in @@ -13342,15 +13312,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 13348 "parsing/parser.ml" +# 13318 "parsing/parser.ml" in ( -# 2426 "parsing/parser.mly" +# 2412 "parsing/parser.mly" ( _1 ) -# 13354 "parsing/parser.ml" +# 13324 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -13419,18 +13389,18 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 13423 "parsing/parser.ml" +# 13393 "parsing/parser.ml" in -# 1200 "parsing/parser.mly" +# 1188 "parsing/parser.mly" ( xs ) -# 13428 "parsing/parser.ml" +# 13398 "parsing/parser.ml" in -# 2798 "parsing/parser.mly" +# 2783 "parsing/parser.mly" ( xs ) -# 13434 "parsing/parser.ml" +# 13404 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -13439,22 +13409,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 13445 "parsing/parser.ml" +# 13415 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 13451 "parsing/parser.ml" +# 13421 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2311 "parsing/parser.mly" +# 2299 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -13467,34 +13437,34 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 13471 "parsing/parser.ml" +# 13441 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 13477 "parsing/parser.ml" +# 13447 "parsing/parser.ml" in let op = let _1 = -# 3830 "parsing/parser.mly" +# 4001 "parsing/parser.mly" ("-") -# 13484 "parsing/parser.ml" +# 13454 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1011 "parsing/parser.mly" +# 999 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 13492 "parsing/parser.ml" +# 13462 "parsing/parser.ml" in -# 2506 "parsing/parser.mly" +# 2493 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 13498 "parsing/parser.ml" +# 13468 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in @@ -13502,15 +13472,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 13508 "parsing/parser.ml" +# 13478 "parsing/parser.ml" in ( -# 2426 "parsing/parser.mly" +# 2412 "parsing/parser.mly" ( _1 ) -# 13514 "parsing/parser.ml" +# 13484 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -13553,35 +13523,35 @@ module Tables = struct let e2 = let _1 = _1_inlined1 in let _1 = -# 2309 "parsing/parser.mly" +# 2297 "parsing/parser.mly" ( _1 ) -# 13559 "parsing/parser.ml" +# 13529 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 13564 "parsing/parser.ml" +# 13534 "parsing/parser.ml" in let op = let _1 = -# 3831 "parsing/parser.mly" +# 4002 "parsing/parser.mly" ("-.") -# 13571 "parsing/parser.ml" +# 13541 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1011 "parsing/parser.mly" +# 999 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 13579 "parsing/parser.ml" +# 13549 "parsing/parser.ml" in -# 2506 "parsing/parser.mly" +# 2493 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 13585 "parsing/parser.ml" +# 13555 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_e1_) in @@ -13589,15 +13559,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 13595 "parsing/parser.ml" +# 13565 "parsing/parser.ml" in ( -# 2426 "parsing/parser.mly" +# 2412 "parsing/parser.mly" ( _1 ) -# 13601 "parsing/parser.ml" +# 13571 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -13666,18 +13636,18 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 13670 "parsing/parser.ml" +# 13640 "parsing/parser.ml" in -# 1200 "parsing/parser.mly" +# 1188 "parsing/parser.mly" ( xs ) -# 13675 "parsing/parser.ml" +# 13645 "parsing/parser.ml" in -# 2798 "parsing/parser.mly" +# 2783 "parsing/parser.mly" ( xs ) -# 13681 "parsing/parser.ml" +# 13651 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -13686,22 +13656,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 13692 "parsing/parser.ml" +# 13662 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 13698 "parsing/parser.ml" +# 13668 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2311 "parsing/parser.mly" +# 2299 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -13714,34 +13684,34 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 13718 "parsing/parser.ml" +# 13688 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 13724 "parsing/parser.ml" +# 13694 "parsing/parser.ml" in let op = let _1 = -# 3831 "parsing/parser.mly" +# 4002 "parsing/parser.mly" ("-.") -# 13731 "parsing/parser.ml" +# 13701 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1011 "parsing/parser.mly" +# 999 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 13739 "parsing/parser.ml" +# 13709 "parsing/parser.ml" in -# 2506 "parsing/parser.mly" +# 2493 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 13745 "parsing/parser.ml" +# 13715 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in @@ -13749,15 +13719,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 13755 "parsing/parser.ml" +# 13725 "parsing/parser.ml" in ( -# 2426 "parsing/parser.mly" +# 2412 "parsing/parser.mly" ( _1 ) -# 13761 "parsing/parser.ml" +# 13731 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -13800,35 +13770,35 @@ module Tables = struct let e2 = let _1 = _1_inlined1 in let _1 = -# 2309 "parsing/parser.mly" +# 2297 "parsing/parser.mly" ( _1 ) -# 13806 "parsing/parser.ml" +# 13776 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 13811 "parsing/parser.ml" +# 13781 "parsing/parser.ml" in let op = let _1 = -# 3832 "parsing/parser.mly" +# 4003 "parsing/parser.mly" ("*") -# 13818 "parsing/parser.ml" +# 13788 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1011 "parsing/parser.mly" +# 999 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 13826 "parsing/parser.ml" +# 13796 "parsing/parser.ml" in -# 2506 "parsing/parser.mly" +# 2493 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 13832 "parsing/parser.ml" +# 13802 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_e1_) in @@ -13836,15 +13806,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 13842 "parsing/parser.ml" +# 13812 "parsing/parser.ml" in ( -# 2426 "parsing/parser.mly" +# 2412 "parsing/parser.mly" ( _1 ) -# 13848 "parsing/parser.ml" +# 13818 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -13913,18 +13883,18 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 13917 "parsing/parser.ml" +# 13887 "parsing/parser.ml" in -# 1200 "parsing/parser.mly" +# 1188 "parsing/parser.mly" ( xs ) -# 13922 "parsing/parser.ml" +# 13892 "parsing/parser.ml" in -# 2798 "parsing/parser.mly" +# 2783 "parsing/parser.mly" ( xs ) -# 13928 "parsing/parser.ml" +# 13898 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -13933,22 +13903,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 13939 "parsing/parser.ml" +# 13909 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 13945 "parsing/parser.ml" +# 13915 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2311 "parsing/parser.mly" +# 2299 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -13961,34 +13931,34 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 13965 "parsing/parser.ml" +# 13935 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 13971 "parsing/parser.ml" +# 13941 "parsing/parser.ml" in let op = let _1 = -# 3832 "parsing/parser.mly" +# 4003 "parsing/parser.mly" ("*") -# 13978 "parsing/parser.ml" +# 13948 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1011 "parsing/parser.mly" +# 999 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 13986 "parsing/parser.ml" +# 13956 "parsing/parser.ml" in -# 2506 "parsing/parser.mly" +# 2493 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 13992 "parsing/parser.ml" +# 13962 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in @@ -13996,15 +13966,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 14002 "parsing/parser.ml" +# 13972 "parsing/parser.ml" in ( -# 2426 "parsing/parser.mly" +# 2412 "parsing/parser.mly" ( _1 ) -# 14008 "parsing/parser.ml" +# 13978 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -14047,35 +14017,35 @@ module Tables = struct let e2 = let _1 = _1_inlined1 in let _1 = -# 2309 "parsing/parser.mly" +# 2297 "parsing/parser.mly" ( _1 ) -# 14053 "parsing/parser.ml" +# 14023 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 14058 "parsing/parser.ml" +# 14028 "parsing/parser.ml" in let op = let _1 = -# 3833 "parsing/parser.mly" +# 4004 "parsing/parser.mly" ("%") -# 14065 "parsing/parser.ml" +# 14035 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1011 "parsing/parser.mly" +# 999 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 14073 "parsing/parser.ml" +# 14043 "parsing/parser.ml" in -# 2506 "parsing/parser.mly" +# 2493 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 14079 "parsing/parser.ml" +# 14049 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_e1_) in @@ -14083,15 +14053,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 14089 "parsing/parser.ml" +# 14059 "parsing/parser.ml" in ( -# 2426 "parsing/parser.mly" +# 2412 "parsing/parser.mly" ( _1 ) -# 14095 "parsing/parser.ml" +# 14065 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -14160,18 +14130,18 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 14164 "parsing/parser.ml" +# 14134 "parsing/parser.ml" in -# 1200 "parsing/parser.mly" +# 1188 "parsing/parser.mly" ( xs ) -# 14169 "parsing/parser.ml" +# 14139 "parsing/parser.ml" in -# 2798 "parsing/parser.mly" +# 2783 "parsing/parser.mly" ( xs ) -# 14175 "parsing/parser.ml" +# 14145 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -14180,22 +14150,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 14186 "parsing/parser.ml" +# 14156 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 14192 "parsing/parser.ml" +# 14162 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2311 "parsing/parser.mly" +# 2299 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -14208,34 +14178,34 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 14212 "parsing/parser.ml" +# 14182 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 14218 "parsing/parser.ml" +# 14188 "parsing/parser.ml" in let op = let _1 = -# 3833 "parsing/parser.mly" +# 4004 "parsing/parser.mly" ("%") -# 14225 "parsing/parser.ml" +# 14195 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1011 "parsing/parser.mly" +# 999 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 14233 "parsing/parser.ml" +# 14203 "parsing/parser.ml" in -# 2506 "parsing/parser.mly" +# 2493 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 14239 "parsing/parser.ml" +# 14209 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in @@ -14243,15 +14213,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 14249 "parsing/parser.ml" +# 14219 "parsing/parser.ml" in ( -# 2426 "parsing/parser.mly" +# 2412 "parsing/parser.mly" ( _1 ) -# 14255 "parsing/parser.ml" +# 14225 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -14294,35 +14264,35 @@ module Tables = struct let e2 = let _1 = _1_inlined1 in let _1 = -# 2309 "parsing/parser.mly" +# 2297 "parsing/parser.mly" ( _1 ) -# 14300 "parsing/parser.ml" +# 14270 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 14305 "parsing/parser.ml" +# 14275 "parsing/parser.ml" in let op = let _1 = -# 3834 "parsing/parser.mly" +# 4005 "parsing/parser.mly" ("=") -# 14312 "parsing/parser.ml" +# 14282 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1011 "parsing/parser.mly" +# 999 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 14320 "parsing/parser.ml" +# 14290 "parsing/parser.ml" in -# 2506 "parsing/parser.mly" +# 2493 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 14326 "parsing/parser.ml" +# 14296 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_e1_) in @@ -14330,15 +14300,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 14336 "parsing/parser.ml" +# 14306 "parsing/parser.ml" in ( -# 2426 "parsing/parser.mly" +# 2412 "parsing/parser.mly" ( _1 ) -# 14342 "parsing/parser.ml" +# 14312 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -14407,18 +14377,18 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 14411 "parsing/parser.ml" +# 14381 "parsing/parser.ml" in -# 1200 "parsing/parser.mly" +# 1188 "parsing/parser.mly" ( xs ) -# 14416 "parsing/parser.ml" +# 14386 "parsing/parser.ml" in -# 2798 "parsing/parser.mly" +# 2783 "parsing/parser.mly" ( xs ) -# 14422 "parsing/parser.ml" +# 14392 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -14427,22 +14397,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 14433 "parsing/parser.ml" +# 14403 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 14439 "parsing/parser.ml" +# 14409 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2311 "parsing/parser.mly" +# 2299 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -14455,34 +14425,34 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 14459 "parsing/parser.ml" +# 14429 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 14465 "parsing/parser.ml" +# 14435 "parsing/parser.ml" in let op = let _1 = -# 3834 "parsing/parser.mly" +# 4005 "parsing/parser.mly" ("=") -# 14472 "parsing/parser.ml" +# 14442 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1011 "parsing/parser.mly" +# 999 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 14480 "parsing/parser.ml" +# 14450 "parsing/parser.ml" in -# 2506 "parsing/parser.mly" +# 2493 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 14486 "parsing/parser.ml" +# 14456 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in @@ -14490,15 +14460,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 14496 "parsing/parser.ml" +# 14466 "parsing/parser.ml" in ( -# 2426 "parsing/parser.mly" +# 2412 "parsing/parser.mly" ( _1 ) -# 14502 "parsing/parser.ml" +# 14472 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -14541,35 +14511,35 @@ module Tables = struct let e2 = let _1 = _1_inlined1 in let _1 = -# 2309 "parsing/parser.mly" +# 2297 "parsing/parser.mly" ( _1 ) -# 14547 "parsing/parser.ml" +# 14517 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 14552 "parsing/parser.ml" +# 14522 "parsing/parser.ml" in let op = let _1 = -# 3835 "parsing/parser.mly" +# 4006 "parsing/parser.mly" ("<") -# 14559 "parsing/parser.ml" +# 14529 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1011 "parsing/parser.mly" +# 999 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 14567 "parsing/parser.ml" +# 14537 "parsing/parser.ml" in -# 2506 "parsing/parser.mly" +# 2493 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 14573 "parsing/parser.ml" +# 14543 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_e1_) in @@ -14577,15 +14547,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 14583 "parsing/parser.ml" +# 14553 "parsing/parser.ml" in ( -# 2426 "parsing/parser.mly" +# 2412 "parsing/parser.mly" ( _1 ) -# 14589 "parsing/parser.ml" +# 14559 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -14654,18 +14624,18 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 14658 "parsing/parser.ml" +# 14628 "parsing/parser.ml" in -# 1200 "parsing/parser.mly" +# 1188 "parsing/parser.mly" ( xs ) -# 14663 "parsing/parser.ml" +# 14633 "parsing/parser.ml" in -# 2798 "parsing/parser.mly" +# 2783 "parsing/parser.mly" ( xs ) -# 14669 "parsing/parser.ml" +# 14639 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -14674,22 +14644,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 14680 "parsing/parser.ml" +# 14650 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 14686 "parsing/parser.ml" +# 14656 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2311 "parsing/parser.mly" +# 2299 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -14702,34 +14672,34 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 14706 "parsing/parser.ml" +# 14676 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 14712 "parsing/parser.ml" +# 14682 "parsing/parser.ml" in let op = let _1 = -# 3835 "parsing/parser.mly" +# 4006 "parsing/parser.mly" ("<") -# 14719 "parsing/parser.ml" +# 14689 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1011 "parsing/parser.mly" +# 999 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 14727 "parsing/parser.ml" +# 14697 "parsing/parser.ml" in -# 2506 "parsing/parser.mly" +# 2493 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 14733 "parsing/parser.ml" +# 14703 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in @@ -14737,15 +14707,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 14743 "parsing/parser.ml" +# 14713 "parsing/parser.ml" in ( -# 2426 "parsing/parser.mly" +# 2412 "parsing/parser.mly" ( _1 ) -# 14749 "parsing/parser.ml" +# 14719 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -14788,35 +14758,35 @@ module Tables = struct let e2 = let _1 = _1_inlined1 in let _1 = -# 2309 "parsing/parser.mly" +# 2297 "parsing/parser.mly" ( _1 ) -# 14794 "parsing/parser.ml" +# 14764 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 14799 "parsing/parser.ml" +# 14769 "parsing/parser.ml" in let op = let _1 = -# 3836 "parsing/parser.mly" +# 4007 "parsing/parser.mly" (">") -# 14806 "parsing/parser.ml" +# 14776 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1011 "parsing/parser.mly" +# 999 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 14814 "parsing/parser.ml" +# 14784 "parsing/parser.ml" in -# 2506 "parsing/parser.mly" +# 2493 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 14820 "parsing/parser.ml" +# 14790 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_e1_) in @@ -14824,15 +14794,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 14830 "parsing/parser.ml" +# 14800 "parsing/parser.ml" in ( -# 2426 "parsing/parser.mly" +# 2412 "parsing/parser.mly" ( _1 ) -# 14836 "parsing/parser.ml" +# 14806 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -14901,18 +14871,18 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 14905 "parsing/parser.ml" +# 14875 "parsing/parser.ml" in -# 1200 "parsing/parser.mly" +# 1188 "parsing/parser.mly" ( xs ) -# 14910 "parsing/parser.ml" +# 14880 "parsing/parser.ml" in -# 2798 "parsing/parser.mly" +# 2783 "parsing/parser.mly" ( xs ) -# 14916 "parsing/parser.ml" +# 14886 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -14921,22 +14891,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 14927 "parsing/parser.ml" +# 14897 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 14933 "parsing/parser.ml" +# 14903 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2311 "parsing/parser.mly" +# 2299 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -14949,34 +14919,34 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 14953 "parsing/parser.ml" +# 14923 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 14959 "parsing/parser.ml" +# 14929 "parsing/parser.ml" in let op = let _1 = -# 3836 "parsing/parser.mly" +# 4007 "parsing/parser.mly" (">") -# 14966 "parsing/parser.ml" +# 14936 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1011 "parsing/parser.mly" +# 999 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 14974 "parsing/parser.ml" +# 14944 "parsing/parser.ml" in -# 2506 "parsing/parser.mly" +# 2493 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 14980 "parsing/parser.ml" +# 14950 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in @@ -14984,15 +14954,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 14990 "parsing/parser.ml" +# 14960 "parsing/parser.ml" in ( -# 2426 "parsing/parser.mly" +# 2412 "parsing/parser.mly" ( _1 ) -# 14996 "parsing/parser.ml" +# 14966 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -15035,35 +15005,35 @@ module Tables = struct let e2 = let _1 = _1_inlined1 in let _1 = -# 2309 "parsing/parser.mly" +# 2297 "parsing/parser.mly" ( _1 ) -# 15041 "parsing/parser.ml" +# 15011 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 15046 "parsing/parser.ml" +# 15016 "parsing/parser.ml" in let op = let _1 = -# 3837 "parsing/parser.mly" +# 4008 "parsing/parser.mly" ("or") -# 15053 "parsing/parser.ml" +# 15023 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1011 "parsing/parser.mly" +# 999 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 15061 "parsing/parser.ml" +# 15031 "parsing/parser.ml" in -# 2506 "parsing/parser.mly" +# 2493 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 15067 "parsing/parser.ml" +# 15037 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_e1_) in @@ -15071,15 +15041,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 15077 "parsing/parser.ml" +# 15047 "parsing/parser.ml" in ( -# 2426 "parsing/parser.mly" +# 2412 "parsing/parser.mly" ( _1 ) -# 15083 "parsing/parser.ml" +# 15053 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -15148,18 +15118,18 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 15152 "parsing/parser.ml" +# 15122 "parsing/parser.ml" in -# 1200 "parsing/parser.mly" +# 1188 "parsing/parser.mly" ( xs ) -# 15157 "parsing/parser.ml" +# 15127 "parsing/parser.ml" in -# 2798 "parsing/parser.mly" +# 2783 "parsing/parser.mly" ( xs ) -# 15163 "parsing/parser.ml" +# 15133 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -15168,22 +15138,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 15174 "parsing/parser.ml" +# 15144 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 15180 "parsing/parser.ml" +# 15150 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2311 "parsing/parser.mly" +# 2299 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -15196,34 +15166,34 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 15200 "parsing/parser.ml" +# 15170 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 15206 "parsing/parser.ml" +# 15176 "parsing/parser.ml" in let op = let _1 = -# 3837 "parsing/parser.mly" +# 4008 "parsing/parser.mly" ("or") -# 15213 "parsing/parser.ml" +# 15183 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1011 "parsing/parser.mly" +# 999 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 15221 "parsing/parser.ml" +# 15191 "parsing/parser.ml" in -# 2506 "parsing/parser.mly" +# 2493 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 15227 "parsing/parser.ml" +# 15197 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in @@ -15231,15 +15201,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 15237 "parsing/parser.ml" +# 15207 "parsing/parser.ml" in ( -# 2426 "parsing/parser.mly" +# 2412 "parsing/parser.mly" ( _1 ) -# 15243 "parsing/parser.ml" +# 15213 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -15282,35 +15252,35 @@ module Tables = struct let e2 = let _1 = _1_inlined1 in let _1 = -# 2309 "parsing/parser.mly" +# 2297 "parsing/parser.mly" ( _1 ) -# 15288 "parsing/parser.ml" +# 15258 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 15293 "parsing/parser.ml" +# 15263 "parsing/parser.ml" in let op = let _1 = -# 3838 "parsing/parser.mly" +# 4009 "parsing/parser.mly" ("||") -# 15300 "parsing/parser.ml" +# 15270 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1011 "parsing/parser.mly" +# 999 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 15308 "parsing/parser.ml" +# 15278 "parsing/parser.ml" in -# 2506 "parsing/parser.mly" +# 2493 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 15314 "parsing/parser.ml" +# 15284 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_e1_) in @@ -15318,15 +15288,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 15324 "parsing/parser.ml" +# 15294 "parsing/parser.ml" in ( -# 2426 "parsing/parser.mly" +# 2412 "parsing/parser.mly" ( _1 ) -# 15330 "parsing/parser.ml" +# 15300 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -15395,18 +15365,18 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 15399 "parsing/parser.ml" +# 15369 "parsing/parser.ml" in -# 1200 "parsing/parser.mly" +# 1188 "parsing/parser.mly" ( xs ) -# 15404 "parsing/parser.ml" +# 15374 "parsing/parser.ml" in -# 2798 "parsing/parser.mly" +# 2783 "parsing/parser.mly" ( xs ) -# 15410 "parsing/parser.ml" +# 15380 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -15415,22 +15385,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 15421 "parsing/parser.ml" +# 15391 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 15427 "parsing/parser.ml" +# 15397 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2311 "parsing/parser.mly" +# 2299 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -15443,34 +15413,34 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 15447 "parsing/parser.ml" +# 15417 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 15453 "parsing/parser.ml" +# 15423 "parsing/parser.ml" in let op = let _1 = -# 3838 "parsing/parser.mly" +# 4009 "parsing/parser.mly" ("||") -# 15460 "parsing/parser.ml" +# 15430 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1011 "parsing/parser.mly" +# 999 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 15468 "parsing/parser.ml" +# 15438 "parsing/parser.ml" in -# 2506 "parsing/parser.mly" +# 2493 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 15474 "parsing/parser.ml" +# 15444 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in @@ -15478,15 +15448,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 15484 "parsing/parser.ml" +# 15454 "parsing/parser.ml" in ( -# 2426 "parsing/parser.mly" +# 2412 "parsing/parser.mly" ( _1 ) -# 15490 "parsing/parser.ml" +# 15460 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -15529,35 +15499,35 @@ module Tables = struct let e2 = let _1 = _1_inlined1 in let _1 = -# 2309 "parsing/parser.mly" +# 2297 "parsing/parser.mly" ( _1 ) -# 15535 "parsing/parser.ml" +# 15505 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 15540 "parsing/parser.ml" +# 15510 "parsing/parser.ml" in let op = let _1 = -# 3839 "parsing/parser.mly" +# 4010 "parsing/parser.mly" ("&") -# 15547 "parsing/parser.ml" +# 15517 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1011 "parsing/parser.mly" +# 999 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 15555 "parsing/parser.ml" +# 15525 "parsing/parser.ml" in -# 2506 "parsing/parser.mly" +# 2493 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 15561 "parsing/parser.ml" +# 15531 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_e1_) in @@ -15565,15 +15535,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 15571 "parsing/parser.ml" +# 15541 "parsing/parser.ml" in ( -# 2426 "parsing/parser.mly" +# 2412 "parsing/parser.mly" ( _1 ) -# 15577 "parsing/parser.ml" +# 15547 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -15642,18 +15612,18 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 15646 "parsing/parser.ml" +# 15616 "parsing/parser.ml" in -# 1200 "parsing/parser.mly" +# 1188 "parsing/parser.mly" ( xs ) -# 15651 "parsing/parser.ml" +# 15621 "parsing/parser.ml" in -# 2798 "parsing/parser.mly" +# 2783 "parsing/parser.mly" ( xs ) -# 15657 "parsing/parser.ml" +# 15627 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -15662,22 +15632,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 15668 "parsing/parser.ml" +# 15638 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 15674 "parsing/parser.ml" +# 15644 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2311 "parsing/parser.mly" +# 2299 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -15690,34 +15660,34 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 15694 "parsing/parser.ml" +# 15664 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 15700 "parsing/parser.ml" +# 15670 "parsing/parser.ml" in let op = let _1 = -# 3839 "parsing/parser.mly" +# 4010 "parsing/parser.mly" ("&") -# 15707 "parsing/parser.ml" +# 15677 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1011 "parsing/parser.mly" +# 999 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 15715 "parsing/parser.ml" +# 15685 "parsing/parser.ml" in -# 2506 "parsing/parser.mly" +# 2493 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 15721 "parsing/parser.ml" +# 15691 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in @@ -15725,15 +15695,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 15731 "parsing/parser.ml" +# 15701 "parsing/parser.ml" in ( -# 2426 "parsing/parser.mly" +# 2412 "parsing/parser.mly" ( _1 ) -# 15737 "parsing/parser.ml" +# 15707 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -15776,35 +15746,35 @@ module Tables = struct let e2 = let _1 = _1_inlined1 in let _1 = -# 2309 "parsing/parser.mly" +# 2297 "parsing/parser.mly" ( _1 ) -# 15782 "parsing/parser.ml" +# 15752 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 15787 "parsing/parser.ml" +# 15757 "parsing/parser.ml" in let op = let _1 = -# 3840 "parsing/parser.mly" +# 4011 "parsing/parser.mly" ("&&") -# 15794 "parsing/parser.ml" +# 15764 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1011 "parsing/parser.mly" +# 999 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 15802 "parsing/parser.ml" +# 15772 "parsing/parser.ml" in -# 2506 "parsing/parser.mly" +# 2493 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 15808 "parsing/parser.ml" +# 15778 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_e1_) in @@ -15812,15 +15782,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 15818 "parsing/parser.ml" +# 15788 "parsing/parser.ml" in ( -# 2426 "parsing/parser.mly" +# 2412 "parsing/parser.mly" ( _1 ) -# 15824 "parsing/parser.ml" +# 15794 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -15889,18 +15859,18 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 15893 "parsing/parser.ml" +# 15863 "parsing/parser.ml" in -# 1200 "parsing/parser.mly" +# 1188 "parsing/parser.mly" ( xs ) -# 15898 "parsing/parser.ml" +# 15868 "parsing/parser.ml" in -# 2798 "parsing/parser.mly" +# 2783 "parsing/parser.mly" ( xs ) -# 15904 "parsing/parser.ml" +# 15874 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -15909,22 +15879,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 15915 "parsing/parser.ml" +# 15885 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 15921 "parsing/parser.ml" +# 15891 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2311 "parsing/parser.mly" +# 2299 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -15937,34 +15907,34 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 15941 "parsing/parser.ml" +# 15911 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 15947 "parsing/parser.ml" +# 15917 "parsing/parser.ml" in let op = let _1 = -# 3840 "parsing/parser.mly" +# 4011 "parsing/parser.mly" ("&&") -# 15954 "parsing/parser.ml" +# 15924 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1011 "parsing/parser.mly" +# 999 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 15962 "parsing/parser.ml" +# 15932 "parsing/parser.ml" in -# 2506 "parsing/parser.mly" +# 2493 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 15968 "parsing/parser.ml" +# 15938 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in @@ -15972,15 +15942,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 15978 "parsing/parser.ml" +# 15948 "parsing/parser.ml" in ( -# 2426 "parsing/parser.mly" +# 2412 "parsing/parser.mly" ( _1 ) -# 15984 "parsing/parser.ml" +# 15954 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -16023,35 +15993,35 @@ module Tables = struct let e2 = let _1 = _1_inlined1 in let _1 = -# 2309 "parsing/parser.mly" +# 2297 "parsing/parser.mly" ( _1 ) -# 16029 "parsing/parser.ml" +# 15999 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 16034 "parsing/parser.ml" +# 16004 "parsing/parser.ml" in let op = let _1 = -# 3841 "parsing/parser.mly" +# 4012 "parsing/parser.mly" (":=") -# 16041 "parsing/parser.ml" +# 16011 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1011 "parsing/parser.mly" +# 999 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 16049 "parsing/parser.ml" +# 16019 "parsing/parser.ml" in -# 2506 "parsing/parser.mly" +# 2493 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 16055 "parsing/parser.ml" +# 16025 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_e1_) in @@ -16059,15 +16029,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 16065 "parsing/parser.ml" +# 16035 "parsing/parser.ml" in ( -# 2426 "parsing/parser.mly" +# 2412 "parsing/parser.mly" ( _1 ) -# 16071 "parsing/parser.ml" +# 16041 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -16136,18 +16106,18 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 16140 "parsing/parser.ml" +# 16110 "parsing/parser.ml" in -# 1200 "parsing/parser.mly" +# 1188 "parsing/parser.mly" ( xs ) -# 16145 "parsing/parser.ml" +# 16115 "parsing/parser.ml" in -# 2798 "parsing/parser.mly" +# 2783 "parsing/parser.mly" ( xs ) -# 16151 "parsing/parser.ml" +# 16121 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -16156,22 +16126,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 16162 "parsing/parser.ml" +# 16132 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 16168 "parsing/parser.ml" +# 16138 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2311 "parsing/parser.mly" +# 2299 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -16184,34 +16154,34 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 16188 "parsing/parser.ml" +# 16158 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 16194 "parsing/parser.ml" +# 16164 "parsing/parser.ml" in let op = let _1 = -# 3841 "parsing/parser.mly" +# 4012 "parsing/parser.mly" (":=") -# 16201 "parsing/parser.ml" +# 16171 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1011 "parsing/parser.mly" +# 999 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 16209 "parsing/parser.ml" +# 16179 "parsing/parser.ml" in -# 2506 "parsing/parser.mly" +# 2493 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 16215 "parsing/parser.ml" +# 16185 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in @@ -16219,15 +16189,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 16225 "parsing/parser.ml" +# 16195 "parsing/parser.ml" in ( -# 2426 "parsing/parser.mly" +# 2412 "parsing/parser.mly" ( _1 ) -# 16231 "parsing/parser.ml" +# 16201 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -16263,14 +16233,14 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in let _1 = -# 2309 "parsing/parser.mly" +# 2297 "parsing/parser.mly" ( _1 ) -# 16269 "parsing/parser.ml" +# 16239 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 16274 "parsing/parser.ml" +# 16244 "parsing/parser.ml" in let _endpos__2_ = _endpos__1_inlined1_ in @@ -16279,9 +16249,9 @@ module Tables = struct let _loc__1_ = (_startpos__1_, _endpos__1_) in let _sloc = (_symbolstartpos, _endpos) in -# 2508 "parsing/parser.mly" +# 2495 "parsing/parser.mly" ( mkuminus ~sloc:_sloc ~oploc:_loc__1_ _1 _2 ) -# 16285 "parsing/parser.ml" +# 16255 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined1_ in @@ -16289,15 +16259,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 16295 "parsing/parser.ml" +# 16265 "parsing/parser.ml" in ( -# 2426 "parsing/parser.mly" +# 2412 "parsing/parser.mly" ( _1 ) -# 16301 "parsing/parser.ml" +# 16271 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -16359,18 +16329,18 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 16363 "parsing/parser.ml" +# 16333 "parsing/parser.ml" in -# 1200 "parsing/parser.mly" +# 1188 "parsing/parser.mly" ( xs ) -# 16368 "parsing/parser.ml" +# 16338 "parsing/parser.ml" in -# 2798 "parsing/parser.mly" +# 2783 "parsing/parser.mly" ( xs ) -# 16374 "parsing/parser.ml" +# 16344 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -16379,22 +16349,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 16385 "parsing/parser.ml" +# 16355 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 16391 "parsing/parser.ml" +# 16361 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2311 "parsing/parser.mly" +# 2299 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -16407,13 +16377,13 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 16411 "parsing/parser.ml" +# 16381 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 16417 "parsing/parser.ml" +# 16387 "parsing/parser.ml" in let _endpos__2_ = _endpos_xs_ in @@ -16422,9 +16392,9 @@ module Tables = struct let _loc__1_ = (_startpos__1_, _endpos__1_) in let _sloc = (_symbolstartpos, _endpos) in -# 2508 "parsing/parser.mly" +# 2495 "parsing/parser.mly" ( mkuminus ~sloc:_sloc ~oploc:_loc__1_ _1 _2 ) -# 16428 "parsing/parser.ml" +# 16398 "parsing/parser.ml" in let _endpos__1_ = _endpos_xs_ in @@ -16432,15 +16402,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 16438 "parsing/parser.ml" +# 16408 "parsing/parser.ml" in ( -# 2426 "parsing/parser.mly" +# 2412 "parsing/parser.mly" ( _1 ) -# 16444 "parsing/parser.ml" +# 16414 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -16476,14 +16446,14 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in let _1 = -# 2309 "parsing/parser.mly" +# 2297 "parsing/parser.mly" ( _1 ) -# 16482 "parsing/parser.ml" +# 16452 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 16487 "parsing/parser.ml" +# 16457 "parsing/parser.ml" in let _endpos__2_ = _endpos__1_inlined1_ in @@ -16492,9 +16462,9 @@ module Tables = struct let _loc__1_ = (_startpos__1_, _endpos__1_) in let _sloc = (_symbolstartpos, _endpos) in -# 2510 "parsing/parser.mly" +# 2497 "parsing/parser.mly" ( mkuplus ~sloc:_sloc ~oploc:_loc__1_ _1 _2 ) -# 16498 "parsing/parser.ml" +# 16468 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined1_ in @@ -16502,15 +16472,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 16508 "parsing/parser.ml" +# 16478 "parsing/parser.ml" in ( -# 2426 "parsing/parser.mly" +# 2412 "parsing/parser.mly" ( _1 ) -# 16514 "parsing/parser.ml" +# 16484 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -16572,18 +16542,18 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 16576 "parsing/parser.ml" +# 16546 "parsing/parser.ml" in -# 1200 "parsing/parser.mly" +# 1188 "parsing/parser.mly" ( xs ) -# 16581 "parsing/parser.ml" +# 16551 "parsing/parser.ml" in -# 2798 "parsing/parser.mly" +# 2783 "parsing/parser.mly" ( xs ) -# 16587 "parsing/parser.ml" +# 16557 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -16592,22 +16562,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 16598 "parsing/parser.ml" +# 16568 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 16604 "parsing/parser.ml" +# 16574 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2311 "parsing/parser.mly" +# 2299 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -16620,13 +16590,13 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 16624 "parsing/parser.ml" +# 16594 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 16630 "parsing/parser.ml" +# 16600 "parsing/parser.ml" in let _endpos__2_ = _endpos_xs_ in @@ -16635,9 +16605,9 @@ module Tables = struct let _loc__1_ = (_startpos__1_, _endpos__1_) in let _sloc = (_symbolstartpos, _endpos) in -# 2510 "parsing/parser.mly" +# 2497 "parsing/parser.mly" ( mkuplus ~sloc:_sloc ~oploc:_loc__1_ _1 _2 ) -# 16641 "parsing/parser.ml" +# 16611 "parsing/parser.ml" in let _endpos__1_ = _endpos_xs_ in @@ -16645,15 +16615,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 16651 "parsing/parser.ml" +# 16621 "parsing/parser.ml" in ( -# 2426 "parsing/parser.mly" +# 2412 "parsing/parser.mly" ( _1 ) -# 16657 "parsing/parser.ml" +# 16627 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -16695,9 +16665,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2428 "parsing/parser.mly" +# 2414 "parsing/parser.mly" ( expr_of_let_bindings ~loc:_sloc _1 _3 ) -# 16701 "parsing/parser.ml" +# 16671 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -16738,9 +16708,9 @@ module Tables = struct let _3 : unit = Obj.magic _3 in let bindings : (Parsetree.pattern * Parsetree.expression * Parsetree.binding_op list) = Obj.magic bindings in let _1 : ( -# 779 "parsing/parser.mly" +# 767 "parsing/parser.mly" (string) -# 16744 "parsing/parser.ml" +# 16714 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -16751,9 +16721,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 16757 "parsing/parser.ml" +# 16727 "parsing/parser.ml" in let _startpos_pbop_op_ = _startpos__1_ in @@ -16761,13 +16731,13 @@ module Tables = struct let _symbolstartpos = _startpos_pbop_op_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2430 "parsing/parser.mly" +# 2416 "parsing/parser.mly" ( let (pbop_pat, pbop_exp, rev_ands) = bindings in let ands = List.rev rev_ands in let pbop_loc = make_loc _sloc in let let_ = {pbop_op; pbop_pat; pbop_exp; pbop_loc} in mkexp ~loc:_sloc (Pexp_letop{ let_; ands; body}) ) -# 16771 "parsing/parser.ml" +# 16741 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -16808,14 +16778,14 @@ module Tables = struct let _3 = let _1 = _1_inlined1 in let _1 = -# 2309 "parsing/parser.mly" +# 2297 "parsing/parser.mly" ( _1 ) -# 16814 "parsing/parser.ml" +# 16784 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 16819 "parsing/parser.ml" +# 16789 "parsing/parser.ml" in let _endpos__3_ = _endpos__1_inlined1_ in @@ -16824,9 +16794,10 @@ module Tables = struct let _loc__2_ = (_startpos__2_, _endpos__2_) in let _sloc = (_symbolstartpos, _endpos) in ( -# 2436 "parsing/parser.mly" - ( mkexp_cons ~loc:_sloc _loc__2_ (ghexp ~loc:_sloc (Pexp_tuple[_1;_3])) ) -# 16830 "parsing/parser.ml" +# 2422 "parsing/parser.mly" + ( mkexp_cons ~loc:_sloc _loc__2_ + (ghexp ~loc:_sloc (Pexp_tuple[None,_1;None,_3])) ) +# 16801 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -16893,18 +16864,18 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 16897 "parsing/parser.ml" +# 16868 "parsing/parser.ml" in -# 1200 "parsing/parser.mly" +# 1188 "parsing/parser.mly" ( xs ) -# 16902 "parsing/parser.ml" +# 16873 "parsing/parser.ml" in -# 2798 "parsing/parser.mly" +# 2783 "parsing/parser.mly" ( xs ) -# 16908 "parsing/parser.ml" +# 16879 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -16913,22 +16884,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 16919 "parsing/parser.ml" +# 16890 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 16925 "parsing/parser.ml" +# 16896 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2311 "parsing/parser.mly" +# 2299 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -16941,13 +16912,13 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 16945 "parsing/parser.ml" +# 16916 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 16951 "parsing/parser.ml" +# 16922 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -16956,9 +16927,10 @@ module Tables = struct let _loc__2_ = (_startpos__2_, _endpos__2_) in let _sloc = (_symbolstartpos, _endpos) in ( -# 2436 "parsing/parser.mly" - ( mkexp_cons ~loc:_sloc _loc__2_ (ghexp ~loc:_sloc (Pexp_tuple[_1;_3])) ) -# 16962 "parsing/parser.ml" +# 2422 "parsing/parser.mly" + ( mkexp_cons ~loc:_sloc _loc__2_ + (ghexp ~loc:_sloc (Pexp_tuple[None,_1;None,_3])) ) +# 16934 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -16992,9 +16964,9 @@ module Tables = struct let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in let _2 : unit = Obj.magic _2 in let _1 : ( -# 797 "parsing/parser.mly" +# 785 "parsing/parser.mly" (string) -# 16998 "parsing/parser.ml" +# 16970 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -17003,39 +16975,39 @@ module Tables = struct let _3 = let _1 = _1_inlined1 in let _1 = -# 2309 "parsing/parser.mly" +# 2297 "parsing/parser.mly" ( _1 ) -# 17009 "parsing/parser.ml" +# 16981 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 17014 "parsing/parser.ml" +# 16986 "parsing/parser.ml" in let _endpos__3_ = _endpos__1_inlined1_ in let _1 = let _1 = -# 3765 "parsing/parser.mly" +# 3936 "parsing/parser.mly" ( _1 ) -# 17022 "parsing/parser.ml" +# 16994 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 17030 "parsing/parser.ml" +# 17002 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2438 "parsing/parser.mly" +# 2425 "parsing/parser.mly" ( mkexp ~loc:_sloc (Pexp_setinstvar(_1, _3)) ) -# 17039 "parsing/parser.ml" +# 17011 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -17090,9 +17062,9 @@ module Tables = struct let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _2 : unit = Obj.magic _2 in let _1 : ( -# 797 "parsing/parser.mly" +# 785 "parsing/parser.mly" (string) -# 17096 "parsing/parser.ml" +# 17068 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -17106,18 +17078,18 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 17110 "parsing/parser.ml" +# 17082 "parsing/parser.ml" in -# 1200 "parsing/parser.mly" +# 1188 "parsing/parser.mly" ( xs ) -# 17115 "parsing/parser.ml" +# 17087 "parsing/parser.ml" in -# 2798 "parsing/parser.mly" +# 2783 "parsing/parser.mly" ( xs ) -# 17121 "parsing/parser.ml" +# 17093 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -17126,22 +17098,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 17132 "parsing/parser.ml" +# 17104 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 17138 "parsing/parser.ml" +# 17110 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2311 "parsing/parser.mly" +# 2299 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -17154,38 +17126,38 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 17158 "parsing/parser.ml" +# 17130 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 17164 "parsing/parser.ml" +# 17136 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in let _1 = let _1 = -# 3765 "parsing/parser.mly" +# 3936 "parsing/parser.mly" ( _1 ) -# 17172 "parsing/parser.ml" +# 17144 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 17180 "parsing/parser.ml" +# 17152 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2438 "parsing/parser.mly" +# 2425 "parsing/parser.mly" ( mkexp ~loc:_sloc (Pexp_setinstvar(_1, _3)) ) -# 17189 "parsing/parser.ml" +# 17161 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -17240,14 +17212,14 @@ module Tables = struct let _5 = let _1 = _1_inlined2 in let _1 = -# 2309 "parsing/parser.mly" +# 2297 "parsing/parser.mly" ( _1 ) -# 17246 "parsing/parser.ml" +# 17218 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 17251 "parsing/parser.ml" +# 17223 "parsing/parser.ml" in let _endpos__5_ = _endpos__1_inlined2_ in @@ -17257,18 +17229,18 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 17263 "parsing/parser.ml" +# 17235 "parsing/parser.ml" in let _endpos = _endpos__5_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2440 "parsing/parser.mly" +# 2427 "parsing/parser.mly" ( mkexp ~loc:_sloc (Pexp_setfield(_1, _3, _5)) ) -# 17272 "parsing/parser.ml" +# 17244 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -17349,18 +17321,18 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 17353 "parsing/parser.ml" +# 17325 "parsing/parser.ml" in -# 1200 "parsing/parser.mly" +# 1188 "parsing/parser.mly" ( xs ) -# 17358 "parsing/parser.ml" +# 17330 "parsing/parser.ml" in -# 2798 "parsing/parser.mly" +# 2783 "parsing/parser.mly" ( xs ) -# 17364 "parsing/parser.ml" +# 17336 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -17369,22 +17341,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 17375 "parsing/parser.ml" +# 17347 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 17381 "parsing/parser.ml" +# 17353 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2311 "parsing/parser.mly" +# 2299 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -17397,13 +17369,13 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 17401 "parsing/parser.ml" +# 17373 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 17407 "parsing/parser.ml" +# 17379 "parsing/parser.ml" in let _endpos__5_ = _endpos_xs_ in @@ -17413,18 +17385,18 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 17419 "parsing/parser.ml" +# 17391 "parsing/parser.ml" in let _endpos = _endpos__5_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2440 "parsing/parser.mly" +# 2427 "parsing/parser.mly" ( mkexp ~loc:_sloc (Pexp_setfield(_1, _3, _5)) ) -# 17428 "parsing/parser.ml" +# 17400 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -17495,26 +17467,26 @@ module Tables = struct let v = let _1 = _1_inlined1 in let _1 = -# 2309 "parsing/parser.mly" +# 2297 "parsing/parser.mly" ( _1 ) -# 17501 "parsing/parser.ml" +# 17473 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 17506 "parsing/parser.ml" +# 17478 "parsing/parser.ml" in -# 2441 "parsing/parser.mly" +# 2428 "parsing/parser.mly" (Some v) -# 17512 "parsing/parser.ml" +# 17484 "parsing/parser.ml" in -# 2401 "parsing/parser.mly" +# 2387 "parsing/parser.mly" ( array, d, Paren, i, r ) -# 17518 "parsing/parser.ml" +# 17490 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_array_) in @@ -17522,9 +17494,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2442 "parsing/parser.mly" +# 2429 "parsing/parser.mly" ( mk_indexop_expr builtin_indexing_operators ~loc:_sloc _1 ) -# 17528 "parsing/parser.ml" +# 17500 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -17621,18 +17593,18 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 17625 "parsing/parser.ml" +# 17597 "parsing/parser.ml" in -# 1200 "parsing/parser.mly" +# 1188 "parsing/parser.mly" ( xs ) -# 17630 "parsing/parser.ml" +# 17602 "parsing/parser.ml" in -# 2798 "parsing/parser.mly" +# 2783 "parsing/parser.mly" ( xs ) -# 17636 "parsing/parser.ml" +# 17608 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -17641,22 +17613,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 17647 "parsing/parser.ml" +# 17619 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 17653 "parsing/parser.ml" +# 17625 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2311 "parsing/parser.mly" +# 2299 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -17669,25 +17641,25 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 17673 "parsing/parser.ml" +# 17645 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 17679 "parsing/parser.ml" +# 17651 "parsing/parser.ml" in -# 2441 "parsing/parser.mly" +# 2428 "parsing/parser.mly" (Some v) -# 17685 "parsing/parser.ml" +# 17657 "parsing/parser.ml" in -# 2401 "parsing/parser.mly" +# 2387 "parsing/parser.mly" ( array, d, Paren, i, r ) -# 17691 "parsing/parser.ml" +# 17663 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_array_) in @@ -17695,9 +17667,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2442 "parsing/parser.mly" +# 2429 "parsing/parser.mly" ( mk_indexop_expr builtin_indexing_operators ~loc:_sloc _1 ) -# 17701 "parsing/parser.ml" +# 17673 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -17768,26 +17740,26 @@ module Tables = struct let v = let _1 = _1_inlined1 in let _1 = -# 2309 "parsing/parser.mly" +# 2297 "parsing/parser.mly" ( _1 ) -# 17774 "parsing/parser.ml" +# 17746 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 17779 "parsing/parser.ml" +# 17751 "parsing/parser.ml" in -# 2441 "parsing/parser.mly" +# 2428 "parsing/parser.mly" (Some v) -# 17785 "parsing/parser.ml" +# 17757 "parsing/parser.ml" in -# 2403 "parsing/parser.mly" +# 2389 "parsing/parser.mly" ( array, d, Brace, i, r ) -# 17791 "parsing/parser.ml" +# 17763 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_array_) in @@ -17795,9 +17767,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2442 "parsing/parser.mly" +# 2429 "parsing/parser.mly" ( mk_indexop_expr builtin_indexing_operators ~loc:_sloc _1 ) -# 17801 "parsing/parser.ml" +# 17773 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -17894,18 +17866,18 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 17898 "parsing/parser.ml" +# 17870 "parsing/parser.ml" in -# 1200 "parsing/parser.mly" +# 1188 "parsing/parser.mly" ( xs ) -# 17903 "parsing/parser.ml" +# 17875 "parsing/parser.ml" in -# 2798 "parsing/parser.mly" +# 2783 "parsing/parser.mly" ( xs ) -# 17909 "parsing/parser.ml" +# 17881 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -17914,22 +17886,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 17920 "parsing/parser.ml" +# 17892 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 17926 "parsing/parser.ml" +# 17898 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2311 "parsing/parser.mly" +# 2299 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -17942,25 +17914,25 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 17946 "parsing/parser.ml" +# 17918 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 17952 "parsing/parser.ml" +# 17924 "parsing/parser.ml" in -# 2441 "parsing/parser.mly" +# 2428 "parsing/parser.mly" (Some v) -# 17958 "parsing/parser.ml" +# 17930 "parsing/parser.ml" in -# 2403 "parsing/parser.mly" +# 2389 "parsing/parser.mly" ( array, d, Brace, i, r ) -# 17964 "parsing/parser.ml" +# 17936 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_array_) in @@ -17968,9 +17940,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2442 "parsing/parser.mly" +# 2429 "parsing/parser.mly" ( mk_indexop_expr builtin_indexing_operators ~loc:_sloc _1 ) -# 17974 "parsing/parser.ml" +# 17946 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -18041,26 +18013,26 @@ module Tables = struct let v = let _1 = _1_inlined1 in let _1 = -# 2309 "parsing/parser.mly" +# 2297 "parsing/parser.mly" ( _1 ) -# 18047 "parsing/parser.ml" +# 18019 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 18052 "parsing/parser.ml" +# 18024 "parsing/parser.ml" in -# 2441 "parsing/parser.mly" +# 2428 "parsing/parser.mly" (Some v) -# 18058 "parsing/parser.ml" +# 18030 "parsing/parser.ml" in -# 2405 "parsing/parser.mly" +# 2391 "parsing/parser.mly" ( array, d, Bracket, i, r ) -# 18064 "parsing/parser.ml" +# 18036 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_array_) in @@ -18068,9 +18040,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2442 "parsing/parser.mly" +# 2429 "parsing/parser.mly" ( mk_indexop_expr builtin_indexing_operators ~loc:_sloc _1 ) -# 18074 "parsing/parser.ml" +# 18046 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -18167,18 +18139,18 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 18171 "parsing/parser.ml" +# 18143 "parsing/parser.ml" in -# 1200 "parsing/parser.mly" +# 1188 "parsing/parser.mly" ( xs ) -# 18176 "parsing/parser.ml" +# 18148 "parsing/parser.ml" in -# 2798 "parsing/parser.mly" +# 2783 "parsing/parser.mly" ( xs ) -# 18182 "parsing/parser.ml" +# 18154 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -18187,22 +18159,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 18193 "parsing/parser.ml" +# 18165 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 18199 "parsing/parser.ml" +# 18171 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2311 "parsing/parser.mly" +# 2299 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -18215,25 +18187,25 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 18219 "parsing/parser.ml" +# 18191 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 18225 "parsing/parser.ml" +# 18197 "parsing/parser.ml" in -# 2441 "parsing/parser.mly" +# 2428 "parsing/parser.mly" (Some v) -# 18231 "parsing/parser.ml" +# 18203 "parsing/parser.ml" in -# 2405 "parsing/parser.mly" +# 2391 "parsing/parser.mly" ( array, d, Bracket, i, r ) -# 18237 "parsing/parser.ml" +# 18209 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_array_) in @@ -18241,9 +18213,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2442 "parsing/parser.mly" +# 2429 "parsing/parser.mly" ( mk_indexop_expr builtin_indexing_operators ~loc:_sloc _1 ) -# 18247 "parsing/parser.ml" +# 18219 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -18304,9 +18276,9 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _3 : unit = Obj.magic _3 in let _2 : ( -# 778 "parsing/parser.mly" +# 766 "parsing/parser.mly" (string) -# 18310 "parsing/parser.ml" +# 18282 "parsing/parser.ml" ) = Obj.magic _2 in let array : (Parsetree.expression) = Obj.magic array in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -18318,43 +18290,43 @@ module Tables = struct let v = let _1 = _1_inlined1 in let _1 = -# 2309 "parsing/parser.mly" +# 2297 "parsing/parser.mly" ( _1 ) -# 18324 "parsing/parser.ml" +# 18296 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 18329 "parsing/parser.ml" +# 18301 "parsing/parser.ml" in -# 2443 "parsing/parser.mly" +# 2430 "parsing/parser.mly" (Some v) -# 18335 "parsing/parser.ml" +# 18307 "parsing/parser.ml" in let i = -# 2873 "parsing/parser.mly" +# 2933 "parsing/parser.mly" ( es ) -# 18341 "parsing/parser.ml" +# 18313 "parsing/parser.ml" in let d = let _1 = # 123 "" ( None ) -# 18347 "parsing/parser.ml" +# 18319 "parsing/parser.ml" in -# 2417 "parsing/parser.mly" +# 2403 "parsing/parser.mly" ( _1, _2 ) -# 18352 "parsing/parser.ml" +# 18324 "parsing/parser.ml" in -# 2401 "parsing/parser.mly" +# 2387 "parsing/parser.mly" ( array, d, Paren, i, r ) -# 18358 "parsing/parser.ml" +# 18330 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_array_) in @@ -18362,9 +18334,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2444 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) -# 18368 "parsing/parser.ml" +# 18340 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -18446,9 +18418,9 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _3 : unit = Obj.magic _3 in let _2 : ( -# 778 "parsing/parser.mly" +# 766 "parsing/parser.mly" (string) -# 18452 "parsing/parser.ml" +# 18424 "parsing/parser.ml" ) = Obj.magic _2 in let array : (Parsetree.expression) = Obj.magic array in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -18465,18 +18437,18 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 18469 "parsing/parser.ml" +# 18441 "parsing/parser.ml" in -# 1200 "parsing/parser.mly" +# 1188 "parsing/parser.mly" ( xs ) -# 18474 "parsing/parser.ml" +# 18446 "parsing/parser.ml" in -# 2798 "parsing/parser.mly" +# 2783 "parsing/parser.mly" ( xs ) -# 18480 "parsing/parser.ml" +# 18452 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -18485,22 +18457,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 18491 "parsing/parser.ml" +# 18463 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 18497 "parsing/parser.ml" +# 18469 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2311 "parsing/parser.mly" +# 2299 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -18513,42 +18485,42 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 18517 "parsing/parser.ml" +# 18489 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 18523 "parsing/parser.ml" +# 18495 "parsing/parser.ml" in -# 2443 "parsing/parser.mly" +# 2430 "parsing/parser.mly" (Some v) -# 18529 "parsing/parser.ml" +# 18501 "parsing/parser.ml" in let i = -# 2873 "parsing/parser.mly" +# 2933 "parsing/parser.mly" ( es ) -# 18535 "parsing/parser.ml" +# 18507 "parsing/parser.ml" in let d = let _1 = # 123 "" ( None ) -# 18541 "parsing/parser.ml" +# 18513 "parsing/parser.ml" in -# 2417 "parsing/parser.mly" +# 2403 "parsing/parser.mly" ( _1, _2 ) -# 18546 "parsing/parser.ml" +# 18518 "parsing/parser.ml" in -# 2401 "parsing/parser.mly" +# 2387 "parsing/parser.mly" ( array, d, Paren, i, r ) -# 18552 "parsing/parser.ml" +# 18524 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_array_) in @@ -18556,9 +18528,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2444 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) -# 18562 "parsing/parser.ml" +# 18534 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -18631,9 +18603,9 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _3 : unit = Obj.magic _3 in let _2 : ( -# 778 "parsing/parser.mly" +# 766 "parsing/parser.mly" (string) -# 18637 "parsing/parser.ml" +# 18609 "parsing/parser.ml" ) = Obj.magic _2 in let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in let _1 : unit = Obj.magic _1 in @@ -18648,51 +18620,51 @@ module Tables = struct let v = let _1 = _1_inlined1 in let _1 = -# 2309 "parsing/parser.mly" +# 2297 "parsing/parser.mly" ( _1 ) -# 18654 "parsing/parser.ml" +# 18626 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 18659 "parsing/parser.ml" +# 18631 "parsing/parser.ml" in -# 2443 "parsing/parser.mly" +# 2430 "parsing/parser.mly" (Some v) -# 18665 "parsing/parser.ml" +# 18637 "parsing/parser.ml" in let i = -# 2873 "parsing/parser.mly" +# 2933 "parsing/parser.mly" ( es ) -# 18671 "parsing/parser.ml" +# 18643 "parsing/parser.ml" in let d = let _1 = let _2 = _2_inlined1 in let x = -# 2417 "parsing/parser.mly" +# 2403 "parsing/parser.mly" (_2) -# 18679 "parsing/parser.ml" +# 18651 "parsing/parser.ml" in # 126 "" ( Some x ) -# 18684 "parsing/parser.ml" +# 18656 "parsing/parser.ml" in -# 2417 "parsing/parser.mly" +# 2403 "parsing/parser.mly" ( _1, _2 ) -# 18690 "parsing/parser.ml" +# 18662 "parsing/parser.ml" in -# 2401 "parsing/parser.mly" +# 2387 "parsing/parser.mly" ( array, d, Paren, i, r ) -# 18696 "parsing/parser.ml" +# 18668 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined2_, _startpos_array_) in @@ -18700,9 +18672,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2444 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) -# 18706 "parsing/parser.ml" +# 18678 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -18796,9 +18768,9 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _3 : unit = Obj.magic _3 in let _2 : ( -# 778 "parsing/parser.mly" +# 766 "parsing/parser.mly" (string) -# 18802 "parsing/parser.ml" +# 18774 "parsing/parser.ml" ) = Obj.magic _2 in let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in let _1 : unit = Obj.magic _1 in @@ -18818,18 +18790,18 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 18822 "parsing/parser.ml" +# 18794 "parsing/parser.ml" in -# 1200 "parsing/parser.mly" +# 1188 "parsing/parser.mly" ( xs ) -# 18827 "parsing/parser.ml" +# 18799 "parsing/parser.ml" in -# 2798 "parsing/parser.mly" +# 2783 "parsing/parser.mly" ( xs ) -# 18833 "parsing/parser.ml" +# 18805 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -18838,22 +18810,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 18844 "parsing/parser.ml" +# 18816 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 18850 "parsing/parser.ml" +# 18822 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2311 "parsing/parser.mly" +# 2299 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -18866,50 +18838,50 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 18870 "parsing/parser.ml" +# 18842 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 18876 "parsing/parser.ml" +# 18848 "parsing/parser.ml" in -# 2443 "parsing/parser.mly" +# 2430 "parsing/parser.mly" (Some v) -# 18882 "parsing/parser.ml" +# 18854 "parsing/parser.ml" in let i = -# 2873 "parsing/parser.mly" +# 2933 "parsing/parser.mly" ( es ) -# 18888 "parsing/parser.ml" +# 18860 "parsing/parser.ml" in let d = let _1 = let _2 = _2_inlined1 in let x = -# 2417 "parsing/parser.mly" +# 2403 "parsing/parser.mly" (_2) -# 18896 "parsing/parser.ml" +# 18868 "parsing/parser.ml" in # 126 "" ( Some x ) -# 18901 "parsing/parser.ml" +# 18873 "parsing/parser.ml" in -# 2417 "parsing/parser.mly" +# 2403 "parsing/parser.mly" ( _1, _2 ) -# 18907 "parsing/parser.ml" +# 18879 "parsing/parser.ml" in -# 2401 "parsing/parser.mly" +# 2387 "parsing/parser.mly" ( array, d, Paren, i, r ) -# 18913 "parsing/parser.ml" +# 18885 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_array_) in @@ -18917,9 +18889,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2444 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) -# 18923 "parsing/parser.ml" +# 18895 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -18980,9 +18952,9 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _3 : unit = Obj.magic _3 in let _2 : ( -# 778 "parsing/parser.mly" +# 766 "parsing/parser.mly" (string) -# 18986 "parsing/parser.ml" +# 18958 "parsing/parser.ml" ) = Obj.magic _2 in let array : (Parsetree.expression) = Obj.magic array in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -18994,43 +18966,43 @@ module Tables = struct let v = let _1 = _1_inlined1 in let _1 = -# 2309 "parsing/parser.mly" +# 2297 "parsing/parser.mly" ( _1 ) -# 19000 "parsing/parser.ml" +# 18972 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 19005 "parsing/parser.ml" +# 18977 "parsing/parser.ml" in -# 2443 "parsing/parser.mly" +# 2430 "parsing/parser.mly" (Some v) -# 19011 "parsing/parser.ml" +# 18983 "parsing/parser.ml" in let i = -# 2873 "parsing/parser.mly" +# 2933 "parsing/parser.mly" ( es ) -# 19017 "parsing/parser.ml" +# 18989 "parsing/parser.ml" in let d = let _1 = # 123 "" ( None ) -# 19023 "parsing/parser.ml" +# 18995 "parsing/parser.ml" in -# 2417 "parsing/parser.mly" +# 2403 "parsing/parser.mly" ( _1, _2 ) -# 19028 "parsing/parser.ml" +# 19000 "parsing/parser.ml" in -# 2403 "parsing/parser.mly" +# 2389 "parsing/parser.mly" ( array, d, Brace, i, r ) -# 19034 "parsing/parser.ml" +# 19006 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_array_) in @@ -19038,9 +19010,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2444 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) -# 19044 "parsing/parser.ml" +# 19016 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -19122,9 +19094,9 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _3 : unit = Obj.magic _3 in let _2 : ( -# 778 "parsing/parser.mly" +# 766 "parsing/parser.mly" (string) -# 19128 "parsing/parser.ml" +# 19100 "parsing/parser.ml" ) = Obj.magic _2 in let array : (Parsetree.expression) = Obj.magic array in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -19141,18 +19113,18 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 19145 "parsing/parser.ml" +# 19117 "parsing/parser.ml" in -# 1200 "parsing/parser.mly" +# 1188 "parsing/parser.mly" ( xs ) -# 19150 "parsing/parser.ml" +# 19122 "parsing/parser.ml" in -# 2798 "parsing/parser.mly" +# 2783 "parsing/parser.mly" ( xs ) -# 19156 "parsing/parser.ml" +# 19128 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -19161,22 +19133,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 19167 "parsing/parser.ml" +# 19139 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 19173 "parsing/parser.ml" +# 19145 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2311 "parsing/parser.mly" +# 2299 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -19189,42 +19161,42 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 19193 "parsing/parser.ml" +# 19165 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 19199 "parsing/parser.ml" +# 19171 "parsing/parser.ml" in -# 2443 "parsing/parser.mly" +# 2430 "parsing/parser.mly" (Some v) -# 19205 "parsing/parser.ml" +# 19177 "parsing/parser.ml" in let i = -# 2873 "parsing/parser.mly" +# 2933 "parsing/parser.mly" ( es ) -# 19211 "parsing/parser.ml" +# 19183 "parsing/parser.ml" in let d = let _1 = # 123 "" ( None ) -# 19217 "parsing/parser.ml" +# 19189 "parsing/parser.ml" in -# 2417 "parsing/parser.mly" +# 2403 "parsing/parser.mly" ( _1, _2 ) -# 19222 "parsing/parser.ml" +# 19194 "parsing/parser.ml" in -# 2403 "parsing/parser.mly" +# 2389 "parsing/parser.mly" ( array, d, Brace, i, r ) -# 19228 "parsing/parser.ml" +# 19200 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_array_) in @@ -19232,9 +19204,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2444 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) -# 19238 "parsing/parser.ml" +# 19210 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -19307,9 +19279,9 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _3 : unit = Obj.magic _3 in let _2 : ( -# 778 "parsing/parser.mly" +# 766 "parsing/parser.mly" (string) -# 19313 "parsing/parser.ml" +# 19285 "parsing/parser.ml" ) = Obj.magic _2 in let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in let _1 : unit = Obj.magic _1 in @@ -19324,51 +19296,51 @@ module Tables = struct let v = let _1 = _1_inlined1 in let _1 = -# 2309 "parsing/parser.mly" +# 2297 "parsing/parser.mly" ( _1 ) -# 19330 "parsing/parser.ml" +# 19302 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 19335 "parsing/parser.ml" +# 19307 "parsing/parser.ml" in -# 2443 "parsing/parser.mly" +# 2430 "parsing/parser.mly" (Some v) -# 19341 "parsing/parser.ml" +# 19313 "parsing/parser.ml" in let i = -# 2873 "parsing/parser.mly" +# 2933 "parsing/parser.mly" ( es ) -# 19347 "parsing/parser.ml" +# 19319 "parsing/parser.ml" in let d = let _1 = let _2 = _2_inlined1 in let x = -# 2417 "parsing/parser.mly" +# 2403 "parsing/parser.mly" (_2) -# 19355 "parsing/parser.ml" +# 19327 "parsing/parser.ml" in # 126 "" ( Some x ) -# 19360 "parsing/parser.ml" +# 19332 "parsing/parser.ml" in -# 2417 "parsing/parser.mly" +# 2403 "parsing/parser.mly" ( _1, _2 ) -# 19366 "parsing/parser.ml" +# 19338 "parsing/parser.ml" in -# 2403 "parsing/parser.mly" +# 2389 "parsing/parser.mly" ( array, d, Brace, i, r ) -# 19372 "parsing/parser.ml" +# 19344 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined2_, _startpos_array_) in @@ -19376,9 +19348,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2444 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) -# 19382 "parsing/parser.ml" +# 19354 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -19472,9 +19444,9 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _3 : unit = Obj.magic _3 in let _2 : ( -# 778 "parsing/parser.mly" +# 766 "parsing/parser.mly" (string) -# 19478 "parsing/parser.ml" +# 19450 "parsing/parser.ml" ) = Obj.magic _2 in let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in let _1 : unit = Obj.magic _1 in @@ -19494,18 +19466,18 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 19498 "parsing/parser.ml" +# 19470 "parsing/parser.ml" in -# 1200 "parsing/parser.mly" +# 1188 "parsing/parser.mly" ( xs ) -# 19503 "parsing/parser.ml" +# 19475 "parsing/parser.ml" in -# 2798 "parsing/parser.mly" +# 2783 "parsing/parser.mly" ( xs ) -# 19509 "parsing/parser.ml" +# 19481 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -19514,22 +19486,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 19520 "parsing/parser.ml" +# 19492 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 19526 "parsing/parser.ml" +# 19498 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2311 "parsing/parser.mly" +# 2299 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -19542,50 +19514,50 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 19546 "parsing/parser.ml" +# 19518 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 19552 "parsing/parser.ml" +# 19524 "parsing/parser.ml" in -# 2443 "parsing/parser.mly" +# 2430 "parsing/parser.mly" (Some v) -# 19558 "parsing/parser.ml" +# 19530 "parsing/parser.ml" in let i = -# 2873 "parsing/parser.mly" +# 2933 "parsing/parser.mly" ( es ) -# 19564 "parsing/parser.ml" +# 19536 "parsing/parser.ml" in let d = let _1 = let _2 = _2_inlined1 in let x = -# 2417 "parsing/parser.mly" +# 2403 "parsing/parser.mly" (_2) -# 19572 "parsing/parser.ml" +# 19544 "parsing/parser.ml" in # 126 "" ( Some x ) -# 19577 "parsing/parser.ml" +# 19549 "parsing/parser.ml" in -# 2417 "parsing/parser.mly" +# 2403 "parsing/parser.mly" ( _1, _2 ) -# 19583 "parsing/parser.ml" +# 19555 "parsing/parser.ml" in -# 2403 "parsing/parser.mly" +# 2389 "parsing/parser.mly" ( array, d, Brace, i, r ) -# 19589 "parsing/parser.ml" +# 19561 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_array_) in @@ -19593,9 +19565,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2444 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) -# 19599 "parsing/parser.ml" +# 19571 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -19656,9 +19628,9 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _3 : unit = Obj.magic _3 in let _2 : ( -# 778 "parsing/parser.mly" +# 766 "parsing/parser.mly" (string) -# 19662 "parsing/parser.ml" +# 19634 "parsing/parser.ml" ) = Obj.magic _2 in let array : (Parsetree.expression) = Obj.magic array in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -19670,43 +19642,43 @@ module Tables = struct let v = let _1 = _1_inlined1 in let _1 = -# 2309 "parsing/parser.mly" +# 2297 "parsing/parser.mly" ( _1 ) -# 19676 "parsing/parser.ml" +# 19648 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 19681 "parsing/parser.ml" +# 19653 "parsing/parser.ml" in -# 2443 "parsing/parser.mly" +# 2430 "parsing/parser.mly" (Some v) -# 19687 "parsing/parser.ml" +# 19659 "parsing/parser.ml" in let i = -# 2873 "parsing/parser.mly" +# 2933 "parsing/parser.mly" ( es ) -# 19693 "parsing/parser.ml" +# 19665 "parsing/parser.ml" in let d = let _1 = # 123 "" ( None ) -# 19699 "parsing/parser.ml" +# 19671 "parsing/parser.ml" in -# 2417 "parsing/parser.mly" +# 2403 "parsing/parser.mly" ( _1, _2 ) -# 19704 "parsing/parser.ml" +# 19676 "parsing/parser.ml" in -# 2405 "parsing/parser.mly" +# 2391 "parsing/parser.mly" ( array, d, Bracket, i, r ) -# 19710 "parsing/parser.ml" +# 19682 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_array_) in @@ -19714,9 +19686,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2444 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) -# 19720 "parsing/parser.ml" +# 19692 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -19798,9 +19770,9 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _3 : unit = Obj.magic _3 in let _2 : ( -# 778 "parsing/parser.mly" +# 766 "parsing/parser.mly" (string) -# 19804 "parsing/parser.ml" +# 19776 "parsing/parser.ml" ) = Obj.magic _2 in let array : (Parsetree.expression) = Obj.magic array in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -19817,18 +19789,18 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 19821 "parsing/parser.ml" +# 19793 "parsing/parser.ml" in -# 1200 "parsing/parser.mly" +# 1188 "parsing/parser.mly" ( xs ) -# 19826 "parsing/parser.ml" +# 19798 "parsing/parser.ml" in -# 2798 "parsing/parser.mly" +# 2783 "parsing/parser.mly" ( xs ) -# 19832 "parsing/parser.ml" +# 19804 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -19837,22 +19809,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 19843 "parsing/parser.ml" +# 19815 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 19849 "parsing/parser.ml" +# 19821 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2311 "parsing/parser.mly" +# 2299 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -19865,42 +19837,42 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 19869 "parsing/parser.ml" +# 19841 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 19875 "parsing/parser.ml" +# 19847 "parsing/parser.ml" in -# 2443 "parsing/parser.mly" +# 2430 "parsing/parser.mly" (Some v) -# 19881 "parsing/parser.ml" +# 19853 "parsing/parser.ml" in let i = -# 2873 "parsing/parser.mly" +# 2933 "parsing/parser.mly" ( es ) -# 19887 "parsing/parser.ml" +# 19859 "parsing/parser.ml" in let d = let _1 = # 123 "" ( None ) -# 19893 "parsing/parser.ml" +# 19865 "parsing/parser.ml" in -# 2417 "parsing/parser.mly" +# 2403 "parsing/parser.mly" ( _1, _2 ) -# 19898 "parsing/parser.ml" +# 19870 "parsing/parser.ml" in -# 2405 "parsing/parser.mly" +# 2391 "parsing/parser.mly" ( array, d, Bracket, i, r ) -# 19904 "parsing/parser.ml" +# 19876 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_array_) in @@ -19908,9 +19880,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2444 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) -# 19914 "parsing/parser.ml" +# 19886 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -19983,9 +19955,9 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _3 : unit = Obj.magic _3 in let _2 : ( -# 778 "parsing/parser.mly" +# 766 "parsing/parser.mly" (string) -# 19989 "parsing/parser.ml" +# 19961 "parsing/parser.ml" ) = Obj.magic _2 in let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in let _1 : unit = Obj.magic _1 in @@ -20000,51 +19972,51 @@ module Tables = struct let v = let _1 = _1_inlined1 in let _1 = -# 2309 "parsing/parser.mly" +# 2297 "parsing/parser.mly" ( _1 ) -# 20006 "parsing/parser.ml" +# 19978 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 20011 "parsing/parser.ml" +# 19983 "parsing/parser.ml" in -# 2443 "parsing/parser.mly" +# 2430 "parsing/parser.mly" (Some v) -# 20017 "parsing/parser.ml" +# 19989 "parsing/parser.ml" in let i = -# 2873 "parsing/parser.mly" +# 2933 "parsing/parser.mly" ( es ) -# 20023 "parsing/parser.ml" +# 19995 "parsing/parser.ml" in let d = let _1 = let _2 = _2_inlined1 in let x = -# 2417 "parsing/parser.mly" +# 2403 "parsing/parser.mly" (_2) -# 20031 "parsing/parser.ml" +# 20003 "parsing/parser.ml" in # 126 "" ( Some x ) -# 20036 "parsing/parser.ml" +# 20008 "parsing/parser.ml" in -# 2417 "parsing/parser.mly" +# 2403 "parsing/parser.mly" ( _1, _2 ) -# 20042 "parsing/parser.ml" +# 20014 "parsing/parser.ml" in -# 2405 "parsing/parser.mly" +# 2391 "parsing/parser.mly" ( array, d, Bracket, i, r ) -# 20048 "parsing/parser.ml" +# 20020 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined2_, _startpos_array_) in @@ -20052,9 +20024,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2444 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) -# 20058 "parsing/parser.ml" +# 20030 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -20148,9 +20120,9 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _3 : unit = Obj.magic _3 in let _2 : ( -# 778 "parsing/parser.mly" +# 766 "parsing/parser.mly" (string) -# 20154 "parsing/parser.ml" +# 20126 "parsing/parser.ml" ) = Obj.magic _2 in let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in let _1 : unit = Obj.magic _1 in @@ -20170,18 +20142,18 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 20174 "parsing/parser.ml" +# 20146 "parsing/parser.ml" in -# 1200 "parsing/parser.mly" +# 1188 "parsing/parser.mly" ( xs ) -# 20179 "parsing/parser.ml" +# 20151 "parsing/parser.ml" in -# 2798 "parsing/parser.mly" +# 2783 "parsing/parser.mly" ( xs ) -# 20185 "parsing/parser.ml" +# 20157 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -20190,22 +20162,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 20196 "parsing/parser.ml" +# 20168 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 20202 "parsing/parser.ml" +# 20174 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2311 "parsing/parser.mly" +# 2299 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -20218,50 +20190,50 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 20222 "parsing/parser.ml" +# 20194 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 20228 "parsing/parser.ml" +# 20200 "parsing/parser.ml" in -# 2443 "parsing/parser.mly" +# 2430 "parsing/parser.mly" (Some v) -# 20234 "parsing/parser.ml" +# 20206 "parsing/parser.ml" in let i = -# 2873 "parsing/parser.mly" +# 2933 "parsing/parser.mly" ( es ) -# 20240 "parsing/parser.ml" +# 20212 "parsing/parser.ml" in let d = let _1 = let _2 = _2_inlined1 in let x = -# 2417 "parsing/parser.mly" +# 2403 "parsing/parser.mly" (_2) -# 20248 "parsing/parser.ml" +# 20220 "parsing/parser.ml" in # 126 "" ( Some x ) -# 20253 "parsing/parser.ml" +# 20225 "parsing/parser.ml" in -# 2417 "parsing/parser.mly" +# 2403 "parsing/parser.mly" ( _1, _2 ) -# 20259 "parsing/parser.ml" +# 20231 "parsing/parser.ml" in -# 2405 "parsing/parser.mly" +# 2391 "parsing/parser.mly" ( array, d, Bracket, i, r ) -# 20265 "parsing/parser.ml" +# 20237 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_array_) in @@ -20269,9 +20241,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2444 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) -# 20275 "parsing/parser.ml" +# 20247 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -20302,9 +20274,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.expression) = -# 2446 "parsing/parser.mly" +# 2433 "parsing/parser.mly" ( Exp.attr _1 _2 ) -# 20308 "parsing/parser.ml" +# 20280 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20329,9 +20301,9 @@ module Tables = struct let _v = let _loc__1_ = (_startpos__1_, _endpos__1_) in ( -# 2449 "parsing/parser.mly" +# 2436 "parsing/parser.mly" ( not_expecting _loc__1_ "wildcard \"_\"" ) -# 20335 "parsing/parser.ml" +# 20307 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -20377,15 +20349,15 @@ module Tables = struct let _endpos = _endpos__4_ in let _v = let ty_params = -# 2679 "parsing/parser.mly" +# 2664 "parsing/parser.mly" ( xs ) -# 20383 "parsing/parser.ml" +# 20355 "parsing/parser.ml" in let _endpos = _endpos__4_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2810 "parsing/parser.mly" +# 2795 "parsing/parser.mly" ( (* We desugar (type a b c) to (type a) (type b) (type c). If we do this desugaring, the loc for each parameter is a ghost. *) @@ -20399,7 +20371,7 @@ module Tables = struct (fun x -> { pparam_loc = loc; pparam_desc = Pparam_newtype x }) ty_params ) -# 20403 "parsing/parser.ml" +# 20375 "parsing/parser.ml" : (Parsetree.function_param list)) in { @@ -20427,11 +20399,11 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2824 "parsing/parser.mly" +# 2809 "parsing/parser.mly" ( let a, b, c = _1 in [ { pparam_loc = make_loc _sloc; pparam_desc = Pparam_val (a, b, c) } ] ) -# 20435 "parsing/parser.ml" +# 20407 "parsing/parser.ml" : (Parsetree.function_param list)) in { @@ -20459,18 +20431,18 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 20463 "parsing/parser.ml" +# 20435 "parsing/parser.ml" in -# 1107 "parsing/parser.mly" +# 1095 "parsing/parser.mly" ( xs ) -# 20468 "parsing/parser.ml" +# 20440 "parsing/parser.ml" in ( -# 2829 "parsing/parser.mly" +# 2814 "parsing/parser.mly" ( _1 ) -# 20474 "parsing/parser.ml" +# 20446 "parsing/parser.ml" : (Parsetree.function_param list)) in { @@ -20494,9 +20466,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.expression) = -# 2336 "parsing/parser.mly" +# 2324 "parsing/parser.mly" ( _1 ) -# 20500 "parsing/parser.ml" +# 20472 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20526,9 +20498,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.expression) = -# 2337 "parsing/parser.mly" +# 2325 "parsing/parser.mly" ( _1 ) -# 20532 "parsing/parser.ml" +# 20504 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20567,24 +20539,24 @@ module Tables = struct let _v = let _1 = let _1 = -# 2339 "parsing/parser.mly" +# 2327 "parsing/parser.mly" ( Pexp_sequence(_1, _3) ) -# 20573 "parsing/parser.ml" +# 20545 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 20582 "parsing/parser.ml" +# 20554 "parsing/parser.ml" in ( -# 2340 "parsing/parser.mly" +# 2328 "parsing/parser.mly" ( _1 ) -# 20588 "parsing/parser.ml" +# 20560 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -20640,11 +20612,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2342 "parsing/parser.mly" - ( let seq = mkexp ~loc:_sloc (Pexp_sequence (_1, _5)) in - let payload = PStr [mkstrexp seq []] in - mkexp ~loc:_sloc (Pexp_extension (_4, payload)) ) -# 20648 "parsing/parser.ml" +# 2330 "parsing/parser.mly" + ( mkexp_attrs ~loc:_sloc (Pexp_sequence (_1, _5)) (Some _4, []) ) +# 20618 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -20668,9 +20638,9 @@ module Tables = struct let _startpos = _startpos_ty_ in let _endpos = _endpos_ty_ in let _v : (Parsetree.core_type) = -# 3531 "parsing/parser.mly" +# 3655 "parsing/parser.mly" ( ty ) -# 20674 "parsing/parser.ml" +# 20644 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20717,19 +20687,19 @@ module Tables = struct let _1 = let _1 = let domain = -# 982 "parsing/parser.mly" +# 970 "parsing/parser.mly" ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) -# 20723 "parsing/parser.ml" +# 20693 "parsing/parser.ml" in let label = -# 3543 "parsing/parser.mly" +# 3695 "parsing/parser.mly" ( Optional label ) -# 20728 "parsing/parser.ml" +# 20698 "parsing/parser.ml" in -# 3537 "parsing/parser.mly" +# 3661 "parsing/parser.mly" ( Ptyp_arrow(label, domain, codomain) ) -# 20733 "parsing/parser.ml" +# 20703 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in @@ -20737,15 +20707,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1021 "parsing/parser.mly" +# 1009 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 20743 "parsing/parser.ml" +# 20713 "parsing/parser.ml" in ( -# 3539 "parsing/parser.mly" +# 3663 "parsing/parser.mly" ( _1 ) -# 20749 "parsing/parser.ml" +# 20719 "parsing/parser.ml" : (Parsetree.core_type)) in { @@ -20793,9 +20763,9 @@ module Tables = struct let _1 : (Parsetree.core_type) = Obj.magic _1 in let _2 : unit = Obj.magic _2 in let label : ( -# 797 "parsing/parser.mly" +# 785 "parsing/parser.mly" (string) -# 20799 "parsing/parser.ml" +# 20769 "parsing/parser.ml" ) = Obj.magic label in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_label_ in @@ -20804,19 +20774,19 @@ module Tables = struct let _1 = let _1 = let domain = -# 982 "parsing/parser.mly" +# 970 "parsing/parser.mly" ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) -# 20810 "parsing/parser.ml" +# 20780 "parsing/parser.ml" in let label = -# 3545 "parsing/parser.mly" +# 3697 "parsing/parser.mly" ( Labelled label ) -# 20815 "parsing/parser.ml" +# 20785 "parsing/parser.ml" in -# 3537 "parsing/parser.mly" +# 3661 "parsing/parser.mly" ( Ptyp_arrow(label, domain, codomain) ) -# 20820 "parsing/parser.ml" +# 20790 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in @@ -20824,15 +20794,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1021 "parsing/parser.mly" +# 1009 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 20830 "parsing/parser.ml" +# 20800 "parsing/parser.ml" in ( -# 3539 "parsing/parser.mly" +# 3663 "parsing/parser.mly" ( _1 ) -# 20836 "parsing/parser.ml" +# 20806 "parsing/parser.ml" : (Parsetree.core_type)) in { @@ -20873,19 +20843,19 @@ module Tables = struct let _1 = let _1 = let domain = -# 982 "parsing/parser.mly" +# 970 "parsing/parser.mly" ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) -# 20879 "parsing/parser.ml" +# 20849 "parsing/parser.ml" in let label = -# 3547 "parsing/parser.mly" +# 3699 "parsing/parser.mly" ( Nolabel ) -# 20884 "parsing/parser.ml" +# 20854 "parsing/parser.ml" in -# 3537 "parsing/parser.mly" +# 3661 "parsing/parser.mly" ( Ptyp_arrow(label, domain, codomain) ) -# 20889 "parsing/parser.ml" +# 20859 "parsing/parser.ml" in let _endpos__1_ = _endpos_codomain_ in @@ -20893,15 +20863,217 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1021 "parsing/parser.mly" +# 1009 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 20899 "parsing/parser.ml" +# 20869 "parsing/parser.ml" in ( -# 3539 "parsing/parser.mly" +# 3663 "parsing/parser.mly" + ( _1 ) +# 20875 "parsing/parser.ml" + : (Parsetree.core_type)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = codomain; + MenhirLib.EngineTypes.startp = _startpos_codomain_; + MenhirLib.EngineTypes.endp = _endpos_codomain_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let codomain : (Parsetree.core_type) = Obj.magic codomain in + let _4 : unit = Obj.magic _4 in + let xs : ((string option * Parsetree.core_type) list) = Obj.magic xs in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _2 : unit = Obj.magic _2 in + let label : ( +# 785 "parsing/parser.mly" + (string) +# 20939 "parsing/parser.ml" + ) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_codomain_ in + let _v = + let _1 = + let _1 = + let tuple = + let ltys = + let xs = +# 264 "" + ( List.rev xs ) +# 20952 "parsing/parser.ml" + in + +# 1127 "parsing/parser.mly" + ( xs ) +# 20957 "parsing/parser.ml" + + in + +# 3725 "parsing/parser.mly" + ( ty, ltys ) +# 20963 "parsing/parser.ml" + + in + let (_endpos_tuple_, _startpos_tuple_) = (_endpos_xs_, _startpos_ty_) in + let _loc_tuple_ = (_startpos_tuple_, _endpos_tuple_) in + +# 3679 "parsing/parser.mly" + ( let ty, ltys = tuple in + let tuple_loc = _loc_tuple_ in + let domain = + mktyp ~loc:tuple_loc (Ptyp_tuple ((None, ty) :: ltys)) + in + let domain = extra_rhs_core_type domain ~pos:(snd tuple_loc) in + Ptyp_arrow(Labelled label, domain, codomain) ) +# 20977 "parsing/parser.ml" + + in + let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1009 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +# 20987 "parsing/parser.ml" + + in + ( +# 3687 "parsing/parser.mly" ( _1 ) -# 20905 "parsing/parser.ml" +# 20993 "parsing/parser.ml" + : (Parsetree.core_type)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let xs : ((string option * Parsetree.core_type) list) = Obj.magic xs in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _2 : unit = Obj.magic _2 in + let label : ( +# 785 "parsing/parser.mly" + (string) +# 21043 "parsing/parser.ml" + ) = Obj.magic label in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_label_ in + let _endpos = _endpos_xs_ in + let _v = + let _3 = + let ltys = + let xs = +# 264 "" + ( List.rev xs ) +# 21054 "parsing/parser.ml" + in + +# 1127 "parsing/parser.mly" + ( xs ) +# 21059 "parsing/parser.ml" + + in + +# 3725 "parsing/parser.mly" + ( ty, ltys ) +# 21065 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos_label_ in + let _sloc = (_symbolstartpos, _endpos) in + ( +# 3689 "parsing/parser.mly" + ( let ty, ltys = _3 in + mktyp ~loc:_sloc (Ptyp_tuple ((Some label, ty) :: ltys)) + ) +# 21077 "parsing/parser.ml" : (Parsetree.core_type)) in { @@ -20934,9 +21106,9 @@ module Tables = struct let _v = let _startpos = _startpos__1_ in ( -# 1393 "parsing/parser.mly" +# 1381 "parsing/parser.mly" ( _startpos, Unit ) -# 20940 "parsing/parser.ml" +# 21112 "parsing/parser.ml" : (Lexing.position * Parsetree.functor_parameter)) in { @@ -20994,16 +21166,16 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 21000 "parsing/parser.ml" +# 21172 "parsing/parser.ml" in let _startpos = _startpos__1_ in ( -# 1396 "parsing/parser.mly" +# 1384 "parsing/parser.mly" ( _startpos, Named (x, mty) ) -# 21007 "parsing/parser.ml" +# 21179 "parsing/parser.ml" : (Lexing.position * Parsetree.functor_parameter)) in { @@ -21021,9 +21193,9 @@ module Tables = struct let _endpos = _startpos in let _v : (Ast_helper.str list * Parsetree.constructor_arguments * Parsetree.core_type option) = -# 3330 "parsing/parser.mly" +# 3453 "parsing/parser.mly" ( ([],Pcstr_tuple [],None) ) -# 21027 "parsing/parser.ml" +# 21199 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21054,9 +21226,9 @@ module Tables = struct let _endpos = _endpos__2_ in let _v : (Ast_helper.str list * Parsetree.constructor_arguments * Parsetree.core_type option) = -# 3331 "parsing/parser.mly" +# 3454 "parsing/parser.mly" ( ([],_2,None) ) -# 21060 "parsing/parser.ml" +# 21232 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21101,9 +21273,9 @@ module Tables = struct let _endpos = _endpos__4_ in let _v : (Ast_helper.str list * Parsetree.constructor_arguments * Parsetree.core_type option) = -# 3333 "parsing/parser.mly" +# 3456 "parsing/parser.mly" ( ([],_2,Some _4) ) -# 21107 "parsing/parser.ml" +# 21279 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21166,24 +21338,24 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 21170 "parsing/parser.ml" +# 21342 "parsing/parser.ml" in -# 1086 "parsing/parser.mly" +# 1074 "parsing/parser.mly" ( xs ) -# 21175 "parsing/parser.ml" +# 21347 "parsing/parser.ml" in -# 3466 "parsing/parser.mly" +# 3590 "parsing/parser.mly" ( _1 ) -# 21181 "parsing/parser.ml" +# 21353 "parsing/parser.ml" in ( -# 3336 "parsing/parser.mly" +# 3459 "parsing/parser.mly" ( (_2,_4,Some _6) ) -# 21187 "parsing/parser.ml" +# 21359 "parsing/parser.ml" : (Ast_helper.str list * Parsetree.constructor_arguments * Parsetree.core_type option)) in @@ -21216,9 +21388,9 @@ module Tables = struct let _endpos = _endpos__2_ in let _v : (Ast_helper.str list * Parsetree.constructor_arguments * Parsetree.core_type option) = -# 3338 "parsing/parser.mly" +# 3461 "parsing/parser.mly" ( ([],Pcstr_tuple [],Some _2) ) -# 21222 "parsing/parser.ml" +# 21394 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21267,24 +21439,24 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 21271 "parsing/parser.ml" +# 21443 "parsing/parser.ml" in -# 1086 "parsing/parser.mly" +# 1074 "parsing/parser.mly" ( xs ) -# 21276 "parsing/parser.ml" +# 21448 "parsing/parser.ml" in -# 3466 "parsing/parser.mly" +# 3590 "parsing/parser.mly" ( _1 ) -# 21282 "parsing/parser.ml" +# 21454 "parsing/parser.ml" in ( -# 3340 "parsing/parser.mly" +# 3463 "parsing/parser.mly" ( (_2,Pcstr_tuple [],Some _4) ) -# 21288 "parsing/parser.ml" +# 21460 "parsing/parser.ml" : (Ast_helper.str list * Parsetree.constructor_arguments * Parsetree.core_type option)) in @@ -21334,9 +21506,9 @@ module Tables = struct let attrs = let _1 = _1_inlined2 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 21340 "parsing/parser.ml" +# 21512 "parsing/parser.ml" in let _endpos_attrs_ = _endpos__1_inlined2_ in @@ -21346,23 +21518,23 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 21352 "parsing/parser.ml" +# 21524 "parsing/parser.ml" in let _endpos = _endpos_attrs_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 3278 "parsing/parser.mly" +# 3401 "parsing/parser.mly" ( let vars, args, res = vars_args_res in let info = symbol_info _endpos in let loc = make_loc _sloc in cid, vars, args, res, attrs, loc, info ) -# 21366 "parsing/parser.ml" +# 21538 "parsing/parser.ml" : (Ast_helper.str * Ast_helper.str list * Parsetree.constructor_arguments * Parsetree.core_type option * Parsetree.attributes * Location.t * Docstrings.info)) @@ -21406,9 +21578,9 @@ module Tables = struct let attrs = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 21412 "parsing/parser.ml" +# 21584 "parsing/parser.ml" in let _endpos_attrs_ = _endpos__1_inlined1_ in @@ -21417,29 +21589,29 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 21423 "parsing/parser.ml" +# 21595 "parsing/parser.ml" in let _startpos_cid_ = _startpos__1_ in let _1 = -# 3935 "parsing/parser.mly" +# 4106 "parsing/parser.mly" ( () ) -# 21430 "parsing/parser.ml" +# 21602 "parsing/parser.ml" in let _endpos = _endpos_attrs_ in let _symbolstartpos = _startpos_cid_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 3278 "parsing/parser.mly" +# 3401 "parsing/parser.mly" ( let vars, args, res = vars_args_res in let info = symbol_info _endpos in let loc = make_loc _sloc in cid, vars, args, res, attrs, loc, info ) -# 21443 "parsing/parser.ml" +# 21615 "parsing/parser.ml" : (Ast_helper.str * Ast_helper.str list * Parsetree.constructor_arguments * Parsetree.core_type option * Parsetree.attributes * Location.t * Docstrings.info)) @@ -21513,9 +21685,9 @@ module Tables = struct let _2 : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = Obj.magic _2 in let _1_inlined3 : unit = Obj.magic _1_inlined3 in let _1_inlined2 : ( -# 797 "parsing/parser.mly" +# 785 "parsing/parser.mly" (string) -# 21519 "parsing/parser.ml" +# 21691 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in @@ -21528,9 +21700,9 @@ module Tables = struct let attrs2 = let _1 = _1_inlined4 in -# 4110 "parsing/parser.mly" +# 4282 "parsing/parser.mly" ( _1 ) -# 21534 "parsing/parser.ml" +# 21706 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined4_ in @@ -21539,24 +21711,24 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 21543 "parsing/parser.ml" +# 21715 "parsing/parser.ml" in -# 1068 "parsing/parser.mly" +# 1056 "parsing/parser.mly" ( xs ) -# 21548 "parsing/parser.ml" +# 21720 "parsing/parser.ml" in -# 3183 "parsing/parser.mly" +# 3300 "parsing/parser.mly" ( _1 ) -# 21554 "parsing/parser.ml" +# 21726 "parsing/parser.ml" in let kind_priv_manifest = -# 3218 "parsing/parser.mly" +# 3335 "parsing/parser.mly" ( _2 ) -# 21560 "parsing/parser.ml" +# 21732 "parsing/parser.ml" in let id = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in @@ -21564,29 +21736,29 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 21570 "parsing/parser.ml" +# 21742 "parsing/parser.ml" in let flag = -# 3955 "parsing/parser.mly" +# 4126 "parsing/parser.mly" ( Recursive ) -# 21576 "parsing/parser.ml" +# 21748 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 21583 "parsing/parser.ml" +# 21755 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 3155 "parsing/parser.mly" +# 3272 "parsing/parser.mly" ( let (kind, priv, manifest) = kind_priv_manifest in let docs = symbol_docs _sloc in @@ -21595,7 +21767,7 @@ module Tables = struct (flag, ext), Type.mk id ~params ~cstrs ~kind ~priv ?manifest ~attrs ~loc ~docs ) -# 21599 "parsing/parser.ml" +# 21771 "parsing/parser.ml" : ((Asttypes.rec_flag * string Asttypes.loc option) * Parsetree.type_declaration)) in @@ -21674,9 +21846,9 @@ module Tables = struct let _2 : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = Obj.magic _2 in let _1_inlined4 : unit = Obj.magic _1_inlined4 in let _1_inlined3 : ( -# 797 "parsing/parser.mly" +# 785 "parsing/parser.mly" (string) -# 21680 "parsing/parser.ml" +# 21852 "parsing/parser.ml" ) = Obj.magic _1_inlined3 in let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in let _1_inlined2 : unit = Obj.magic _1_inlined2 in @@ -21690,9 +21862,9 @@ module Tables = struct let attrs2 = let _1 = _1_inlined5 in -# 4110 "parsing/parser.mly" +# 4282 "parsing/parser.mly" ( _1 ) -# 21696 "parsing/parser.ml" +# 21868 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined5_ in @@ -21701,24 +21873,24 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 21705 "parsing/parser.ml" +# 21877 "parsing/parser.ml" in -# 1068 "parsing/parser.mly" +# 1056 "parsing/parser.mly" ( xs ) -# 21710 "parsing/parser.ml" +# 21882 "parsing/parser.ml" in -# 3183 "parsing/parser.mly" +# 3300 "parsing/parser.mly" ( _1 ) -# 21716 "parsing/parser.ml" +# 21888 "parsing/parser.ml" in let kind_priv_manifest = -# 3218 "parsing/parser.mly" +# 3335 "parsing/parser.mly" ( _2 ) -# 21722 "parsing/parser.ml" +# 21894 "parsing/parser.ml" in let id = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in @@ -21726,9 +21898,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 21732 "parsing/parser.ml" +# 21904 "parsing/parser.ml" in let flag = @@ -21737,24 +21909,24 @@ module Tables = struct let _startpos = _startpos__1_ in let _loc = (_startpos, _endpos) in -# 3957 "parsing/parser.mly" +# 4128 "parsing/parser.mly" ( not_expecting _loc "nonrec flag" ) -# 21743 "parsing/parser.ml" +# 21915 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 21751 "parsing/parser.ml" +# 21923 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 3155 "parsing/parser.mly" +# 3272 "parsing/parser.mly" ( let (kind, priv, manifest) = kind_priv_manifest in let docs = symbol_docs _sloc in @@ -21763,7 +21935,7 @@ module Tables = struct (flag, ext), Type.mk id ~params ~cstrs ~kind ~priv ?manifest ~attrs ~loc ~docs ) -# 21767 "parsing/parser.ml" +# 21939 "parsing/parser.ml" : ((Asttypes.rec_flag * string Asttypes.loc option) * Parsetree.type_declaration)) in @@ -21829,9 +22001,9 @@ module Tables = struct let xs : ((Parsetree.core_type * Parsetree.core_type * Ast_helper.loc) list) = Obj.magic xs in let kind_priv_manifest : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = Obj.magic kind_priv_manifest in let _1_inlined2 : ( -# 797 "parsing/parser.mly" +# 785 "parsing/parser.mly" (string) -# 21835 "parsing/parser.ml" +# 22007 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in @@ -21844,9 +22016,9 @@ module Tables = struct let attrs2 = let _1 = _1_inlined3 in -# 4110 "parsing/parser.mly" +# 4282 "parsing/parser.mly" ( _1 ) -# 21850 "parsing/parser.ml" +# 22022 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -21855,18 +22027,18 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 21859 "parsing/parser.ml" +# 22031 "parsing/parser.ml" in -# 1068 "parsing/parser.mly" +# 1056 "parsing/parser.mly" ( xs ) -# 21864 "parsing/parser.ml" +# 22036 "parsing/parser.ml" in -# 3183 "parsing/parser.mly" +# 3300 "parsing/parser.mly" ( _1 ) -# 21870 "parsing/parser.ml" +# 22042 "parsing/parser.ml" in let id = @@ -21875,29 +22047,29 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 21881 "parsing/parser.ml" +# 22053 "parsing/parser.ml" in let flag = -# 3951 "parsing/parser.mly" +# 4122 "parsing/parser.mly" ( Recursive ) -# 21887 "parsing/parser.ml" +# 22059 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 21894 "parsing/parser.ml" +# 22066 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 3155 "parsing/parser.mly" +# 3272 "parsing/parser.mly" ( let (kind, priv, manifest) = kind_priv_manifest in let docs = symbol_docs _sloc in @@ -21906,7 +22078,7 @@ module Tables = struct (flag, ext), Type.mk id ~params ~cstrs ~kind ~priv ?manifest ~attrs ~loc ~docs ) -# 21910 "parsing/parser.ml" +# 22082 "parsing/parser.ml" : ((Asttypes.rec_flag * string Asttypes.loc option) * Parsetree.type_declaration)) in @@ -21978,9 +22150,9 @@ module Tables = struct let xs : ((Parsetree.core_type * Parsetree.core_type * Ast_helper.loc) list) = Obj.magic xs in let kind_priv_manifest : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = Obj.magic kind_priv_manifest in let _1_inlined3 : ( -# 797 "parsing/parser.mly" +# 785 "parsing/parser.mly" (string) -# 21984 "parsing/parser.ml" +# 22156 "parsing/parser.ml" ) = Obj.magic _1_inlined3 in let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in let _1_inlined2 : unit = Obj.magic _1_inlined2 in @@ -21994,9 +22166,9 @@ module Tables = struct let attrs2 = let _1 = _1_inlined4 in -# 4110 "parsing/parser.mly" +# 4282 "parsing/parser.mly" ( _1 ) -# 22000 "parsing/parser.ml" +# 22172 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined4_ in @@ -22005,18 +22177,18 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 22009 "parsing/parser.ml" +# 22181 "parsing/parser.ml" in -# 1068 "parsing/parser.mly" +# 1056 "parsing/parser.mly" ( xs ) -# 22014 "parsing/parser.ml" +# 22186 "parsing/parser.ml" in -# 3183 "parsing/parser.mly" +# 3300 "parsing/parser.mly" ( _1 ) -# 22020 "parsing/parser.ml" +# 22192 "parsing/parser.ml" in let id = @@ -22025,29 +22197,29 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 22031 "parsing/parser.ml" +# 22203 "parsing/parser.ml" in let flag = -# 3952 "parsing/parser.mly" +# 4123 "parsing/parser.mly" ( Nonrecursive ) -# 22037 "parsing/parser.ml" +# 22209 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 22044 "parsing/parser.ml" +# 22216 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 3155 "parsing/parser.mly" +# 3272 "parsing/parser.mly" ( let (kind, priv, manifest) = kind_priv_manifest in let docs = symbol_docs _sloc in @@ -22056,7 +22228,7 @@ module Tables = struct (flag, ext), Type.mk id ~params ~cstrs ~kind ~priv ?manifest ~attrs ~loc ~docs ) -# 22060 "parsing/parser.ml" +# 22232 "parsing/parser.ml" : ((Asttypes.rec_flag * string Asttypes.loc option) * Parsetree.type_declaration)) in @@ -22077,17 +22249,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 848 "parsing/parser.mly" +# 836 "parsing/parser.mly" (string) -# 22083 "parsing/parser.ml" +# 22255 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = -# 3794 "parsing/parser.mly" +# 3965 "parsing/parser.mly" ( _1 ) -# 22091 "parsing/parser.ml" +# 22263 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22106,17 +22278,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 797 "parsing/parser.mly" +# 785 "parsing/parser.mly" (string) -# 22112 "parsing/parser.ml" +# 22284 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = -# 3795 "parsing/parser.mly" +# 3966 "parsing/parser.mly" ( _1 ) -# 22120 "parsing/parser.ml" +# 22292 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22146,9 +22318,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.structure) = -# 1260 "parsing/parser.mly" +# 1248 "parsing/parser.mly" ( _1 ) -# 22152 "parsing/parser.ml" +# 22324 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22164,9 +22336,9 @@ module Tables = struct let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in let _endpos = _startpos in let _v : (string) = -# 3844 "parsing/parser.mly" +# 4015 "parsing/parser.mly" ( "" ) -# 22170 "parsing/parser.ml" +# 22342 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22196,398 +22368,398 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (string) = -# 3845 "parsing/parser.mly" +# 4016 "parsing/parser.mly" ( ";.." ) -# 22202 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - } = _menhir_stack in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.signature) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Parsetree.signature) = -# 1267 "parsing/parser.mly" - ( _1 ) -# 22234 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - } = _menhir_stack in - let _4 : unit = Obj.magic _4 in - let _3 : (Parsetree.payload) = Obj.magic _3 in - let _2 : (Ast_helper.str) = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__4_ in - let _v : (Parsetree.extension) = -# 4135 "parsing/parser.mly" - ( (_2, _3) ) -# 22280 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : ( -# 839 "parsing/parser.mly" - (string * Location.t * string * Location.t * string option) -# 22301 "parsing/parser.ml" - ) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - ( -# 4137 "parsing/parser.mly" - ( mk_quotedext ~loc:_sloc _1 ) -# 22313 "parsing/parser.ml" - : (Parsetree.extension)) - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - } = _menhir_stack in - let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let _1_inlined2 : (Parsetree.core_type) = Obj.magic _1_inlined2 in - let _3 : unit = Obj.magic _3 in - let _1_inlined1 : ( -# 797 "parsing/parser.mly" - (string) -# 22362 "parsing/parser.ml" - ) = Obj.magic _1_inlined1 in - let _1 : (Asttypes.mutable_flag) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined3_ in - let _v = - let _5 = - let _1 = _1_inlined3 in - -# 4114 "parsing/parser.mly" - ( _1 ) # 22374 "parsing/parser.ml" - - in - let _endpos__5_ = _endpos__1_inlined3_ in - let _4 = - let _1 = _1_inlined2 in - -# 3484 "parsing/parser.mly" - ( _1 ) -# 22383 "parsing/parser.ml" - - in - let _2 = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in - let _1 = -# 3765 "parsing/parser.mly" - ( _1 ) -# 22391 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 984 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 22399 "parsing/parser.ml" - - in - let _startpos__2_ = _startpos__1_inlined1_ in - let _endpos = _endpos__5_ in - let _symbolstartpos = if _startpos__1_ != _endpos__1_ then - _startpos__1_ - else - _startpos__2_ in - let _sloc = (_symbolstartpos, _endpos) in - ( -# 3357 "parsing/parser.mly" - ( let info = symbol_info _endpos in - Type.field _2 _4 ~mut:_1 ~attrs:_5 ~loc:(make_loc _sloc) ~info ) -# 22413 "parsing/parser.ml" - : (Parsetree.label_declaration)) - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined4; - MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _6; - MenhirLib.EngineTypes.startp = _startpos__6_; - MenhirLib.EngineTypes.endp = _endpos__6_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; - }; - } = _menhir_stack in - let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in - let _6 : unit = Obj.magic _6 in - let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let _1_inlined2 : (Parsetree.core_type) = Obj.magic _1_inlined2 in - let _3 : unit = Obj.magic _3 in - let _1_inlined1 : ( -# 797 "parsing/parser.mly" - (string) -# 22476 "parsing/parser.ml" - ) = Obj.magic _1_inlined1 in - let _1 : (Asttypes.mutable_flag) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined4_ in - let _v = - let _7 = - let _1 = _1_inlined4 in - -# 4114 "parsing/parser.mly" - ( _1 ) -# 22488 "parsing/parser.ml" - - in - let _endpos__7_ = _endpos__1_inlined4_ in - let _5 = - let _1 = _1_inlined3 in - -# 4114 "parsing/parser.mly" - ( _1 ) -# 22497 "parsing/parser.ml" - - in - let _endpos__5_ = _endpos__1_inlined3_ in - let _4 = - let _1 = _1_inlined2 in - -# 3484 "parsing/parser.mly" - ( _1 ) -# 22506 "parsing/parser.ml" - - in - let _2 = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in - let _1 = -# 3765 "parsing/parser.mly" - ( _1 ) -# 22514 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 984 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 22522 "parsing/parser.ml" - - in - let _startpos__2_ = _startpos__1_inlined1_ in - let _endpos = _endpos__7_ in - let _symbolstartpos = if _startpos__1_ != _endpos__1_ then - _startpos__1_ - else - _startpos__2_ in - let _sloc = (_symbolstartpos, _endpos) in - ( -# 3362 "parsing/parser.mly" - ( let info = - match rhs_info _endpos__5_ with - | Some _ as info_before_semi -> info_before_semi - | None -> symbol_info _endpos - in - Type.field _2 _4 ~mut:_1 ~attrs:(_5 @ _7) ~loc:(make_loc _sloc) ~info ) -# 22540 "parsing/parser.ml" - : (Parsetree.label_declaration)) - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : (Parsetree.label_declaration) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Parsetree.label_declaration list) = -# 3351 "parsing/parser.mly" - ( [_1] ) -# 22566 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : (Parsetree.label_declaration) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Parsetree.label_declaration list) = -# 3352 "parsing/parser.mly" - ( [_1] ) -# 22591 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.signature) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (Parsetree.signature) = +# 1255 "parsing/parser.mly" + ( _1 ) +# 22406 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let _4 : unit = Obj.magic _4 in + let _3 : (Parsetree.payload) = Obj.magic _3 in + let _2 : (Ast_helper.str) = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__4_ in + let _v : (Parsetree.extension) = +# 4307 "parsing/parser.mly" + ( (_2, _3) ) +# 22452 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : ( +# 827 "parsing/parser.mly" + (string * Location.t * string * Location.t * string option) +# 22473 "parsing/parser.ml" + ) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + ( +# 4309 "parsing/parser.mly" + ( mk_quotedext ~loc:_sloc _1 ) +# 22485 "parsing/parser.ml" + : (Parsetree.extension)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let _1_inlined2 : (Parsetree.core_type) = Obj.magic _1_inlined2 in + let _3 : unit = Obj.magic _3 in + let _1_inlined1 : ( +# 785 "parsing/parser.mly" + (string) +# 22534 "parsing/parser.ml" + ) = Obj.magic _1_inlined1 in + let _1 : (Asttypes.mutable_flag) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined3_ in + let _v = + let _5 = + let _1 = _1_inlined3 in + +# 4286 "parsing/parser.mly" + ( _1 ) +# 22546 "parsing/parser.ml" + + in + let _endpos__5_ = _endpos__1_inlined3_ in + let _4 = + let _1 = _1_inlined2 in + +# 3608 "parsing/parser.mly" + ( _1 ) +# 22555 "parsing/parser.ml" + + in + let _2 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _1 = +# 3936 "parsing/parser.mly" + ( _1 ) +# 22563 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 972 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 22571 "parsing/parser.ml" + + in + let _startpos__2_ = _startpos__1_inlined1_ in + let _endpos = _endpos__5_ in + let _symbolstartpos = if _startpos__1_ != _endpos__1_ then + _startpos__1_ + else + _startpos__2_ in + let _sloc = (_symbolstartpos, _endpos) in + ( +# 3480 "parsing/parser.mly" + ( let info = symbol_info _endpos in + Type.field _2 _4 ~mut:_1 ~attrs:_5 ~loc:(make_loc _sloc) ~info ) +# 22585 "parsing/parser.ml" + : (Parsetree.label_declaration)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined4; + MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in + let _6 : unit = Obj.magic _6 in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let _1_inlined2 : (Parsetree.core_type) = Obj.magic _1_inlined2 in + let _3 : unit = Obj.magic _3 in + let _1_inlined1 : ( +# 785 "parsing/parser.mly" + (string) +# 22648 "parsing/parser.ml" + ) = Obj.magic _1_inlined1 in + let _1 : (Asttypes.mutable_flag) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined4_ in + let _v = + let _7 = + let _1 = _1_inlined4 in + +# 4286 "parsing/parser.mly" + ( _1 ) +# 22660 "parsing/parser.ml" + + in + let _endpos__7_ = _endpos__1_inlined4_ in + let _5 = + let _1 = _1_inlined3 in + +# 4286 "parsing/parser.mly" + ( _1 ) +# 22669 "parsing/parser.ml" + + in + let _endpos__5_ = _endpos__1_inlined3_ in + let _4 = + let _1 = _1_inlined2 in + +# 3608 "parsing/parser.mly" + ( _1 ) +# 22678 "parsing/parser.ml" + + in + let _2 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _1 = +# 3936 "parsing/parser.mly" + ( _1 ) +# 22686 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 972 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 22694 "parsing/parser.ml" + + in + let _startpos__2_ = _startpos__1_inlined1_ in + let _endpos = _endpos__7_ in + let _symbolstartpos = if _startpos__1_ != _endpos__1_ then + _startpos__1_ + else + _startpos__2_ in + let _sloc = (_symbolstartpos, _endpos) in + ( +# 3485 "parsing/parser.mly" + ( let info = + match rhs_info _endpos__5_ with + | Some _ as info_before_semi -> info_before_semi + | None -> symbol_info _endpos + in + Type.field _2 _4 ~mut:_1 ~attrs:(_5 @ _7) ~loc:(make_loc _sloc) ~info ) +# 22712 "parsing/parser.ml" + : (Parsetree.label_declaration)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Parsetree.label_declaration) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.label_declaration list) = +# 3474 "parsing/parser.mly" + ( [_1] ) +# 22738 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Parsetree.label_declaration) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.label_declaration list) = +# 3475 "parsing/parser.mly" + ( [_1] ) +# 22763 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22617,9 +22789,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.label_declaration list) = -# 3353 "parsing/parser.mly" +# 3476 "parsing/parser.mly" ( _1 :: _2 ) -# 22623 "parsing/parser.ml" +# 22795 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22638,9 +22810,9 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 797 "parsing/parser.mly" +# 785 "parsing/parser.mly" (string) -# 22644 "parsing/parser.ml" +# 22816 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -22652,24 +22824,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 22658 "parsing/parser.ml" +# 22830 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2389 "parsing/parser.mly" +# 2375 "parsing/parser.mly" ( (_1.Location.txt, mkpat ~loc:_sloc (Ppat_var _1)) ) -# 22667 "parsing/parser.ml" +# 22839 "parsing/parser.ml" in ( -# 2381 "parsing/parser.mly" +# 2367 "parsing/parser.mly" ( x ) -# 22673 "parsing/parser.ml" +# 22845 "parsing/parser.ml" : (string * Parsetree.pattern)) in { @@ -22703,9 +22875,9 @@ module Tables = struct let cty : (Parsetree.core_type) = Obj.magic cty in let _2 : unit = Obj.magic _2 in let _1 : ( -# 797 "parsing/parser.mly" +# 785 "parsing/parser.mly" (string) -# 22709 "parsing/parser.ml" +# 22881 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -22717,18 +22889,18 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 22723 "parsing/parser.ml" +# 22895 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2389 "parsing/parser.mly" +# 2375 "parsing/parser.mly" ( (_1.Location.txt, mkpat ~loc:_sloc (Ppat_var _1)) ) -# 22732 "parsing/parser.ml" +# 22904 "parsing/parser.ml" in let _startpos_x_ = _startpos__1_ in @@ -22736,11 +22908,11 @@ module Tables = struct let _symbolstartpos = _startpos_x_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2383 "parsing/parser.mly" +# 2369 "parsing/parser.mly" ( let lab, pat = x in lab, mkpat ~loc:_sloc (Ppat_constraint (pat, cty)) ) -# 22744 "parsing/parser.ml" +# 22916 "parsing/parser.ml" : (string * Parsetree.pattern)) in { @@ -22764,9 +22936,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3876 "parsing/parser.mly" +# 4047 "parsing/parser.mly" ( _1 ) -# 22770 "parsing/parser.ml" +# 22942 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22789,9 +22961,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.arg_label * Parsetree.expression) = -# 2662 "parsing/parser.mly" +# 2647 "parsing/parser.mly" ( (Nolabel, _1) ) -# 22795 "parsing/parser.ml" +# 22967 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22817,17 +22989,17 @@ module Tables = struct } = _menhir_stack in let _2 : (Parsetree.expression) = Obj.magic _2 in let _1 : ( -# 784 "parsing/parser.mly" +# 772 "parsing/parser.mly" (string) -# 22823 "parsing/parser.ml" +# 22995 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.arg_label * Parsetree.expression) = -# 2664 "parsing/parser.mly" +# 2649 "parsing/parser.mly" ( (Labelled _1, _2) ) -# 22831 "parsing/parser.ml" +# 23003 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22852,9 +23024,9 @@ module Tables = struct }; } = _menhir_stack in let label : ( -# 797 "parsing/parser.mly" +# 785 "parsing/parser.mly" (string) -# 22858 "parsing/parser.ml" +# 23030 "parsing/parser.ml" ) = Obj.magic label in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -22863,10 +23035,10 @@ module Tables = struct let _v = let _loc_label_ = (_startpos_label_, _endpos_label_) in ( -# 2666 "parsing/parser.mly" +# 2651 "parsing/parser.mly" ( let loc = _loc_label_ in (Labelled label, mkexpvar ~loc label) ) -# 22870 "parsing/parser.ml" +# 23042 "parsing/parser.ml" : (Asttypes.arg_label * Parsetree.expression)) in { @@ -22912,9 +23084,9 @@ module Tables = struct let _5 : unit = Obj.magic _5 in let ty : (Parsetree.type_constraint) = Obj.magic ty in let label : ( -# 797 "parsing/parser.mly" +# 785 "parsing/parser.mly" (string) -# 22918 "parsing/parser.ml" +# 23090 "parsing/parser.ml" ) = Obj.magic label in let _2 : unit = Obj.magic _2 in let _1 : unit = Obj.magic _1 in @@ -22925,10 +23097,10 @@ module Tables = struct let _endpos = _endpos__5_ in let _loc_label_ = (_startpos_label_, _endpos_label_) in ( -# 2669 "parsing/parser.mly" +# 2654 "parsing/parser.mly" ( (Labelled label, mkexp_constraint ~loc:(_startpos__2_, _endpos) (mkexpvar ~loc:_loc_label_ label) ty) ) -# 22932 "parsing/parser.ml" +# 23104 "parsing/parser.ml" : (Asttypes.arg_label * Parsetree.expression)) in { @@ -22954,9 +23126,9 @@ module Tables = struct }; } = _menhir_stack in let label : ( -# 797 "parsing/parser.mly" +# 785 "parsing/parser.mly" (string) -# 22960 "parsing/parser.ml" +# 23132 "parsing/parser.ml" ) = Obj.magic label in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -22965,10 +23137,10 @@ module Tables = struct let _v = let _loc_label_ = (_startpos_label_, _endpos_label_) in ( -# 2672 "parsing/parser.mly" +# 2657 "parsing/parser.mly" ( let loc = _loc_label_ in (Optional label, mkexpvar ~loc label) ) -# 22972 "parsing/parser.ml" +# 23144 "parsing/parser.ml" : (Asttypes.arg_label * Parsetree.expression)) in { @@ -22995,17 +23167,17 @@ module Tables = struct } = _menhir_stack in let _2 : (Parsetree.expression) = Obj.magic _2 in let _1 : ( -# 814 "parsing/parser.mly" +# 802 "parsing/parser.mly" (string) -# 23001 "parsing/parser.ml" +# 23173 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.arg_label * Parsetree.expression) = -# 2675 "parsing/parser.mly" +# 2660 "parsing/parser.mly" ( (Optional _1, _2) ) -# 23009 "parsing/parser.ml" +# 23181 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23059,15 +23231,15 @@ module Tables = struct let _4 = let _1 = _1_inlined1 in -# 2377 "parsing/parser.mly" +# 2363 "parsing/parser.mly" ( _1 ) -# 23065 "parsing/parser.ml" +# 23237 "parsing/parser.ml" in ( -# 2351 "parsing/parser.mly" +# 2337 "parsing/parser.mly" ( (Optional (fst _3), _4, snd _3) ) -# 23071 "parsing/parser.ml" +# 23243 "parsing/parser.ml" : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern)) in { @@ -23093,9 +23265,9 @@ module Tables = struct }; } = _menhir_stack in let _1_inlined1 : ( -# 797 "parsing/parser.mly" +# 785 "parsing/parser.mly" (string) -# 23099 "parsing/parser.ml" +# 23271 "parsing/parser.ml" ) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -23109,24 +23281,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 23115 "parsing/parser.ml" +# 23287 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2389 "parsing/parser.mly" +# 2375 "parsing/parser.mly" ( (_1.Location.txt, mkpat ~loc:_sloc (Ppat_var _1)) ) -# 23124 "parsing/parser.ml" +# 23296 "parsing/parser.ml" in ( -# 2353 "parsing/parser.mly" +# 2339 "parsing/parser.mly" ( (Optional (fst _2), None, snd _2) ) -# 23130 "parsing/parser.ml" +# 23302 "parsing/parser.ml" : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern)) in { @@ -23174,9 +23346,9 @@ module Tables = struct let _3 : (Parsetree.pattern) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in let _1 : ( -# 814 "parsing/parser.mly" +# 802 "parsing/parser.mly" (string) -# 23180 "parsing/parser.ml" +# 23352 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -23185,15 +23357,15 @@ module Tables = struct let _4 = let _1 = _1_inlined1 in -# 2377 "parsing/parser.mly" +# 2363 "parsing/parser.mly" ( _1 ) -# 23191 "parsing/parser.ml" +# 23363 "parsing/parser.ml" in ( -# 2355 "parsing/parser.mly" +# 2341 "parsing/parser.mly" ( (Optional _1, _4, _3) ) -# 23197 "parsing/parser.ml" +# 23369 "parsing/parser.ml" : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern)) in { @@ -23220,17 +23392,17 @@ module Tables = struct } = _menhir_stack in let _2 : (Parsetree.pattern) = Obj.magic _2 in let _1 : ( -# 814 "parsing/parser.mly" +# 802 "parsing/parser.mly" (string) -# 23226 "parsing/parser.ml" +# 23398 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern) = -# 2357 "parsing/parser.mly" +# 2343 "parsing/parser.mly" ( (Optional _1, None, _2) ) -# 23234 "parsing/parser.ml" +# 23406 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23274,9 +23446,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__4_ in let _v : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern) = -# 2359 "parsing/parser.mly" +# 2345 "parsing/parser.mly" ( (Labelled (fst _3), None, snd _3) ) -# 23280 "parsing/parser.ml" +# 23452 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23301,9 +23473,9 @@ module Tables = struct }; } = _menhir_stack in let _1_inlined1 : ( -# 797 "parsing/parser.mly" +# 785 "parsing/parser.mly" (string) -# 23307 "parsing/parser.ml" +# 23479 "parsing/parser.ml" ) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -23317,24 +23489,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 23323 "parsing/parser.ml" +# 23495 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2389 "parsing/parser.mly" +# 2375 "parsing/parser.mly" ( (_1.Location.txt, mkpat ~loc:_sloc (Ppat_var _1)) ) -# 23332 "parsing/parser.ml" +# 23504 "parsing/parser.ml" in ( -# 2361 "parsing/parser.mly" +# 2347 "parsing/parser.mly" ( (Labelled (fst _2), None, snd _2) ) -# 23338 "parsing/parser.ml" +# 23510 "parsing/parser.ml" : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern)) in { @@ -23361,17 +23533,17 @@ module Tables = struct } = _menhir_stack in let _2 : (Parsetree.pattern) = Obj.magic _2 in let _1 : ( -# 784 "parsing/parser.mly" +# 772 "parsing/parser.mly" (string) -# 23367 "parsing/parser.ml" +# 23539 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern) = -# 2363 "parsing/parser.mly" +# 2349 "parsing/parser.mly" ( (Labelled _1, None, _2) ) -# 23375 "parsing/parser.ml" +# 23547 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23394,36 +23566,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern) = -# 2365 "parsing/parser.mly" +# 2351 "parsing/parser.mly" ( (Nolabel, None, _1) ) -# 23400 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : (Parsetree.pattern * Parsetree.expression * - Parsetree.value_constraint option) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Parsetree.pattern * Parsetree.expression * - Parsetree.value_constraint option * bool) = -# 2714 "parsing/parser.mly" - ( let p,e,c = _1 in (p,e,c,false) ) -# 23427 "parsing/parser.ml" +# 23572 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23432,74 +23577,47 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos; MenhirLib.EngineTypes.next = _menhir_stack; }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : (Asttypes.label) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v = - let _endpos = _endpos__1_ in - let _startpos = _startpos__1_ in - let _loc = (_startpos, _endpos) in - ( -# 2717 "parsing/parser.mly" - ( (mkpatvar ~loc:_loc _1, mkexpvar ~loc:_loc _1, None, true) ) -# 23456 "parsing/parser.ml" - : (Parsetree.pattern * Parsetree.expression * - Parsetree.value_constraint option * bool)) - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; } = _menhir_stack in - let _2 : (Parsetree.expression) = Obj.magic _2 in - let _1 : (Asttypes.label) = Obj.magic _1 in + let _1_inlined1 : (Parsetree.pattern) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : ((string option * Parsetree.pattern) list) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in + let _endpos = _endpos__1_inlined1_ in let _v = - let _1 = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _3 = + let _1 = _1_inlined1 in -# 2682 "parsing/parser.mly" - ( mkpatvar ~loc:_sloc _1 ) -# 23495 "parsing/parser.ml" +# 3112 "parsing/parser.mly" + ( None, _1 ) +# 23614 "parsing/parser.ml" in ( -# 2686 "parsing/parser.mly" - ( (_1, _2, None) ) -# 23501 "parsing/parser.ml" - : (Parsetree.pattern * Parsetree.expression * - Parsetree.value_constraint option)) +# 3140 "parsing/parser.mly" + ( _3 :: _1 ) +# 23620 "parsing/parser.ml" + : ((string option * Parsetree.pattern) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23512,14 +23630,14 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _2; @@ -23535,38 +23653,31 @@ module Tables = struct }; }; } = _menhir_stack in - let _4 : (Parsetree.expression) = Obj.magic _4 in - let _3 : unit = Obj.magic _3 in - let _2 : (Parsetree.type_constraint) = Obj.magic _2 in - let _1 : (Asttypes.label) = Obj.magic _1 in + let _2_inlined1 : (Parsetree.pattern) = Obj.magic _2_inlined1 in + let _1_inlined1 : ( +# 772 "parsing/parser.mly" + (string) +# 23661 "parsing/parser.ml" + ) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : ((string option * Parsetree.pattern) list) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__4_ in + let _endpos = _endpos__2_inlined1_ in let _v = - let _1 = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _3 = + let (_2, _1) = (_2_inlined1, _1_inlined1) in -# 2682 "parsing/parser.mly" - ( mkpatvar ~loc:_sloc _1 ) -# 23554 "parsing/parser.ml" +# 3114 "parsing/parser.mly" + ( Some _1, _2 ) +# 23674 "parsing/parser.ml" in ( -# 2688 "parsing/parser.mly" - ( let v = _1 in (* PR#7344 *) - let t = - match _2 with - Pconstraint t -> - Pvc_constraint { locally_abstract_univars = []; typ=t } - | Pcoerce (ground, coercion) -> Pvc_coercion { ground; coercion} - in - (v, _4, Some t) - ) -# 23568 "parsing/parser.ml" - : (Parsetree.pattern * Parsetree.expression * - Parsetree.value_constraint option)) +# 3140 "parsing/parser.mly" + ( _3 :: _1 ) +# 23680 "parsing/parser.ml" + : ((string option * Parsetree.pattern) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23579,105 +23690,55 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2_inlined1; - MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; } = _menhir_stack in - let _5 : (Parsetree.expression) = Obj.magic _5 in - let _4 : unit = Obj.magic _4 in - let _3 : (Parsetree.core_type) = Obj.magic _3 in - let _2_inlined1 : unit = Obj.magic _2_inlined1 in - let xs : (Asttypes.label Asttypes.loc list) = Obj.magic xs in + let label : ( +# 785 "parsing/parser.mly" + (string) +# 23720 "parsing/parser.ml" + ) = Obj.magic label in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _2 : unit = Obj.magic _2 in - let _1 : (Asttypes.label) = Obj.magic _1 in + let _1 : ((string option * Parsetree.pattern) list) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in + let _endpos = _endpos_label_ in let _v = let _3 = - let _1 = - let _1 = - let xs = -# 264 "" - ( List.rev xs ) -# 23641 "parsing/parser.ml" - in - -# 1086 "parsing/parser.mly" - ( xs ) -# 23646 "parsing/parser.ml" - - in - -# 3466 "parsing/parser.mly" - ( _1 ) -# 23652 "parsing/parser.ml" - - in - -# 3470 "parsing/parser.mly" - ( Ptyp_poly(_1, _3) ) -# 23658 "parsing/parser.ml" - - in - let _startpos__3_ = _startpos_xs_ in - let _1 = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _loc_label_ = (_startpos_label_, _endpos_label_) in -# 2682 "parsing/parser.mly" - ( mkpatvar ~loc:_sloc _1 ) -# 23669 "parsing/parser.ml" +# 3116 "parsing/parser.mly" + ( let loc = _loc_label_ in + Some label, mkpatvar ~loc label ) +# 23735 "parsing/parser.ml" in - let _loc__3_ = (_startpos__3_, _endpos__3_) in ( -# 2698 "parsing/parser.mly" - ( - let t = ghtyp ~loc:(_loc__3_) _3 in - (_1, _5, Some (Pvc_constraint { locally_abstract_univars = []; typ=t })) - ) -# 23679 "parsing/parser.ml" - : (Parsetree.pattern * Parsetree.expression * - Parsetree.value_constraint option)) +# 3140 "parsing/parser.mly" + ( _3 :: _1 ) +# 23741 "parsing/parser.ml" + : ((string option * Parsetree.pattern) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23690,34 +23751,34 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _8; - MenhirLib.EngineTypes.startp = _startpos__8_; - MenhirLib.EngineTypes.endp = _endpos__8_; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _7; - MenhirLib.EngineTypes.startp = _startpos__7_; - MenhirLib.EngineTypes.endp = _endpos__7_; + MenhirLib.EngineTypes.semv = cty; + MenhirLib.EngineTypes.startp = _startpos_cty_; + MenhirLib.EngineTypes.endp = _endpos_cty_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _6; - MenhirLib.EngineTypes.startp = _startpos__6_; - MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _2; @@ -23737,42 +23798,40 @@ module Tables = struct }; }; } = _menhir_stack in - let _8 : (Parsetree.expression) = Obj.magic _8 in - let _7 : unit = Obj.magic _7 in - let _6 : (Parsetree.core_type) = Obj.magic _6 in - let _5 : unit = Obj.magic _5 in - let xs : (string Asttypes.loc list) = Obj.magic xs in - let _3 : unit = Obj.magic _3 in + let _6 : unit = Obj.magic _6 in + let cty : (Parsetree.core_type) = Obj.magic cty in + let _4 : unit = Obj.magic _4 in + let label : ( +# 785 "parsing/parser.mly" + (string) +# 23808 "parsing/parser.ml" + ) = Obj.magic label in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _2 : unit = Obj.magic _2 in - let _1 : (Asttypes.label) = Obj.magic _1 in + let _1 : ((string option * Parsetree.pattern) list) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__8_ in + let _endpos = _endpos__6_ in let _v = - let _4 = -# 2679 "parsing/parser.mly" - ( xs ) -# 23756 "parsing/parser.ml" - in - let _1 = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _3 = + let _startpos__2_ = _startpos__2_inlined1_ in + let _endpos = _endpos__6_ in + let _loc_label_ = (_startpos_label_, _endpos_label_) in -# 2682 "parsing/parser.mly" - ( mkpatvar ~loc:_sloc _1 ) -# 23765 "parsing/parser.ml" +# 3119 "parsing/parser.mly" + ( let lbl_loc = _loc_label_ in + let pat_loc = _startpos__2_, _endpos in + let pat = mkpatvar ~loc:lbl_loc label in + Some label, mkpat ~loc:pat_loc (Ppat_constraint(pat, cty)) ) +# 23828 "parsing/parser.ml" in ( -# 2703 "parsing/parser.mly" - ( let constraint' = - Pvc_constraint { locally_abstract_univars=_4; typ = _6} - in - (_1, _8, Some constraint') ) -# 23774 "parsing/parser.ml" - : (Parsetree.pattern * Parsetree.expression * - Parsetree.value_constraint option)) +# 3140 "parsing/parser.mly" + ( _3 :: _1 ) +# 23834 "parsing/parser.ml" + : ((string option * Parsetree.pattern) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23785,9 +23844,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _2; @@ -23802,18 +23861,32 @@ module Tables = struct }; }; } = _menhir_stack in - let _3 : (Parsetree.expression) = Obj.magic _3 in + let _1_inlined1 : (Parsetree.pattern) = Obj.magic _1_inlined1 in let _2 : unit = Obj.magic _2 in let _1 : (Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.pattern * Parsetree.expression * - Parsetree.value_constraint option) = -# 2708 "parsing/parser.mly" - ( (_1, _3, None) ) -# 23816 "parsing/parser.ml" - in + let _endpos = _endpos__1_inlined1_ in + let _v = + let _3 = + let _1 = _1_inlined1 in + +# 3112 "parsing/parser.mly" + ( None, _1 ) +# 23877 "parsing/parser.ml" + + in + let _1 = +# 3126 "parsing/parser.mly" + ( None, _1 ) +# 23883 "parsing/parser.ml" + in + ( +# 3142 "parsing/parser.mly" + ( [ _3; _1 ] ) +# 23888 "parsing/parser.ml" + : ((string option * Parsetree.pattern) list)) + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -23825,49 +23898,60 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; } = _menhir_stack in - let _5 : (Parsetree.expression) = Obj.magic _5 in - let _4 : unit = Obj.magic _4 in - let _3 : (Parsetree.core_type) = Obj.magic _3 in + let _2_inlined1 : (Parsetree.pattern) = Obj.magic _2_inlined1 in + let _1_inlined1 : ( +# 772 "parsing/parser.mly" + (string) +# 23929 "parsing/parser.ml" + ) = Obj.magic _1_inlined1 in let _2 : unit = Obj.magic _2 in let _1 : (Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in - let _v : (Parsetree.pattern * Parsetree.expression * - Parsetree.value_constraint option) = -# 2710 "parsing/parser.mly" - ( (_1, _5, Some(Pvc_constraint { locally_abstract_univars=[]; typ=_3 })) ) -# 23870 "parsing/parser.ml" - in + let _endpos = _endpos__2_inlined1_ in + let _v = + let _3 = + let (_2, _1) = (_2_inlined1, _1_inlined1) in + +# 3114 "parsing/parser.mly" + ( Some _1, _2 ) +# 23942 "parsing/parser.ml" + + in + let _1 = +# 3126 "parsing/parser.mly" + ( None, _1 ) +# 23948 "parsing/parser.ml" + in + ( +# 3142 "parsing/parser.mly" + ( [ _3; _1 ] ) +# 23953 "parsing/parser.ml" + : ((string option * Parsetree.pattern) list)) + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -23879,87 +23963,158 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = body; - MenhirLib.EngineTypes.startp = _startpos_body_; - MenhirLib.EngineTypes.endp = _endpos_body_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = rec_flag; - MenhirLib.EngineTypes.startp = _startpos_rec_flag_; - MenhirLib.EngineTypes.endp = _endpos_rec_flag_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let label : ( +# 785 "parsing/parser.mly" + (string) +# 23993 "parsing/parser.ml" + ) = Obj.magic label in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos_label_ in + let _v = + let _3 = + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +# 3116 "parsing/parser.mly" + ( let loc = _loc_label_ in + Some label, mkpatvar ~loc label ) +# 24008 "parsing/parser.ml" + + in + let _1 = +# 3126 "parsing/parser.mly" + ( None, _1 ) +# 24014 "parsing/parser.ml" + in + ( +# 3142 "parsing/parser.mly" + ( [ _3; _1 ] ) +# 24019 "parsing/parser.ml" + : ((string option * Parsetree.pattern) list)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = cty; + MenhirLib.EngineTypes.startp = _startpos_cty_; + MenhirLib.EngineTypes.endp = _endpos_cty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ext; - MenhirLib.EngineTypes.startp = _startpos_ext_; - MenhirLib.EngineTypes.endp = _endpos_ext_; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; }; }; }; }; }; } = _menhir_stack in - let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let body : (Parsetree.pattern * Parsetree.expression * - Parsetree.value_constraint option * bool) = Obj.magic body in - let rec_flag : (Asttypes.rec_flag) = Obj.magic rec_flag in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let ext : (string Asttypes.loc option) = Obj.magic ext in - let _1 : unit = Obj.magic _1 in + let _6 : unit = Obj.magic _6 in + let cty : (Parsetree.core_type) = Obj.magic cty in + let _4 : unit = Obj.magic _4 in + let label : ( +# 785 "parsing/parser.mly" + (string) +# 24086 "parsing/parser.ml" + ) = Obj.magic label in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined2_ in + let _endpos = _endpos__6_ in let _v = - let _1 = - let attrs2 = - let _1 = _1_inlined2 in - -# 4110 "parsing/parser.mly" - ( _1 ) -# 23935 "parsing/parser.ml" - - in - let _endpos_attrs2_ = _endpos__1_inlined2_ in - let attrs1 = - let _1 = _1_inlined1 in - -# 4114 "parsing/parser.mly" - ( _1 ) -# 23944 "parsing/parser.ml" - - in - let _endpos = _endpos_attrs2_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _3 = + let _startpos__2_ = _startpos__2_inlined1_ in + let _endpos = _endpos__6_ in + let _loc_label_ = (_startpos_label_, _endpos_label_) in -# 2737 "parsing/parser.mly" - ( - let attrs = attrs1 @ attrs2 in - mklbs ext rec_flag (mklb ~loc:_sloc true body attrs) - ) -# 23956 "parsing/parser.ml" +# 3119 "parsing/parser.mly" + ( let lbl_loc = _loc_label_ in + let pat_loc = _startpos__2_, _endpos in + let pat = mkpatvar ~loc:lbl_loc label in + Some label, mkpat ~loc:pat_loc (Ppat_constraint(pat, cty)) ) +# 24106 "parsing/parser.ml" in + let _1 = +# 3126 "parsing/parser.mly" + ( None, _1 ) +# 24112 "parsing/parser.ml" + in ( -# 2727 "parsing/parser.mly" - ( _1 ) -# 23962 "parsing/parser.ml" - : (let_bindings)) +# 3142 "parsing/parser.mly" + ( [ _3; _1 ] ) +# 24117 "parsing/parser.ml" + : ((string option * Parsetree.pattern) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23972,27 +24127,63 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; }; } = _menhir_stack in - let _2 : (let_binding) = Obj.magic _2 in - let _1 : (let_bindings) = Obj.magic _1 in + let _1_inlined1 : (Parsetree.pattern) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _2_inlined1 : (Parsetree.pattern) = Obj.magic _2_inlined1 in + let _1 : ( +# 772 "parsing/parser.mly" + (string) +# 24160 "parsing/parser.ml" + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (let_bindings) = -# 2728 "parsing/parser.mly" - ( addlb _1 _2 ) -# 23995 "parsing/parser.ml" - in + let _endpos = _endpos__1_inlined1_ in + let _v = + let _3 = + let _1 = _1_inlined1 in + +# 3112 "parsing/parser.mly" + ( None, _1 ) +# 24171 "parsing/parser.ml" + + in + let _1 = + let _2 = _2_inlined1 in + +# 3128 "parsing/parser.mly" + ( Some _1, _2 ) +# 24179 "parsing/parser.ml" + + in + ( +# 3142 "parsing/parser.mly" + ( [ _3; _1 ] ) +# 24185 "parsing/parser.ml" + : ((string option * Parsetree.pattern) list)) + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -24004,24 +24195,24 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _2_inlined2; + MenhirLib.EngineTypes.startp = _startpos__2_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = body; - MenhirLib.EngineTypes.startp = _startpos_body_; - MenhirLib.EngineTypes.endp = _endpos_body_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = rec_flag; - MenhirLib.EngineTypes.startp = _startpos_rec_flag_; - MenhirLib.EngineTypes.endp = _endpos_rec_flag_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -24033,56 +24224,44 @@ module Tables = struct }; }; } = _menhir_stack in - let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let body : (Parsetree.pattern * Parsetree.expression * - Parsetree.value_constraint option * bool) = Obj.magic body in - let rec_flag : (Asttypes.rec_flag) = Obj.magic rec_flag in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let _1 : unit = Obj.magic _1 in + let _2_inlined2 : (Parsetree.pattern) = Obj.magic _2_inlined2 in + let _1_inlined1 : ( +# 772 "parsing/parser.mly" + (string) +# 24232 "parsing/parser.ml" + ) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _2_inlined1 : (Parsetree.pattern) = Obj.magic _2_inlined1 in + let _1 : ( +# 772 "parsing/parser.mly" + (string) +# 24239 "parsing/parser.ml" + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined2_ in + let _endpos = _endpos__2_inlined2_ in let _v = + let _3 = + let (_2, _1) = (_2_inlined2, _1_inlined1) in + +# 3114 "parsing/parser.mly" + ( Some _1, _2 ) +# 24250 "parsing/parser.ml" + + in let _1 = - let attrs2 = - let _1 = _1_inlined2 in - -# 4110 "parsing/parser.mly" - ( _1 ) -# 24053 "parsing/parser.ml" - - in - let _endpos_attrs2_ = _endpos__1_inlined2_ in - let attrs1 = - let _1 = _1_inlined1 in - -# 4114 "parsing/parser.mly" - ( _1 ) -# 24062 "parsing/parser.ml" - - in - let ext = -# 4121 "parsing/parser.mly" - ( None ) -# 24068 "parsing/parser.ml" - in - let _endpos = _endpos_attrs2_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _2 = _2_inlined1 in -# 2737 "parsing/parser.mly" - ( - let attrs = attrs1 @ attrs2 in - mklbs ext rec_flag (mklb ~loc:_sloc true body attrs) - ) -# 24079 "parsing/parser.ml" +# 3128 "parsing/parser.mly" + ( Some _1, _2 ) +# 24258 "parsing/parser.ml" in ( -# 2727 "parsing/parser.mly" - ( _1 ) -# 24085 "parsing/parser.ml" - : (let_bindings)) +# 3142 "parsing/parser.mly" + ( [ _3; _1 ] ) +# 24264 "parsing/parser.ml" + : ((string option * Parsetree.pattern) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24095,105 +24274,74 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = body; - MenhirLib.EngineTypes.startp = _startpos_body_; - MenhirLib.EngineTypes.endp = _endpos_body_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = rec_flag; - MenhirLib.EngineTypes.startp = _startpos_rec_flag_; - MenhirLib.EngineTypes.endp = _endpos_rec_flag_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; }; } = _menhir_stack in - let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let body : (Parsetree.pattern * Parsetree.expression * - Parsetree.value_constraint option * bool) = Obj.magic body in - let rec_flag : (Asttypes.rec_flag) = Obj.magic rec_flag in - let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _2 : (Ast_helper.str) = Obj.magic _2 in + let label : ( +# 785 "parsing/parser.mly" + (string) +# 24310 "parsing/parser.ml" + ) = Obj.magic label in let _1_inlined1 : unit = Obj.magic _1_inlined1 in - let _1 : unit = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let _2_inlined1 : (Parsetree.pattern) = Obj.magic _2_inlined1 in + let _1 : ( +# 772 "parsing/parser.mly" + (string) +# 24318 "parsing/parser.ml" + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined3_ in + let _endpos = _endpos_label_ in let _v = + let _3 = + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +# 3116 "parsing/parser.mly" + ( let loc = _loc_label_ in + Some label, mkpatvar ~loc label ) +# 24330 "parsing/parser.ml" + + in let _1 = - let attrs2 = - let _1 = _1_inlined3 in - -# 4110 "parsing/parser.mly" - ( _1 ) -# 24158 "parsing/parser.ml" - - in - let _endpos_attrs2_ = _endpos__1_inlined3_ in - let attrs1 = - let _1 = _1_inlined2 in - -# 4114 "parsing/parser.mly" - ( _1 ) -# 24167 "parsing/parser.ml" - - in - let ext = - let _startpos__1_ = _startpos__1_inlined1_ in - let _endpos = _endpos__2_ in - let _startpos = _startpos__1_ in - let _loc = (_startpos, _endpos) in - -# 4123 "parsing/parser.mly" - ( not_expecting _loc "extension" ) -# 24178 "parsing/parser.ml" - - in - let _endpos = _endpos_attrs2_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _2 = _2_inlined1 in -# 2737 "parsing/parser.mly" - ( - let attrs = attrs1 @ attrs2 in - mklbs ext rec_flag (mklb ~loc:_sloc true body attrs) - ) -# 24190 "parsing/parser.ml" +# 3128 "parsing/parser.mly" + ( Some _1, _2 ) +# 24338 "parsing/parser.ml" in ( -# 2727 "parsing/parser.mly" - ( _1 ) -# 24196 "parsing/parser.ml" - : (let_bindings)) +# 3142 "parsing/parser.mly" + ( [ _3; _1 ] ) +# 24344 "parsing/parser.ml" + : ((string option * Parsetree.pattern) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24206,52 +24354,107 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = cty; + MenhirLib.EngineTypes.startp = _startpos_cty_; + MenhirLib.EngineTypes.endp = _endpos_cty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined2; + MenhirLib.EngineTypes.startp = _startpos__2_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; }; } = _menhir_stack in - let _2 : (let_binding) = Obj.magic _2 in - let _1 : (let_bindings) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (let_bindings) = -# 2728 "parsing/parser.mly" - ( addlb _1 _2 ) -# 24229 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : (Parsetree.pattern) = Obj.magic _1 in + let _6 : unit = Obj.magic _6 in + let cty : (Parsetree.core_type) = Obj.magic cty in + let _4 : unit = Obj.magic _4 in + let label : ( +# 785 "parsing/parser.mly" + (string) +# 24417 "parsing/parser.ml" + ) = Obj.magic label in + let _2_inlined2 : unit = Obj.magic _2_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _2_inlined1 : (Parsetree.pattern) = Obj.magic _2_inlined1 in + let _1 : ( +# 772 "parsing/parser.mly" + (string) +# 24426 "parsing/parser.ml" + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Parsetree.pattern) = -# 2393 "parsing/parser.mly" - ( _1 ) -# 24254 "parsing/parser.ml" - in + let _endpos = _endpos__6_ in + let _v = + let _3 = + let _startpos__2_ = _startpos__2_inlined2_ in + let _endpos = _endpos__6_ in + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +# 3119 "parsing/parser.mly" + ( let lbl_loc = _loc_label_ in + let pat_loc = _startpos__2_, _endpos in + let pat = mkpatvar ~loc:lbl_loc label in + Some label, mkpat ~loc:pat_loc (Ppat_constraint(pat, cty)) ) +# 24442 "parsing/parser.ml" + + in + let _1 = + let _2 = _2_inlined1 in + +# 3128 "parsing/parser.mly" + ( Some _1, _2 ) +# 24450 "parsing/parser.ml" + + in + ( +# 3142 "parsing/parser.mly" + ( [ _3; _1 ] ) +# 24456 "parsing/parser.ml" + : ((string option * Parsetree.pattern) list)) + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -24263,51 +24466,63 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _2; MenhirLib.EngineTypes.startp = _startpos__2_; MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; }; } = _menhir_stack in - let _3 : (Parsetree.core_type) = Obj.magic _3 in + let _1_inlined1 : (Parsetree.pattern) = Obj.magic _1_inlined1 in let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.pattern) = Obj.magic _1 in + let label : ( +# 785 "parsing/parser.mly" + (string) +# 24498 "parsing/parser.ml" + ) = Obj.magic label in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in + let _endpos = _endpos__1_inlined1_ in let _v = + let _3 = + let _1 = _1_inlined1 in + +# 3112 "parsing/parser.mly" + ( None, _1 ) +# 24510 "parsing/parser.ml" + + in let _1 = - let _1 = -# 2395 "parsing/parser.mly" - ( Ppat_constraint(_1, _3) ) -# 24295 "parsing/parser.ml" - in - let _endpos__1_ = _endpos__3_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _loc_label_ = (_startpos_label_, _endpos_label_) in -# 1019 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 24304 "parsing/parser.ml" +# 3130 "parsing/parser.mly" + ( let loc = _loc_label_ in + Some label, mkpatvar ~loc label ) +# 24519 "parsing/parser.ml" in ( -# 2396 "parsing/parser.mly" - ( _1 ) -# 24310 "parsing/parser.ml" - : (Parsetree.pattern)) +# 3142 "parsing/parser.mly" + ( [ _3; _1 ] ) +# 24525 "parsing/parser.ml" + : ((string option * Parsetree.pattern) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24320,38 +24535,74 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = exp; - MenhirLib.EngineTypes.startp = _startpos_exp_; - MenhirLib.EngineTypes.endp = _endpos_exp_; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; }; } = _menhir_stack in - let exp : (Parsetree.expression) = Obj.magic exp in - let _1 : (Asttypes.label) = Obj.magic _1 in + let _2_inlined1 : (Parsetree.pattern) = Obj.magic _2_inlined1 in + let _1_inlined1 : ( +# 772 "parsing/parser.mly" + (string) +# 24572 "parsing/parser.ml" + ) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let label : ( +# 785 "parsing/parser.mly" + (string) +# 24578 "parsing/parser.ml" + ) = Obj.magic label in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_exp_ in + let _endpos = _endpos__2_inlined1_ in let _v = - let pat = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _3 = + let (_2, _1) = (_2_inlined1, _1_inlined1) in -# 2682 "parsing/parser.mly" - ( mkpatvar ~loc:_sloc _1 ) -# 24348 "parsing/parser.ml" +# 3114 "parsing/parser.mly" + ( Some _1, _2 ) +# 24590 "parsing/parser.ml" + + in + let _1 = + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +# 3130 "parsing/parser.mly" + ( let loc = _loc_label_ in + Some label, mkpatvar ~loc label ) +# 24599 "parsing/parser.ml" in ( -# 2754 "parsing/parser.mly" - ( (pat, exp) ) -# 24354 "parsing/parser.ml" - : (Parsetree.pattern * Parsetree.expression)) +# 3142 "parsing/parser.mly" + ( [ _3; _1 ] ) +# 24605 "parsing/parser.ml" + : ((string option * Parsetree.pattern) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24363,25 +24614,77 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label_inlined1; + MenhirLib.EngineTypes.startp = _startpos_label_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_label_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; } = _menhir_stack in - let _1 : (Asttypes.label) = Obj.magic _1 in + let label_inlined1 : ( +# 785 "parsing/parser.mly" + (string) +# 24651 "parsing/parser.ml" + ) = Obj.magic label_inlined1 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let label : ( +# 785 "parsing/parser.mly" + (string) +# 24658 "parsing/parser.ml" + ) = Obj.magic label in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in + let _endpos = _endpos_label_inlined1_ in let _v = - let _endpos = _endpos__1_ in - let _startpos = _startpos__1_ in - let _loc = (_startpos, _endpos) in + let _3 = + let (_endpos_label_, _startpos_label_, label) = (_endpos_label_inlined1_, _startpos_label_inlined1_, label_inlined1) in + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +# 3116 "parsing/parser.mly" + ( let loc = _loc_label_ in + Some label, mkpatvar ~loc label ) +# 24672 "parsing/parser.ml" + + in + let _1 = + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +# 3130 "parsing/parser.mly" + ( let loc = _loc_label_ in + Some label, mkpatvar ~loc label ) +# 24681 "parsing/parser.ml" + + in ( -# 2757 "parsing/parser.mly" - ( (mkpatvar ~loc:_loc _1, mkexpvar ~loc:_loc _1) ) -# 24384 "parsing/parser.ml" - : (Parsetree.pattern * Parsetree.expression)) +# 3142 "parsing/parser.mly" + ( [ _3; _1 ] ) +# 24687 "parsing/parser.ml" + : ((string option * Parsetree.pattern) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24394,49 +24697,108 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = exp; - MenhirLib.EngineTypes.startp = _startpos_exp_; - MenhirLib.EngineTypes.endp = _endpos_exp_; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = cty; + MenhirLib.EngineTypes.startp = _startpos_cty_; + MenhirLib.EngineTypes.endp = _endpos_cty_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = typ; - MenhirLib.EngineTypes.startp = _startpos_typ_; - MenhirLib.EngineTypes.endp = _endpos_typ_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = label_inlined1; + MenhirLib.EngineTypes.startp = _startpos_label_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_label_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = pat; - MenhirLib.EngineTypes.startp = _startpos_pat_; - MenhirLib.EngineTypes.endp = _endpos_pat_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; }; }; }; }; } = _menhir_stack in - let exp : (Parsetree.expression) = Obj.magic exp in + let _6 : unit = Obj.magic _6 in + let cty : (Parsetree.core_type) = Obj.magic cty in let _4 : unit = Obj.magic _4 in - let typ : (Parsetree.core_type) = Obj.magic typ in + let label_inlined1 : ( +# 785 "parsing/parser.mly" + (string) +# 24760 "parsing/parser.ml" + ) = Obj.magic label_inlined1 in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _2 : unit = Obj.magic _2 in - let pat : (Parsetree.pattern) = Obj.magic pat in + let label : ( +# 785 "parsing/parser.mly" + (string) +# 24768 "parsing/parser.ml" + ) = Obj.magic label in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_pat_ in - let _endpos = _endpos_exp_ in - let _v : (Parsetree.pattern * Parsetree.expression) = -# 2759 "parsing/parser.mly" - ( let loc = (_startpos_pat_, _endpos_typ_) in - (ghpat ~loc (Ppat_constraint(pat, typ)), exp) ) -# 24439 "parsing/parser.ml" - in + let _startpos = _startpos__1_ in + let _endpos = _endpos__6_ in + let _v = + let _3 = + let (_endpos_label_, _startpos_label_, _startpos__2_, label) = (_endpos_label_inlined1_, _startpos_label_inlined1_, _startpos__2_inlined1_, label_inlined1) in + let _endpos = _endpos__6_ in + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +# 3119 "parsing/parser.mly" + ( let lbl_loc = _loc_label_ in + let pat_loc = _startpos__2_, _endpos in + let pat = mkpatvar ~loc:lbl_loc label in + Some label, mkpat ~loc:pat_loc (Ppat_constraint(pat, cty)) ) +# 24785 "parsing/parser.ml" + + in + let _1 = + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +# 3130 "parsing/parser.mly" + ( let loc = _loc_label_ in + Some label, mkpatvar ~loc label ) +# 24794 "parsing/parser.ml" + + in + ( +# 3142 "parsing/parser.mly" + ( [ _3; _1 ] ) +# 24800 "parsing/parser.ml" + : ((string option * Parsetree.pattern) list)) + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -24448,140 +24810,96 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = exp; - MenhirLib.EngineTypes.startp = _startpos_exp_; - MenhirLib.EngineTypes.endp = _endpos_exp_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _2; MenhirLib.EngineTypes.startp = _startpos__2_; MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = pat; - MenhirLib.EngineTypes.startp = _startpos_pat_; - MenhirLib.EngineTypes.endp = _endpos_pat_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = cty; + MenhirLib.EngineTypes.startp = _startpos_cty_; + MenhirLib.EngineTypes.endp = _endpos_cty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; }; }; } = _menhir_stack in - let exp : (Parsetree.expression) = Obj.magic exp in + let _1_inlined1 : (Parsetree.pattern) = Obj.magic _1_inlined1 in let _2 : unit = Obj.magic _2 in - let pat : (Parsetree.pattern) = Obj.magic pat in + let _6 : unit = Obj.magic _6 in + let cty : (Parsetree.core_type) = Obj.magic cty in + let _4 : unit = Obj.magic _4 in + let label : ( +# 785 "parsing/parser.mly" + (string) +# 24869 "parsing/parser.ml" + ) = Obj.magic label in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_pat_ in - let _endpos = _endpos_exp_ in - let _v : (Parsetree.pattern * Parsetree.expression) = -# 2762 "parsing/parser.mly" - ( (pat, exp) ) -# 24478 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = body; - MenhirLib.EngineTypes.startp = _startpos_body_; - MenhirLib.EngineTypes.endp = _endpos_body_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let body : (Parsetree.pattern * Parsetree.expression) = Obj.magic body in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_body_ in - let _endpos = _endpos_body_ in - let _v : (Parsetree.pattern * Parsetree.expression * Parsetree.binding_op list) = -# 2766 "parsing/parser.mly" - ( let let_pat, let_exp = body in - let_pat, let_exp, [] ) -# 24504 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = body; - MenhirLib.EngineTypes.startp = _startpos_body_; - MenhirLib.EngineTypes.endp = _endpos_body_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = bindings; - MenhirLib.EngineTypes.startp = _startpos_bindings_; - MenhirLib.EngineTypes.endp = _endpos_bindings_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - } = _menhir_stack in - let body : (Parsetree.pattern * Parsetree.expression) = Obj.magic body in - let _1 : ( -# 780 "parsing/parser.mly" - (string) -# 24538 "parsing/parser.ml" - ) = Obj.magic _1 in - let bindings : (Parsetree.pattern * Parsetree.expression * Parsetree.binding_op list) = Obj.magic bindings in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_bindings_ in - let _endpos = _endpos_body_ in - let _v = - let pbop_op = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 984 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 24552 "parsing/parser.ml" - - in - let _endpos = _endpos_body_ in - let _symbolstartpos = _startpos_bindings_ in - let _sloc = (_symbolstartpos, _endpos) in - ( -# 2769 "parsing/parser.mly" - ( let let_pat, let_exp, rev_ands = bindings in - let pbop_pat, pbop_exp = body in - let pbop_loc = make_loc _sloc in - let and_ = {pbop_op; pbop_pat; pbop_exp; pbop_loc} in - let_pat, let_exp, and_ :: rev_ands ) -# 24565 "parsing/parser.ml" - : (Parsetree.pattern * Parsetree.expression * Parsetree.binding_op list)) - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (Parsetree.class_declaration list) = -# 216 "" - ( [] ) -# 24584 "parsing/parser.ml" - in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined1_ in + let _v = + let _3 = + let _1 = _1_inlined1 in + +# 3112 "parsing/parser.mly" + ( None, _1 ) +# 24882 "parsing/parser.ml" + + in + let _1 = + let _startpos__2_ = _startpos__2_inlined1_ in + let _endpos = _endpos__6_ in + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +# 3133 "parsing/parser.mly" + ( let lbl_loc = _loc_label_ in + let pat_loc = _startpos__2_, _endpos in + let pat = mkpatvar ~loc:lbl_loc label in + Some label, mkpat ~loc:pat_loc (Ppat_constraint(pat, cty)) ) +# 24895 "parsing/parser.ml" + + in + ( +# 3142 "parsing/parser.mly" + ( [ _3; _1 ] ) +# 24901 "parsing/parser.ml" + : ((string option * Parsetree.pattern) list)) + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -24593,45 +24911,51 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _2_inlined2; + MenhirLib.EngineTypes.startp = _startpos__2_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = body; - MenhirLib.EngineTypes.startp = _startpos_body_; - MenhirLib.EngineTypes.endp = _endpos_body_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = params; - MenhirLib.EngineTypes.startp = _startpos_params_; - MenhirLib.EngineTypes.endp = _endpos_params_; + MenhirLib.EngineTypes.semv = cty; + MenhirLib.EngineTypes.startp = _startpos_cty_; + MenhirLib.EngineTypes.endp = _endpos_cty_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = virt; - MenhirLib.EngineTypes.startp = _startpos_virt_; - MenhirLib.EngineTypes.endp = _endpos_virt_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; }; }; @@ -24640,71 +24964,53 @@ module Tables = struct }; }; } = _menhir_stack in - let xs : (Parsetree.class_declaration list) = Obj.magic xs in - let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let body : (Parsetree.class_expr) = Obj.magic body in - let _1_inlined2 : ( -# 797 "parsing/parser.mly" + let _2_inlined2 : (Parsetree.pattern) = Obj.magic _2_inlined2 in + let _1_inlined1 : ( +# 772 "parsing/parser.mly" (string) -# 24650 "parsing/parser.ml" - ) = Obj.magic _1_inlined2 in - let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in - let virt : (Asttypes.virtual_flag) = Obj.magic virt in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in +# 24972 "parsing/parser.ml" + ) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _6 : unit = Obj.magic _6 in + let cty : (Parsetree.core_type) = Obj.magic cty in + let _4 : unit = Obj.magic _4 in + let label : ( +# 785 "parsing/parser.mly" + (string) +# 24981 "parsing/parser.ml" + ) = Obj.magic label in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_xs_ in + let _endpos = _endpos__2_inlined2_ in let _v = - let x = - let attrs2 = - let _1 = _1_inlined3 in - -# 4110 "parsing/parser.mly" - ( _1 ) -# 24666 "parsing/parser.ml" - - in - let _endpos_attrs2_ = _endpos__1_inlined3_ in - let id = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 984 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 24678 "parsing/parser.ml" - - in - let attrs1 = - let _1 = _1_inlined1 in - -# 4114 "parsing/parser.mly" - ( _1 ) -# 24686 "parsing/parser.ml" - - in - let _endpos = _endpos_attrs2_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _3 = + let (_2, _1) = (_2_inlined2, _1_inlined1) in -# 1966 "parsing/parser.mly" - ( - let attrs = attrs1 @ attrs2 in - let loc = make_loc _sloc in - let docs = symbol_docs _sloc in - let text = symbol_text _symbolstartpos in - Ci.mk id body ~virt ~params ~attrs ~loc ~text ~docs - ) -# 24701 "parsing/parser.ml" +# 3114 "parsing/parser.mly" + ( Some _1, _2 ) +# 24994 "parsing/parser.ml" + + in + let _1 = + let _startpos__2_ = _startpos__2_inlined1_ in + let _endpos = _endpos__6_ in + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +# 3133 "parsing/parser.mly" + ( let lbl_loc = _loc_label_ in + let pat_loc = _startpos__2_, _endpos in + let pat = mkpatvar ~loc:lbl_loc label in + Some label, mkpat ~loc:pat_loc (Ppat_constraint(pat, cty)) ) +# 25007 "parsing/parser.ml" in ( -# 219 "" - ( x :: xs ) -# 24707 "parsing/parser.ml" - : (Parsetree.class_declaration list)) +# 3142 "parsing/parser.mly" + ( [ _3; _1 ] ) +# 25013 "parsing/parser.ml" + : ((string option * Parsetree.pattern) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24713,41 +25019,23 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos; MenhirLib.EngineTypes.next = _menhir_stack; }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (Parsetree.class_description list) = -# 216 "" - ( [] ) -# 24726 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = label_inlined1; + MenhirLib.EngineTypes.startp = _startpos_label_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_label_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = cty; - MenhirLib.EngineTypes.startp = _startpos_cty_; - MenhirLib.EngineTypes.endp = _endpos_cty_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _6; @@ -24755,24 +25043,24 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__6_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = cty; + MenhirLib.EngineTypes.startp = _startpos_cty_; + MenhirLib.EngineTypes.endp = _endpos_cty_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = params; - MenhirLib.EngineTypes.startp = _startpos_params_; - MenhirLib.EngineTypes.endp = _endpos_params_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = virt; - MenhirLib.EngineTypes.startp = _startpos_virt_; - MenhirLib.EngineTypes.endp = _endpos_virt_; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -24788,72 +25076,55 @@ module Tables = struct }; }; } = _menhir_stack in - let xs : (Parsetree.class_description list) = Obj.magic xs in - let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let cty : (Parsetree.class_type) = Obj.magic cty in + let label_inlined1 : ( +# 785 "parsing/parser.mly" + (string) +# 25083 "parsing/parser.ml" + ) = Obj.magic label_inlined1 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in let _6 : unit = Obj.magic _6 in - let _1_inlined2 : ( -# 797 "parsing/parser.mly" + let cty : (Parsetree.core_type) = Obj.magic cty in + let _4 : unit = Obj.magic _4 in + let label : ( +# 785 "parsing/parser.mly" (string) -# 24799 "parsing/parser.ml" - ) = Obj.magic _1_inlined2 in - let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in - let virt : (Asttypes.virtual_flag) = Obj.magic virt in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in +# 25093 "parsing/parser.ml" + ) = Obj.magic label in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_xs_ in + let _endpos = _endpos_label_inlined1_ in let _v = - let x = - let attrs2 = - let _1 = _1_inlined3 in - -# 4110 "parsing/parser.mly" - ( _1 ) -# 24815 "parsing/parser.ml" - - in - let _endpos_attrs2_ = _endpos__1_inlined3_ in - let id = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 984 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 24827 "parsing/parser.ml" - - in - let attrs1 = - let _1 = _1_inlined1 in - -# 4114 "parsing/parser.mly" - ( _1 ) -# 24835 "parsing/parser.ml" - - in - let _endpos = _endpos_attrs2_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _3 = + let (_endpos_label_, _startpos_label_, label) = (_endpos_label_inlined1_, _startpos_label_inlined1_, label_inlined1) in + let _loc_label_ = (_startpos_label_, _endpos_label_) in -# 2257 "parsing/parser.mly" - ( - let attrs = attrs1 @ attrs2 in - let loc = make_loc _sloc in - let docs = symbol_docs _sloc in - let text = symbol_text _symbolstartpos in - Ci.mk id cty ~virt ~params ~attrs ~loc ~text ~docs - ) -# 24850 "parsing/parser.ml" +# 3116 "parsing/parser.mly" + ( let loc = _loc_label_ in + Some label, mkpatvar ~loc label ) +# 25108 "parsing/parser.ml" + + in + let _1 = + let _startpos__2_ = _startpos__2_inlined1_ in + let _endpos = _endpos__6_ in + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +# 3133 "parsing/parser.mly" + ( let lbl_loc = _loc_label_ in + let pat_loc = _startpos__2_, _endpos in + let pat = mkpatvar ~loc:lbl_loc label in + Some label, mkpat ~loc:pat_loc (Ppat_constraint(pat, cty)) ) +# 25121 "parsing/parser.ml" in ( -# 219 "" - ( x :: xs ) -# 24856 "parsing/parser.ml" - : (Parsetree.class_description list)) +# 3142 "parsing/parser.mly" + ( [ _3; _1 ] ) +# 25127 "parsing/parser.ml" + : ((string option * Parsetree.pattern) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24862,72 +25133,78 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos; MenhirLib.EngineTypes.next = _menhir_stack; }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (Parsetree.class_type_declaration list) = -# 216 "" - ( [] ) -# 24875 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _6_inlined1; + MenhirLib.EngineTypes.startp = _startpos__6_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__6_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = cty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_cty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_cty_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = csig; - MenhirLib.EngineTypes.startp = _startpos_csig_; - MenhirLib.EngineTypes.endp = _endpos_csig_; + MenhirLib.EngineTypes.semv = _4_inlined1; + MenhirLib.EngineTypes.startp = _startpos__4_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__4_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _6; - MenhirLib.EngineTypes.startp = _startpos__6_; - MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.semv = label_inlined1; + MenhirLib.EngineTypes.startp = _startpos_label_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_label_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _2_inlined2; + MenhirLib.EngineTypes.startp = _startpos__2_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = params; - MenhirLib.EngineTypes.startp = _startpos_params_; - MenhirLib.EngineTypes.endp = _endpos_params_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = virt; - MenhirLib.EngineTypes.startp = _startpos_virt_; - MenhirLib.EngineTypes.endp = _endpos_virt_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = cty; + MenhirLib.EngineTypes.startp = _startpos_cty_; + MenhirLib.EngineTypes.endp = _endpos_cty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; }; }; }; @@ -24937,72 +25214,62 @@ module Tables = struct }; }; } = _menhir_stack in - let xs : (Parsetree.class_type_declaration list) = Obj.magic xs in - let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let csig : (Parsetree.class_type) = Obj.magic csig in + let _6_inlined1 : unit = Obj.magic _6_inlined1 in + let cty_inlined1 : (Parsetree.core_type) = Obj.magic cty_inlined1 in + let _4_inlined1 : unit = Obj.magic _4_inlined1 in + let label_inlined1 : ( +# 785 "parsing/parser.mly" + (string) +# 25224 "parsing/parser.ml" + ) = Obj.magic label_inlined1 in + let _2_inlined2 : unit = Obj.magic _2_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in let _6 : unit = Obj.magic _6 in - let _1_inlined2 : ( -# 797 "parsing/parser.mly" + let cty : (Parsetree.core_type) = Obj.magic cty in + let _4 : unit = Obj.magic _4 in + let label : ( +# 785 "parsing/parser.mly" (string) -# 24948 "parsing/parser.ml" - ) = Obj.magic _1_inlined2 in - let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in - let virt : (Asttypes.virtual_flag) = Obj.magic virt in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in +# 25235 "parsing/parser.ml" + ) = Obj.magic label in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_xs_ in + let _endpos = _endpos__6_inlined1_ in let _v = - let x = - let attrs2 = - let _1 = _1_inlined3 in - -# 4110 "parsing/parser.mly" - ( _1 ) -# 24964 "parsing/parser.ml" - - in - let _endpos_attrs2_ = _endpos__1_inlined3_ in - let id = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 984 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 24976 "parsing/parser.ml" - - in - let attrs1 = - let _1 = _1_inlined1 in - -# 4114 "parsing/parser.mly" - ( _1 ) -# 24984 "parsing/parser.ml" - - in - let _endpos = _endpos_attrs2_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _3 = + let (_endpos_label_, _startpos_label_, _endpos__6_, _startpos__2_, cty, label) = (_endpos_label_inlined1_, _startpos_label_inlined1_, _endpos__6_inlined1_, _startpos__2_inlined2_, cty_inlined1, label_inlined1) in + let _endpos = _endpos__6_ in + let _loc_label_ = (_startpos_label_, _endpos_label_) in -# 2296 "parsing/parser.mly" - ( - let attrs = attrs1 @ attrs2 in - let loc = make_loc _sloc in - let docs = symbol_docs _sloc in - let text = symbol_text _symbolstartpos in - Ci.mk id csig ~virt ~params ~attrs ~loc ~text ~docs - ) -# 24999 "parsing/parser.ml" +# 3119 "parsing/parser.mly" + ( let lbl_loc = _loc_label_ in + let pat_loc = _startpos__2_, _endpos in + let pat = mkpatvar ~loc:lbl_loc label in + Some label, mkpat ~loc:pat_loc (Ppat_constraint(pat, cty)) ) +# 25253 "parsing/parser.ml" + + in + let _1 = + let _startpos__2_ = _startpos__2_inlined1_ in + let _endpos = _endpos__6_ in + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +# 3133 "parsing/parser.mly" + ( let lbl_loc = _loc_label_ in + let pat_loc = _startpos__2_, _endpos in + let pat = mkpatvar ~loc:lbl_loc label in + Some label, mkpat ~loc:pat_loc (Ppat_constraint(pat, cty)) ) +# 25266 "parsing/parser.ml" in ( -# 219 "" - ( x :: xs ) -# 25005 "parsing/parser.ml" - : (Parsetree.class_type_declaration list)) +# 3142 "parsing/parser.mly" + ( [ _3; _1 ] ) +# 25272 "parsing/parser.ml" + : ((string option * Parsetree.pattern) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25013,15 +25280,39 @@ module Tables = struct }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (Parsetree.module_binding list) = -# 216 "" - ( [] ) -# 25024 "parsing/parser.ml" - in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v = + let _loc__3_ = (_startpos__3_, _endpos__3_) in + ( +# 3144 "parsing/parser.mly" + ( expecting _loc__3_ "pattern" ) +# 25314 "parsing/parser.ml" + : ((string option * Parsetree.pattern) list)) + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -25033,100 +25324,43 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = body; - MenhirLib.EngineTypes.startp = _startpos_body_; - MenhirLib.EngineTypes.endp = _endpos_body_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; - } = _menhir_stack in - let xs : (Parsetree.module_binding list) = Obj.magic xs in - let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let body : (Parsetree.module_expr) = Obj.magic body in - let _1_inlined2 : (string option) = Obj.magic _1_inlined2 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let _1 : unit = Obj.magic _1 in + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _1_inlined1 : (Parsetree.pattern) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : ((string option * Parsetree.pattern) list) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_xs_ in + let _endpos = _endpos__1_inlined1_ in let _v = - let x = - let attrs2 = - let _1 = _1_inlined3 in - -# 4110 "parsing/parser.mly" - ( _1 ) -# 25088 "parsing/parser.ml" - - in - let _endpos_attrs2_ = _endpos__1_inlined3_ in - let name = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 984 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 25100 "parsing/parser.ml" - - in - let attrs1 = - let _1 = _1_inlined1 in - -# 4114 "parsing/parser.mly" - ( _1 ) -# 25108 "parsing/parser.ml" - - in - let _endpos = _endpos_attrs2_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _3 = + let _1 = _1_inlined1 in -# 1624 "parsing/parser.mly" - ( - let loc = make_loc _sloc in - let attrs = attrs1 @ attrs2 in - let docs = symbol_docs _sloc in - let text = symbol_text _symbolstartpos in - Mb.mk name body ~attrs ~loc ~text ~docs - ) -# 25123 "parsing/parser.ml" +# 3112 "parsing/parser.mly" + ( None, _1 ) +# 25357 "parsing/parser.ml" in ( -# 219 "" - ( x :: xs ) -# 25129 "parsing/parser.ml" - : (Parsetree.module_binding list)) +# 3140 "parsing/parser.mly" + ( _3 :: _1 ) +# 25363 "parsing/parser.ml" + : ((string option * Parsetree.pattern) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25137,15 +25371,57 @@ module Tables = struct }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let _2_inlined1 : (Parsetree.pattern) = Obj.magic _2_inlined1 in + let _1_inlined1 : ( +# 772 "parsing/parser.mly" + (string) +# 25404 "parsing/parser.ml" + ) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : ((string option * Parsetree.pattern) list) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (Parsetree.module_declaration list) = -# 216 "" - ( [] ) -# 25148 "parsing/parser.ml" - in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_inlined1_ in + let _v = + let _3 = + let (_2, _1) = (_2_inlined1, _1_inlined1) in + +# 3114 "parsing/parser.mly" + ( Some _1, _2 ) +# 25417 "parsing/parser.ml" + + in + ( +# 3140 "parsing/parser.mly" + ( _3 :: _1 ) +# 25423 "parsing/parser.ml" + : ((string option * Parsetree.pattern) list)) + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -25157,40 +25433,107 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = mty; - MenhirLib.EngineTypes.startp = _startpos_mty_; - MenhirLib.EngineTypes.endp = _endpos_mty_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let label : ( +# 785 "parsing/parser.mly" + (string) +# 25463 "parsing/parser.ml" + ) = Obj.magic label in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : ((string option * Parsetree.pattern) list) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos_label_ in + let _v = + let _3 = + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +# 3116 "parsing/parser.mly" + ( let loc = _loc_label_ in + Some label, mkpatvar ~loc label ) +# 25478 "parsing/parser.ml" + + in + ( +# 3140 "parsing/parser.mly" + ( _3 :: _1 ) +# 25484 "parsing/parser.ml" + : ((string option * Parsetree.pattern) list)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = cty; + MenhirLib.EngineTypes.startp = _startpos_cty_; + MenhirLib.EngineTypes.endp = _endpos_cty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1_inlined1; MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; }; }; @@ -25198,66 +25541,40 @@ module Tables = struct }; }; } = _menhir_stack in - let xs : (Parsetree.module_declaration list) = Obj.magic xs in - let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let mty : (Parsetree.module_type) = Obj.magic mty in + let _6 : unit = Obj.magic _6 in + let cty : (Parsetree.core_type) = Obj.magic cty in let _4 : unit = Obj.magic _4 in - let _1_inlined2 : (string option) = Obj.magic _1_inlined2 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let _1 : unit = Obj.magic _1 in + let label : ( +# 785 "parsing/parser.mly" + (string) +# 25551 "parsing/parser.ml" + ) = Obj.magic label in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : ((string option * Parsetree.pattern) list) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_xs_ in + let _endpos = _endpos__6_ in let _v = - let x = - let attrs2 = - let _1 = _1_inlined3 in - -# 4110 "parsing/parser.mly" - ( _1 ) -# 25219 "parsing/parser.ml" - - in - let _endpos_attrs2_ = _endpos__1_inlined3_ in - let name = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 984 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 25231 "parsing/parser.ml" - - in - let attrs1 = - let _1 = _1_inlined1 in - -# 4114 "parsing/parser.mly" - ( _1 ) -# 25239 "parsing/parser.ml" - - in - let _endpos = _endpos_attrs2_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _3 = + let _startpos__2_ = _startpos__2_inlined1_ in + let _endpos = _endpos__6_ in + let _loc_label_ = (_startpos_label_, _endpos_label_) in -# 1907 "parsing/parser.mly" - ( - let attrs = attrs1 @ attrs2 in - let docs = symbol_docs _sloc in - let loc = make_loc _sloc in - let text = symbol_text _symbolstartpos in - Md.mk name mty ~attrs ~loc ~text ~docs - ) -# 25254 "parsing/parser.ml" +# 3119 "parsing/parser.mly" + ( let lbl_loc = _loc_label_ in + let pat_loc = _startpos__2_, _endpos in + let pat = mkpatvar ~loc:lbl_loc label in + Some label, mkpat ~loc:pat_loc (Ppat_constraint(pat, cty)) ) +# 25571 "parsing/parser.ml" in ( -# 219 "" - ( x :: xs ) -# 25260 "parsing/parser.ml" - : (Parsetree.module_declaration list)) +# 3140 "parsing/parser.mly" + ( _3 :: _1 ) +# 25577 "parsing/parser.ml" + : ((string option * Parsetree.pattern) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25268,15 +25585,51 @@ module Tables = struct }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _1_inlined1 : (Parsetree.pattern) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (Parsetree.attributes) = -# 216 "" - ( [] ) -# 25279 "parsing/parser.ml" - in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined1_ in + let _v = + let _3 = + let _1 = _1_inlined1 in + +# 3112 "parsing/parser.mly" + ( None, _1 ) +# 25620 "parsing/parser.ml" + + in + let _1 = +# 3126 "parsing/parser.mly" + ( None, _1 ) +# 25626 "parsing/parser.ml" + in + ( +# 3142 "parsing/parser.mly" + ( [ _3; _1 ] ) +# 25631 "parsing/parser.ml" + : ((string option * Parsetree.pattern) list)) + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -25288,27 +25641,60 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; }; } = _menhir_stack in - let xs : (Parsetree.attributes) = Obj.magic xs in - let x : (Parsetree.attribute) = Obj.magic x in + let _2_inlined1 : (Parsetree.pattern) = Obj.magic _2_inlined1 in + let _1_inlined1 : ( +# 772 "parsing/parser.mly" + (string) +# 25672 "parsing/parser.ml" + ) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_x_ in - let _endpos = _endpos_xs_ in - let _v : (Parsetree.attributes) = -# 219 "" - ( x :: xs ) -# 25311 "parsing/parser.ml" - in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_inlined1_ in + let _v = + let _3 = + let (_2, _1) = (_2_inlined1, _1_inlined1) in + +# 3114 "parsing/parser.mly" + ( Some _1, _2 ) +# 25685 "parsing/parser.ml" + + in + let _1 = +# 3126 "parsing/parser.mly" + ( None, _1 ) +# 25691 "parsing/parser.ml" + in + ( +# 3142 "parsing/parser.mly" + ( [ _3; _1 ] ) +# 25696 "parsing/parser.ml" + : ((string option * Parsetree.pattern) list)) + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -25318,15 +25704,63 @@ module Tables = struct }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let label : ( +# 785 "parsing/parser.mly" + (string) +# 25736 "parsing/parser.ml" + ) = Obj.magic label in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (Parsetree.type_declaration list) = -# 216 "" - ( [] ) -# 25329 "parsing/parser.ml" - in + let _startpos = _startpos__1_ in + let _endpos = _endpos_label_ in + let _v = + let _3 = + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +# 3116 "parsing/parser.mly" + ( let loc = _loc_label_ in + Some label, mkpatvar ~loc label ) +# 25751 "parsing/parser.ml" + + in + let _1 = +# 3126 "parsing/parser.mly" + ( None, _1 ) +# 25757 "parsing/parser.ml" + in + ( +# 3142 "parsing/parser.mly" + ( [ _3; _1 ] ) +# 25762 "parsing/parser.ml" + : ((string option * Parsetree.pattern) list)) + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -25338,39 +25772,39 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = cty; + MenhirLib.EngineTypes.startp = _startpos_cty_; + MenhirLib.EngineTypes.endp = _endpos_cty_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs_inlined1; - MenhirLib.EngineTypes.startp = _startpos_xs_inlined1_; - MenhirLib.EngineTypes.endp = _endpos_xs_inlined1_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = kind_priv_manifest; - MenhirLib.EngineTypes.startp = _startpos_kind_priv_manifest_; - MenhirLib.EngineTypes.endp = _endpos_kind_priv_manifest_; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = params; - MenhirLib.EngineTypes.startp = _startpos_params_; - MenhirLib.EngineTypes.endp = _endpos_params_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -25385,92 +25819,45 @@ module Tables = struct }; }; } = _menhir_stack in - let xs : (Parsetree.type_declaration list) = Obj.magic xs in - let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let xs_inlined1 : ((Parsetree.core_type * Parsetree.core_type * Ast_helper.loc) list) = Obj.magic xs_inlined1 in - let kind_priv_manifest : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = Obj.magic kind_priv_manifest in - let _1_inlined2 : ( -# 797 "parsing/parser.mly" + let _6 : unit = Obj.magic _6 in + let cty : (Parsetree.core_type) = Obj.magic cty in + let _4 : unit = Obj.magic _4 in + let label : ( +# 785 "parsing/parser.mly" (string) -# 25396 "parsing/parser.ml" - ) = Obj.magic _1_inlined2 in - let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let _1 : unit = Obj.magic _1 in +# 25829 "parsing/parser.ml" + ) = Obj.magic label in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_xs_ in + let _endpos = _endpos__6_ in let _v = - let x = - let xs = xs_inlined1 in - let attrs2 = - let _1 = _1_inlined3 in - -# 4110 "parsing/parser.mly" - ( _1 ) -# 25412 "parsing/parser.ml" - - in - let _endpos_attrs2_ = _endpos__1_inlined3_ in - let cstrs = - let _1 = - let xs = -# 264 "" - ( List.rev xs ) -# 25421 "parsing/parser.ml" - in - -# 1068 "parsing/parser.mly" - ( xs ) -# 25426 "parsing/parser.ml" - - in - -# 3183 "parsing/parser.mly" - ( _1 ) -# 25432 "parsing/parser.ml" - - in - let id = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 984 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 25443 "parsing/parser.ml" - - in - let attrs1 = - let _1 = _1_inlined1 in - -# 4114 "parsing/parser.mly" - ( _1 ) -# 25451 "parsing/parser.ml" - - in - let _endpos = _endpos_attrs2_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _3 = + let _startpos__2_ = _startpos__2_inlined1_ in + let _endpos = _endpos__6_ in + let _loc_label_ = (_startpos_label_, _endpos_label_) in -# 3172 "parsing/parser.mly" - ( - let (kind, priv, manifest) = kind_priv_manifest in - let docs = symbol_docs _sloc in - let attrs = attrs1 @ attrs2 in - let loc = make_loc _sloc in - let text = symbol_text _symbolstartpos in - Type.mk id ~params ~cstrs ~kind ~priv ?manifest ~attrs ~loc ~docs ~text - ) -# 25467 "parsing/parser.ml" +# 3119 "parsing/parser.mly" + ( let lbl_loc = _loc_label_ in + let pat_loc = _startpos__2_, _endpos in + let pat = mkpatvar ~loc:lbl_loc label in + Some label, mkpat ~loc:pat_loc (Ppat_constraint(pat, cty)) ) +# 25849 "parsing/parser.ml" in + let _1 = +# 3126 "parsing/parser.mly" + ( None, _1 ) +# 25855 "parsing/parser.ml" + in ( -# 219 "" - ( x :: xs ) -# 25473 "parsing/parser.ml" - : (Parsetree.type_declaration list)) +# 3142 "parsing/parser.mly" + ( [ _3; _1 ] ) +# 25860 "parsing/parser.ml" + : ((string option * Parsetree.pattern) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25479,173 +25866,66 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos; MenhirLib.EngineTypes.next = _menhir_stack; }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (Parsetree.type_declaration list) = -# 216 "" - ( [] ) -# 25492 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined4; - MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs_inlined1; - MenhirLib.EngineTypes.startp = _startpos_xs_inlined1_; - MenhirLib.EngineTypes.endp = _endpos_xs_inlined1_; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = params; - MenhirLib.EngineTypes.startp = _startpos_params_; - MenhirLib.EngineTypes.endp = _endpos_params_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; } = _menhir_stack in - let xs : (Parsetree.type_declaration list) = Obj.magic xs in - let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in - let xs_inlined1 : ((Parsetree.core_type * Parsetree.core_type * Ast_helper.loc) list) = Obj.magic xs_inlined1 in - let _2 : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = Obj.magic _2 in - let _1_inlined3 : unit = Obj.magic _1_inlined3 in - let _1_inlined2 : ( -# 797 "parsing/parser.mly" + let _1_inlined1 : (Parsetree.pattern) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _2_inlined1 : (Parsetree.pattern) = Obj.magic _2_inlined1 in + let _1 : ( +# 772 "parsing/parser.mly" (string) -# 25566 "parsing/parser.ml" - ) = Obj.magic _1_inlined2 in - let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let _1 : unit = Obj.magic _1 in +# 25903 "parsing/parser.ml" + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_xs_ in + let _endpos = _endpos__1_inlined1_ in let _v = - let x = - let xs = xs_inlined1 in - let attrs2 = - let _1 = _1_inlined4 in - -# 4110 "parsing/parser.mly" - ( _1 ) -# 25582 "parsing/parser.ml" - - in - let _endpos_attrs2_ = _endpos__1_inlined4_ in - let cstrs = - let _1 = - let xs = -# 264 "" - ( List.rev xs ) -# 25591 "parsing/parser.ml" - in - -# 1068 "parsing/parser.mly" - ( xs ) -# 25596 "parsing/parser.ml" - - in - -# 3183 "parsing/parser.mly" - ( _1 ) -# 25602 "parsing/parser.ml" - - in - let kind_priv_manifest = -# 3218 "parsing/parser.mly" - ( _2 ) -# 25608 "parsing/parser.ml" - in - let id = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 984 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 25618 "parsing/parser.ml" - - in - let attrs1 = - let _1 = _1_inlined1 in - -# 4114 "parsing/parser.mly" - ( _1 ) -# 25626 "parsing/parser.ml" - - in - let _endpos = _endpos_attrs2_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _3 = + let _1 = _1_inlined1 in -# 3172 "parsing/parser.mly" - ( - let (kind, priv, manifest) = kind_priv_manifest in - let docs = symbol_docs _sloc in - let attrs = attrs1 @ attrs2 in - let loc = make_loc _sloc in - let text = symbol_text _symbolstartpos in - Type.mk id ~params ~cstrs ~kind ~priv ?manifest ~attrs ~loc ~docs ~text - ) -# 25642 "parsing/parser.ml" +# 3112 "parsing/parser.mly" + ( None, _1 ) +# 25914 "parsing/parser.ml" + + in + let _1 = + let _2 = _2_inlined1 in + +# 3128 "parsing/parser.mly" + ( Some _1, _2 ) +# 25922 "parsing/parser.ml" in ( -# 219 "" - ( x :: xs ) -# 25648 "parsing/parser.ml" - : (Parsetree.type_declaration list)) +# 3142 "parsing/parser.mly" + ( [ _3; _1 ] ) +# 25928 "parsing/parser.ml" + : ((string option * Parsetree.pattern) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25654,67 +25934,78 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos; MenhirLib.EngineTypes.next = _menhir_stack; }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (Parsetree.attributes) = -# 216 "" - ( [] ) -# 25667 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _2_inlined2; + MenhirLib.EngineTypes.startp = _startpos__2_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; }; } = _menhir_stack in - let xs : (Parsetree.attributes) = Obj.magic xs in - let x : (Parsetree.attribute) = Obj.magic x in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_x_ in - let _endpos = _endpos_xs_ in - let _v : (Parsetree.attributes) = -# 219 "" - ( x :: xs ) -# 25699 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in + let _2_inlined2 : (Parsetree.pattern) = Obj.magic _2_inlined2 in + let _1_inlined1 : ( +# 772 "parsing/parser.mly" + (string) +# 25975 "parsing/parser.ml" + ) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _2_inlined1 : (Parsetree.pattern) = Obj.magic _2_inlined1 in + let _1 : ( +# 772 "parsing/parser.mly" + (string) +# 25982 "parsing/parser.ml" + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (Parsetree.signature_item list list) = -# 216 "" - ( [] ) -# 25717 "parsing/parser.ml" - in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_inlined2_ in + let _v = + let _3 = + let (_2, _1) = (_2_inlined2, _1_inlined1) in + +# 3114 "parsing/parser.mly" + ( Some _1, _2 ) +# 25993 "parsing/parser.ml" + + in + let _1 = + let _2 = _2_inlined1 in + +# 3128 "parsing/parser.mly" + ( Some _1, _2 ) +# 26001 "parsing/parser.ml" + + in + ( +# 3142 "parsing/parser.mly" + ( [ _3; _1 ] ) +# 26007 "parsing/parser.ml" + : ((string option * Parsetree.pattern) list)) + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -25726,43 +26017,74 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; }; } = _menhir_stack in - let xs : (Parsetree.signature_item list list) = Obj.magic xs in - let _1 : unit = Obj.magic _1 in + let label : ( +# 785 "parsing/parser.mly" + (string) +# 26053 "parsing/parser.ml" + ) = Obj.magic label in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _2_inlined1 : (Parsetree.pattern) = Obj.magic _2_inlined1 in + let _1 : ( +# 772 "parsing/parser.mly" + (string) +# 26061 "parsing/parser.ml" + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_xs_ in + let _endpos = _endpos_label_ in let _v = - let x = - let _1 = - let _startpos = _startpos__1_ in - -# 994 "parsing/parser.mly" - ( text_sig _startpos ) -# 25753 "parsing/parser.ml" - - in + let _3 = + let _loc_label_ = (_startpos_label_, _endpos_label_) in -# 1764 "parsing/parser.mly" - ( _1 ) -# 25759 "parsing/parser.ml" +# 3116 "parsing/parser.mly" + ( let loc = _loc_label_ in + Some label, mkpatvar ~loc label ) +# 26073 "parsing/parser.ml" + + in + let _1 = + let _2 = _2_inlined1 in + +# 3128 "parsing/parser.mly" + ( Some _1, _2 ) +# 26081 "parsing/parser.ml" in ( -# 219 "" - ( x :: xs ) -# 25765 "parsing/parser.ml" - : (Parsetree.signature_item list list)) +# 3142 "parsing/parser.mly" + ( [ _3; _1 ] ) +# 26087 "parsing/parser.ml" + : ((string option * Parsetree.pattern) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25775,43 +26097,106 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = cty; + MenhirLib.EngineTypes.startp = _startpos_cty_; + MenhirLib.EngineTypes.endp = _endpos_cty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined2; + MenhirLib.EngineTypes.startp = _startpos__2_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; }; } = _menhir_stack in - let xs : (Parsetree.signature_item list list) = Obj.magic xs in - let _1 : (Parsetree.signature_item) = Obj.magic _1 in + let _6 : unit = Obj.magic _6 in + let cty : (Parsetree.core_type) = Obj.magic cty in + let _4 : unit = Obj.magic _4 in + let label : ( +# 785 "parsing/parser.mly" + (string) +# 26160 "parsing/parser.ml" + ) = Obj.magic label in + let _2_inlined2 : unit = Obj.magic _2_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _2_inlined1 : (Parsetree.pattern) = Obj.magic _2_inlined1 in + let _1 : ( +# 772 "parsing/parser.mly" + (string) +# 26169 "parsing/parser.ml" + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_xs_ in + let _endpos = _endpos__6_ in let _v = - let x = - let _1 = - let _startpos = _startpos__1_ in - -# 992 "parsing/parser.mly" - ( text_sig _startpos @ [_1] ) -# 25802 "parsing/parser.ml" - - in + let _3 = + let _startpos__2_ = _startpos__2_inlined2_ in + let _endpos = _endpos__6_ in + let _loc_label_ = (_startpos_label_, _endpos_label_) in -# 1764 "parsing/parser.mly" - ( _1 ) -# 25808 "parsing/parser.ml" +# 3119 "parsing/parser.mly" + ( let lbl_loc = _loc_label_ in + let pat_loc = _startpos__2_, _endpos in + let pat = mkpatvar ~loc:lbl_loc label in + Some label, mkpat ~loc:pat_loc (Ppat_constraint(pat, cty)) ) +# 26185 "parsing/parser.ml" + + in + let _1 = + let _2 = _2_inlined1 in + +# 3128 "parsing/parser.mly" + ( Some _1, _2 ) +# 26193 "parsing/parser.ml" in ( -# 219 "" - ( x :: xs ) -# 25814 "parsing/parser.ml" - : (Parsetree.signature_item list list)) +# 3142 "parsing/parser.mly" + ( [ _3; _1 ] ) +# 26199 "parsing/parser.ml" + : ((string option * Parsetree.pattern) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25820,84 +26205,67 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos; MenhirLib.EngineTypes.next = _menhir_stack; }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (Parsetree.structure_item list list) = -# 216 "" - ( [] ) -# 25833 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; }; } = _menhir_stack in - let xs : (Parsetree.structure_item list list) = Obj.magic xs in + let _1_inlined1 : (Parsetree.pattern) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let label : ( +# 785 "parsing/parser.mly" + (string) +# 26241 "parsing/parser.ml" + ) = Obj.magic label in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_xs_ in + let _endpos = _endpos__1_inlined1_ in let _v = - let x = - let _1 = - let ys = - let items = -# 1054 "parsing/parser.mly" - ( [] ) -# 25869 "parsing/parser.ml" - in - -# 1505 "parsing/parser.mly" - ( items ) -# 25874 "parsing/parser.ml" - - in - let xs = - let _startpos = _startpos__1_ in - -# 990 "parsing/parser.mly" - ( text_str _startpos ) -# 25882 "parsing/parser.ml" - - in - -# 278 "" - ( xs @ ys ) -# 25888 "parsing/parser.ml" - - in + let _3 = + let _1 = _1_inlined1 in -# 1521 "parsing/parser.mly" - ( _1 ) -# 25894 "parsing/parser.ml" +# 3112 "parsing/parser.mly" + ( None, _1 ) +# 26253 "parsing/parser.ml" + + in + let _1 = + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +# 3130 "parsing/parser.mly" + ( let loc = _loc_label_ in + Some label, mkpatvar ~loc label ) +# 26262 "parsing/parser.ml" in ( -# 219 "" - ( x :: xs ) -# 25900 "parsing/parser.ml" - : (Parsetree.structure_item list list)) +# 3142 "parsing/parser.mly" + ( [ _3; _1 ] ) +# 26268 "parsing/parser.ml" + : ((string option * Parsetree.pattern) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25910,9 +26278,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1_inlined1; @@ -25920,150 +26288,64 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = e; - MenhirLib.EngineTypes.startp = _startpos_e_; - MenhirLib.EngineTypes.endp = _endpos_e_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; }; }; } = _menhir_stack in - let xs : (Parsetree.structure_item list list) = Obj.magic xs in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let e : (Parsetree.expression) = Obj.magic e in - let _1 : unit = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos_xs_ in + let _2_inlined1 : (Parsetree.pattern) = Obj.magic _2_inlined1 in + let _1_inlined1 : ( +# 772 "parsing/parser.mly" + (string) +# 26315 "parsing/parser.ml" + ) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let label : ( +# 785 "parsing/parser.mly" + (string) +# 26321 "parsing/parser.ml" + ) = Obj.magic label in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_inlined1_ in let _v = - let x = - let _1 = - let ys = - let (_endpos__1_, _1) = (_endpos__1_inlined1_, _1_inlined1) in - let items = - let x = - let _1 = - let _1 = - let attrs = -# 4110 "parsing/parser.mly" - ( _1 ) -# 25956 "parsing/parser.ml" - in - -# 1512 "parsing/parser.mly" - ( mkstrexp e attrs ) -# 25961 "parsing/parser.ml" - - in - let _startpos__1_ = _startpos_e_ in - let _startpos = _startpos__1_ in - -# 988 "parsing/parser.mly" - ( text_str _startpos @ [_1] ) -# 25969 "parsing/parser.ml" - - in - let _startpos__1_ = _startpos_e_ in - let _endpos = _endpos__1_ in - let _startpos = _startpos__1_ in - -# 1007 "parsing/parser.mly" - ( mark_rhs_docs _startpos _endpos; - _1 ) -# 25979 "parsing/parser.ml" - - in - -# 1056 "parsing/parser.mly" - ( x ) -# 25985 "parsing/parser.ml" - - in - -# 1505 "parsing/parser.mly" - ( items ) -# 25991 "parsing/parser.ml" - - in - let xs = - let _startpos = _startpos__1_ in - -# 990 "parsing/parser.mly" - ( text_str _startpos ) -# 25999 "parsing/parser.ml" - - in - -# 278 "" - ( xs @ ys ) -# 26005 "parsing/parser.ml" - - in + let _3 = + let (_2, _1) = (_2_inlined1, _1_inlined1) in -# 1521 "parsing/parser.mly" - ( _1 ) -# 26011 "parsing/parser.ml" +# 3114 "parsing/parser.mly" + ( Some _1, _2 ) +# 26333 "parsing/parser.ml" in - ( -# 219 "" - ( x :: xs ) -# 26017 "parsing/parser.ml" - : (Parsetree.structure_item list list)) - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - } = _menhir_stack in - let xs : (Parsetree.structure_item list list) = Obj.magic xs in - let _1 : (Parsetree.structure_item) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos_xs_ in - let _v = - let x = - let _1 = - let _startpos = _startpos__1_ in - -# 988 "parsing/parser.mly" - ( text_str _startpos @ [_1] ) -# 26054 "parsing/parser.ml" - - in + let _1 = + let _loc_label_ = (_startpos_label_, _endpos_label_) in -# 1521 "parsing/parser.mly" - ( _1 ) -# 26060 "parsing/parser.ml" +# 3130 "parsing/parser.mly" + ( let loc = _loc_label_ in + Some label, mkpatvar ~loc label ) +# 26342 "parsing/parser.ml" in ( -# 219 "" - ( x :: xs ) -# 26066 "parsing/parser.ml" - : (Parsetree.structure_item list list)) +# 3142 "parsing/parser.mly" + ( [ _3; _1 ] ) +# 26348 "parsing/parser.ml" + : ((string option * Parsetree.pattern) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26072,58 +26354,80 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos; MenhirLib.EngineTypes.next = _menhir_stack; }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (Parsetree.class_type_field list list) = -# 216 "" - ( [] ) -# 26085 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = label_inlined1; + MenhirLib.EngineTypes.startp = _startpos_label_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_label_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; }; } = _menhir_stack in - let xs : (Parsetree.class_type_field list list) = Obj.magic xs in - let _1 : (Parsetree.class_type_field) = Obj.magic _1 in + let label_inlined1 : ( +# 785 "parsing/parser.mly" + (string) +# 26394 "parsing/parser.ml" + ) = Obj.magic label_inlined1 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let label : ( +# 785 "parsing/parser.mly" + (string) +# 26401 "parsing/parser.ml" + ) = Obj.magic label in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_xs_ in + let _endpos = _endpos_label_inlined1_ in let _v = - let x = - let _startpos = _startpos__1_ in + let _3 = + let (_endpos_label_, _startpos_label_, label) = (_endpos_label_inlined1_, _startpos_label_inlined1_, label_inlined1) in + let _loc_label_ = (_startpos_label_, _endpos_label_) in -# 1002 "parsing/parser.mly" - ( text_csig _startpos @ [_1] ) -# 26120 "parsing/parser.ml" +# 3116 "parsing/parser.mly" + ( let loc = _loc_label_ in + Some label, mkpatvar ~loc label ) +# 26415 "parsing/parser.ml" + + in + let _1 = + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +# 3130 "parsing/parser.mly" + ( let loc = _loc_label_ in + Some label, mkpatvar ~loc label ) +# 26424 "parsing/parser.ml" in ( -# 219 "" - ( x :: xs ) -# 26126 "parsing/parser.ml" - : (Parsetree.class_type_field list list)) +# 3142 "parsing/parser.mly" + ( [ _3; _1 ] ) +# 26430 "parsing/parser.ml" + : ((string option * Parsetree.pattern) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26132,58 +26436,111 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos; MenhirLib.EngineTypes.next = _menhir_stack; }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (Parsetree.class_field list list) = -# 216 "" - ( [] ) -# 26145 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = cty; + MenhirLib.EngineTypes.startp = _startpos_cty_; + MenhirLib.EngineTypes.endp = _endpos_cty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label_inlined1; + MenhirLib.EngineTypes.startp = _startpos_label_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_label_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; }; } = _menhir_stack in - let xs : (Parsetree.class_field list list) = Obj.magic xs in - let _1 : (Parsetree.class_field) = Obj.magic _1 in + let _6 : unit = Obj.magic _6 in + let cty : (Parsetree.core_type) = Obj.magic cty in + let _4 : unit = Obj.magic _4 in + let label_inlined1 : ( +# 785 "parsing/parser.mly" + (string) +# 26503 "parsing/parser.ml" + ) = Obj.magic label_inlined1 in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let label : ( +# 785 "parsing/parser.mly" + (string) +# 26511 "parsing/parser.ml" + ) = Obj.magic label in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_xs_ in + let _endpos = _endpos__6_ in let _v = - let x = - let _startpos = _startpos__1_ in + let _3 = + let (_endpos_label_, _startpos_label_, _startpos__2_, label) = (_endpos_label_inlined1_, _startpos_label_inlined1_, _startpos__2_inlined1_, label_inlined1) in + let _endpos = _endpos__6_ in + let _loc_label_ = (_startpos_label_, _endpos_label_) in -# 1000 "parsing/parser.mly" - ( text_cstr _startpos @ [_1] ) -# 26180 "parsing/parser.ml" +# 3119 "parsing/parser.mly" + ( let lbl_loc = _loc_label_ in + let pat_loc = _startpos__2_, _endpos in + let pat = mkpatvar ~loc:lbl_loc label in + Some label, mkpat ~loc:pat_loc (Ppat_constraint(pat, cty)) ) +# 26528 "parsing/parser.ml" + + in + let _1 = + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +# 3130 "parsing/parser.mly" + ( let loc = _loc_label_ in + Some label, mkpatvar ~loc label ) +# 26537 "parsing/parser.ml" in ( -# 219 "" - ( x :: xs ) -# 26186 "parsing/parser.ml" - : (Parsetree.class_field list list)) +# 3142 "parsing/parser.mly" + ( [ _3; _1 ] ) +# 26543 "parsing/parser.ml" + : ((string option * Parsetree.pattern) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26192,58 +26549,99 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos; MenhirLib.EngineTypes.next = _menhir_stack; }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (Parsetree.structure_item list list) = -# 216 "" - ( [] ) -# 26205 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = cty; + MenhirLib.EngineTypes.startp = _startpos_cty_; + MenhirLib.EngineTypes.endp = _endpos_cty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; }; } = _menhir_stack in - let xs : (Parsetree.structure_item list list) = Obj.magic xs in - let _1 : (Parsetree.structure_item) = Obj.magic _1 in + let _1_inlined1 : (Parsetree.pattern) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _6 : unit = Obj.magic _6 in + let cty : (Parsetree.core_type) = Obj.magic cty in + let _4 : unit = Obj.magic _4 in + let label : ( +# 785 "parsing/parser.mly" + (string) +# 26612 "parsing/parser.ml" + ) = Obj.magic label in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_xs_ in + let _endpos = _endpos__1_inlined1_ in let _v = - let x = - let _startpos = _startpos__1_ in + let _3 = + let _1 = _1_inlined1 in -# 988 "parsing/parser.mly" - ( text_str _startpos @ [_1] ) -# 26240 "parsing/parser.ml" +# 3112 "parsing/parser.mly" + ( None, _1 ) +# 26625 "parsing/parser.ml" + + in + let _1 = + let _startpos__2_ = _startpos__2_inlined1_ in + let _endpos = _endpos__6_ in + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +# 3133 "parsing/parser.mly" + ( let lbl_loc = _loc_label_ in + let pat_loc = _startpos__2_, _endpos in + let pat = mkpatvar ~loc:lbl_loc label in + Some label, mkpat ~loc:pat_loc (Ppat_constraint(pat, cty)) ) +# 26638 "parsing/parser.ml" in ( -# 219 "" - ( x :: xs ) -# 26246 "parsing/parser.ml" - : (Parsetree.structure_item list list)) +# 3142 "parsing/parser.mly" + ( [ _3; _1 ] ) +# 26644 "parsing/parser.ml" + : ((string option * Parsetree.pattern) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26252,76 +26650,110 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos; MenhirLib.EngineTypes.next = _menhir_stack; }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (Parsetree.toplevel_phrase list list) = -# 216 "" - ( [] ) -# 26265 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _2_inlined2; + MenhirLib.EngineTypes.startp = _startpos__2_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = cty; + MenhirLib.EngineTypes.startp = _startpos_cty_; + MenhirLib.EngineTypes.endp = _endpos_cty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; }; } = _menhir_stack in - let xs : (Parsetree.toplevel_phrase list list) = Obj.magic xs in + let _2_inlined2 : (Parsetree.pattern) = Obj.magic _2_inlined2 in + let _1_inlined1 : ( +# 772 "parsing/parser.mly" + (string) +# 26715 "parsing/parser.ml" + ) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _6 : unit = Obj.magic _6 in + let cty : (Parsetree.core_type) = Obj.magic cty in + let _4 : unit = Obj.magic _4 in + let label : ( +# 785 "parsing/parser.mly" + (string) +# 26724 "parsing/parser.ml" + ) = Obj.magic label in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_xs_ in + let _endpos = _endpos__2_inlined2_ in let _v = - let x = - let _1 = - let x = - let _1 = -# 1054 "parsing/parser.mly" - ( [] ) -# 26301 "parsing/parser.ml" - in - -# 1307 "parsing/parser.mly" - ( _1 ) -# 26306 "parsing/parser.ml" - - in - -# 188 "" - ( x ) -# 26312 "parsing/parser.ml" - - in + let _3 = + let (_2, _1) = (_2_inlined2, _1_inlined1) in -# 1319 "parsing/parser.mly" - ( _1 ) -# 26318 "parsing/parser.ml" +# 3114 "parsing/parser.mly" + ( Some _1, _2 ) +# 26737 "parsing/parser.ml" + + in + let _1 = + let _startpos__2_ = _startpos__2_inlined1_ in + let _endpos = _endpos__6_ in + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +# 3133 "parsing/parser.mly" + ( let lbl_loc = _loc_label_ in + let pat_loc = _startpos__2_, _endpos in + let pat = mkpatvar ~loc:lbl_loc label in + Some label, mkpat ~loc:pat_loc (Ppat_constraint(pat, cty)) ) +# 26750 "parsing/parser.ml" in ( -# 219 "" - ( x :: xs ) -# 26324 "parsing/parser.ml" - : (Parsetree.toplevel_phrase list list)) +# 3142 "parsing/parser.mly" + ( [ _3; _1 ] ) +# 26756 "parsing/parser.ml" + : ((string option * Parsetree.pattern) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26334,9 +26766,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = label_inlined1; + MenhirLib.EngineTypes.startp = _startpos_label_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_label_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1_inlined1; @@ -26344,89 +26776,98 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = e; - MenhirLib.EngineTypes.startp = _startpos_e_; - MenhirLib.EngineTypes.endp = _endpos_e_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - } = _menhir_stack in - let xs : (Parsetree.toplevel_phrase list list) = Obj.magic xs in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let e : (Parsetree.expression) = Obj.magic e in - let _1 : unit = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos_xs_ in - let _v = - let x = - let _1 = - let x = - let _1 = _1_inlined1 in - let _1 = - let x = - let _1 = - let _1 = - let attrs = -# 4110 "parsing/parser.mly" - ( _1 ) -# 26380 "parsing/parser.ml" - in - -# 1512 "parsing/parser.mly" - ( mkstrexp e attrs ) -# 26385 "parsing/parser.ml" - - in - -# 998 "parsing/parser.mly" - ( Ptop_def [_1] ) -# 26391 "parsing/parser.ml" - - in - let _startpos__1_ = _startpos_e_ in - let _startpos = _startpos__1_ in - -# 996 "parsing/parser.mly" - ( text_def _startpos @ [_1] ) -# 26399 "parsing/parser.ml" - - in - -# 1056 "parsing/parser.mly" - ( x ) -# 26405 "parsing/parser.ml" - - in - -# 1307 "parsing/parser.mly" - ( _1 ) -# 26411 "parsing/parser.ml" - - in - -# 188 "" - ( x ) -# 26417 "parsing/parser.ml" - - in + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = cty; + MenhirLib.EngineTypes.startp = _startpos_cty_; + MenhirLib.EngineTypes.endp = _endpos_cty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let label_inlined1 : ( +# 785 "parsing/parser.mly" + (string) +# 26826 "parsing/parser.ml" + ) = Obj.magic label_inlined1 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _6 : unit = Obj.magic _6 in + let cty : (Parsetree.core_type) = Obj.magic cty in + let _4 : unit = Obj.magic _4 in + let label : ( +# 785 "parsing/parser.mly" + (string) +# 26836 "parsing/parser.ml" + ) = Obj.magic label in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos_label_inlined1_ in + let _v = + let _3 = + let (_endpos_label_, _startpos_label_, label) = (_endpos_label_inlined1_, _startpos_label_inlined1_, label_inlined1) in + let _loc_label_ = (_startpos_label_, _endpos_label_) in -# 1319 "parsing/parser.mly" - ( _1 ) -# 26423 "parsing/parser.ml" +# 3116 "parsing/parser.mly" + ( let loc = _loc_label_ in + Some label, mkpatvar ~loc label ) +# 26851 "parsing/parser.ml" + + in + let _1 = + let _startpos__2_ = _startpos__2_inlined1_ in + let _endpos = _endpos__6_ in + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +# 3133 "parsing/parser.mly" + ( let lbl_loc = _loc_label_ in + let pat_loc = _startpos__2_, _endpos in + let pat = mkpatvar ~loc:lbl_loc label in + Some label, mkpat ~loc:pat_loc (Ppat_constraint(pat, cty)) ) +# 26864 "parsing/parser.ml" in ( -# 219 "" - ( x :: xs ) -# 26429 "parsing/parser.ml" - : (Parsetree.toplevel_phrase list list)) +# 3142 "parsing/parser.mly" + ( [ _3; _1 ] ) +# 26870 "parsing/parser.ml" + : ((string option * Parsetree.pattern) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26439,48 +26880,139 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _6_inlined1; + MenhirLib.EngineTypes.startp = _startpos__6_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__6_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = cty_inlined1; + MenhirLib.EngineTypes.startp = _startpos_cty_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_cty_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4_inlined1; + MenhirLib.EngineTypes.startp = _startpos__4_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__4_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label_inlined1; + MenhirLib.EngineTypes.startp = _startpos_label_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_label_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined2; + MenhirLib.EngineTypes.startp = _startpos__2_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = cty; + MenhirLib.EngineTypes.startp = _startpos_cty_; + MenhirLib.EngineTypes.endp = _endpos_cty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + }; + }; + }; }; } = _menhir_stack in - let xs : (Parsetree.toplevel_phrase list list) = Obj.magic xs in - let _1 : (Parsetree.structure_item) = Obj.magic _1 in + let _6_inlined1 : unit = Obj.magic _6_inlined1 in + let cty_inlined1 : (Parsetree.core_type) = Obj.magic cty_inlined1 in + let _4_inlined1 : unit = Obj.magic _4_inlined1 in + let label_inlined1 : ( +# 785 "parsing/parser.mly" + (string) +# 26967 "parsing/parser.ml" + ) = Obj.magic label_inlined1 in + let _2_inlined2 : unit = Obj.magic _2_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _6 : unit = Obj.magic _6 in + let cty : (Parsetree.core_type) = Obj.magic cty in + let _4 : unit = Obj.magic _4 in + let label : ( +# 785 "parsing/parser.mly" + (string) +# 26978 "parsing/parser.ml" + ) = Obj.magic label in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_xs_ in + let _endpos = _endpos__6_inlined1_ in let _v = - let x = - let _1 = - let _1 = -# 998 "parsing/parser.mly" - ( Ptop_def [_1] ) -# 26465 "parsing/parser.ml" - in - let _startpos = _startpos__1_ in - -# 996 "parsing/parser.mly" - ( text_def _startpos @ [_1] ) -# 26471 "parsing/parser.ml" - - in + let _3 = + let (_endpos_label_, _startpos_label_, _endpos__6_, _startpos__2_, cty, label) = (_endpos_label_inlined1_, _startpos_label_inlined1_, _endpos__6_inlined1_, _startpos__2_inlined2_, cty_inlined1, label_inlined1) in + let _endpos = _endpos__6_ in + let _loc_label_ = (_startpos_label_, _endpos_label_) in -# 1319 "parsing/parser.mly" - ( _1 ) -# 26477 "parsing/parser.ml" +# 3119 "parsing/parser.mly" + ( let lbl_loc = _loc_label_ in + let pat_loc = _startpos__2_, _endpos in + let pat = mkpatvar ~loc:lbl_loc label in + Some label, mkpat ~loc:pat_loc (Ppat_constraint(pat, cty)) ) +# 26996 "parsing/parser.ml" + + in + let _1 = + let _startpos__2_ = _startpos__2_inlined1_ in + let _endpos = _endpos__6_ in + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +# 3133 "parsing/parser.mly" + ( let lbl_loc = _loc_label_ in + let pat_loc = _startpos__2_, _endpos in + let pat = mkpatvar ~loc:lbl_loc label in + Some label, mkpat ~loc:pat_loc (Ppat_constraint(pat, cty)) ) +# 27009 "parsing/parser.ml" in ( -# 219 "" - ( x :: xs ) -# 26483 "parsing/parser.ml" - : (Parsetree.toplevel_phrase list list)) +# 3142 "parsing/parser.mly" + ( [ _3; _1 ] ) +# 27015 "parsing/parser.ml" + : ((string option * Parsetree.pattern) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26493,53 +27025,36 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; } = _menhir_stack in - let xs : (Parsetree.toplevel_phrase list list) = Obj.magic xs in - let _1 : (Parsetree.toplevel_phrase) = Obj.magic _1 in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_xs_ in + let _endpos = _endpos__3_ in let _v = - let x = - let _1 = - let _1 = - let _endpos = _endpos__1_ in - let _startpos = _startpos__1_ in - -# 1007 "parsing/parser.mly" - ( mark_rhs_docs _startpos _endpos; - _1 ) -# 26523 "parsing/parser.ml" - - in - let _startpos = _startpos__1_ in - -# 996 "parsing/parser.mly" - ( text_def _startpos @ [_1] ) -# 26530 "parsing/parser.ml" - - in - -# 1319 "parsing/parser.mly" - ( _1 ) -# 26536 "parsing/parser.ml" - - in + let _loc__3_ = (_startpos__3_, _endpos__3_) in ( -# 219 "" - ( x :: xs ) -# 26542 "parsing/parser.ml" - : (Parsetree.toplevel_phrase list list)) +# 3144 "parsing/parser.mly" + ( expecting _loc__3_ "pattern" ) +# 27057 "parsing/parser.ml" + : ((string option * Parsetree.pattern) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26551,74 +27066,105 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = opat; - MenhirLib.EngineTypes.startp = _startpos_opat_; - MenhirLib.EngineTypes.endp = _endpos_opat_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = octy; - MenhirLib.EngineTypes.startp = _startpos_octy_; - MenhirLib.EngineTypes.endp = _endpos_octy_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let opat : (Parsetree.pattern option) = Obj.magic opat in - let octy : (Parsetree.core_type option) = Obj.magic octy in - let _1 : (Longident.t) = Obj.magic _1 in + let _1 : (Asttypes.closed_flag * (string option * Parsetree.pattern) list) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_opat_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.pattern_desc) = +# 3156 "parsing/parser.mly" + ( let closed, pat = _1 in + Ppat_tuple(List.rev pat, closed) ) +# 27084 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Asttypes.closed_flag * (string option * Parsetree.pattern) list) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.pattern_desc) = +# 3156 "parsing/parser.mly" + ( let closed, pat = _1 in + Ppat_tuple(List.rev pat, closed) ) +# 27110 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Parsetree.pattern * Parsetree.expression * + Parsetree.value_constraint option) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.pattern * Parsetree.expression * + Parsetree.value_constraint option * bool) = +# 2699 "parsing/parser.mly" + ( let p,e,c = _1 in (p,e,c,false) ) +# 27137 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Asttypes.label) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in let _v = - let _2 = -# 123 "" - ( None ) -# 26583 "parsing/parser.ml" - in - let x = - let label = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 984 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 26593 "parsing/parser.ml" - - in - let _startpos_label_ = _startpos__1_ in - let _endpos = _endpos_opat_ in - let _symbolstartpos = _startpos_label_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 3058 "parsing/parser.mly" - ( let constraint_loc, label, pat = - match opat with - | None -> - (* No pattern; this is a pun. Desugar it. - But that the pattern was there and the label reconstructed (which - piece of AST is marked as ghost is important for warning - emission). *) - _sloc, make_ghost label, pat_of_label label - | Some pat -> - (_startpos_octy_, _endpos), label, pat - in - label, mkpat_opt_constraint ~loc:constraint_loc pat octy - ) -# 26615 "parsing/parser.ml" - - in + let _endpos = _endpos__1_ in + let _startpos = _startpos__1_ in + let _loc = (_startpos, _endpos) in ( -# 1244 "parsing/parser.mly" - ( [x], None ) -# 26621 "parsing/parser.ml" - : ((Longident.t Asttypes.loc * Parsetree.pattern) list * unit option)) +# 2702 "parsing/parser.mly" + ( (mkpatvar ~loc:_loc _1, mkexpvar ~loc:_loc _1, None, true) ) +# 27166 "parsing/parser.ml" + : (Parsetree.pattern * Parsetree.expression * + Parsetree.value_constraint option * bool)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26631,80 +27177,39 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = opat; - MenhirLib.EngineTypes.startp = _startpos_opat_; - MenhirLib.EngineTypes.endp = _endpos_opat_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = octy; - MenhirLib.EngineTypes.startp = _startpos_octy_; - MenhirLib.EngineTypes.endp = _endpos_octy_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let x : unit = Obj.magic x in - let opat : (Parsetree.pattern option) = Obj.magic opat in - let octy : (Parsetree.core_type option) = Obj.magic octy in - let _1 : (Longident.t) = Obj.magic _1 in + let _2 : (Parsetree.expression) = Obj.magic _2 in + let _1 : (Asttypes.label) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_x_ in + let _endpos = _endpos__2_ in let _v = - let _2 = -# 126 "" - ( Some x ) -# 26669 "parsing/parser.ml" - in - let x = - let label = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 984 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 26679 "parsing/parser.ml" - - in - let _startpos_label_ = _startpos__1_ in - let _endpos = _endpos_opat_ in - let _symbolstartpos = _startpos_label_ in + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3058 "parsing/parser.mly" - ( let constraint_loc, label, pat = - match opat with - | None -> - (* No pattern; this is a pun. Desugar it. - But that the pattern was there and the label reconstructed (which - piece of AST is marked as ghost is important for warning - emission). *) - _sloc, make_ghost label, pat_of_label label - | Some pat -> - (_startpos_octy_, _endpos), label, pat - in - label, mkpat_opt_constraint ~loc:constraint_loc pat octy - ) -# 26701 "parsing/parser.ml" +# 2667 "parsing/parser.mly" + ( mkpatvar ~loc:_sloc _1 ) +# 27205 "parsing/parser.ml" in ( -# 1244 "parsing/parser.mly" - ( [x], None ) -# 26707 "parsing/parser.ml" - : ((Longident.t Asttypes.loc * Parsetree.pattern) list * unit option)) +# 2671 "parsing/parser.mly" + ( (_1, _2, None) ) +# 27211 "parsing/parser.ml" + : (Parsetree.pattern * Parsetree.expression * + Parsetree.value_constraint option)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26722,84 +27227,56 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = y; - MenhirLib.EngineTypes.startp = _startpos_y_; - MenhirLib.EngineTypes.endp = _endpos_y_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _2; MenhirLib.EngineTypes.startp = _startpos__2_; MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = opat; - MenhirLib.EngineTypes.startp = _startpos_opat_; - MenhirLib.EngineTypes.endp = _endpos_opat_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = octy; - MenhirLib.EngineTypes.startp = _startpos_octy_; - MenhirLib.EngineTypes.endp = _endpos_octy_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; } = _menhir_stack in - let _4 : (unit option) = Obj.magic _4 in - let y : unit = Obj.magic y in - let _2 : unit = Obj.magic _2 in - let opat : (Parsetree.pattern option) = Obj.magic opat in - let octy : (Parsetree.core_type option) = Obj.magic octy in - let _1 : (Longident.t) = Obj.magic _1 in + let _4 : (Parsetree.expression) = Obj.magic _4 in + let _3 : unit = Obj.magic _3 in + let _2 : (Parsetree.type_constraint) = Obj.magic _2 in + let _1 : (Asttypes.label) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__4_ in let _v = - let x = - let label = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 984 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 26774 "parsing/parser.ml" - - in - let _startpos_label_ = _startpos__1_ in - let _endpos = _endpos_opat_ in - let _symbolstartpos = _startpos_label_ in + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3058 "parsing/parser.mly" - ( let constraint_loc, label, pat = - match opat with - | None -> - (* No pattern; this is a pun. Desugar it. - But that the pattern was there and the label reconstructed (which - piece of AST is marked as ghost is important for warning - emission). *) - _sloc, make_ghost label, pat_of_label label - | Some pat -> - (_startpos_octy_, _endpos), label, pat - in - label, mkpat_opt_constraint ~loc:constraint_loc pat octy - ) -# 26796 "parsing/parser.ml" +# 2667 "parsing/parser.mly" + ( mkpatvar ~loc:_sloc _1 ) +# 27264 "parsing/parser.ml" in ( -# 1246 "parsing/parser.mly" - ( [x], Some y ) -# 26802 "parsing/parser.ml" - : ((Longident.t Asttypes.loc * Parsetree.pattern) list * unit option)) +# 2673 "parsing/parser.mly" + ( let v = _1 in (* PR#7344 *) + let t = + match _2 with + Pconstraint t -> + Pvc_constraint { locally_abstract_univars = []; typ=t } + | Pcoerce (ground, coercion) -> Pvc_coercion { ground; coercion} + in + (v, _4, Some t) + ) +# 27278 "parsing/parser.ml" + : (Parsetree.pattern * Parsetree.expression * + Parsetree.value_constraint option)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26812,83 +27289,200 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = tail; - MenhirLib.EngineTypes.startp = _startpos_tail_; - MenhirLib.EngineTypes.endp = _endpos_tail_; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = opat; - MenhirLib.EngineTypes.startp = _startpos_opat_; - MenhirLib.EngineTypes.endp = _endpos_opat_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = octy; - MenhirLib.EngineTypes.startp = _startpos_octy_; - MenhirLib.EngineTypes.endp = _endpos_octy_; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; }; }; }; }; } = _menhir_stack in - let tail : ((Longident.t Asttypes.loc * Parsetree.pattern) list * unit option) = Obj.magic tail in + let _5 : (Parsetree.expression) = Obj.magic _5 in + let _4 : unit = Obj.magic _4 in + let _3 : (Parsetree.core_type) = Obj.magic _3 in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let xs : (Asttypes.label Asttypes.loc list) = Obj.magic xs in let _2 : unit = Obj.magic _2 in - let opat : (Parsetree.pattern option) = Obj.magic opat in - let octy : (Parsetree.core_type option) = Obj.magic octy in - let _1 : (Longident.t) = Obj.magic _1 in + let _1 : (Asttypes.label) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_tail_ in + let _endpos = _endpos__5_ in let _v = - let x = - let label = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _3 = + let _1 = + let _1 = + let xs = +# 264 "" + ( List.rev xs ) +# 27351 "parsing/parser.ml" + in + +# 1074 "parsing/parser.mly" + ( xs ) +# 27356 "parsing/parser.ml" + + in -# 984 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 26862 "parsing/parser.ml" +# 3590 "parsing/parser.mly" + ( _1 ) +# 27362 "parsing/parser.ml" in - let _startpos_label_ = _startpos__1_ in - let _endpos = _endpos_opat_ in - let _symbolstartpos = _startpos_label_ in + +# 3594 "parsing/parser.mly" + ( Ptyp_poly(_1, _3) ) +# 27368 "parsing/parser.ml" + + in + let _startpos__3_ = _startpos_xs_ in + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3058 "parsing/parser.mly" - ( let constraint_loc, label, pat = - match opat with - | None -> - (* No pattern; this is a pun. Desugar it. - But that the pattern was there and the label reconstructed (which - piece of AST is marked as ghost is important for warning - emission). *) - _sloc, make_ghost label, pat_of_label label - | Some pat -> - (_startpos_octy_, _endpos), label, pat - in - label, mkpat_opt_constraint ~loc:constraint_loc pat octy +# 2667 "parsing/parser.mly" + ( mkpatvar ~loc:_sloc _1 ) +# 27379 "parsing/parser.ml" + + in + let _loc__3_ = (_startpos__3_, _endpos__3_) in + ( +# 2683 "parsing/parser.mly" + ( + let t = ghtyp ~loc:(_loc__3_) _3 in + (_1, _5, Some (Pvc_constraint { locally_abstract_univars = []; typ=t })) ) -# 26884 "parsing/parser.ml" +# 27389 "parsing/parser.ml" + : (Parsetree.pattern * Parsetree.expression * + Parsetree.value_constraint option)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _8; + MenhirLib.EngineTypes.startp = _startpos__8_; + MenhirLib.EngineTypes.endp = _endpos__8_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _7; + MenhirLib.EngineTypes.startp = _startpos__7_; + MenhirLib.EngineTypes.endp = _endpos__7_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _8 : (Parsetree.expression) = Obj.magic _8 in + let _7 : unit = Obj.magic _7 in + let _6 : (Parsetree.core_type) = Obj.magic _6 in + let _5 : unit = Obj.magic _5 in + let xs : (string Asttypes.loc list) = Obj.magic xs in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Asttypes.label) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__8_ in + let _v = + let _4 = +# 2664 "parsing/parser.mly" + ( xs ) +# 27466 "parsing/parser.ml" + in + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2667 "parsing/parser.mly" + ( mkpatvar ~loc:_sloc _1 ) +# 27475 "parsing/parser.ml" in ( -# 1250 "parsing/parser.mly" - ( let xs, y = tail in - x :: xs, y ) -# 26891 "parsing/parser.ml" - : ((Longident.t Asttypes.loc * Parsetree.pattern) list * unit option)) +# 2688 "parsing/parser.mly" + ( let constraint' = + Pvc_constraint { locally_abstract_univars=_4; typ = _6} + in + (_1, _8, Some constraint') ) +# 27484 "parsing/parser.ml" + : (Parsetree.pattern * Parsetree.expression * + Parsetree.value_constraint option)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26924,10 +27518,11 @@ module Tables = struct let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in - let _v : (Parsetree.case) = -# 2802 "parsing/parser.mly" - ( Exp.case _1 _3 ) -# 26931 "parsing/parser.ml" + let _v : (Parsetree.pattern * Parsetree.expression * + Parsetree.value_constraint option) = +# 2693 "parsing/parser.mly" + ( (_1, _3, None) ) +# 27526 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26971,16 +27566,17 @@ module Tables = struct } = _menhir_stack in let _5 : (Parsetree.expression) = Obj.magic _5 in let _4 : unit = Obj.magic _4 in - let _3 : (Parsetree.expression) = Obj.magic _3 in + let _3 : (Parsetree.core_type) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in let _1 : (Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__5_ in - let _v : (Parsetree.case) = -# 2804 "parsing/parser.mly" - ( Exp.case _1 ~guard:_3 _5 ) -# 26984 "parsing/parser.ml" + let _v : (Parsetree.pattern * Parsetree.expression * + Parsetree.value_constraint option) = +# 2695 "parsing/parser.mly" + ( (_1, _5, Some(Pvc_constraint { locally_abstract_univars=[]; typ=_3 })) ) +# 27580 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26993,166 +27589,87 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - } = _menhir_stack in - let _3 : unit = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.pattern) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v = - let _loc__3_ = (_startpos__3_, _endpos__3_) in - ( -# 2806 "parsing/parser.mly" - ( Exp.case _1 (Exp.unreachable ~loc:(make_loc _loc__3_) ()) ) -# 27025 "parsing/parser.ml" - : (Parsetree.case)) - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = tail; - MenhirLib.EngineTypes.startp = _startpos_tail_; - MenhirLib.EngineTypes.endp = _endpos_tail_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = body; + MenhirLib.EngineTypes.startp = _startpos_body_; + MenhirLib.EngineTypes.endp = _endpos_body_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = rec_flag; + MenhirLib.EngineTypes.startp = _startpos_rec_flag_; + MenhirLib.EngineTypes.endp = _endpos_rec_flag_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = ext; + MenhirLib.EngineTypes.startp = _startpos_ext_; + MenhirLib.EngineTypes.endp = _endpos_ext_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; }; }; } = _menhir_stack in - let tail : (Parsetree.object_field list * Asttypes.closed_flag) = Obj.magic tail in - let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let _5 : unit = Obj.magic _5 in let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _1_inlined1 : (Parsetree.core_type) = Obj.magic _1_inlined1 in - let _2 : unit = Obj.magic _2 in - let _1 : ( -# 797 "parsing/parser.mly" - (string) -# 27089 "parsing/parser.ml" - ) = Obj.magic _1 in + let body : (Parsetree.pattern * Parsetree.expression * + Parsetree.value_constraint option * bool) = Obj.magic body in + let rec_flag : (Asttypes.rec_flag) = Obj.magic rec_flag in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let ext : (string Asttypes.loc option) = Obj.magic ext in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_tail_ in + let _endpos = _endpos__1_inlined2_ in let _v = - let head = - let _6 = - let _1 = _1_inlined3 in - -# 4114 "parsing/parser.mly" - ( _1 ) -# 27101 "parsing/parser.ml" - - in - let _endpos__6_ = _endpos__1_inlined3_ in - let _4 = + let _1 = + let attrs2 = let _1 = _1_inlined2 in -# 4114 "parsing/parser.mly" +# 4282 "parsing/parser.mly" ( _1 ) -# 27110 "parsing/parser.ml" +# 27645 "parsing/parser.ml" in - let _endpos__4_ = _endpos__1_inlined2_ in - let _3 = + let _endpos_attrs2_ = _endpos__1_inlined2_ in + let attrs1 = let _1 = _1_inlined1 in -# 3484 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 27119 "parsing/parser.ml" - - in - let _1 = - let _1 = -# 3765 "parsing/parser.mly" - ( _1 ) -# 27126 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 984 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 27134 "parsing/parser.ml" +# 27654 "parsing/parser.ml" in - let _endpos = _endpos__6_ in + let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3750 "parsing/parser.mly" - ( let info = - match rhs_info _endpos__4_ with - | Some _ as info_before_semi -> info_before_semi - | None -> symbol_info _endpos - in - let attrs = add_info_attrs info (_4 @ _6) in - Of.tag ~loc:(make_loc _sloc) ~attrs _1 _3 ) -# 27149 "parsing/parser.ml" +# 2722 "parsing/parser.mly" + ( + let attrs = attrs1 @ attrs2 in + mklbs ext rec_flag (mklb ~loc:_sloc true body attrs) + ) +# 27666 "parsing/parser.ml" in ( -# 3731 "parsing/parser.mly" - ( let (f, c) = tail in (head :: f, c) ) -# 27155 "parsing/parser.ml" - : (Parsetree.object_field list * Asttypes.closed_flag)) +# 2712 "parsing/parser.mly" + ( _1 ) +# 27672 "parsing/parser.ml" + : (let_bindings)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27165,46 +27682,27 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = tail; - MenhirLib.EngineTypes.startp = _startpos_tail_; - MenhirLib.EngineTypes.endp = _endpos_tail_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = ty; - MenhirLib.EngineTypes.startp = _startpos_ty_; - MenhirLib.EngineTypes.endp = _endpos_ty_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let tail : (Parsetree.object_field list * Asttypes.closed_flag) = Obj.magic tail in - let _2 : unit = Obj.magic _2 in - let ty : (Parsetree.core_type) = Obj.magic ty in + let _2 : (let_binding) = Obj.magic _2 in + let _1 : (let_bindings) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_ty_ in - let _endpos = _endpos_tail_ in - let _v = - let head = - let _endpos = _endpos_ty_ in - let _symbolstartpos = _startpos_ty_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 3761 "parsing/parser.mly" - ( Of.inherit_ ~loc:(make_loc _sloc) ty ) -# 27200 "parsing/parser.ml" - - in - ( -# 3731 "parsing/parser.mly" - ( let (f, c) = tail in (head :: f, c) ) -# 27206 "parsing/parser.ml" - : (Parsetree.object_field list * Asttypes.closed_flag)) - in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (let_bindings) = +# 2713 "parsing/parser.mly" + ( addlb _1 _2 ) +# 27705 "parsing/parser.ml" + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -27216,117 +27714,85 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = body; + MenhirLib.EngineTypes.startp = _startpos_body_; + MenhirLib.EngineTypes.endp = _endpos_body_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = rec_flag; + MenhirLib.EngineTypes.startp = _startpos_rec_flag_; + MenhirLib.EngineTypes.endp = _endpos_rec_flag_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1_inlined1; MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; }; } = _menhir_stack in - let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let _5 : unit = Obj.magic _5 in let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _1_inlined1 : (Parsetree.core_type) = Obj.magic _1_inlined1 in - let _2 : unit = Obj.magic _2 in - let _1 : ( -# 797 "parsing/parser.mly" - (string) -# 27263 "parsing/parser.ml" - ) = Obj.magic _1 in + let body : (Parsetree.pattern * Parsetree.expression * + Parsetree.value_constraint option * bool) = Obj.magic body in + let rec_flag : (Asttypes.rec_flag) = Obj.magic rec_flag in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined3_ in + let _endpos = _endpos__1_inlined2_ in let _v = - let head = - let _6 = - let _1 = _1_inlined3 in - -# 4114 "parsing/parser.mly" - ( _1 ) -# 27275 "parsing/parser.ml" - - in - let _endpos__6_ = _endpos__1_inlined3_ in - let _4 = + let _1 = + let attrs2 = let _1 = _1_inlined2 in -# 4114 "parsing/parser.mly" +# 4282 "parsing/parser.mly" ( _1 ) -# 27284 "parsing/parser.ml" +# 27763 "parsing/parser.ml" in - let _endpos__4_ = _endpos__1_inlined2_ in - let _3 = + let _endpos_attrs2_ = _endpos__1_inlined2_ in + let attrs1 = let _1 = _1_inlined1 in -# 3484 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 27293 "parsing/parser.ml" - - in - let _1 = - let _1 = -# 3765 "parsing/parser.mly" - ( _1 ) -# 27300 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 984 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 27308 "parsing/parser.ml" +# 27772 "parsing/parser.ml" in - let _endpos = _endpos__6_ in + let ext = +# 4293 "parsing/parser.mly" + ( None ) +# 27778 "parsing/parser.ml" + in + let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3750 "parsing/parser.mly" - ( let info = - match rhs_info _endpos__4_ with - | Some _ as info_before_semi -> info_before_semi - | None -> symbol_info _endpos - in - let attrs = add_info_attrs info (_4 @ _6) in - Of.tag ~loc:(make_loc _sloc) ~attrs _1 _3 ) -# 27323 "parsing/parser.ml" +# 2722 "parsing/parser.mly" + ( + let attrs = attrs1 @ attrs2 in + mklbs ext rec_flag (mklb ~loc:_sloc true body attrs) + ) +# 27789 "parsing/parser.ml" in ( -# 3734 "parsing/parser.mly" - ( [head], Closed ) -# 27329 "parsing/parser.ml" - : (Parsetree.object_field list * Asttypes.closed_flag)) +# 2712 "parsing/parser.mly" + ( _1 ) +# 27795 "parsing/parser.ml" + : (let_bindings)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27339,134 +27805,105 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = ty; - MenhirLib.EngineTypes.startp = _startpos_ty_; - MenhirLib.EngineTypes.endp = _endpos_ty_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - } = _menhir_stack in - let _2 : unit = Obj.magic _2 in - let ty : (Parsetree.core_type) = Obj.magic ty in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_ty_ in - let _endpos = _endpos__2_ in - let _v = - let head = - let _endpos = _endpos_ty_ in - let _symbolstartpos = _startpos_ty_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 3761 "parsing/parser.mly" - ( Of.inherit_ ~loc:(make_loc _sloc) ty ) -# 27367 "parsing/parser.ml" - - in - ( -# 3734 "parsing/parser.mly" - ( [head], Closed ) -# 27373 "parsing/parser.ml" - : (Parsetree.object_field list * Asttypes.closed_flag)) - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = body; + MenhirLib.EngineTypes.startp = _startpos_body_; + MenhirLib.EngineTypes.endp = _endpos_body_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = rec_flag; + MenhirLib.EngineTypes.startp = _startpos_rec_flag_; + MenhirLib.EngineTypes.endp = _endpos_rec_flag_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; }; }; }; } = _menhir_stack in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let body : (Parsetree.pattern * Parsetree.expression * + Parsetree.value_constraint option * bool) = Obj.magic body in + let rec_flag : (Asttypes.rec_flag) = Obj.magic rec_flag in let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _1_inlined1 : (Parsetree.core_type) = Obj.magic _1_inlined1 in - let _2 : unit = Obj.magic _2 in - let _1 : ( -# 797 "parsing/parser.mly" - (string) -# 27416 "parsing/parser.ml" - ) = Obj.magic _1 in + let _2 : (Ast_helper.str) = Obj.magic _2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined2_ in + let _endpos = _endpos__1_inlined3_ in let _v = - let head = - let _4 = - let _1 = _1_inlined2 in + let _1 = + let attrs2 = + let _1 = _1_inlined3 in -# 4114 "parsing/parser.mly" +# 4282 "parsing/parser.mly" ( _1 ) -# 27428 "parsing/parser.ml" +# 27868 "parsing/parser.ml" in - let _endpos__4_ = _endpos__1_inlined2_ in - let _3 = - let _1 = _1_inlined1 in + let _endpos_attrs2_ = _endpos__1_inlined3_ in + let attrs1 = + let _1 = _1_inlined2 in -# 3484 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 27437 "parsing/parser.ml" +# 27877 "parsing/parser.ml" in - let _1 = - let _1 = -# 3765 "parsing/parser.mly" - ( _1 ) -# 27444 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let ext = + let _startpos__1_ = _startpos__1_inlined1_ in + let _endpos = _endpos__2_ in + let _startpos = _startpos__1_ in + let _loc = (_startpos, _endpos) in -# 984 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 27452 "parsing/parser.ml" +# 4295 "parsing/parser.mly" + ( not_expecting _loc "extension" ) +# 27888 "parsing/parser.ml" in - let _endpos = _endpos__4_ in + let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3743 "parsing/parser.mly" - ( let info = symbol_info _endpos in - let attrs = add_info_attrs info _4 in - Of.tag ~loc:(make_loc _sloc) ~attrs _1 _3 ) -# 27463 "parsing/parser.ml" +# 2722 "parsing/parser.mly" + ( + let attrs = attrs1 @ attrs2 in + mklbs ext rec_flag (mklb ~loc:_sloc true body attrs) + ) +# 27900 "parsing/parser.ml" in ( -# 3737 "parsing/parser.mly" - ( [head], Closed ) -# 27469 "parsing/parser.ml" - : (Parsetree.object_field list * Asttypes.closed_flag)) +# 2712 "parsing/parser.mly" + ( _1 ) +# 27906 "parsing/parser.ml" + : (let_bindings)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27478,33 +27915,28 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = ty; - MenhirLib.EngineTypes.startp = _startpos_ty_; - MenhirLib.EngineTypes.endp = _endpos_ty_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; } = _menhir_stack in - let ty : (Parsetree.core_type) = Obj.magic ty in + let _2 : (let_binding) = Obj.magic _2 in + let _1 : (let_bindings) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_ty_ in - let _endpos = _endpos_ty_ in - let _v = - let head = - let _endpos = _endpos_ty_ in - let _symbolstartpos = _startpos_ty_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 3761 "parsing/parser.mly" - ( Of.inherit_ ~loc:(make_loc _sloc) ty ) -# 27500 "parsing/parser.ml" - - in - ( -# 3737 "parsing/parser.mly" - ( [head], Closed ) -# 27506 "parsing/parser.ml" - : (Parsetree.object_field list * Asttypes.closed_flag)) - in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (let_bindings) = +# 2713 "parsing/parser.mly" + ( addlb _1 _2 ) +# 27939 "parsing/parser.ml" + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -27521,14 +27953,14 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in - let _v : (Parsetree.object_field list * Asttypes.closed_flag) = -# 3739 "parsing/parser.mly" - ( [], Open ) -# 27532 "parsing/parser.ml" + let _v : (Parsetree.pattern) = +# 2379 "parsing/parser.mly" + ( _1 ) +# 27964 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27541,89 +27973,51 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = private_; - MenhirLib.EngineTypes.startp = _startpos_private__; - MenhirLib.EngineTypes.endp = _endpos_private__; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in - let _1_inlined2 : (Parsetree.core_type) = Obj.magic _1_inlined2 in - let _5 : unit = Obj.magic _5 in - let _1_inlined1 : ( -# 797 "parsing/parser.mly" - (string) -# 27579 "parsing/parser.ml" - ) = Obj.magic _1_inlined1 in - let private_ : (Asttypes.private_flag) = Obj.magic private_ in - let _1 : (Parsetree.attributes) = Obj.magic _1 in + let _3 : (Parsetree.core_type) = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined2_ in + let _endpos = _endpos__3_ in let _v = - let ty = - let _1 = _1_inlined2 in - -# 3480 "parsing/parser.mly" - ( _1 ) -# 27592 "parsing/parser.ml" - - in - let label = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _1 = let _1 = -# 3765 "parsing/parser.mly" - ( _1 ) -# 27600 "parsing/parser.ml" +# 2381 "parsing/parser.mly" + ( Ppat_constraint(_1, _3) ) +# 28005 "parsing/parser.ml" in + let _endpos__1_ = _endpos__3_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 27608 "parsing/parser.ml" +# 1007 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +# 28014 "parsing/parser.ml" in - let attrs = -# 4114 "parsing/parser.mly" - ( _1 ) -# 27614 "parsing/parser.ml" - in - let _1 = -# 4013 "parsing/parser.mly" - ( Fresh ) -# 27619 "parsing/parser.ml" - in ( -# 2104 "parsing/parser.mly" - ( (label, private_, Cfk_virtual ty), attrs ) -# 27624 "parsing/parser.ml" - : ((Asttypes.label Asttypes.loc * Asttypes.private_flag * - Parsetree.class_field_kind) * - Parsetree.attributes)) +# 2382 "parsing/parser.mly" + ( _1 ) +# 28020 "parsing/parser.ml" + : (Parsetree.pattern)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27636,77 +28030,38 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = exp; + MenhirLib.EngineTypes.startp = _startpos_exp_; + MenhirLib.EngineTypes.endp = _endpos_exp_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _5 : (Parsetree.expression) = Obj.magic _5 in - let _1_inlined1 : ( -# 797 "parsing/parser.mly" - (string) -# 27667 "parsing/parser.ml" - ) = Obj.magic _1_inlined1 in - let _3 : (Asttypes.private_flag) = Obj.magic _3 in - let _1 : (Parsetree.attributes) = Obj.magic _1 in + let exp : (Parsetree.expression) = Obj.magic exp in + let _1 : (Asttypes.label) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in + let _endpos = _endpos_exp_ in let _v = - let _4 = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in - let _1 = -# 3765 "parsing/parser.mly" - ( _1 ) -# 27680 "parsing/parser.ml" - in + let pat = let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 27688 "parsing/parser.ml" +# 2667 "parsing/parser.mly" + ( mkpatvar ~loc:_sloc _1 ) +# 28058 "parsing/parser.ml" in - let _2 = -# 4114 "parsing/parser.mly" - ( _1 ) -# 27694 "parsing/parser.ml" - in - let _1 = -# 4016 "parsing/parser.mly" - ( Fresh ) -# 27699 "parsing/parser.ml" - in ( -# 2106 "parsing/parser.mly" - ( let e = _5 in - let loc = Location.(e.pexp_loc.loc_start, e.pexp_loc.loc_end) in - (_4, _3, - Cfk_concrete (_1, ghexp ~loc (Pexp_poly (e, None)))), _2 ) -# 27707 "parsing/parser.ml" - : ((Asttypes.label Asttypes.loc * Asttypes.private_flag * - Parsetree.class_field_kind) * - Parsetree.attributes)) +# 2739 "parsing/parser.mly" + ( (pat, exp) ) +# 28064 "parsing/parser.ml" + : (Parsetree.pattern * Parsetree.expression)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27718,88 +28073,25 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _5 : (Parsetree.expression) = Obj.magic _5 in - let _1_inlined2 : ( -# 797 "parsing/parser.mly" - (string) -# 27756 "parsing/parser.ml" - ) = Obj.magic _1_inlined2 in - let _3 : (Asttypes.private_flag) = Obj.magic _3 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let _1 : unit = Obj.magic _1 in + let _1 : (Asttypes.label) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in + let _endpos = _endpos__1_ in let _v = - let _4 = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in - let _1 = -# 3765 "parsing/parser.mly" - ( _1 ) -# 27770 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 984 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 27778 "parsing/parser.ml" - - in - let _2 = - let _1 = _1_inlined1 in - -# 4114 "parsing/parser.mly" - ( _1 ) -# 27786 "parsing/parser.ml" - - in - let _1 = -# 4017 "parsing/parser.mly" - ( Override ) -# 27792 "parsing/parser.ml" - in + let _endpos = _endpos__1_ in + let _startpos = _startpos__1_ in + let _loc = (_startpos, _endpos) in ( -# 2106 "parsing/parser.mly" - ( let e = _5 in - let loc = Location.(e.pexp_loc.loc_start, e.pexp_loc.loc_end) in - (_4, _3, - Cfk_concrete (_1, ghexp ~loc (Pexp_poly (e, None)))), _2 ) -# 27800 "parsing/parser.ml" - : ((Asttypes.label Asttypes.loc * Asttypes.private_flag * - Parsetree.class_field_kind) * - Parsetree.attributes)) +# 2742 "parsing/parser.mly" + ( (mkpatvar ~loc:_loc _1, mkexpvar ~loc:_loc _1) ) +# 28094 "parsing/parser.ml" + : (Parsetree.pattern * Parsetree.expression)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27812,108 +28104,49 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _8; - MenhirLib.EngineTypes.startp = _startpos__8_; - MenhirLib.EngineTypes.endp = _endpos__8_; + MenhirLib.EngineTypes.semv = exp; + MenhirLib.EngineTypes.startp = _startpos_exp_; + MenhirLib.EngineTypes.endp = _endpos_exp_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _7; - MenhirLib.EngineTypes.startp = _startpos__7_; - MenhirLib.EngineTypes.endp = _endpos__7_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = typ; + MenhirLib.EngineTypes.startp = _startpos_typ_; + MenhirLib.EngineTypes.endp = _endpos_typ_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = pat; + MenhirLib.EngineTypes.startp = _startpos_pat_; + MenhirLib.EngineTypes.endp = _endpos_pat_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; }; } = _menhir_stack in - let _8 : (Parsetree.expression) = Obj.magic _8 in - let _7 : unit = Obj.magic _7 in - let _1_inlined2 : (Parsetree.core_type) = Obj.magic _1_inlined2 in - let _5 : unit = Obj.magic _5 in - let _1_inlined1 : ( -# 797 "parsing/parser.mly" - (string) -# 27864 "parsing/parser.ml" - ) = Obj.magic _1_inlined1 in - let _3 : (Asttypes.private_flag) = Obj.magic _3 in - let _1 : (Parsetree.attributes) = Obj.magic _1 in + let exp : (Parsetree.expression) = Obj.magic exp in + let _4 : unit = Obj.magic _4 in + let typ : (Parsetree.core_type) = Obj.magic typ in + let _2 : unit = Obj.magic _2 in + let pat : (Parsetree.pattern) = Obj.magic pat in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__8_ in - let _v = - let _6 = - let _1 = _1_inlined2 in - -# 3480 "parsing/parser.mly" - ( _1 ) -# 27877 "parsing/parser.ml" - - in - let _startpos__6_ = _startpos__1_inlined2_ in - let _4 = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in - let _1 = -# 3765 "parsing/parser.mly" - ( _1 ) -# 27886 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 984 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 27894 "parsing/parser.ml" - - in - let _2 = -# 4114 "parsing/parser.mly" - ( _1 ) -# 27900 "parsing/parser.ml" - in - let _1 = -# 4016 "parsing/parser.mly" - ( Fresh ) -# 27905 "parsing/parser.ml" - in - ( -# 2112 "parsing/parser.mly" - ( let poly_exp = - let loc = (_startpos__6_, _endpos__8_) in - ghexp ~loc (Pexp_poly(_8, Some _6)) in - (_4, _3, Cfk_concrete (_1, poly_exp)), _2 ) -# 27913 "parsing/parser.ml" - : ((Asttypes.label Asttypes.loc * Asttypes.private_flag * - Parsetree.class_field_kind) * - Parsetree.attributes)) - in + let _startpos = _startpos_pat_ in + let _endpos = _endpos_exp_ in + let _v : (Parsetree.pattern * Parsetree.expression) = +# 2744 "parsing/parser.mly" + ( let loc = (_startpos_pat_, _endpos_typ_) in + (ghpat ~loc (Ppat_constraint(pat, typ)), exp) ) +# 28149 "parsing/parser.ml" + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -27925,34 +28158,179 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _8; - MenhirLib.EngineTypes.startp = _startpos__8_; - MenhirLib.EngineTypes.endp = _endpos__8_; + MenhirLib.EngineTypes.semv = exp; + MenhirLib.EngineTypes.startp = _startpos_exp_; + MenhirLib.EngineTypes.endp = _endpos_exp_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _7; - MenhirLib.EngineTypes.startp = _startpos__7_; - MenhirLib.EngineTypes.endp = _endpos__7_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = pat; + MenhirLib.EngineTypes.startp = _startpos_pat_; + MenhirLib.EngineTypes.endp = _endpos_pat_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let exp : (Parsetree.expression) = Obj.magic exp in + let _2 : unit = Obj.magic _2 in + let pat : (Parsetree.pattern) = Obj.magic pat in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_pat_ in + let _endpos = _endpos_exp_ in + let _v : (Parsetree.pattern * Parsetree.expression) = +# 2747 "parsing/parser.mly" + ( (pat, exp) ) +# 28188 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = body; + MenhirLib.EngineTypes.startp = _startpos_body_; + MenhirLib.EngineTypes.endp = _endpos_body_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let body : (Parsetree.pattern * Parsetree.expression) = Obj.magic body in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_body_ in + let _endpos = _endpos_body_ in + let _v : (Parsetree.pattern * Parsetree.expression * Parsetree.binding_op list) = +# 2751 "parsing/parser.mly" + ( let let_pat, let_exp = body in + let_pat, let_exp, [] ) +# 28214 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = body; + MenhirLib.EngineTypes.startp = _startpos_body_; + MenhirLib.EngineTypes.endp = _endpos_body_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = bindings; + MenhirLib.EngineTypes.startp = _startpos_bindings_; + MenhirLib.EngineTypes.endp = _endpos_bindings_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let body : (Parsetree.pattern * Parsetree.expression) = Obj.magic body in + let _1 : ( +# 768 "parsing/parser.mly" + (string) +# 28248 "parsing/parser.ml" + ) = Obj.magic _1 in + let bindings : (Parsetree.pattern * Parsetree.expression * Parsetree.binding_op list) = Obj.magic bindings in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_bindings_ in + let _endpos = _endpos_body_ in + let _v = + let pbop_op = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 972 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 28262 "parsing/parser.ml" + + in + let _endpos = _endpos_body_ in + let _symbolstartpos = _startpos_bindings_ in + let _sloc = (_symbolstartpos, _endpos) in + ( +# 2754 "parsing/parser.mly" + ( let let_pat, let_exp, rev_ands = bindings in + let pbop_pat, pbop_exp = body in + let pbop_loc = make_loc _sloc in + let and_ = {pbop_op; pbop_pat; pbop_exp; pbop_loc} in + let_pat, let_exp, and_ :: rev_ands ) +# 28275 "parsing/parser.ml" + : (Parsetree.pattern * Parsetree.expression * Parsetree.binding_op list)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (Parsetree.class_declaration list) = +# 216 "" + ( [] ) +# 28294 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = body; + MenhirLib.EngineTypes.startp = _startpos_body_; + MenhirLib.EngineTypes.endp = _endpos_body_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = params; + MenhirLib.EngineTypes.startp = _startpos_params_; + MenhirLib.EngineTypes.endp = _endpos_params_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = virt; + MenhirLib.EngineTypes.startp = _startpos_virt_; + MenhirLib.EngineTypes.endp = _endpos_virt_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1_inlined1; @@ -27972,70 +28350,71 @@ module Tables = struct }; }; } = _menhir_stack in - let _8 : (Parsetree.expression) = Obj.magic _8 in - let _7 : unit = Obj.magic _7 in - let _1_inlined3 : (Parsetree.core_type) = Obj.magic _1_inlined3 in - let _5 : unit = Obj.magic _5 in + let xs : (Parsetree.class_declaration list) = Obj.magic xs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let body : (Parsetree.class_expr) = Obj.magic body in let _1_inlined2 : ( -# 797 "parsing/parser.mly" +# 785 "parsing/parser.mly" (string) -# 27983 "parsing/parser.ml" +# 28360 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in - let _3 : (Asttypes.private_flag) = Obj.magic _3 in + let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in + let virt : (Asttypes.virtual_flag) = Obj.magic virt in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__8_ in + let _endpos = _endpos_xs_ in let _v = - let _6 = - let _1 = _1_inlined3 in - -# 3480 "parsing/parser.mly" + let x = + let attrs2 = + let _1 = _1_inlined3 in + +# 4282 "parsing/parser.mly" ( _1 ) -# 27997 "parsing/parser.ml" - - in - let _startpos__6_ = _startpos__1_inlined3_ in - let _4 = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in - let _1 = -# 3765 "parsing/parser.mly" - ( _1 ) -# 28006 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in +# 28376 "parsing/parser.ml" + + in + let _endpos_attrs2_ = _endpos__1_inlined3_ in + let id = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 972 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 28388 "parsing/parser.ml" + + in + let attrs1 = + let _1 = _1_inlined1 in + +# 4286 "parsing/parser.mly" + ( _1 ) +# 28396 "parsing/parser.ml" + + in + let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 28014 "parsing/parser.ml" - - in - let _2 = - let _1 = _1_inlined1 in - -# 4114 "parsing/parser.mly" - ( _1 ) -# 28022 "parsing/parser.ml" +# 1954 "parsing/parser.mly" + ( + let attrs = attrs1 @ attrs2 in + let loc = make_loc _sloc in + let docs = symbol_docs _sloc in + let text = symbol_text _symbolstartpos in + Ci.mk id body ~virt ~params ~attrs ~loc ~text ~docs + ) +# 28411 "parsing/parser.ml" in - let _1 = -# 4017 "parsing/parser.mly" - ( Override ) -# 28028 "parsing/parser.ml" - in ( -# 2112 "parsing/parser.mly" - ( let poly_exp = - let loc = (_startpos__6_, _endpos__8_) in - ghexp ~loc (Pexp_poly(_8, Some _6)) in - (_4, _3, Cfk_concrete (_1, poly_exp)), _2 ) -# 28036 "parsing/parser.ml" - : ((Asttypes.label Asttypes.loc * Asttypes.private_flag * - Parsetree.class_field_kind) * - Parsetree.attributes)) +# 219 "" + ( x :: xs ) +# 28417 "parsing/parser.ml" + : (Parsetree.class_declaration list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28044,60 +28423,72 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos; MenhirLib.EngineTypes.next = _menhir_stack; }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (Parsetree.class_description list) = +# 216 "" + ( [] ) +# 28436 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _11; - MenhirLib.EngineTypes.startp = _startpos__11_; - MenhirLib.EngineTypes.endp = _endpos__11_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _10; - MenhirLib.EngineTypes.startp = _startpos__10_; - MenhirLib.EngineTypes.endp = _endpos__10_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _9; - MenhirLib.EngineTypes.startp = _startpos__9_; - MenhirLib.EngineTypes.endp = _endpos__9_; + MenhirLib.EngineTypes.semv = cty; + MenhirLib.EngineTypes.startp = _startpos_cty_; + MenhirLib.EngineTypes.endp = _endpos_cty_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _8; - MenhirLib.EngineTypes.startp = _startpos__8_; - MenhirLib.EngineTypes.endp = _endpos__8_; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _6; - MenhirLib.EngineTypes.startp = _startpos__6_; - MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.semv = params; + MenhirLib.EngineTypes.startp = _startpos_params_; + MenhirLib.EngineTypes.endp = _endpos_params_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = virt; + MenhirLib.EngineTypes.startp = _startpos_virt_; + MenhirLib.EngineTypes.endp = _endpos_virt_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1_inlined1; MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; @@ -28107,87 +28498,72 @@ module Tables = struct }; }; } = _menhir_stack in - let _11 : (Parsetree.expression) = Obj.magic _11 in - let _10 : unit = Obj.magic _10 in - let _9 : (Parsetree.core_type) = Obj.magic _9 in - let _8 : unit = Obj.magic _8 in - let xs : (string Asttypes.loc list) = Obj.magic xs in + let xs : (Parsetree.class_description list) = Obj.magic xs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let cty : (Parsetree.class_type) = Obj.magic cty in let _6 : unit = Obj.magic _6 in - let _5 : unit = Obj.magic _5 in - let _1_inlined1 : ( -# 797 "parsing/parser.mly" + let _1_inlined2 : ( +# 785 "parsing/parser.mly" (string) -# 28121 "parsing/parser.ml" - ) = Obj.magic _1_inlined1 in - let _3 : (Asttypes.private_flag) = Obj.magic _3 in - let _1 : (Parsetree.attributes) = Obj.magic _1 in +# 28509 "parsing/parser.ml" + ) = Obj.magic _1_inlined2 in + let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in + let virt : (Asttypes.virtual_flag) = Obj.magic virt in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__11_ in + let _endpos = _endpos_xs_ in let _v = - let _7 = -# 2679 "parsing/parser.mly" - ( xs ) -# 28132 "parsing/parser.ml" - in - let _startpos__7_ = _startpos_xs_ in - let _4 = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in - let _1 = -# 3765 "parsing/parser.mly" - ( _1 ) -# 28140 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in + let x = + let attrs2 = + let _1 = _1_inlined3 in + +# 4282 "parsing/parser.mly" + ( _1 ) +# 28525 "parsing/parser.ml" + + in + let _endpos_attrs2_ = _endpos__1_inlined3_ in + let id = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 972 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 28537 "parsing/parser.ml" + + in + let attrs1 = + let _1 = _1_inlined1 in + +# 4286 "parsing/parser.mly" + ( _1 ) +# 28545 "parsing/parser.ml" + + in + let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 28148 "parsing/parser.ml" +# 2245 "parsing/parser.mly" + ( + let attrs = attrs1 @ attrs2 in + let loc = make_loc _sloc in + let docs = symbol_docs _sloc in + let text = symbol_text _symbolstartpos in + Ci.mk id cty ~virt ~params ~attrs ~loc ~text ~docs + ) +# 28560 "parsing/parser.ml" in - let _startpos__4_ = _startpos__1_inlined1_ in - let _2 = -# 4114 "parsing/parser.mly" - ( _1 ) -# 28155 "parsing/parser.ml" - in - let (_endpos__2_, _startpos__2_) = (_endpos__1_, _startpos__1_) in - let _1 = -# 4016 "parsing/parser.mly" - ( Fresh ) -# 28161 "parsing/parser.ml" - in - let (_endpos__1_, _startpos__1_) = (_endpos__0_, _endpos__0_) in - let _endpos = _endpos__11_ in - let _symbolstartpos = if _startpos__1_ != _endpos__1_ then - _startpos__1_ - else - if _startpos__2_ != _endpos__2_ then - _startpos__2_ - else - if _startpos__3_ != _endpos__3_ then - _startpos__3_ - else - _startpos__4_ in - let _sloc = (_symbolstartpos, _endpos) in ( -# 2118 "parsing/parser.mly" - ( let poly_exp_loc = (_startpos__7_, _endpos__11_) in - let poly_exp = - let exp, poly = - (* it seems odd to use the global ~loc here while poly_exp_loc - is tighter, but this is what ocamlyacc does; - TODO improve parser.mly *) - wrap_type_annotation ~loc:_sloc _7 _9 _11 in - ghexp ~loc:poly_exp_loc (Pexp_poly(exp, Some poly)) in - (_4, _3, - Cfk_concrete (_1, poly_exp)), _2 ) -# 28188 "parsing/parser.ml" - : ((Asttypes.label Asttypes.loc * Asttypes.private_flag * - Parsetree.class_field_kind) * - Parsetree.attributes)) +# 219 "" + ( x :: xs ) +# 28566 "parsing/parser.ml" + : (Parsetree.class_description list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28196,66 +28572,72 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos; MenhirLib.EngineTypes.next = _menhir_stack; }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (Parsetree.class_type_declaration list) = +# 216 "" + ( [] ) +# 28585 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _11; - MenhirLib.EngineTypes.startp = _startpos__11_; - MenhirLib.EngineTypes.endp = _endpos__11_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _10; - MenhirLib.EngineTypes.startp = _startpos__10_; - MenhirLib.EngineTypes.endp = _endpos__10_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _9; - MenhirLib.EngineTypes.startp = _startpos__9_; - MenhirLib.EngineTypes.endp = _endpos__9_; + MenhirLib.EngineTypes.semv = csig; + MenhirLib.EngineTypes.startp = _startpos_csig_; + MenhirLib.EngineTypes.endp = _endpos_csig_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _8; - MenhirLib.EngineTypes.startp = _startpos__8_; - MenhirLib.EngineTypes.endp = _endpos__8_; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _6; - MenhirLib.EngineTypes.startp = _startpos__6_; - MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.semv = params; + MenhirLib.EngineTypes.startp = _startpos_params_; + MenhirLib.EngineTypes.endp = _endpos_params_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = virt; + MenhirLib.EngineTypes.startp = _startpos_virt_; + MenhirLib.EngineTypes.endp = _endpos_virt_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; @@ -28265,90 +28647,72 @@ module Tables = struct }; }; } = _menhir_stack in - let _11 : (Parsetree.expression) = Obj.magic _11 in - let _10 : unit = Obj.magic _10 in - let _9 : (Parsetree.core_type) = Obj.magic _9 in - let _8 : unit = Obj.magic _8 in - let xs : (string Asttypes.loc list) = Obj.magic xs in + let xs : (Parsetree.class_type_declaration list) = Obj.magic xs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let csig : (Parsetree.class_type) = Obj.magic csig in let _6 : unit = Obj.magic _6 in - let _5 : unit = Obj.magic _5 in let _1_inlined2 : ( -# 797 "parsing/parser.mly" +# 785 "parsing/parser.mly" (string) -# 28279 "parsing/parser.ml" +# 28658 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in - let _3 : (Asttypes.private_flag) = Obj.magic _3 in + let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in + let virt : (Asttypes.virtual_flag) = Obj.magic virt in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__11_ in + let _endpos = _endpos_xs_ in let _v = - let _7 = -# 2679 "parsing/parser.mly" - ( xs ) -# 28291 "parsing/parser.ml" - in - let _startpos__7_ = _startpos_xs_ in - let _4 = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in - let _1 = -# 3765 "parsing/parser.mly" - ( _1 ) -# 28299 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in + let x = + let attrs2 = + let _1 = _1_inlined3 in + +# 4282 "parsing/parser.mly" + ( _1 ) +# 28674 "parsing/parser.ml" + + in + let _endpos_attrs2_ = _endpos__1_inlined3_ in + let id = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 972 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 28686 "parsing/parser.ml" + + in + let attrs1 = + let _1 = _1_inlined1 in + +# 4286 "parsing/parser.mly" + ( _1 ) +# 28694 "parsing/parser.ml" + + in + let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 28307 "parsing/parser.ml" - - in - let _startpos__4_ = _startpos__1_inlined2_ in - let _2 = - let _1 = _1_inlined1 in - -# 4114 "parsing/parser.mly" - ( _1 ) -# 28316 "parsing/parser.ml" +# 2284 "parsing/parser.mly" + ( + let attrs = attrs1 @ attrs2 in + let loc = make_loc _sloc in + let docs = symbol_docs _sloc in + let text = symbol_text _symbolstartpos in + Ci.mk id csig ~virt ~params ~attrs ~loc ~text ~docs + ) +# 28709 "parsing/parser.ml" in - let (_endpos__2_, _startpos__2_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in - let _1 = -# 4017 "parsing/parser.mly" - ( Override ) -# 28323 "parsing/parser.ml" - in - let _endpos = _endpos__11_ in - let _symbolstartpos = if _startpos__1_ != _endpos__1_ then - _startpos__1_ - else - if _startpos__2_ != _endpos__2_ then - _startpos__2_ - else - if _startpos__3_ != _endpos__3_ then - _startpos__3_ - else - _startpos__4_ in - let _sloc = (_symbolstartpos, _endpos) in ( -# 2118 "parsing/parser.mly" - ( let poly_exp_loc = (_startpos__7_, _endpos__11_) in - let poly_exp = - let exp, poly = - (* it seems odd to use the global ~loc here while poly_exp_loc - is tighter, but this is what ocamlyacc does; - TODO improve parser.mly *) - wrap_type_annotation ~loc:_sloc _7 _9 _11 in - ghexp ~loc:poly_exp_loc (Pexp_poly(exp, Some poly)) in - (_4, _3, - Cfk_concrete (_1, poly_exp)), _2 ) -# 28349 "parsing/parser.ml" - : ((Asttypes.label Asttypes.loc * Asttypes.private_flag * - Parsetree.class_field_kind) * - Parsetree.attributes)) +# 219 "" + ( x :: xs ) +# 28715 "parsing/parser.ml" + : (Parsetree.class_type_declaration list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28359,25 +28723,14 @@ module Tables = struct }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : ( -# 797 "parsing/parser.mly" - (string) -# 28373 "parsing/parser.ml" - ) = Obj.magic _1 in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Longident.t) = -# 3869 "parsing/parser.mly" - ( Lident _1 ) -# 28381 "parsing/parser.ml" + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (Parsetree.module_binding list) = +# 216 "" + ( [] ) +# 28734 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28390,38 +28743,101 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = body; + MenhirLib.EngineTypes.startp = _startpos_body_; + MenhirLib.EngineTypes.endp = _endpos_body_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; }; }; } = _menhir_stack in - let _3 : ( -# 797 "parsing/parser.mly" - (string) -# 28414 "parsing/parser.ml" - ) = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in + let xs : (Parsetree.module_binding list) = Obj.magic xs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let body : (Parsetree.module_expr) = Obj.magic body in + let _1_inlined2 : (string option) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Longident.t) = -# 3870 "parsing/parser.mly" - ( Ldot(_1,_3) ) -# 28424 "parsing/parser.ml" - in + let _endpos = _endpos_xs_ in + let _v = + let x = + let attrs2 = + let _1 = _1_inlined3 in + +# 4282 "parsing/parser.mly" + ( _1 ) +# 28798 "parsing/parser.ml" + + in + let _endpos_attrs2_ = _endpos__1_inlined3_ in + let name = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 972 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 28810 "parsing/parser.ml" + + in + let attrs1 = + let _1 = _1_inlined1 in + +# 4286 "parsing/parser.mly" + ( _1 ) +# 28818 "parsing/parser.ml" + + in + let _endpos = _endpos_attrs2_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1612 "parsing/parser.mly" + ( + let loc = make_loc _sloc in + let attrs = attrs1 @ attrs2 in + let docs = symbol_docs _sloc in + let text = symbol_text _symbolstartpos in + Mb.mk name body ~attrs ~loc ~text ~docs + ) +# 28833 "parsing/parser.ml" + + in + ( +# 219 "" + ( x :: xs ) +# 28839 "parsing/parser.ml" + : (Parsetree.module_binding list)) + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -28431,25 +28847,14 @@ module Tables = struct }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : ( -# 848 "parsing/parser.mly" - (string) -# 28445 "parsing/parser.ml" - ) = Obj.magic _1 in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Longident.t) = -# 3869 "parsing/parser.mly" - ( Lident _1 ) -# 28453 "parsing/parser.ml" + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (Parsetree.module_declaration list) = +# 216 "" + ( [] ) +# 28858 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28462,38 +28867,108 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = mty; + MenhirLib.EngineTypes.startp = _startpos_mty_; + MenhirLib.EngineTypes.endp = _endpos_mty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; }; }; } = _menhir_stack in - let _3 : ( -# 848 "parsing/parser.mly" - (string) -# 28486 "parsing/parser.ml" - ) = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in + let xs : (Parsetree.module_declaration list) = Obj.magic xs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let mty : (Parsetree.module_type) = Obj.magic mty in + let _4 : unit = Obj.magic _4 in + let _1_inlined2 : (string option) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Longident.t) = -# 3870 "parsing/parser.mly" - ( Ldot(_1,_3) ) -# 28496 "parsing/parser.ml" - in + let _endpos = _endpos_xs_ in + let _v = + let x = + let attrs2 = + let _1 = _1_inlined3 in + +# 4282 "parsing/parser.mly" + ( _1 ) +# 28929 "parsing/parser.ml" + + in + let _endpos_attrs2_ = _endpos__1_inlined3_ in + let name = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 972 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 28941 "parsing/parser.ml" + + in + let attrs1 = + let _1 = _1_inlined1 in + +# 4286 "parsing/parser.mly" + ( _1 ) +# 28949 "parsing/parser.ml" + + in + let _endpos = _endpos_attrs2_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1895 "parsing/parser.mly" + ( + let attrs = attrs1 @ attrs2 in + let docs = symbol_docs _sloc in + let loc = make_loc _sloc in + let text = symbol_text _symbolstartpos in + Md.mk name mty ~attrs ~loc ~text ~docs + ) +# 28964 "parsing/parser.ml" + + in + ( +# 219 "" + ( x :: xs ) +# 28970 "parsing/parser.ml" + : (Parsetree.module_declaration list)) + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -28503,29 +28978,15 @@ module Tables = struct }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : (Asttypes.label) = Obj.magic _1 in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v = - let _1 = -# 3907 "parsing/parser.mly" - ( _1 ) -# 28522 "parsing/parser.ml" - in - ( -# 3869 "parsing/parser.mly" - ( Lident _1 ) -# 28527 "parsing/parser.ml" - : (Longident.t)) - in + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (Parsetree.attributes) = +# 216 "" + ( [] ) +# 28989 "parsing/parser.ml" + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -28537,48 +28998,27 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _3 : unit = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in + let xs : (Parsetree.attributes) = Obj.magic xs in + let x : (Parsetree.attribute) = Obj.magic x in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v = - let _1 = - let _1 = -# 3849 "parsing/parser.mly" - ( "::" ) -# 28569 "parsing/parser.ml" - in - -# 3907 "parsing/parser.mly" - ( _1 ) -# 28574 "parsing/parser.ml" - - in - ( -# 3869 "parsing/parser.mly" - ( Lident _1 ) -# 28580 "parsing/parser.ml" - : (Longident.t)) - in + let _startpos = _startpos_x_ in + let _endpos = _endpos_xs_ in + let _v : (Parsetree.attributes) = +# 219 "" + ( x :: xs ) +# 29021 "parsing/parser.ml" + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -28588,29 +29028,15 @@ module Tables = struct }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : (Asttypes.label) = Obj.magic _1 in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v = - let _1 = -# 3907 "parsing/parser.mly" - ( _1 ) -# 28607 "parsing/parser.ml" - in - ( -# 3869 "parsing/parser.mly" - ( Lident _1 ) -# 28612 "parsing/parser.ml" - : (Longident.t)) - in + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (Parsetree.type_declaration list) = +# 216 "" + ( [] ) +# 29039 "parsing/parser.ml" + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -28622,45 +29048,141 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs_inlined1; + MenhirLib.EngineTypes.startp = _startpos_xs_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_xs_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = kind_priv_manifest; + MenhirLib.EngineTypes.startp = _startpos_kind_priv_manifest_; + MenhirLib.EngineTypes.endp = _endpos_kind_priv_manifest_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = params; + MenhirLib.EngineTypes.startp = _startpos_params_; + MenhirLib.EngineTypes.endp = _endpos_params_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; }; }; } = _menhir_stack in - let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in - let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in + let xs : (Parsetree.type_declaration list) = Obj.magic xs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let xs_inlined1 : ((Parsetree.core_type * Parsetree.core_type * Ast_helper.loc) list) = Obj.magic xs_inlined1 in + let kind_priv_manifest : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = Obj.magic kind_priv_manifest in + let _1_inlined2 : ( +# 785 "parsing/parser.mly" + (string) +# 29106 "parsing/parser.ml" + ) = Obj.magic _1_inlined2 in + let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined1_ in + let _endpos = _endpos_xs_ in let _v = - let _3 = - let _1 = _1_inlined1 in - -# 3907 "parsing/parser.mly" - ( _1 ) -# 28655 "parsing/parser.ml" - - in - ( -# 3870 "parsing/parser.mly" - ( Ldot(_1,_3) ) -# 28661 "parsing/parser.ml" - : (Longident.t)) - in - { + let x = + let xs = xs_inlined1 in + let attrs2 = + let _1 = _1_inlined3 in + +# 4282 "parsing/parser.mly" + ( _1 ) +# 29122 "parsing/parser.ml" + + in + let _endpos_attrs2_ = _endpos__1_inlined3_ in + let cstrs = + let _1 = + let xs = +# 264 "" + ( List.rev xs ) +# 29131 "parsing/parser.ml" + in + +# 1056 "parsing/parser.mly" + ( xs ) +# 29136 "parsing/parser.ml" + + in + +# 3300 "parsing/parser.mly" + ( _1 ) +# 29142 "parsing/parser.ml" + + in + let id = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 972 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 29153 "parsing/parser.ml" + + in + let attrs1 = + let _1 = _1_inlined1 in + +# 4286 "parsing/parser.mly" + ( _1 ) +# 29161 "parsing/parser.ml" + + in + let _endpos = _endpos_attrs2_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 3289 "parsing/parser.mly" + ( + let (kind, priv, manifest) = kind_priv_manifest in + let docs = symbol_docs _sloc in + let attrs = attrs1 @ attrs2 in + let loc = make_loc _sloc in + let text = symbol_text _symbolstartpos in + Type.mk id ~params ~cstrs ~kind ~priv ?manifest ~attrs ~loc ~docs ~text + ) +# 29177 "parsing/parser.ml" + + in + ( +# 219 "" + ( x :: xs ) +# 29183 "parsing/parser.ml" + : (Parsetree.type_declaration list)) + in + { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; MenhirLib.EngineTypes.startp = _startpos; @@ -28669,64 +29191,15 @@ module Tables = struct }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2_inlined1; - MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - } = _menhir_stack in - let _3 : unit = Obj.magic _3 in - let _2_inlined1 : unit = Obj.magic _2_inlined1 in - let _1_inlined1 : unit = Obj.magic _1_inlined1 in - let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v = - let _3 = - let _1 = -# 3849 "parsing/parser.mly" - ( "::" ) -# 28717 "parsing/parser.ml" - in - -# 3907 "parsing/parser.mly" - ( _1 ) -# 28722 "parsing/parser.ml" - - in - ( -# 3870 "parsing/parser.mly" - ( Ldot(_1,_3) ) -# 28728 "parsing/parser.ml" - : (Longident.t)) - in + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (Parsetree.type_declaration list) = +# 216 "" + ( [] ) +# 29202 "parsing/parser.ml" + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -28738,43 +29211,151 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined4; + MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs_inlined1; + MenhirLib.EngineTypes.startp = _startpos_xs_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_xs_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = params; + MenhirLib.EngineTypes.startp = _startpos_params_; + MenhirLib.EngineTypes.endp = _endpos_params_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; }; }; } = _menhir_stack in - let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in - let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in + let xs : (Parsetree.type_declaration list) = Obj.magic xs in + let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in + let xs_inlined1 : ((Parsetree.core_type * Parsetree.core_type * Ast_helper.loc) list) = Obj.magic xs_inlined1 in + let _2 : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = Obj.magic _2 in + let _1_inlined3 : unit = Obj.magic _1_inlined3 in + let _1_inlined2 : ( +# 785 "parsing/parser.mly" + (string) +# 29276 "parsing/parser.ml" + ) = Obj.magic _1_inlined2 in + let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined1_ in + let _endpos = _endpos_xs_ in let _v = - let _3 = - let _1 = _1_inlined1 in + let x = + let xs = xs_inlined1 in + let attrs2 = + let _1 = _1_inlined4 in + +# 4282 "parsing/parser.mly" + ( _1 ) +# 29292 "parsing/parser.ml" + + in + let _endpos_attrs2_ = _endpos__1_inlined4_ in + let cstrs = + let _1 = + let xs = +# 264 "" + ( List.rev xs ) +# 29301 "parsing/parser.ml" + in + +# 1056 "parsing/parser.mly" + ( xs ) +# 29306 "parsing/parser.ml" + + in + +# 3300 "parsing/parser.mly" + ( _1 ) +# 29312 "parsing/parser.ml" + + in + let kind_priv_manifest = +# 3335 "parsing/parser.mly" + ( _2 ) +# 29318 "parsing/parser.ml" + in + let id = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 972 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 29328 "parsing/parser.ml" + + in + let attrs1 = + let _1 = _1_inlined1 in + +# 4286 "parsing/parser.mly" + ( _1 ) +# 29336 "parsing/parser.ml" + + in + let _endpos = _endpos_attrs2_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 3907 "parsing/parser.mly" - ( _1 ) -# 28771 "parsing/parser.ml" +# 3289 "parsing/parser.mly" + ( + let (kind, priv, manifest) = kind_priv_manifest in + let docs = symbol_docs _sloc in + let attrs = attrs1 @ attrs2 in + let loc = make_loc _sloc in + let text = symbol_text _symbolstartpos in + Type.mk id ~params ~cstrs ~kind ~priv ?manifest ~attrs ~loc ~docs ~text + ) +# 29352 "parsing/parser.ml" in ( -# 3870 "parsing/parser.mly" - ( Ldot(_1,_3) ) -# 28777 "parsing/parser.ml" - : (Longident.t)) +# 219 "" + ( x :: xs ) +# 29358 "parsing/parser.ml" + : (Parsetree.type_declaration list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28785,21 +29366,14 @@ module Tables = struct }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : (Asttypes.label) = Obj.magic _1 in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Longident.t) = -# 3869 "parsing/parser.mly" - ( Lident _1 ) -# 28803 "parsing/parser.ml" + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (Parsetree.attributes) = +# 216 "" + ( [] ) +# 29377 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28812,33 +29386,26 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _3 : (Asttypes.label) = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in + let xs : (Parsetree.attributes) = Obj.magic xs in + let x : (Parsetree.attribute) = Obj.magic x in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Longident.t) = -# 3870 "parsing/parser.mly" - ( Ldot(_1,_3) ) -# 28842 "parsing/parser.ml" + let _startpos = _startpos_x_ in + let _endpos = _endpos_xs_ in + let _v : (Parsetree.attributes) = +# 219 "" + ( x :: xs ) +# 29409 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28849,25 +29416,14 @@ module Tables = struct }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : ( -# 797 "parsing/parser.mly" - (string) -# 28863 "parsing/parser.ml" - ) = Obj.magic _1 in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Longident.t) = -# 3869 "parsing/parser.mly" - ( Lident _1 ) -# 28871 "parsing/parser.ml" + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (Parsetree.signature_item list list) = +# 216 "" + ( [] ) +# 29427 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28880,38 +29436,44 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _3 : ( -# 797 "parsing/parser.mly" - (string) -# 28904 "parsing/parser.ml" - ) = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in + let xs : (Parsetree.signature_item list list) = Obj.magic xs in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Longident.t) = -# 3870 "parsing/parser.mly" - ( Ldot(_1,_3) ) -# 28914 "parsing/parser.ml" - in + let _endpos = _endpos_xs_ in + let _v = + let x = + let _1 = + let _startpos = _startpos__1_ in + +# 982 "parsing/parser.mly" + ( text_sig _startpos ) +# 29463 "parsing/parser.ml" + + in + +# 1752 "parsing/parser.mly" + ( _1 ) +# 29469 "parsing/parser.ml" + + in + ( +# 219 "" + ( x :: xs ) +# 29475 "parsing/parser.ml" + : (Parsetree.signature_item list list)) + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -28922,25 +29484,45 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; } = _menhir_stack in - let _1 : ( -# 848 "parsing/parser.mly" - (string) -# 28935 "parsing/parser.ml" - ) = Obj.magic _1 in + let xs : (Parsetree.signature_item list list) = Obj.magic xs in + let _1 : (Parsetree.signature_item) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Longident.t) = -# 3869 "parsing/parser.mly" - ( Lident _1 ) -# 28943 "parsing/parser.ml" - in + let _endpos = _endpos_xs_ in + let _v = + let x = + let _1 = + let _startpos = _startpos__1_ in + +# 980 "parsing/parser.mly" + ( text_sig _startpos @ [_1] ) +# 29512 "parsing/parser.ml" + + in + +# 1752 "parsing/parser.mly" + ( _1 ) +# 29518 "parsing/parser.ml" + + in + ( +# 219 "" + ( x :: xs ) +# 29524 "parsing/parser.ml" + : (Parsetree.signature_item list list)) + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -28950,39 +29532,14 @@ module Tables = struct }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - } = _menhir_stack in - let _3 : ( -# 848 "parsing/parser.mly" - (string) -# 28976 "parsing/parser.ml" - ) = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Longident.t) = -# 3870 "parsing/parser.mly" - ( Ldot(_1,_3) ) -# 28986 "parsing/parser.ml" + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (Parsetree.structure_item list list) = +# 216 "" + ( [] ) +# 29543 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28994,21 +29551,64 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; } = _menhir_stack in - let _1 : (Asttypes.label) = Obj.magic _1 in + let xs : (Parsetree.structure_item list list) = Obj.magic xs in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Longident.t) = -# 3869 "parsing/parser.mly" - ( Lident _1 ) -# 29011 "parsing/parser.ml" - in + let _endpos = _endpos_xs_ in + let _v = + let x = + let _1 = + let ys = + let items = +# 1042 "parsing/parser.mly" + ( [] ) +# 29579 "parsing/parser.ml" + in + +# 1493 "parsing/parser.mly" + ( items ) +# 29584 "parsing/parser.ml" + + in + let xs = + let _startpos = _startpos__1_ in + +# 978 "parsing/parser.mly" + ( text_str _startpos ) +# 29592 "parsing/parser.ml" + + in + +# 278 "" + ( xs @ ys ) +# 29598 "parsing/parser.ml" + + in + +# 1509 "parsing/parser.mly" + ( _1 ) +# 29604 "parsing/parser.ml" + + in + ( +# 219 "" + ( x :: xs ) +# 29610 "parsing/parser.ml" + : (Parsetree.structure_item list list)) + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -29020,83 +29620,19 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - } = _menhir_stack in - let _3 : (Asttypes.label) = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Longident.t) = -# 3870 "parsing/parser.mly" - ( Ldot(_1,_3) ) -# 29050 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : (Longident.t) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Longident.t) = -# 3885 "parsing/parser.mly" - ( _1 ) -# 29075 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = e; + MenhirLib.EngineTypes.startp = _startpos_e_; + MenhirLib.EngineTypes.endp = _endpos_e_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -29107,22 +29643,88 @@ module Tables = struct }; }; } = _menhir_stack in - let _4 : unit = Obj.magic _4 in - let _3 : (Longident.t) = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in + let xs : (Parsetree.structure_item list list) = Obj.magic xs in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let e : (Parsetree.expression) = Obj.magic e in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__4_ in + let _endpos = _endpos_xs_ in let _v = - let _endpos = _endpos__4_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let x = + let _1 = + let ys = + let (_endpos__1_, _1) = (_endpos__1_inlined1_, _1_inlined1) in + let items = + let x = + let _1 = + let _1 = + let attrs = +# 4282 "parsing/parser.mly" + ( _1 ) +# 29666 "parsing/parser.ml" + in + +# 1500 "parsing/parser.mly" + ( mkstrexp e attrs ) +# 29671 "parsing/parser.ml" + + in + let _startpos__1_ = _startpos_e_ in + let _startpos = _startpos__1_ in + +# 976 "parsing/parser.mly" + ( text_str _startpos @ [_1] ) +# 29679 "parsing/parser.ml" + + in + let _startpos__1_ = _startpos_e_ in + let _endpos = _endpos__1_ in + let _startpos = _startpos__1_ in + +# 995 "parsing/parser.mly" + ( mark_rhs_docs _startpos _endpos; + _1 ) +# 29689 "parsing/parser.ml" + + in + +# 1044 "parsing/parser.mly" + ( x ) +# 29695 "parsing/parser.ml" + + in + +# 1493 "parsing/parser.mly" + ( items ) +# 29701 "parsing/parser.ml" + + in + let xs = + let _startpos = _startpos__1_ in + +# 978 "parsing/parser.mly" + ( text_str _startpos ) +# 29709 "parsing/parser.ml" + + in + +# 278 "" + ( xs @ ys ) +# 29715 "parsing/parser.ml" + + in + +# 1509 "parsing/parser.mly" + ( _1 ) +# 29721 "parsing/parser.ml" + + in ( -# 3887 "parsing/parser.mly" - ( lapply ~loc:_sloc _1 _3 ) -# 29125 "parsing/parser.ml" - : (Longident.t)) +# 219 "" + ( x :: xs ) +# 29727 "parsing/parser.ml" + : (Parsetree.structure_item list list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29135,36 +29737,43 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _3 : unit = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in + let xs : (Parsetree.structure_item list list) = Obj.magic xs in + let _1 : (Parsetree.structure_item) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in + let _endpos = _endpos_xs_ in let _v = - let _loc__3_ = (_startpos__3_, _endpos__3_) in + let x = + let _1 = + let _startpos = _startpos__1_ in + +# 976 "parsing/parser.mly" + ( text_str _startpos @ [_1] ) +# 29764 "parsing/parser.ml" + + in + +# 1509 "parsing/parser.mly" + ( _1 ) +# 29770 "parsing/parser.ml" + + in ( -# 3889 "parsing/parser.mly" - ( expecting _loc__3_ "module path" ) -# 29167 "parsing/parser.ml" - : (Longident.t)) +# 219 "" + ( x :: xs ) +# 29776 "parsing/parser.ml" + : (Parsetree.structure_item list list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29175,21 +29784,14 @@ module Tables = struct }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : (Longident.t) = Obj.magic _1 in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Longident.t) = -# 3882 "parsing/parser.mly" - ( _1 ) -# 29193 "parsing/parser.ml" + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (Parsetree.class_type_field list list) = +# 216 "" + ( [] ) +# 29795 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29202,9 +29804,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = me; - MenhirLib.EngineTypes.startp = _startpos_me_; - MenhirLib.EngineTypes.endp = _endpos_me_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -29213,15 +29815,43 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let me : (Parsetree.module_expr) = Obj.magic me in - let _1 : unit = Obj.magic _1 in + let xs : (Parsetree.class_type_field list list) = Obj.magic xs in + let _1 : (Parsetree.class_type_field) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_me_ in - let _v : (Parsetree.module_expr) = -# 1581 "parsing/parser.mly" - ( me ) -# 29225 "parsing/parser.ml" + let _endpos = _endpos_xs_ in + let _v = + let x = + let _startpos = _startpos__1_ in + +# 990 "parsing/parser.mly" + ( text_csig _startpos @ [_1] ) +# 29830 "parsing/parser.ml" + + in + ( +# 219 "" + ( x :: xs ) +# 29836 "parsing/parser.ml" + : (Parsetree.class_type_field list list)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (Parsetree.class_field list list) = +# 216 "" + ( [] ) +# 29855 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29234,9 +29864,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -29245,18 +29875,25 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _2 : unit = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in + let xs : (Parsetree.class_field list list) = Obj.magic xs in + let _1 : (Parsetree.class_field) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in + let _endpos = _endpos_xs_ in let _v = - let _loc__1_ = (_startpos__1_, _endpos__1_) in + let x = + let _startpos = _startpos__1_ in + +# 988 "parsing/parser.mly" + ( text_cstr _startpos @ [_1] ) +# 29890 "parsing/parser.ml" + + in ( -# 1583 "parsing/parser.mly" - ( expecting _loc__1_ "=" ) -# 29259 "parsing/parser.ml" - : (Parsetree.module_expr)) +# 219 "" + ( x :: xs ) +# 29896 "parsing/parser.ml" + : (Parsetree.class_field list list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29267,61 +29904,15 @@ module Tables = struct }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = me; - MenhirLib.EngineTypes.startp = _startpos_me_; - MenhirLib.EngineTypes.endp = _endpos_me_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = mty; - MenhirLib.EngineTypes.startp = _startpos_mty_; - MenhirLib.EngineTypes.endp = _endpos_mty_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - } = _menhir_stack in - let me : (Parsetree.module_expr) = Obj.magic me in - let _3 : unit = Obj.magic _3 in - let mty : (Parsetree.module_type) = Obj.magic mty in - let _1 : unit = Obj.magic _1 in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos_me_ in - let _v = - let _1 = - let _1 = -# 1586 "parsing/parser.mly" - ( Pmod_constraint(me, mty) ) -# 29308 "parsing/parser.ml" - in - let _endpos__1_ = _endpos_me_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1027 "parsing/parser.mly" - ( mkmod ~loc:_sloc _1 ) -# 29317 "parsing/parser.ml" - - in - ( -# 1590 "parsing/parser.mly" - ( _1 ) -# 29323 "parsing/parser.ml" - : (Parsetree.module_expr)) - in + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (Parsetree.structure_item list list) = +# 216 "" + ( [] ) +# 29915 "parsing/parser.ml" + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -29333,45 +29924,36 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = body; - MenhirLib.EngineTypes.startp = _startpos_body_; - MenhirLib.EngineTypes.endp = _endpos_body_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = arg_and_pos; - MenhirLib.EngineTypes.startp = _startpos_arg_and_pos_; - MenhirLib.EngineTypes.endp = _endpos_arg_and_pos_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let body : (Parsetree.module_expr) = Obj.magic body in - let arg_and_pos : (Lexing.position * Parsetree.functor_parameter) = Obj.magic arg_and_pos in + let xs : (Parsetree.structure_item list list) = Obj.magic xs in + let _1 : (Parsetree.structure_item) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_arg_and_pos_ in - let _endpos = _endpos_body_ in + let _startpos = _startpos__1_ in + let _endpos = _endpos_xs_ in let _v = - let _1 = - let _1 = -# 1588 "parsing/parser.mly" - ( let (_, arg) = arg_and_pos in - Pmod_functor(arg, body) ) -# 29359 "parsing/parser.ml" - in - let (_endpos__1_, _startpos__1_) = (_endpos_body_, _startpos_arg_and_pos_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let x = + let _startpos = _startpos__1_ in -# 1027 "parsing/parser.mly" - ( mkmod ~loc:_sloc _1 ) -# 29368 "parsing/parser.ml" +# 976 "parsing/parser.mly" + ( text_str _startpos @ [_1] ) +# 29950 "parsing/parser.ml" in ( -# 1590 "parsing/parser.mly" - ( _1 ) -# 29374 "parsing/parser.ml" - : (Parsetree.module_expr)) +# 219 "" + ( x :: xs ) +# 29956 "parsing/parser.ml" + : (Parsetree.structure_item list list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29382,28 +29964,14 @@ module Tables = struct }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = mty; - MenhirLib.EngineTypes.startp = _startpos_mty_; - MenhirLib.EngineTypes.endp = _endpos_mty_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - } = _menhir_stack in - let mty : (Parsetree.module_type) = Obj.magic mty in - let _1 : unit = Obj.magic _1 in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos_mty_ in - let _v : (Parsetree.module_type) = -# 1831 "parsing/parser.mly" - ( mty ) -# 29407 "parsing/parser.ml" + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (Parsetree.toplevel_phrase list list) = +# 216 "" + ( [] ) +# 29975 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29416,9 +29984,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -29427,69 +29995,43 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _2 : unit = Obj.magic _2 in + let xs : (Parsetree.toplevel_phrase list list) = Obj.magic xs in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v = - let _loc__1_ = (_startpos__1_, _endpos__1_) in - ( -# 1833 "parsing/parser.mly" - ( expecting _loc__1_ ":" ) -# 29441 "parsing/parser.ml" - : (Parsetree.module_type)) - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = body; - MenhirLib.EngineTypes.startp = _startpos_body_; - MenhirLib.EngineTypes.endp = _endpos_body_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = arg_and_pos; - MenhirLib.EngineTypes.startp = _startpos_arg_and_pos_; - MenhirLib.EngineTypes.endp = _endpos_arg_and_pos_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - } = _menhir_stack in - let body : (Parsetree.module_type) = Obj.magic body in - let arg_and_pos : (Lexing.position * Parsetree.functor_parameter) = Obj.magic arg_and_pos in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_arg_and_pos_ in - let _endpos = _endpos_body_ in + let _endpos = _endpos_xs_ in let _v = - let _1 = - let _1 = -# 1836 "parsing/parser.mly" - ( let (_, arg) = arg_and_pos in - Pmty_functor(arg, body) ) -# 29477 "parsing/parser.ml" - in - let (_endpos__1_, _startpos__1_) = (_endpos_body_, _startpos_arg_and_pos_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let x = + let _1 = + let x = + let _1 = +# 1042 "parsing/parser.mly" + ( [] ) +# 30011 "parsing/parser.ml" + in + +# 1295 "parsing/parser.mly" + ( _1 ) +# 30016 "parsing/parser.ml" + + in + +# 188 "" + ( x ) +# 30022 "parsing/parser.ml" + + in -# 1029 "parsing/parser.mly" - ( mkmty ~loc:_sloc _1 ) -# 29486 "parsing/parser.ml" +# 1307 "parsing/parser.mly" + ( _1 ) +# 30028 "parsing/parser.ml" in ( -# 1839 "parsing/parser.mly" - ( _1 ) -# 29492 "parsing/parser.ml" - : (Parsetree.module_type)) +# 219 "" + ( x :: xs ) +# 30034 "parsing/parser.ml" + : (Parsetree.toplevel_phrase list list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29502,19 +30044,19 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = s; - MenhirLib.EngineTypes.startp = _startpos_s_; - MenhirLib.EngineTypes.endp = _endpos_s_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = e; + MenhirLib.EngineTypes.startp = _startpos_e_; + MenhirLib.EngineTypes.endp = _endpos_e_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -29525,30 +30067,76 @@ module Tables = struct }; }; } = _menhir_stack in - let _4 : unit = Obj.magic _4 in - let s : (Parsetree.structure) = Obj.magic s in + let xs : (Parsetree.toplevel_phrase list list) = Obj.magic xs in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let e : (Parsetree.expression) = Obj.magic e in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__4_ in + let _endpos = _endpos_xs_ in let _v = - let attrs = - let _1 = _1_inlined1 in - -# 4114 "parsing/parser.mly" + let x = + let _1 = + let x = + let _1 = _1_inlined1 in + let _1 = + let x = + let _1 = + let _1 = + let attrs = +# 4282 "parsing/parser.mly" ( _1 ) -# 29542 "parsing/parser.ml" +# 30090 "parsing/parser.ml" + in + +# 1500 "parsing/parser.mly" + ( mkstrexp e attrs ) +# 30095 "parsing/parser.ml" + + in + +# 986 "parsing/parser.mly" + ( Ptop_def [_1] ) +# 30101 "parsing/parser.ml" + + in + let _startpos__1_ = _startpos_e_ in + let _startpos = _startpos__1_ in + +# 984 "parsing/parser.mly" + ( text_def _startpos @ [_1] ) +# 30109 "parsing/parser.ml" + + in + +# 1044 "parsing/parser.mly" + ( x ) +# 30115 "parsing/parser.ml" + + in + +# 1295 "parsing/parser.mly" + ( _1 ) +# 30121 "parsing/parser.ml" + + in + +# 188 "" + ( x ) +# 30127 "parsing/parser.ml" + + in + +# 1307 "parsing/parser.mly" + ( _1 ) +# 30133 "parsing/parser.ml" in - let _endpos = _endpos__4_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in ( -# 1419 "parsing/parser.mly" - ( mkmod ~loc:_sloc ~attrs (Pmod_structure s) ) -# 29551 "parsing/parser.ml" - : (Parsetree.module_expr)) +# 219 "" + ( x :: xs ) +# 30139 "parsing/parser.ml" + : (Parsetree.toplevel_phrase list list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29561,52 +30149,48 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _4 : unit = Obj.magic _4 in - let _3 : (Parsetree.structure) = Obj.magic _3 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let _1 : unit = Obj.magic _1 in + let xs : (Parsetree.toplevel_phrase list list) = Obj.magic xs in + let _1 : (Parsetree.structure_item) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__4_ in + let _endpos = _endpos_xs_ in let _v = - let _2 = - let _1 = _1_inlined1 in + let x = + let _1 = + let _1 = +# 986 "parsing/parser.mly" + ( Ptop_def [_1] ) +# 30175 "parsing/parser.ml" + in + let _startpos = _startpos__1_ in + +# 984 "parsing/parser.mly" + ( text_def _startpos @ [_1] ) +# 30181 "parsing/parser.ml" + + in -# 4114 "parsing/parser.mly" - ( _1 ) -# 29601 "parsing/parser.ml" +# 1307 "parsing/parser.mly" + ( _1 ) +# 30187 "parsing/parser.ml" in - let _loc__4_ = (_startpos__4_, _endpos__4_) in - let _loc__1_ = (_startpos__1_, _endpos__1_) in ( -# 1421 "parsing/parser.mly" - ( unclosed "struct" _loc__1_ "end" _loc__4_ ) -# 29609 "parsing/parser.ml" - : (Parsetree.module_expr)) +# 219 "" + ( x :: xs ) +# 30193 "parsing/parser.ml" + : (Parsetree.toplevel_phrase list list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29619,9 +30203,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -29630,18 +30214,42 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _2 : unit = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in + let xs : (Parsetree.toplevel_phrase list list) = Obj.magic xs in + let _1 : (Parsetree.toplevel_phrase) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in + let _endpos = _endpos_xs_ in let _v = - let _loc__1_ = (_startpos__1_, _endpos__1_) in + let x = + let _1 = + let _1 = + let _endpos = _endpos__1_ in + let _startpos = _startpos__1_ in + +# 995 "parsing/parser.mly" + ( mark_rhs_docs _startpos _endpos; + _1 ) +# 30233 "parsing/parser.ml" + + in + let _startpos = _startpos__1_ in + +# 984 "parsing/parser.mly" + ( text_def _startpos @ [_1] ) +# 30240 "parsing/parser.ml" + + in + +# 1307 "parsing/parser.mly" + ( _1 ) +# 30246 "parsing/parser.ml" + + in ( -# 1423 "parsing/parser.mly" - ( expecting _loc__1_ "struct" ) -# 29644 "parsing/parser.ml" - : (Parsetree.module_expr)) +# 219 "" + ( x :: xs ) +# 30252 "parsing/parser.ml" + : (Parsetree.toplevel_phrase list list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29654,72 +30262,73 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = me; - MenhirLib.EngineTypes.startp = _startpos_me_; - MenhirLib.EngineTypes.endp = _endpos_me_; + MenhirLib.EngineTypes.semv = opat; + MenhirLib.EngineTypes.startp = _startpos_opat_; + MenhirLib.EngineTypes.endp = _endpos_opat_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = octy; + MenhirLib.EngineTypes.startp = _startpos_octy_; + MenhirLib.EngineTypes.endp = _endpos_octy_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in - let me : (Parsetree.module_expr) = Obj.magic me in - let _4 : unit = Obj.magic _4 in - let _1_inlined2 : ((Lexing.position * Parsetree.functor_parameter) list) = Obj.magic _1_inlined2 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let _1 : unit = Obj.magic _1 in + let opat : (Parsetree.pattern option) = Obj.magic opat in + let octy : (Parsetree.core_type option) = Obj.magic octy in + let _1 : (Longident.t) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_me_ in + let _endpos = _endpos_opat_ in let _v = - let args = - let _1 = _1_inlined2 in - -# 1385 "parsing/parser.mly" - ( _1 ) -# 29701 "parsing/parser.ml" - - in - let attrs = - let _1 = _1_inlined1 in + let _2 = +# 123 "" + ( None ) +# 30293 "parsing/parser.ml" + in + let x = + let label = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 972 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 30303 "parsing/parser.ml" + + in + let _startpos_label_ = _startpos__1_ in + let _endpos = _endpos_opat_ in + let _symbolstartpos = _startpos_label_ in + let _sloc = (_symbolstartpos, _endpos) in -# 4114 "parsing/parser.mly" - ( _1 ) -# 29709 "parsing/parser.ml" +# 3175 "parsing/parser.mly" + ( let constraint_loc, label, pat = + match opat with + | None -> + (* No pattern; this is a pun. Desugar it. + But that the pattern was there and the label reconstructed (which + piece of AST is marked as ghost is important for warning + emission). *) + _sloc, make_ghost label, pat_of_label label + | Some pat -> + (_startpos_octy_, _endpos), label, pat + in + label, mkpat_opt_constraint ~loc:constraint_loc pat octy + ) +# 30325 "parsing/parser.ml" in - let _endpos = _endpos_me_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in ( -# 1425 "parsing/parser.mly" - ( wrap_mod_attrs ~loc:_sloc attrs ( - List.fold_left (fun acc (startpos, arg) -> - mkmod ~loc:(startpos, _endpos) (Pmod_functor (arg, acc)) - ) me args - ) ) -# 29722 "parsing/parser.ml" - : (Parsetree.module_expr)) +# 1232 "parsing/parser.mly" + ( [x], None ) +# 30331 "parsing/parser.ml" + : ((Longident.t Asttypes.loc * Parsetree.pattern) list * unit option)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29728,109 +30337,84 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos; MenhirLib.EngineTypes.next = _menhir_stack; }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = me; - MenhirLib.EngineTypes.startp = _startpos_me_; - MenhirLib.EngineTypes.endp = _endpos_me_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let me : (Parsetree.module_expr) = Obj.magic me in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_me_ in - let _endpos = _endpos_me_ in - let _v : (Parsetree.module_expr) = -# 1431 "parsing/parser.mly" - ( me ) -# 29748 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = attr; - MenhirLib.EngineTypes.startp = _startpos_attr_; - MenhirLib.EngineTypes.endp = _endpos_attr_; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = me; - MenhirLib.EngineTypes.startp = _startpos_me_; - MenhirLib.EngineTypes.endp = _endpos_me_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = opat; + MenhirLib.EngineTypes.startp = _startpos_opat_; + MenhirLib.EngineTypes.endp = _endpos_opat_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = octy; + MenhirLib.EngineTypes.startp = _startpos_octy_; + MenhirLib.EngineTypes.endp = _endpos_octy_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; }; } = _menhir_stack in - let attr : (Parsetree.attribute) = Obj.magic attr in - let me : (Parsetree.module_expr) = Obj.magic me in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_me_ in - let _endpos = _endpos_attr_ in - let _v : (Parsetree.module_expr) = -# 1433 "parsing/parser.mly" - ( Mod.attr me attr ) -# 29780 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in + let x : unit = Obj.magic x in + let opat : (Parsetree.pattern option) = Obj.magic opat in + let octy : (Parsetree.core_type option) = Obj.magic octy in let _1 : (Longident.t) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in + let _endpos = _endpos_x_ in let _v = - let _1 = - let _1 = - let x = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 984 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 29812 "parsing/parser.ml" - - in + let _2 = +# 126 "" + ( Some x ) +# 30379 "parsing/parser.ml" + in + let x = + let label = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 1437 "parsing/parser.mly" - ( Pmod_ident x ) -# 29818 "parsing/parser.ml" +# 972 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 30389 "parsing/parser.ml" in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + let _startpos_label_ = _startpos__1_ in + let _endpos = _endpos_opat_ in + let _symbolstartpos = _startpos_label_ in let _sloc = (_symbolstartpos, _endpos) in -# 1027 "parsing/parser.mly" - ( mkmod ~loc:_sloc _1 ) -# 29827 "parsing/parser.ml" +# 3175 "parsing/parser.mly" + ( let constraint_loc, label, pat = + match opat with + | None -> + (* No pattern; this is a pun. Desugar it. + But that the pattern was there and the label reconstructed (which + piece of AST is marked as ghost is important for warning + emission). *) + _sloc, make_ghost label, pat_of_label label + | Some pat -> + (_startpos_octy_, _endpos), label, pat + in + label, mkpat_opt_constraint ~loc:constraint_loc pat octy + ) +# 30411 "parsing/parser.ml" in ( -# 1448 "parsing/parser.mly" - ( _1 ) -# 29833 "parsing/parser.ml" - : (Parsetree.module_expr)) +# 1232 "parsing/parser.mly" + ( [x], None ) +# 30417 "parsing/parser.ml" + : ((Longident.t Asttypes.loc * Parsetree.pattern) list * unit option)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29843,44 +30427,89 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = me2; - MenhirLib.EngineTypes.startp = _startpos_me2_; - MenhirLib.EngineTypes.endp = _endpos_me2_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = me1; - MenhirLib.EngineTypes.startp = _startpos_me1_; - MenhirLib.EngineTypes.endp = _endpos_me1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = y; + MenhirLib.EngineTypes.startp = _startpos_y_; + MenhirLib.EngineTypes.endp = _endpos_y_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = opat; + MenhirLib.EngineTypes.startp = _startpos_opat_; + MenhirLib.EngineTypes.endp = _endpos_opat_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = octy; + MenhirLib.EngineTypes.startp = _startpos_octy_; + MenhirLib.EngineTypes.endp = _endpos_octy_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; }; } = _menhir_stack in - let me2 : (Parsetree.module_expr) = Obj.magic me2 in - let me1 : (Parsetree.module_expr) = Obj.magic me1 in + let _4 : (unit option) = Obj.magic _4 in + let y : unit = Obj.magic y in + let _2 : unit = Obj.magic _2 in + let opat : (Parsetree.pattern option) = Obj.magic opat in + let octy : (Parsetree.core_type option) = Obj.magic octy in + let _1 : (Longident.t) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_me1_ in - let _endpos = _endpos_me2_ in + let _startpos = _startpos__1_ in + let _endpos = _endpos__4_ in let _v = - let _1 = - let _1 = -# 1440 "parsing/parser.mly" - ( Pmod_apply(me1, me2) ) -# 29868 "parsing/parser.ml" - in - let (_endpos__1_, _startpos__1_) = (_endpos_me2_, _startpos_me1_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + let x = + let label = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 972 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 30484 "parsing/parser.ml" + + in + let _startpos_label_ = _startpos__1_ in + let _endpos = _endpos_opat_ in + let _symbolstartpos = _startpos_label_ in let _sloc = (_symbolstartpos, _endpos) in -# 1027 "parsing/parser.mly" - ( mkmod ~loc:_sloc _1 ) -# 29877 "parsing/parser.ml" +# 3175 "parsing/parser.mly" + ( let constraint_loc, label, pat = + match opat with + | None -> + (* No pattern; this is a pun. Desugar it. + But that the pattern was there and the label reconstructed (which + piece of AST is marked as ghost is important for warning + emission). *) + _sloc, make_ghost label, pat_of_label label + | Some pat -> + (_startpos_octy_, _endpos), label, pat + in + label, mkpat_opt_constraint ~loc:constraint_loc pat octy + ) +# 30506 "parsing/parser.ml" in ( -# 1448 "parsing/parser.mly" - ( _1 ) -# 29883 "parsing/parser.ml" - : (Parsetree.module_expr)) +# 1234 "parsing/parser.mly" + ( [x], Some y ) +# 30512 "parsing/parser.ml" + : ((Longident.t Asttypes.loc * Parsetree.pattern) list * unit option)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29893,51 +30522,83 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = tail; + MenhirLib.EngineTypes.startp = _startpos_tail_; + MenhirLib.EngineTypes.endp = _endpos_tail_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _2; MenhirLib.EngineTypes.startp = _startpos__2_; MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = me; - MenhirLib.EngineTypes.startp = _startpos_me_; - MenhirLib.EngineTypes.endp = _endpos_me_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = opat; + MenhirLib.EngineTypes.startp = _startpos_opat_; + MenhirLib.EngineTypes.endp = _endpos_opat_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = octy; + MenhirLib.EngineTypes.startp = _startpos_octy_; + MenhirLib.EngineTypes.endp = _endpos_octy_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; }; }; } = _menhir_stack in - let _3 : unit = Obj.magic _3 in + let tail : ((Longident.t Asttypes.loc * Parsetree.pattern) list * unit option) = Obj.magic tail in let _2 : unit = Obj.magic _2 in - let me : (Parsetree.module_expr) = Obj.magic me in + let opat : (Parsetree.pattern option) = Obj.magic opat in + let octy : (Parsetree.core_type option) = Obj.magic octy in + let _1 : (Longident.t) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_me_ in - let _endpos = _endpos__3_ in + let _startpos = _startpos__1_ in + let _endpos = _endpos_tail_ in let _v = - let _1 = - let _1 = -# 1443 "parsing/parser.mly" - ( Pmod_apply_unit me ) -# 29925 "parsing/parser.ml" - in - let (_endpos__1_, _startpos__1_) = (_endpos__3_, _startpos_me_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in + let x = + let label = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 972 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 30572 "parsing/parser.ml" + + in + let _startpos_label_ = _startpos__1_ in + let _endpos = _endpos_opat_ in + let _symbolstartpos = _startpos_label_ in let _sloc = (_symbolstartpos, _endpos) in -# 1027 "parsing/parser.mly" - ( mkmod ~loc:_sloc _1 ) -# 29934 "parsing/parser.ml" +# 3175 "parsing/parser.mly" + ( let constraint_loc, label, pat = + match opat with + | None -> + (* No pattern; this is a pun. Desugar it. + But that the pattern was there and the label reconstructed (which + piece of AST is marked as ghost is important for warning + emission). *) + _sloc, make_ghost label, pat_of_label label + | Some pat -> + (_startpos_octy_, _endpos), label, pat + in + label, mkpat_opt_constraint ~loc:constraint_loc pat octy + ) +# 30594 "parsing/parser.ml" in ( -# 1448 "parsing/parser.mly" - ( _1 ) -# 29940 "parsing/parser.ml" - : (Parsetree.module_expr)) +# 1238 "parsing/parser.mly" + ( let xs, y = tail in + x :: xs, y ) +# 30601 "parsing/parser.ml" + : ((Longident.t Asttypes.loc * Parsetree.pattern) list * unit option)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29949,39 +30610,35 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = ex; - MenhirLib.EngineTypes.startp = _startpos_ex_; - MenhirLib.EngineTypes.endp = _endpos_ex_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; } = _menhir_stack in - let ex : (Parsetree.extension) = Obj.magic ex in + let _3 : (Parsetree.expression) = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_ex_ in - let _endpos = _endpos_ex_ in - let _v = - let _1 = - let _1 = -# 1446 "parsing/parser.mly" - ( Pmod_extension ex ) -# 29968 "parsing/parser.ml" - in - let (_endpos__1_, _startpos__1_) = (_endpos_ex_, _startpos_ex_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1027 "parsing/parser.mly" - ( mkmod ~loc:_sloc _1 ) -# 29977 "parsing/parser.ml" - - in - ( -# 1448 "parsing/parser.mly" - ( _1 ) -# 29983 "parsing/parser.ml" - : (Parsetree.module_expr)) - in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Parsetree.case) = +# 2787 "parsing/parser.mly" + ( Exp.case _1 _3 ) +# 30641 "parsing/parser.ml" + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -29992,24 +30649,48 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; } = _menhir_stack in - let x : ( -# 848 "parsing/parser.mly" - (string) -# 30005 "parsing/parser.ml" - ) = Obj.magic x in + let _5 : (Parsetree.expression) = Obj.magic _5 in + let _4 : unit = Obj.magic _4 in + let _3 : (Parsetree.expression) = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_x_ in - let _endpos = _endpos_x_ in - let _v : (string option) = -# 1402 "parsing/parser.mly" - ( Some x ) -# 30013 "parsing/parser.ml" + let _startpos = _startpos__1_ in + let _endpos = _endpos__5_ in + let _v : (Parsetree.case) = +# 2789 "parsing/parser.mly" + ( Exp.case _1 ~guard:_3 _5 ) +# 30694 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30021,21 +30702,38 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string option) = -# 1405 "parsing/parser.mly" - ( None ) -# 30038 "parsing/parser.ml" - in + let _endpos = _endpos__3_ in + let _v = + let _loc__3_ = (_startpos__3_, _endpos__3_) in + ( +# 2791 "parsing/parser.mly" + ( Exp.case _1 (Exp.unreachable ~loc:(make_loc _loc__3_) ()) ) +# 30735 "parsing/parser.ml" + : (Parsetree.case)) + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -30047,9 +30745,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined4; - MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.semv = tail; + MenhirLib.EngineTypes.startp = _startpos_tail_; + MenhirLib.EngineTypes.endp = _endpos_tail_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1_inlined3; @@ -30072,9 +30770,9 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ext; - MenhirLib.EngineTypes.startp = _startpos_ext_; - MenhirLib.EngineTypes.endp = _endpos_ext_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -30088,73 +30786,134 @@ module Tables = struct }; }; } = _menhir_stack in - let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in - let _1_inlined3 : (Longident.t) = Obj.magic _1_inlined3 in + let tail : (Parsetree.object_field list * Asttypes.closed_flag) = Obj.magic tail in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in let _5 : unit = Obj.magic _5 in - let _1_inlined2 : ( -# 848 "parsing/parser.mly" + let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.core_type) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : ( +# 785 "parsing/parser.mly" (string) -# 30098 "parsing/parser.ml" - ) = Obj.magic _1_inlined2 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let ext : (string Asttypes.loc option) = Obj.magic ext in - let _1 : unit = Obj.magic _1 in +# 30799 "parsing/parser.ml" + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined4_ in + let _endpos = _endpos_tail_ in let _v = - let attrs2 = - let _1 = _1_inlined4 in - -# 4110 "parsing/parser.mly" + let head = + let _6 = + let _1 = _1_inlined3 in + +# 4286 "parsing/parser.mly" ( _1 ) -# 30112 "parsing/parser.ml" - - in - let _endpos_attrs2_ = _endpos__1_inlined4_ in - let body = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 984 "parsing/parser.mly" +# 30811 "parsing/parser.ml" + + in + let _endpos__6_ = _endpos__1_inlined3_ in + let _4 = + let _1 = _1_inlined2 in + +# 4286 "parsing/parser.mly" + ( _1 ) +# 30820 "parsing/parser.ml" + + in + let _endpos__4_ = _endpos__1_inlined2_ in + let _3 = + let _1 = _1_inlined1 in + +# 3608 "parsing/parser.mly" + ( _1 ) +# 30829 "parsing/parser.ml" + + in + let _1 = + let _1 = +# 3936 "parsing/parser.mly" + ( _1 ) +# 30836 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 30124 "parsing/parser.ml" - - in - let uid = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in - let _endpos = _endpos__1_ in +# 30844 "parsing/parser.ml" + + in + let _endpos = _endpos__6_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 30135 "parsing/parser.ml" +# 3921 "parsing/parser.mly" + ( let info = + match rhs_info _endpos__4_ with + | Some _ as info_before_semi -> info_before_semi + | None -> symbol_info _endpos + in + let attrs = add_info_attrs info (_4 @ _6) in + Of.tag ~loc:(make_loc _sloc) ~attrs _1 _3 ) +# 30859 "parsing/parser.ml" in - let attrs1 = - let _1 = _1_inlined1 in + ( +# 3902 "parsing/parser.mly" + ( let (f, c) = tail in (head :: f, c) ) +# 30865 "parsing/parser.ml" + : (Parsetree.object_field list * Asttypes.closed_flag)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = tail; + MenhirLib.EngineTypes.startp = _startpos_tail_; + MenhirLib.EngineTypes.endp = _endpos_tail_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let tail : (Parsetree.object_field list * Asttypes.closed_flag) = Obj.magic tail in + let _2 : unit = Obj.magic _2 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_ty_ in + let _endpos = _endpos_tail_ in + let _v = + let head = + let _endpos = _endpos_ty_ in + let _symbolstartpos = _startpos_ty_ in + let _sloc = (_symbolstartpos, _endpos) in -# 4114 "parsing/parser.mly" - ( _1 ) -# 30143 "parsing/parser.ml" +# 3932 "parsing/parser.mly" + ( Of.inherit_ ~loc:(make_loc _sloc) ty ) +# 30910 "parsing/parser.ml" in - let _endpos = _endpos_attrs2_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in ( -# 1869 "parsing/parser.mly" - ( - let attrs = attrs1 @ attrs2 in - let loc = make_loc _sloc in - let docs = symbol_docs _sloc in - Ms.mk uid body ~attrs ~loc ~docs, ext - ) -# 30157 "parsing/parser.ml" - : (Parsetree.module_substitution * string Asttypes.loc option)) +# 3902 "parsing/parser.mly" + ( let (f, c) = tail in (head :: f, c) ) +# 30916 "parsing/parser.ml" + : (Parsetree.object_field list * Asttypes.closed_flag)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30167,9 +30926,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _6; - MenhirLib.EngineTypes.startp = _startpos__6_; - MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _5; @@ -30202,45 +30961,82 @@ module Tables = struct }; }; } = _menhir_stack in - let _6 : unit = Obj.magic _6 in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in let _5 : unit = Obj.magic _5 in - let _1_inlined2 : ( -# 848 "parsing/parser.mly" + let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.core_type) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : ( +# 785 "parsing/parser.mly" (string) -# 30211 "parsing/parser.ml" - ) = Obj.magic _1_inlined2 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let _2 : (string Asttypes.loc option) = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in +# 30973 "parsing/parser.ml" + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__6_ in + let _endpos = _endpos__1_inlined3_ in let _v = - let _4 = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in - let _endpos = _endpos__1_ in + let head = + let _6 = + let _1 = _1_inlined3 in + +# 4286 "parsing/parser.mly" + ( _1 ) +# 30985 "parsing/parser.ml" + + in + let _endpos__6_ = _endpos__1_inlined3_ in + let _4 = + let _1 = _1_inlined2 in + +# 4286 "parsing/parser.mly" + ( _1 ) +# 30994 "parsing/parser.ml" + + in + let _endpos__4_ = _endpos__1_inlined2_ in + let _3 = + let _1 = _1_inlined1 in + +# 3608 "parsing/parser.mly" + ( _1 ) +# 31003 "parsing/parser.ml" + + in + let _1 = + let _1 = +# 3936 "parsing/parser.mly" + ( _1 ) +# 31010 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 972 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 31018 "parsing/parser.ml" + + in + let _endpos = _endpos__6_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 30228 "parsing/parser.ml" - - in - let _3 = - let _1 = _1_inlined1 in - -# 4114 "parsing/parser.mly" - ( _1 ) -# 30236 "parsing/parser.ml" +# 3921 "parsing/parser.mly" + ( let info = + match rhs_info _endpos__4_ with + | Some _ as info_before_semi -> info_before_semi + | None -> symbol_info _endpos + in + let attrs = add_info_attrs info (_4 @ _6) in + Of.tag ~loc:(make_loc _sloc) ~attrs _1 _3 ) +# 31033 "parsing/parser.ml" in - let _loc__6_ = (_startpos__6_, _endpos__6_) in ( -# 1876 "parsing/parser.mly" - ( expecting _loc__6_ "module path" ) -# 30243 "parsing/parser.ml" - : (Parsetree.module_substitution * string Asttypes.loc option)) +# 3905 "parsing/parser.mly" + ( [head], Closed ) +# 31039 "parsing/parser.ml" + : (Parsetree.object_field list * Asttypes.closed_flag)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30253,53 +31049,38 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = s; - MenhirLib.EngineTypes.startp = _startpos_s_; - MenhirLib.EngineTypes.endp = _endpos_s_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _4 : unit = Obj.magic _4 in - let s : (Parsetree.signature) = Obj.magic s in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let _1 : unit = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let ty : (Parsetree.core_type) = Obj.magic ty in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__4_ in + let _startpos = _startpos_ty_ in + let _endpos = _endpos__2_ in let _v = - let attrs = - let _1 = _1_inlined1 in + let head = + let _endpos = _endpos_ty_ in + let _symbolstartpos = _startpos_ty_ in + let _sloc = (_symbolstartpos, _endpos) in -# 4114 "parsing/parser.mly" - ( _1 ) -# 30293 "parsing/parser.ml" +# 3932 "parsing/parser.mly" + ( Of.inherit_ ~loc:(make_loc _sloc) ty ) +# 31077 "parsing/parser.ml" in - let _endpos = _endpos__4_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in ( -# 1715 "parsing/parser.mly" - ( mkmty ~loc:_sloc ~attrs (Pmty_signature s) ) -# 30302 "parsing/parser.ml" - : (Parsetree.module_type)) +# 3905 "parsing/parser.mly" + ( [head], Closed ) +# 31083 "parsing/parser.ml" + : (Parsetree.object_field list * Asttypes.closed_flag)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30312,19 +31093,19 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -30335,29 +31116,67 @@ module Tables = struct }; }; } = _menhir_stack in - let _4 : unit = Obj.magic _4 in - let _3 : (Parsetree.signature) = Obj.magic _3 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let _1 : unit = Obj.magic _1 in + let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.core_type) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : ( +# 785 "parsing/parser.mly" + (string) +# 31126 "parsing/parser.ml" + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__4_ in + let _endpos = _endpos__1_inlined2_ in let _v = - let _2 = - let _1 = _1_inlined1 in - -# 4114 "parsing/parser.mly" + let head = + let _4 = + let _1 = _1_inlined2 in + +# 4286 "parsing/parser.mly" + ( _1 ) +# 31138 "parsing/parser.ml" + + in + let _endpos__4_ = _endpos__1_inlined2_ in + let _3 = + let _1 = _1_inlined1 in + +# 3608 "parsing/parser.mly" ( _1 ) -# 30352 "parsing/parser.ml" +# 31147 "parsing/parser.ml" + + in + let _1 = + let _1 = +# 3936 "parsing/parser.mly" + ( _1 ) +# 31154 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 972 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 31162 "parsing/parser.ml" + + in + let _endpos = _endpos__4_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 3914 "parsing/parser.mly" + ( let info = symbol_info _endpos in + let attrs = add_info_attrs info _4 in + Of.tag ~loc:(make_loc _sloc) ~attrs _1 _3 ) +# 31173 "parsing/parser.ml" in - let _loc__4_ = (_startpos__4_, _endpos__4_) in - let _loc__1_ = (_startpos__1_, _endpos__1_) in ( -# 1717 "parsing/parser.mly" - ( unclosed "sig" _loc__1_ "end" _loc__4_ ) -# 30360 "parsing/parser.ml" - : (Parsetree.module_type)) +# 3908 "parsing/parser.mly" + ( [head], Closed ) +# 31179 "parsing/parser.ml" + : (Parsetree.object_field list * Asttypes.closed_flag)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30369,30 +31188,32 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _2 : unit = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in + let ty : (Parsetree.core_type) = Obj.magic ty in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in + let _startpos = _startpos_ty_ in + let _endpos = _endpos_ty_ in let _v = - let _loc__1_ = (_startpos__1_, _endpos__1_) in + let head = + let _endpos = _endpos_ty_ in + let _symbolstartpos = _startpos_ty_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 3932 "parsing/parser.mly" + ( Of.inherit_ ~loc:(make_loc _sloc) ty ) +# 31210 "parsing/parser.ml" + + in ( -# 1719 "parsing/parser.mly" - ( expecting _loc__1_ "sig" ) -# 30395 "parsing/parser.ml" - : (Parsetree.module_type)) +# 3908 "parsing/parser.mly" + ( [head], Closed ) +# 31216 "parsing/parser.ml" + : (Parsetree.object_field list * Asttypes.closed_flag)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30401,28 +31222,53 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos; MenhirLib.EngineTypes.next = _menhir_stack; }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.object_field list * Asttypes.closed_flag) = +# 3910 "parsing/parser.mly" + ( [], Open ) +# 31242 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = mty; - MenhirLib.EngineTypes.startp = _startpos_mty_; - MenhirLib.EngineTypes.endp = _endpos_mty_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = private_; + MenhirLib.EngineTypes.startp = _startpos_private__; + MenhirLib.EngineTypes.endp = _endpos_private__; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -30434,39 +31280,60 @@ module Tables = struct }; }; } = _menhir_stack in - let mty : (Parsetree.module_type) = Obj.magic mty in - let _4 : unit = Obj.magic _4 in - let _1_inlined2 : ((Lexing.position * Parsetree.functor_parameter) list) = Obj.magic _1_inlined2 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let _1 : unit = Obj.magic _1 in + let _1_inlined2 : (Parsetree.core_type) = Obj.magic _1_inlined2 in + let _5 : unit = Obj.magic _5 in + let _1_inlined1 : ( +# 785 "parsing/parser.mly" + (string) +# 31289 "parsing/parser.ml" + ) = Obj.magic _1_inlined1 in + let private_ : (Asttypes.private_flag) = Obj.magic private_ in + let _1 : (Parsetree.attributes) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_mty_ in + let _endpos = _endpos__1_inlined2_ in let _v = - let args = + let ty = let _1 = _1_inlined2 in -# 1385 "parsing/parser.mly" +# 3604 "parsing/parser.mly" ( _1 ) -# 30452 "parsing/parser.ml" +# 31302 "parsing/parser.ml" in - let attrs = - let _1 = _1_inlined1 in + let label = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _1 = +# 3936 "parsing/parser.mly" + ( _1 ) +# 31310 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 4114 "parsing/parser.mly" - ( _1 ) -# 30460 "parsing/parser.ml" +# 972 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 31318 "parsing/parser.ml" in - let _endpos = _endpos_mty_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let attrs = +# 4286 "parsing/parser.mly" + ( _1 ) +# 31324 "parsing/parser.ml" + in + let _1 = +# 4184 "parsing/parser.mly" + ( Fresh ) +# 31329 "parsing/parser.ml" + in ( -# 1723 "parsing/parser.mly" - ( wrap_mty_attrs ~loc:_sloc attrs (mk_functor_typ args mty) ) -# 30469 "parsing/parser.ml" - : (Parsetree.module_type)) +# 2092 "parsing/parser.mly" + ( (label, private_, Cfk_virtual ty), attrs ) +# 31334 "parsing/parser.ml" + : ((Asttypes.label Asttypes.loc * Asttypes.private_flag * + Parsetree.class_field_kind) * + Parsetree.attributes)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30479,40 +31346,77 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = mty; - MenhirLib.EngineTypes.startp = _startpos_mty_; - MenhirLib.EngineTypes.endp = _endpos_mty_; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; }; } = _menhir_stack in - let mty : (Parsetree.module_type) = Obj.magic mty in - let _2 : unit = Obj.magic _2 in - let _1 : ((Lexing.position * Parsetree.functor_parameter) list) = Obj.magic _1 in + let _5 : (Parsetree.expression) = Obj.magic _5 in + let _1_inlined1 : ( +# 785 "parsing/parser.mly" + (string) +# 31377 "parsing/parser.ml" + ) = Obj.magic _1_inlined1 in + let _3 : (Asttypes.private_flag) = Obj.magic _3 in + let _1 : (Parsetree.attributes) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_mty_ in + let _endpos = _endpos__5_ in let _v = - let args = -# 1385 "parsing/parser.mly" + let _4 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _1 = +# 3936 "parsing/parser.mly" + ( _1 ) +# 31390 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 972 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 31398 "parsing/parser.ml" + + in + let _2 = +# 4286 "parsing/parser.mly" ( _1 ) -# 30510 "parsing/parser.ml" +# 31404 "parsing/parser.ml" + in + let _1 = +# 4187 "parsing/parser.mly" + ( Fresh ) +# 31409 "parsing/parser.ml" in ( -# 1727 "parsing/parser.mly" - ( mk_functor_typ args mty ) -# 30515 "parsing/parser.ml" - : (Parsetree.module_type)) +# 2094 "parsing/parser.mly" + ( let e = _5 in + let loc = Location.(e.pexp_loc.loc_start, e.pexp_loc.loc_end) in + (_4, _3, + Cfk_concrete (_1, ghexp ~loc (Pexp_poly (e, None)))), _2 ) +# 31417 "parsing/parser.ml" + : ((Asttypes.label Asttypes.loc * Asttypes.private_flag * + Parsetree.class_field_kind) * + Parsetree.attributes)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30530,9 +31434,9 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _3; @@ -30540,9 +31444,9 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -30554,31 +31458,58 @@ module Tables = struct }; }; } = _menhir_stack in - let _5 : (Parsetree.module_expr) = Obj.magic _5 in + let _5 : (Parsetree.expression) = Obj.magic _5 in + let _1_inlined2 : ( +# 785 "parsing/parser.mly" + (string) +# 31466 "parsing/parser.ml" + ) = Obj.magic _1_inlined2 in + let _3 : (Asttypes.private_flag) = Obj.magic _3 in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let _3 : unit = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__5_ in let _v = let _4 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let _1 = +# 3936 "parsing/parser.mly" + ( _1 ) +# 31480 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 972 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 31488 "parsing/parser.ml" + + in + let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 30572 "parsing/parser.ml" +# 31496 "parsing/parser.ml" in - let _endpos = _endpos__5_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _1 = +# 4188 "parsing/parser.mly" + ( Override ) +# 31502 "parsing/parser.ml" + in ( -# 1729 "parsing/parser.mly" - ( mkmty ~loc:_sloc ~attrs:_4 (Pmty_typeof _5) ) -# 30581 "parsing/parser.ml" - : (Parsetree.module_type)) +# 2094 "parsing/parser.mly" + ( let e = _5 in + let loc = Location.(e.pexp_loc.loc_start, e.pexp_loc.loc_end) in + (_4, _3, + Cfk_concrete (_1, ghexp ~loc (Pexp_poly (e, None)))), _2 ) +# 31510 "parsing/parser.ml" + : ((Asttypes.label Asttypes.loc * Asttypes.private_flag * + Parsetree.class_field_kind) * + Parsetree.attributes)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30591,34 +31522,108 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _8; + MenhirLib.EngineTypes.startp = _startpos__8_; + MenhirLib.EngineTypes.endp = _endpos__8_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _7; + MenhirLib.EngineTypes.startp = _startpos__7_; + MenhirLib.EngineTypes.endp = _endpos__7_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; }; }; } = _menhir_stack in - let _3 : unit = Obj.magic _3 in - let _2 : (Parsetree.module_type) = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in + let _8 : (Parsetree.expression) = Obj.magic _8 in + let _7 : unit = Obj.magic _7 in + let _1_inlined2 : (Parsetree.core_type) = Obj.magic _1_inlined2 in + let _5 : unit = Obj.magic _5 in + let _1_inlined1 : ( +# 785 "parsing/parser.mly" + (string) +# 31574 "parsing/parser.ml" + ) = Obj.magic _1_inlined1 in + let _3 : (Asttypes.private_flag) = Obj.magic _3 in + let _1 : (Parsetree.attributes) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.module_type) = -# 1731 "parsing/parser.mly" - ( _2 ) -# 30621 "parsing/parser.ml" - in + let _endpos = _endpos__8_ in + let _v = + let _6 = + let _1 = _1_inlined2 in + +# 3604 "parsing/parser.mly" + ( _1 ) +# 31587 "parsing/parser.ml" + + in + let _startpos__6_ = _startpos__1_inlined2_ in + let _4 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _1 = +# 3936 "parsing/parser.mly" + ( _1 ) +# 31596 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 972 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 31604 "parsing/parser.ml" + + in + let _2 = +# 4286 "parsing/parser.mly" + ( _1 ) +# 31610 "parsing/parser.ml" + in + let _1 = +# 4187 "parsing/parser.mly" + ( Fresh ) +# 31615 "parsing/parser.ml" + in + ( +# 2100 "parsing/parser.mly" + ( let poly_exp = + let loc = (_startpos__6_, _endpos__8_) in + ghexp ~loc (Pexp_poly(_8, Some _6)) in + (_4, _3, Cfk_concrete (_1, poly_exp)), _2 ) +# 31623 "parsing/parser.ml" + : ((Asttypes.label Asttypes.loc * Asttypes.private_flag * + Parsetree.class_field_kind) * + Parsetree.attributes)) + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -30630,123 +31635,117 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _8; + MenhirLib.EngineTypes.startp = _startpos__8_; + MenhirLib.EngineTypes.endp = _endpos__8_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _7; + MenhirLib.EngineTypes.startp = _startpos__7_; + MenhirLib.EngineTypes.endp = _endpos__7_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; }; }; } = _menhir_stack in - let _3 : unit = Obj.magic _3 in - let _2 : (Parsetree.module_type) = Obj.magic _2 in + let _8 : (Parsetree.expression) = Obj.magic _8 in + let _7 : unit = Obj.magic _7 in + let _1_inlined3 : (Parsetree.core_type) = Obj.magic _1_inlined3 in + let _5 : unit = Obj.magic _5 in + let _1_inlined2 : ( +# 785 "parsing/parser.mly" + (string) +# 31693 "parsing/parser.ml" + ) = Obj.magic _1_inlined2 in + let _3 : (Asttypes.private_flag) = Obj.magic _3 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v = - let _loc__3_ = (_startpos__3_, _endpos__3_) in - let _loc__1_ = (_startpos__1_, _endpos__1_) in - ( -# 1733 "parsing/parser.mly" - ( unclosed "(" _loc__1_ ")" _loc__3_ ) -# 30663 "parsing/parser.ml" - : (Parsetree.module_type)) - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - } = _menhir_stack in - let _2 : (Parsetree.attribute) = Obj.magic _2 in - let _1 : (Parsetree.module_type) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Parsetree.module_type) = -# 1735 "parsing/parser.mly" - ( Mty.attr _1 _2 ) -# 30696 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : (Longident.t) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in + let _endpos = _endpos__8_ in let _v = - let _1 = - let _1 = - let _1 = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 984 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 30728 "parsing/parser.ml" - - in - -# 1738 "parsing/parser.mly" - ( Pmty_ident _1 ) -# 30734 "parsing/parser.ml" - - in + let _6 = + let _1 = _1_inlined3 in + +# 3604 "parsing/parser.mly" + ( _1 ) +# 31707 "parsing/parser.ml" + + in + let _startpos__6_ = _startpos__1_inlined3_ in + let _4 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let _1 = +# 3936 "parsing/parser.mly" + ( _1 ) +# 31716 "parsing/parser.ml" + in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1029 "parsing/parser.mly" - ( mkmty ~loc:_sloc _1 ) -# 30743 "parsing/parser.ml" +# 972 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 31724 "parsing/parser.ml" in - ( -# 1749 "parsing/parser.mly" + let _2 = + let _1 = _1_inlined1 in + +# 4286 "parsing/parser.mly" ( _1 ) -# 30749 "parsing/parser.ml" - : (Parsetree.module_type)) +# 31732 "parsing/parser.ml" + + in + let _1 = +# 4188 "parsing/parser.mly" + ( Override ) +# 31738 "parsing/parser.ml" + in + ( +# 2100 "parsing/parser.mly" + ( let poly_exp = + let loc = (_startpos__6_, _endpos__8_) in + ghexp ~loc (Pexp_poly(_8, Some _6)) in + (_4, _3, Cfk_concrete (_1, poly_exp)), _2 ) +# 31746 "parsing/parser.ml" + : ((Asttypes.label Asttypes.loc * Asttypes.private_flag * + Parsetree.class_field_kind) * + Parsetree.attributes)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30759,210 +31758,58 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - } = _menhir_stack in - let _3 : (Parsetree.module_type) = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.module_type) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v = - let _1 = - let _1 = -# 1741 "parsing/parser.mly" - ( Pmty_functor(Named (mknoloc None, _1), _3) ) -# 30791 "parsing/parser.ml" - in - let _endpos__1_ = _endpos__3_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1029 "parsing/parser.mly" - ( mkmty ~loc:_sloc _1 ) -# 30800 "parsing/parser.ml" - - in - ( -# 1749 "parsing/parser.mly" - ( _1 ) -# 30806 "parsing/parser.ml" - : (Parsetree.module_type)) - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - } = _menhir_stack in - let xs : (Parsetree.with_constraint list) = Obj.magic xs in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.module_type) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos_xs_ in - let _v = - let _1 = - let _1 = - let _3 = - let xs = -# 264 "" - ( List.rev xs ) -# 30850 "parsing/parser.ml" - in - -# 1139 "parsing/parser.mly" - ( xs ) -# 30855 "parsing/parser.ml" - - in - -# 1743 "parsing/parser.mly" - ( Pmty_with(_1, _3) ) -# 30861 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos_xs_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1029 "parsing/parser.mly" - ( mkmty ~loc:_sloc _1 ) -# 30871 "parsing/parser.ml" - - in - ( -# 1749 "parsing/parser.mly" - ( _1 ) -# 30877 "parsing/parser.ml" - : (Parsetree.module_type)) - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : (Parsetree.extension) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v = - let _1 = - let _1 = -# 1747 "parsing/parser.mly" - ( Pmty_extension _1 ) -# 30905 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1029 "parsing/parser.mly" - ( mkmty ~loc:_sloc _1 ) -# 30913 "parsing/parser.ml" - - in - ( -# 1749 "parsing/parser.mly" - ( _1 ) -# 30919 "parsing/parser.ml" - : (Parsetree.module_type)) - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = _11; + MenhirLib.EngineTypes.startp = _startpos__11_; + MenhirLib.EngineTypes.endp = _endpos__11_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = typ; - MenhirLib.EngineTypes.startp = _startpos_typ_; - MenhirLib.EngineTypes.endp = _endpos_typ_; + MenhirLib.EngineTypes.semv = _10; + MenhirLib.EngineTypes.startp = _startpos__10_; + MenhirLib.EngineTypes.endp = _endpos__10_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _9; + MenhirLib.EngineTypes.startp = _startpos__9_; + MenhirLib.EngineTypes.endp = _endpos__9_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _8; + MenhirLib.EngineTypes.startp = _startpos__8_; + MenhirLib.EngineTypes.endp = _endpos__8_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ext; - MenhirLib.EngineTypes.startp = _startpos_ext_; - MenhirLib.EngineTypes.endp = _endpos_ext_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; }; }; }; @@ -30970,58 +31817,87 @@ module Tables = struct }; }; } = _menhir_stack in - let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let typ : (Parsetree.module_type option) = Obj.magic typ in - let _1_inlined2 : (Asttypes.label) = Obj.magic _1_inlined2 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let ext : (string Asttypes.loc option) = Obj.magic ext in - let _2 : unit = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in + let _11 : (Parsetree.expression) = Obj.magic _11 in + let _10 : unit = Obj.magic _10 in + let _9 : (Parsetree.core_type) = Obj.magic _9 in + let _8 : unit = Obj.magic _8 in + let xs : (string Asttypes.loc list) = Obj.magic xs in + let _6 : unit = Obj.magic _6 in + let _5 : unit = Obj.magic _5 in + let _1_inlined1 : ( +# 785 "parsing/parser.mly" + (string) +# 31831 "parsing/parser.ml" + ) = Obj.magic _1_inlined1 in + let _3 : (Asttypes.private_flag) = Obj.magic _3 in + let _1 : (Parsetree.attributes) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined3_ in + let _endpos = _endpos__11_ in let _v = - let attrs2 = - let _1 = _1_inlined3 in - -# 4110 "parsing/parser.mly" - ( _1 ) -# 30990 "parsing/parser.ml" - - in - let _endpos_attrs2_ = _endpos__1_inlined3_ in - let id = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let _7 = +# 2664 "parsing/parser.mly" + ( xs ) +# 31842 "parsing/parser.ml" + in + let _startpos__7_ = _startpos_xs_ in + let _4 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _1 = +# 3936 "parsing/parser.mly" + ( _1 ) +# 31850 "parsing/parser.ml" + in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 31002 "parsing/parser.ml" +# 31858 "parsing/parser.ml" in - let attrs1 = - let _1 = _1_inlined1 in - -# 4114 "parsing/parser.mly" + let _startpos__4_ = _startpos__1_inlined1_ in + let _2 = +# 4286 "parsing/parser.mly" ( _1 ) -# 31010 "parsing/parser.ml" - - in - let _endpos = _endpos_attrs2_ in - let _symbolstartpos = _startpos__1_ in +# 31865 "parsing/parser.ml" + in + let (_endpos__2_, _startpos__2_) = (_endpos__1_, _startpos__1_) in + let _1 = +# 4187 "parsing/parser.mly" + ( Fresh ) +# 31871 "parsing/parser.ml" + in + let (_endpos__1_, _startpos__1_) = (_endpos__0_, _endpos__0_) in + let _endpos = _endpos__11_ in + let _symbolstartpos = if _startpos__1_ != _endpos__1_ then + _startpos__1_ + else + if _startpos__2_ != _endpos__2_ then + _startpos__2_ + else + if _startpos__3_ != _endpos__3_ then + _startpos__3_ + else + _startpos__4_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 1661 "parsing/parser.mly" - ( - let attrs = attrs1 @ attrs2 in - let loc = make_loc _sloc in - let docs = symbol_docs _sloc in - Mtd.mk id ?typ ~attrs ~loc ~docs, ext - ) -# 31024 "parsing/parser.ml" - : (Parsetree.module_type_declaration * string Asttypes.loc option)) +# 2106 "parsing/parser.mly" + ( let poly_exp_loc = (_startpos__7_, _endpos__11_) in + let poly_exp = + let exp, poly = + (* it seems odd to use the global ~loc here while poly_exp_loc + is tighter, but this is what ocamlyacc does; + TODO improve parser.mly *) + wrap_type_annotation ~loc:_sloc _7 _9 _11 in + ghexp ~loc:poly_exp_loc (Pexp_poly(exp, Some poly)) in + (_4, _3, + Cfk_concrete (_1, poly_exp)), _2 ) +# 31898 "parsing/parser.ml" + : ((Asttypes.label Asttypes.loc * Asttypes.private_flag * + Parsetree.class_field_kind) * + Parsetree.attributes)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31034,45 +31910,63 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = _11; + MenhirLib.EngineTypes.startp = _startpos__11_; + MenhirLib.EngineTypes.endp = _endpos__11_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = typ; - MenhirLib.EngineTypes.startp = _startpos_typ_; - MenhirLib.EngineTypes.endp = _endpos_typ_; + MenhirLib.EngineTypes.semv = _10; + MenhirLib.EngineTypes.startp = _startpos__10_; + MenhirLib.EngineTypes.endp = _endpos__10_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _6; - MenhirLib.EngineTypes.startp = _startpos__6_; - MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.semv = _9; + MenhirLib.EngineTypes.startp = _startpos__9_; + MenhirLib.EngineTypes.endp = _endpos__9_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _8; + MenhirLib.EngineTypes.startp = _startpos__8_; + MenhirLib.EngineTypes.endp = _endpos__8_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ext; - MenhirLib.EngineTypes.startp = _startpos_ext_; - MenhirLib.EngineTypes.endp = _endpos_ext_; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; }; }; }; @@ -31081,59 +31975,90 @@ module Tables = struct }; }; } = _menhir_stack in - let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let typ : (Parsetree.module_type) = Obj.magic typ in + let _11 : (Parsetree.expression) = Obj.magic _11 in + let _10 : unit = Obj.magic _10 in + let _9 : (Parsetree.core_type) = Obj.magic _9 in + let _8 : unit = Obj.magic _8 in + let xs : (string Asttypes.loc list) = Obj.magic xs in let _6 : unit = Obj.magic _6 in - let _1_inlined2 : (Asttypes.label) = Obj.magic _1_inlined2 in + let _5 : unit = Obj.magic _5 in + let _1_inlined2 : ( +# 785 "parsing/parser.mly" + (string) +# 31989 "parsing/parser.ml" + ) = Obj.magic _1_inlined2 in + let _3 : (Asttypes.private_flag) = Obj.magic _3 in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let ext : (string Asttypes.loc option) = Obj.magic ext in - let _2 : unit = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined3_ in + let _endpos = _endpos__11_ in let _v = - let attrs2 = - let _1 = _1_inlined3 in - -# 4110 "parsing/parser.mly" - ( _1 ) -# 31102 "parsing/parser.ml" - - in - let _endpos_attrs2_ = _endpos__1_inlined3_ in - let id = + let _7 = +# 2664 "parsing/parser.mly" + ( xs ) +# 32001 "parsing/parser.ml" + in + let _startpos__7_ = _startpos_xs_ in + let _4 = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let _1 = +# 3936 "parsing/parser.mly" + ( _1 ) +# 32009 "parsing/parser.ml" + in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 31114 "parsing/parser.ml" +# 32017 "parsing/parser.ml" in - let attrs1 = + let _startpos__4_ = _startpos__1_inlined2_ in + let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 31122 "parsing/parser.ml" +# 32026 "parsing/parser.ml" in - let _endpos = _endpos_attrs2_ in - let _symbolstartpos = _startpos__1_ in + let (_endpos__2_, _startpos__2_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in + let _1 = +# 4188 "parsing/parser.mly" + ( Override ) +# 32033 "parsing/parser.ml" + in + let _endpos = _endpos__11_ in + let _symbolstartpos = if _startpos__1_ != _endpos__1_ then + _startpos__1_ + else + if _startpos__2_ != _endpos__2_ then + _startpos__2_ + else + if _startpos__3_ != _endpos__3_ then + _startpos__3_ + else + _startpos__4_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 1925 "parsing/parser.mly" - ( - let attrs = attrs1 @ attrs2 in - let loc = make_loc _sloc in - let docs = symbol_docs _sloc in - Mtd.mk id ~typ ~attrs ~loc ~docs, ext - ) -# 31136 "parsing/parser.ml" - : (Parsetree.module_type_declaration * string Asttypes.loc option)) +# 2106 "parsing/parser.mly" + ( let poly_exp_loc = (_startpos__7_, _endpos__11_) in + let poly_exp = + let exp, poly = + (* it seems odd to use the global ~loc here while poly_exp_loc + is tighter, but this is what ocamlyacc does; + TODO improve parser.mly *) + wrap_type_annotation ~loc:_sloc _7 _9 _11 in + ghexp ~loc:poly_exp_loc (Pexp_poly(exp, Some poly)) in + (_4, _3, + Cfk_concrete (_1, poly_exp)), _2 ) +# 32059 "parsing/parser.ml" + : ((Asttypes.label Asttypes.loc * Asttypes.private_flag * + Parsetree.class_field_kind) * + Parsetree.attributes)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31151,14 +32076,18 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _1 : (Longident.t) = Obj.magic _1 in + let _1 : ( +# 785 "parsing/parser.mly" + (string) +# 32083 "parsing/parser.ml" + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3892 "parsing/parser.mly" - ( _1 ) -# 31162 "parsing/parser.ml" +# 4040 "parsing/parser.mly" + ( Lident _1 ) +# 32091 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31169,15 +32098,44 @@ module Tables = struct }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : ( +# 785 "parsing/parser.mly" + (string) +# 32124 "parsing/parser.ml" + ) = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (Asttypes.mutable_flag) = -# 3973 "parsing/parser.mly" - ( Immutable ) -# 31180 "parsing/parser.ml" - in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v = + let _loc__3_ = (_startpos__3_, _endpos__3_) in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + ( +# 4041 "parsing/parser.mly" + ( ldot _1 _loc__1_ _3 _loc__3_ ) +# 32137 "parsing/parser.ml" + : (Longident.t)) + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -31194,32 +32152,18 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _1 : ( +# 836 "parsing/parser.mly" + (string) +# 32159 "parsing/parser.ml" + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in - let _v : (Asttypes.mutable_flag) = -# 3974 "parsing/parser.mly" - ( Mutable ) -# 31205 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (Asttypes.mutable_flag * Asttypes.virtual_flag) = -# 3982 "parsing/parser.mly" - ( Immutable, Concrete ) -# 31223 "parsing/parser.ml" + let _v : (Longident.t) = +# 4040 "parsing/parser.mly" + ( Lident _1 ) +# 32167 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31231,21 +32175,43 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _3 : ( +# 836 "parsing/parser.mly" + (string) +# 32200 "parsing/parser.ml" + ) = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Asttypes.mutable_flag * Asttypes.virtual_flag) = -# 3984 "parsing/parser.mly" - ( Mutable, Concrete ) -# 31248 "parsing/parser.ml" - in + let _endpos = _endpos__3_ in + let _v = + let _loc__3_ = (_startpos__3_, _endpos__3_) in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + ( +# 4041 "parsing/parser.mly" + ( ldot _1 _loc__1_ _3 _loc__3_ ) +# 32213 "parsing/parser.ml" + : (Longident.t)) + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -31262,15 +32228,22 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _1 : (Asttypes.label) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in - let _v : (Asttypes.mutable_flag * Asttypes.virtual_flag) = -# 3986 "parsing/parser.mly" - ( Immutable, Virtual ) -# 31273 "parsing/parser.ml" - in + let _v = + let _1 = +# 4078 "parsing/parser.mly" + ( _1 ) +# 32240 "parsing/parser.ml" + in + ( +# 4040 "parsing/parser.mly" + ( Lident _1 ) +# 32245 "parsing/parser.ml" + : (Longident.t)) + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -31282,27 +32255,48 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; } = _menhir_stack in + let _3 : unit = Obj.magic _3 in let _2 : unit = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Asttypes.mutable_flag * Asttypes.virtual_flag) = -# 3989 "parsing/parser.mly" - ( Mutable, Virtual ) -# 31305 "parsing/parser.ml" - in + let _endpos = _endpos__3_ in + let _v = + let _1 = + let _1 = +# 4020 "parsing/parser.mly" + ( "::" ) +# 32287 "parsing/parser.ml" + in + +# 4078 "parsing/parser.mly" + ( _1 ) +# 32292 "parsing/parser.ml" + + in + ( +# 4040 "parsing/parser.mly" + ( Lident _1 ) +# 32298 "parsing/parser.ml" + : (Longident.t)) + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -31313,28 +32307,28 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _2 : unit = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in + let _1 : (Asttypes.label) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Asttypes.mutable_flag * Asttypes.virtual_flag) = -# 3989 "parsing/parser.mly" - ( Mutable, Virtual ) -# 31337 "parsing/parser.ml" - in + let _endpos = _endpos__1_ in + let _v = + let _1 = +# 4078 "parsing/parser.mly" + ( _1 ) +# 32325 "parsing/parser.ml" + in + ( +# 4040 "parsing/parser.mly" + ( Lident _1 ) +# 32330 "parsing/parser.ml" + : (Longident.t)) + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -31346,27 +32340,47 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; } = _menhir_stack in - let _2 : (Asttypes.label) = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in + let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Asttypes.label) = -# 3944 "parsing/parser.mly" - ( _2 ) -# 31369 "parsing/parser.ml" - in + let _endpos = _endpos__1_inlined1_ in + let _v = + let _3 = + let _1 = _1_inlined1 in + +# 4078 "parsing/parser.mly" + ( _1 ) +# 32373 "parsing/parser.ml" + + in + let (_endpos__3_, _startpos__3_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in + let _loc__3_ = (_startpos__3_, _endpos__3_) in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + ( +# 4041 "parsing/parser.mly" + ( ldot _1 _loc__1_ _3 _loc__3_ ) +# 32382 "parsing/parser.ml" + : (Longident.t)) + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -31377,36 +32391,65 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; } = _menhir_stack in - let _1 : ( -# 797 "parsing/parser.mly" - (string) -# 31390 "parsing/parser.ml" - ) = Obj.magic _1 in + let _3 : unit = Obj.magic _3 in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in + let _endpos = _endpos__3_ in let _v = - let x = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _3 = + let _1 = +# 4020 "parsing/parser.mly" + ( "::" ) +# 32438 "parsing/parser.ml" + in -# 984 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 31403 "parsing/parser.ml" +# 4078 "parsing/parser.mly" + ( _1 ) +# 32443 "parsing/parser.ml" in + let _startpos__3_ = _startpos__1_inlined1_ in + let _loc__3_ = (_startpos__3_, _endpos__3_) in + let _loc__1_ = (_startpos__1_, _endpos__1_) in ( -# 228 "" - ( [ x ] ) -# 31409 "parsing/parser.ml" - : (string Asttypes.loc list)) +# 4041 "parsing/parser.mly" + ( ldot _1 _loc__1_ _3 _loc__3_ ) +# 32452 "parsing/parser.ml" + : (Longident.t)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31419,42 +32462,46 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; } = _menhir_stack in - let xs : (string Asttypes.loc list) = Obj.magic xs in - let _1 : ( -# 797 "parsing/parser.mly" - (string) -# 31438 "parsing/parser.ml" - ) = Obj.magic _1 in + let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_xs_ in + let _endpos = _endpos__1_inlined1_ in let _v = - let x = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _3 = + let _1 = _1_inlined1 in -# 984 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 31451 "parsing/parser.ml" +# 4078 "parsing/parser.mly" + ( _1 ) +# 32495 "parsing/parser.ml" in + let (_endpos__3_, _startpos__3_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in + let _loc__3_ = (_startpos__3_, _endpos__3_) in + let _loc__1_ = (_startpos__1_, _endpos__1_) in ( -# 231 "" - ( x :: xs ) -# 31457 "parsing/parser.ml" - : (string Asttypes.loc list)) +# 4041 "parsing/parser.mly" + ( ldot _1 _loc__1_ _3 _loc__3_ ) +# 32504 "parsing/parser.ml" + : (Longident.t)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31467,31 +32514,20 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = s; - MenhirLib.EngineTypes.startp = _startpos_s_; - MenhirLib.EngineTypes.endp = _endpos_s_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let s : ( -# 835 "parsing/parser.mly" - (string * Location.t * string option) -# 31479 "parsing/parser.ml" - ) = Obj.magic s in + let _1 : (Asttypes.label) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_s_ in - let _endpos = _endpos_s_ in - let _v = - let x = -# 3940 "parsing/parser.mly" - ( let body, _, _ = s in body ) -# 31488 "parsing/parser.ml" - in - ( -# 228 "" - ( [ x ] ) -# 31493 "parsing/parser.ml" - : (string list)) - in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Longident.t) = +# 4040 "parsing/parser.mly" + ( Lident _1 ) +# 32530 "parsing/parser.ml" + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -31503,37 +32539,37 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = s; - MenhirLib.EngineTypes.startp = _startpos_s_; - MenhirLib.EngineTypes.endp = _endpos_s_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; } = _menhir_stack in - let xs : (string list) = Obj.magic xs in - let s : ( -# 835 "parsing/parser.mly" - (string * Location.t * string option) -# 31522 "parsing/parser.ml" - ) = Obj.magic s in + let _3 : (Asttypes.label) = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_s_ in - let _endpos = _endpos_xs_ in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in let _v = - let x = -# 3940 "parsing/parser.mly" - ( let body, _, _ = s in body ) -# 31531 "parsing/parser.ml" - in + let _loc__3_ = (_startpos__3_, _endpos__3_) in + let _loc__1_ = (_startpos__1_, _endpos__1_) in ( -# 231 "" - ( x :: xs ) -# 31536 "parsing/parser.ml" - : (string list)) +# 4041 "parsing/parser.mly" + ( ldot _1 _loc__1_ _3 _loc__3_ ) +# 32572 "parsing/parser.ml" + : (Longident.t)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31546,27 +32582,24 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = ty; - MenhirLib.EngineTypes.startp = _startpos_ty_; - MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let ty : (Parsetree.core_type) = Obj.magic ty in + let _1 : ( +# 785 "parsing/parser.mly" + (string) +# 32594 "parsing/parser.ml" + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_ty_ in - let _endpos = _endpos_ty_ in - let _v = - let priv = -# 3969 "parsing/parser.mly" - ( Public ) -# 31563 "parsing/parser.ml" - in - ( -# 3192 "parsing/parser.mly" - ( (Ptype_abstract, priv, Some ty) ) -# 31568 "parsing/parser.ml" - : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option)) - in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Longident.t) = +# 4040 "parsing/parser.mly" + ( Lident _1 ) +# 32602 "parsing/parser.ml" + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -31578,33 +32611,41 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ty; - MenhirLib.EngineTypes.startp = _startpos_ty_; - MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; } = _menhir_stack in - let ty : (Parsetree.core_type) = Obj.magic ty in - let _1 : unit = Obj.magic _1 in + let _3 : ( +# 785 "parsing/parser.mly" + (string) +# 32635 "parsing/parser.ml" + ) = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_ty_ in + let _endpos = _endpos__3_ in let _v = - let priv = -# 3970 "parsing/parser.mly" - ( Private ) -# 31602 "parsing/parser.ml" - in + let _loc__3_ = (_startpos__3_, _endpos__3_) in + let _loc__1_ = (_startpos__1_, _endpos__1_) in ( -# 3192 "parsing/parser.mly" - ( (Ptype_abstract, priv, Some ty) ) -# 31607 "parsing/parser.ml" - : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option)) +# 4041 "parsing/parser.mly" + ( ldot _1 _loc__1_ _3 _loc__3_ ) +# 32648 "parsing/parser.ml" + : (Longident.t)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31617,39 +32658,24 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = cs; - MenhirLib.EngineTypes.startp = _startpos_cs_; - MenhirLib.EngineTypes.endp = _endpos_cs_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let cs : (Parsetree.constructor_declaration list) = Obj.magic cs in + let _1 : ( +# 836 "parsing/parser.mly" + (string) +# 32670 "parsing/parser.ml" + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_cs_ in - let _endpos = _endpos_cs_ in - let _v = - let priv = -# 3969 "parsing/parser.mly" - ( Public ) -# 31634 "parsing/parser.ml" - in - let oty = - let _1 = -# 123 "" - ( None ) -# 31640 "parsing/parser.ml" - in - -# 3208 "parsing/parser.mly" - ( _1 ) -# 31645 "parsing/parser.ml" - - in - ( -# 3196 "parsing/parser.mly" - ( (Ptype_variant cs, priv, oty) ) -# 31651 "parsing/parser.ml" - : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option)) - in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Longident.t) = +# 4040 "parsing/parser.mly" + ( Lident _1 ) +# 32678 "parsing/parser.ml" + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -31661,45 +32687,41 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = cs; - MenhirLib.EngineTypes.startp = _startpos_cs_; - MenhirLib.EngineTypes.endp = _endpos_cs_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; } = _menhir_stack in - let cs : (Parsetree.constructor_declaration list) = Obj.magic cs in - let _1 : unit = Obj.magic _1 in + let _3 : ( +# 836 "parsing/parser.mly" + (string) +# 32711 "parsing/parser.ml" + ) = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_cs_ in + let _endpos = _endpos__3_ in let _v = - let priv = -# 3970 "parsing/parser.mly" - ( Private ) -# 31685 "parsing/parser.ml" - in - let oty = - let _1 = -# 123 "" - ( None ) -# 31691 "parsing/parser.ml" - in - -# 3208 "parsing/parser.mly" - ( _1 ) -# 31696 "parsing/parser.ml" - - in + let _loc__3_ = (_startpos__3_, _endpos__3_) in + let _loc__1_ = (_startpos__1_, _endpos__1_) in ( -# 3196 "parsing/parser.mly" - ( (Ptype_variant cs, priv, oty) ) -# 31702 "parsing/parser.ml" - : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option)) +# 4041 "parsing/parser.mly" + ( ldot _1 _loc__1_ _3 _loc__3_ ) +# 32724 "parsing/parser.ml" + : (Longident.t)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31708,13 +32730,38 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos; MenhirLib.EngineTypes.next = _menhir_stack; }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Asttypes.label) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Longident.t) = +# 4040 "parsing/parser.mly" + ( Lident _1 ) +# 32750 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = cs; - MenhirLib.EngineTypes.startp = _startpos_cs_; - MenhirLib.EngineTypes.endp = _endpos_cs_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _2; @@ -31722,49 +32769,27 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in - let cs : (Parsetree.constructor_declaration list) = Obj.magic cs in + let _3 : (Asttypes.label) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in - let x : (Parsetree.core_type) = Obj.magic x in + let _1 : (Longident.t) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_x_ in - let _endpos = _endpos_cs_ in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in let _v = - let priv = -# 3969 "parsing/parser.mly" - ( Public ) -# 31743 "parsing/parser.ml" - in - let oty = - let _1 = - let x = -# 196 "" - ( x ) -# 31750 "parsing/parser.ml" - in - -# 126 "" - ( Some x ) -# 31755 "parsing/parser.ml" - - in - -# 3208 "parsing/parser.mly" - ( _1 ) -# 31761 "parsing/parser.ml" - - in + let _loc__3_ = (_startpos__3_, _endpos__3_) in + let _loc__1_ = (_startpos__1_, _endpos__1_) in ( -# 3196 "parsing/parser.mly" - ( (Ptype_variant cs, priv, oty) ) -# 31767 "parsing/parser.ml" - : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option)) +# 4041 "parsing/parser.mly" + ( ldot _1 _loc__1_ _3 _loc__3_ ) +# 32792 "parsing/parser.ml" + : (Longident.t)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31773,18 +32798,43 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos; MenhirLib.EngineTypes.next = _menhir_stack; }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Longident.t) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Longident.t) = +# 4056 "parsing/parser.mly" + ( _1 ) +# 32818 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = cs; - MenhirLib.EngineTypes.startp = _startpos_cs_; - MenhirLib.EngineTypes.endp = _endpos_cs_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _2; @@ -31792,51 +32842,32 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; } = _menhir_stack in - let cs : (Parsetree.constructor_declaration list) = Obj.magic cs in - let _1 : unit = Obj.magic _1 in + let _4 : unit = Obj.magic _4 in + let _3 : (Longident.t) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in - let x : (Parsetree.core_type) = Obj.magic x in + let _1 : (Longident.t) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_x_ in - let _endpos = _endpos_cs_ in + let _startpos = _startpos__1_ in + let _endpos = _endpos__4_ in let _v = - let priv = -# 3970 "parsing/parser.mly" - ( Private ) -# 31815 "parsing/parser.ml" - in - let oty = - let _1 = - let x = -# 196 "" - ( x ) -# 31822 "parsing/parser.ml" - in - -# 126 "" - ( Some x ) -# 31827 "parsing/parser.ml" - - in - -# 3208 "parsing/parser.mly" - ( _1 ) -# 31833 "parsing/parser.ml" - - in + let _endpos = _endpos__4_ in + let _symbolstartpos = _startpos__1_ in + let _loc__3_ = (_startpos__3_, _endpos__3_) in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + let _sloc = (_symbolstartpos, _endpos) in ( -# 3196 "parsing/parser.mly" - ( (Ptype_variant cs, priv, oty) ) -# 31839 "parsing/parser.ml" - : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option)) +# 4058 "parsing/parser.mly" + ( lapply ~loc:_sloc _1 _loc__1_ _3 _loc__3_ ) +# 32870 "parsing/parser.ml" + : (Longident.t)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31848,39 +32879,37 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _3; MenhirLib.EngineTypes.startp = _startpos__3_; MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; } = _menhir_stack in let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__3_ in + let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v = - let priv = -# 3969 "parsing/parser.mly" - ( Public ) -# 31866 "parsing/parser.ml" - in - let oty = - let _1 = -# 123 "" - ( None ) -# 31872 "parsing/parser.ml" - in - -# 3208 "parsing/parser.mly" - ( _1 ) -# 31877 "parsing/parser.ml" - - in + let _loc__3_ = (_startpos__3_, _endpos__3_) in ( -# 3200 "parsing/parser.mly" - ( (Ptype_open, priv, oty) ) -# 31883 "parsing/parser.ml" - : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option)) +# 4060 "parsing/parser.mly" + ( expecting _loc__3_ "module path" ) +# 32912 "parsing/parser.ml" + : (Longident.t)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31889,13 +32918,38 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos; MenhirLib.EngineTypes.next = _menhir_stack; }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Longident.t) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Longident.t) = +# 4053 "parsing/parser.mly" + ( _1 ) +# 32938 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = me; + MenhirLib.EngineTypes.startp = _startpos_me_; + MenhirLib.EngineTypes.endp = _endpos_me_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -31904,35 +32958,16 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _3 : unit = Obj.magic _3 in + let me : (Parsetree.module_expr) = Obj.magic me in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v = - let priv = -# 3970 "parsing/parser.mly" - ( Private ) -# 31917 "parsing/parser.ml" - in - let oty = - let _1 = -# 123 "" - ( None ) -# 31923 "parsing/parser.ml" - in - -# 3208 "parsing/parser.mly" - ( _1 ) -# 31928 "parsing/parser.ml" - - in - ( -# 3200 "parsing/parser.mly" - ( (Ptype_open, priv, oty) ) -# 31934 "parsing/parser.ml" - : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option)) - in + let _endpos = _endpos_me_ in + let _v : (Parsetree.module_expr) = +# 1569 "parsing/parser.mly" + ( me ) +# 32970 "parsing/parser.ml" + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -31944,59 +32979,29 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _3 : unit = Obj.magic _3 in let _2 : unit = Obj.magic _2 in - let x : (Parsetree.core_type) = Obj.magic x in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_x_ in - let _endpos = _endpos__3_ in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in let _v = - let priv = -# 3969 "parsing/parser.mly" - ( Public ) -# 31975 "parsing/parser.ml" - in - let oty = - let _1 = - let x = -# 196 "" - ( x ) -# 31982 "parsing/parser.ml" - in - -# 126 "" - ( Some x ) -# 31987 "parsing/parser.ml" - - in - -# 3208 "parsing/parser.mly" - ( _1 ) -# 31993 "parsing/parser.ml" - - in + let _loc__1_ = (_startpos__1_, _endpos__1_) in ( -# 3200 "parsing/parser.mly" - ( (Ptype_open, priv, oty) ) -# 31999 "parsing/parser.ml" - : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option)) +# 1571 "parsing/parser.mly" + ( expecting _loc__1_ "=" ) +# 33004 "parsing/parser.ml" + : (Parsetree.module_expr)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32009,66 +33014,58 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = me; + MenhirLib.EngineTypes.startp = _startpos_me_; + MenhirLib.EngineTypes.endp = _endpos_me_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = mty; + MenhirLib.EngineTypes.startp = _startpos_mty_; + MenhirLib.EngineTypes.endp = _endpos_mty_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; } = _menhir_stack in + let me : (Parsetree.module_expr) = Obj.magic me in let _3 : unit = Obj.magic _3 in + let mty : (Parsetree.module_type) = Obj.magic mty in let _1 : unit = Obj.magic _1 in - let _2 : unit = Obj.magic _2 in - let x : (Parsetree.core_type) = Obj.magic x in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_x_ in - let _endpos = _endpos__3_ in + let _startpos = _startpos__1_ in + let _endpos = _endpos_me_ in let _v = - let priv = -# 3970 "parsing/parser.mly" - ( Private ) -# 32047 "parsing/parser.ml" - in - let oty = - let _1 = - let x = -# 196 "" - ( x ) -# 32054 "parsing/parser.ml" - in - -# 126 "" - ( Some x ) -# 32059 "parsing/parser.ml" - - in + let _1 = + let _1 = +# 1574 "parsing/parser.mly" + ( Pmod_constraint(me, mty) ) +# 33053 "parsing/parser.ml" + in + let _endpos__1_ = _endpos_me_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 3208 "parsing/parser.mly" - ( _1 ) -# 32065 "parsing/parser.ml" +# 1015 "parsing/parser.mly" + ( mkmod ~loc:_sloc _1 ) +# 33062 "parsing/parser.ml" in ( -# 3200 "parsing/parser.mly" - ( (Ptype_open, priv, oty) ) -# 32071 "parsing/parser.ml" - : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option)) +# 1578 "parsing/parser.mly" + ( _1 ) +# 33068 "parsing/parser.ml" + : (Parsetree.module_expr)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32081,52 +33078,45 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = body; + MenhirLib.EngineTypes.startp = _startpos_body_; + MenhirLib.EngineTypes.endp = _endpos_body_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ls; - MenhirLib.EngineTypes.startp = _startpos_ls_; - MenhirLib.EngineTypes.endp = _endpos_ls_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = arg_and_pos; + MenhirLib.EngineTypes.startp = _startpos_arg_and_pos_; + MenhirLib.EngineTypes.endp = _endpos_arg_and_pos_; + MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _5 : unit = Obj.magic _5 in - let ls : (Parsetree.label_declaration list) = Obj.magic ls in - let _3 : unit = Obj.magic _3 in + let body : (Parsetree.module_expr) = Obj.magic body in + let arg_and_pos : (Lexing.position * Parsetree.functor_parameter) = Obj.magic arg_and_pos in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__3_ in - let _endpos = _endpos__5_ in + let _startpos = _startpos_arg_and_pos_ in + let _endpos = _endpos_body_ in let _v = - let priv = -# 3969 "parsing/parser.mly" - ( Public ) -# 32112 "parsing/parser.ml" - in - let oty = + let _1 = let _1 = -# 123 "" - ( None ) -# 32118 "parsing/parser.ml" +# 1576 "parsing/parser.mly" + ( let (_, arg) = arg_and_pos in + Pmod_functor(arg, body) ) +# 33104 "parsing/parser.ml" in + let (_endpos__1_, _startpos__1_) = (_endpos_body_, _startpos_arg_and_pos_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 3208 "parsing/parser.mly" - ( _1 ) -# 32123 "parsing/parser.ml" +# 1015 "parsing/parser.mly" + ( mkmod ~loc:_sloc _1 ) +# 33113 "parsing/parser.ml" in ( -# 3204 "parsing/parser.mly" - ( (Ptype_record ls, priv, oty) ) -# 32129 "parsing/parser.ml" - : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option)) +# 1578 "parsing/parser.mly" + ( _1 ) +# 33119 "parsing/parser.ml" + : (Parsetree.module_expr)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32139,60 +33129,27 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = mty; + MenhirLib.EngineTypes.startp = _startpos_mty_; + MenhirLib.EngineTypes.endp = _endpos_mty_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ls; - MenhirLib.EngineTypes.startp = _startpos_ls_; - MenhirLib.EngineTypes.endp = _endpos_ls_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _5 : unit = Obj.magic _5 in - let ls : (Parsetree.label_declaration list) = Obj.magic ls in - let _3 : unit = Obj.magic _3 in + let mty : (Parsetree.module_type) = Obj.magic mty in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in - let _v = - let priv = -# 3970 "parsing/parser.mly" - ( Private ) -# 32177 "parsing/parser.ml" - in - let oty = - let _1 = -# 123 "" - ( None ) -# 32183 "parsing/parser.ml" - in - -# 3208 "parsing/parser.mly" - ( _1 ) -# 32188 "parsing/parser.ml" - - in - ( -# 3204 "parsing/parser.mly" - ( (Ptype_record ls, priv, oty) ) -# 32194 "parsing/parser.ml" - : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option)) - in + let _endpos = _endpos_mty_ in + let _v : (Parsetree.module_type) = +# 1819 "parsing/parser.mly" + ( mty ) +# 33152 "parsing/parser.ml" + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -32204,73 +33161,80 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ls; - MenhirLib.EngineTypes.startp = _startpos_ls_; - MenhirLib.EngineTypes.endp = _endpos_ls_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _5 : unit = Obj.magic _5 in - let ls : (Parsetree.label_declaration list) = Obj.magic ls in - let _3 : unit = Obj.magic _3 in let _2 : unit = Obj.magic _2 in - let x : (Parsetree.core_type) = Obj.magic x in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_x_ in - let _endpos = _endpos__5_ in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in let _v = - let priv = -# 3969 "parsing/parser.mly" - ( Public ) -# 32249 "parsing/parser.ml" - in - let oty = - let _1 = - let x = -# 196 "" - ( x ) -# 32256 "parsing/parser.ml" - in - -# 126 "" - ( Some x ) -# 32261 "parsing/parser.ml" - - in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + ( +# 1821 "parsing/parser.mly" + ( expecting _loc__1_ ":" ) +# 33186 "parsing/parser.ml" + : (Parsetree.module_type)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = body; + MenhirLib.EngineTypes.startp = _startpos_body_; + MenhirLib.EngineTypes.endp = _endpos_body_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = arg_and_pos; + MenhirLib.EngineTypes.startp = _startpos_arg_and_pos_; + MenhirLib.EngineTypes.endp = _endpos_arg_and_pos_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let body : (Parsetree.module_type) = Obj.magic body in + let arg_and_pos : (Lexing.position * Parsetree.functor_parameter) = Obj.magic arg_and_pos in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_arg_and_pos_ in + let _endpos = _endpos_body_ in + let _v = + let _1 = + let _1 = +# 1824 "parsing/parser.mly" + ( let (_, arg) = arg_and_pos in + Pmty_functor(arg, body) ) +# 33222 "parsing/parser.ml" + in + let (_endpos__1_, _startpos__1_) = (_endpos_body_, _startpos_arg_and_pos_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 3208 "parsing/parser.mly" - ( _1 ) -# 32267 "parsing/parser.ml" +# 1017 "parsing/parser.mly" + ( mkmty ~loc:_sloc _1 ) +# 33231 "parsing/parser.ml" in ( -# 3204 "parsing/parser.mly" - ( (Ptype_record ls, priv, oty) ) -# 32273 "parsing/parser.ml" - : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option)) +# 1827 "parsing/parser.mly" + ( _1 ) +# 33237 "parsing/parser.ml" + : (Parsetree.module_type)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32283,80 +33247,53 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ls; - MenhirLib.EngineTypes.startp = _startpos_ls_; - MenhirLib.EngineTypes.endp = _endpos_ls_; + MenhirLib.EngineTypes.semv = s; + MenhirLib.EngineTypes.startp = _startpos_s_; + MenhirLib.EngineTypes.endp = _endpos_s_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; MenhirLib.EngineTypes.startp = _startpos__1_; MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; } = _menhir_stack in - let _5 : unit = Obj.magic _5 in - let ls : (Parsetree.label_declaration list) = Obj.magic ls in - let _3 : unit = Obj.magic _3 in + let _4 : unit = Obj.magic _4 in + let s : (Parsetree.structure) = Obj.magic s in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in - let _2 : unit = Obj.magic _2 in - let x : (Parsetree.core_type) = Obj.magic x in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_x_ in - let _endpos = _endpos__5_ in + let _startpos = _startpos__1_ in + let _endpos = _endpos__4_ in let _v = - let priv = -# 3970 "parsing/parser.mly" - ( Private ) -# 32335 "parsing/parser.ml" - in - let oty = - let _1 = - let x = -# 196 "" - ( x ) -# 32342 "parsing/parser.ml" - in - -# 126 "" - ( Some x ) -# 32347 "parsing/parser.ml" - - in + let attrs = + let _1 = _1_inlined1 in -# 3208 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 32353 "parsing/parser.ml" +# 33287 "parsing/parser.ml" in + let _endpos = _endpos__4_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in ( -# 3204 "parsing/parser.mly" - ( (Ptype_record ls, priv, oty) ) -# 32359 "parsing/parser.ml" - : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option)) +# 1407 "parsing/parser.mly" + ( mkmod ~loc:_sloc ~attrs (Pmod_structure s) ) +# 33296 "parsing/parser.ml" + : (Parsetree.module_expr)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32369,51 +33306,52 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = meth_list; - MenhirLib.EngineTypes.startp = _startpos_meth_list_; - MenhirLib.EngineTypes.endp = _endpos_meth_list_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; }; } = _menhir_stack in - let _3 : unit = Obj.magic _3 in - let meth_list : (Parsetree.object_field list * Asttypes.closed_flag) = Obj.magic meth_list in + let _4 : unit = Obj.magic _4 in + let _3 : (Parsetree.structure) = Obj.magic _3 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in + let _endpos = _endpos__4_ in let _v = - let _1 = - let _1 = -# 3626 "parsing/parser.mly" - ( let (f, c) = meth_list in Ptyp_object (f, c) ) -# 32401 "parsing/parser.ml" - in - let _endpos__1_ = _endpos__3_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _2 = + let _1 = _1_inlined1 in -# 1021 "parsing/parser.mly" - ( mktyp ~loc:_sloc _1 ) -# 32410 "parsing/parser.ml" +# 4286 "parsing/parser.mly" + ( _1 ) +# 33346 "parsing/parser.ml" in + let _loc__4_ = (_startpos__4_, _endpos__4_) in + let _loc__1_ = (_startpos__1_, _endpos__1_) in ( -# 3630 "parsing/parser.mly" - ( _1 ) -# 32416 "parsing/parser.ml" - : (Parsetree.core_type)) +# 1409 "parsing/parser.mly" + ( unclosed "struct" _loc__1_ "end" _loc__4_ ) +# 33354 "parsing/parser.ml" + : (Parsetree.module_expr)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32443,27 +33381,12 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v = - let _1 = - let _1 = -# 3628 "parsing/parser.mly" - ( Ptyp_object ([], Closed) ) -# 32451 "parsing/parser.ml" - in - let _endpos__1_ = _endpos__2_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1021 "parsing/parser.mly" - ( mktyp ~loc:_sloc _1 ) -# 32460 "parsing/parser.ml" - - in + let _loc__1_ = (_startpos__1_, _endpos__1_) in ( -# 3630 "parsing/parser.mly" - ( _1 ) -# 32466 "parsing/parser.ml" - : (Parsetree.core_type)) +# 1411 "parsing/parser.mly" + ( expecting _loc__1_ "struct" ) +# 33389 "parsing/parser.ml" + : (Parsetree.module_expr)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32476,24 +33399,24 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = me; + MenhirLib.EngineTypes.startp = _startpos_me_; + MenhirLib.EngineTypes.endp = _endpos_me_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = me; - MenhirLib.EngineTypes.startp = _startpos_me_; - MenhirLib.EngineTypes.endp = _endpos_me_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ext; - MenhirLib.EngineTypes.startp = _startpos_ext_; - MenhirLib.EngineTypes.endp = _endpos_ext_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -32505,50 +33428,43 @@ module Tables = struct }; }; } = _menhir_stack in - let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in let me : (Parsetree.module_expr) = Obj.magic me in + let _4 : unit = Obj.magic _4 in + let _1_inlined2 : ((Lexing.position * Parsetree.functor_parameter) list) = Obj.magic _1_inlined2 in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let ext : (string Asttypes.loc option) = Obj.magic ext in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined2_ in + let _endpos = _endpos_me_ in let _v = - let attrs2 = + let args = let _1 = _1_inlined2 in -# 4110 "parsing/parser.mly" +# 1373 "parsing/parser.mly" ( _1 ) -# 32523 "parsing/parser.ml" +# 33446 "parsing/parser.ml" in - let _endpos_attrs2_ = _endpos__1_inlined2_ in - let attrs1 = + let attrs = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 32532 "parsing/parser.ml" +# 33454 "parsing/parser.ml" in - let override = -# 4016 "parsing/parser.mly" - ( Fresh ) -# 32538 "parsing/parser.ml" - in - let _endpos = _endpos_attrs2_ in + let _endpos = _endpos_me_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 1680 "parsing/parser.mly" - ( - let attrs = attrs1 @ attrs2 in - let loc = make_loc _sloc in - let docs = symbol_docs _sloc in - Opn.mk me ~override ~attrs ~loc ~docs, ext - ) -# 32551 "parsing/parser.ml" - : (Parsetree.open_declaration * string Asttypes.loc option)) +# 1413 "parsing/parser.mly" + ( wrap_mod_attrs ~loc:_sloc attrs ( + List.fold_left (fun acc (startpos, arg) -> + mkmod ~loc:(startpos, _endpos) (Pmod_functor (arg, acc)) + ) me args + ) ) +# 33467 "parsing/parser.ml" + : (Parsetree.module_expr)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32557,90 +33473,109 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos; MenhirLib.EngineTypes.next = _menhir_stack; }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = me; + MenhirLib.EngineTypes.startp = _startpos_me_; + MenhirLib.EngineTypes.endp = _endpos_me_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let me : (Parsetree.module_expr) = Obj.magic me in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_me_ in + let _endpos = _endpos_me_ in + let _v : (Parsetree.module_expr) = +# 1419 "parsing/parser.mly" + ( me ) +# 33493 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = attr; + MenhirLib.EngineTypes.startp = _startpos_attr_; + MenhirLib.EngineTypes.endp = _endpos_attr_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = me; MenhirLib.EngineTypes.startp = _startpos_me_; MenhirLib.EngineTypes.endp = _endpos_me_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ext; - MenhirLib.EngineTypes.startp = _startpos_ext_; - MenhirLib.EngineTypes.endp = _endpos_ext_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; + MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let attr : (Parsetree.attribute) = Obj.magic attr in let me : (Parsetree.module_expr) = Obj.magic me in - let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let ext : (string Asttypes.loc option) = Obj.magic ext in - let _1_inlined1 : unit = Obj.magic _1_inlined1 in - let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_me_ in + let _endpos = _endpos_attr_ in + let _v : (Parsetree.module_expr) = +# 1421 "parsing/parser.mly" + ( Mod.attr me attr ) +# 33525 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Longident.t) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined3_ in + let _endpos = _endpos__1_ in let _v = - let attrs2 = - let _1 = _1_inlined3 in - -# 4110 "parsing/parser.mly" - ( _1 ) -# 32615 "parsing/parser.ml" - - in - let _endpos_attrs2_ = _endpos__1_inlined3_ in - let attrs1 = - let _1 = _1_inlined2 in + let _1 = + let _1 = + let x = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 972 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 33557 "parsing/parser.ml" + + in + +# 1425 "parsing/parser.mly" + ( Pmod_ident x ) +# 33563 "parsing/parser.ml" + + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 4114 "parsing/parser.mly" - ( _1 ) -# 32624 "parsing/parser.ml" +# 1015 "parsing/parser.mly" + ( mkmod ~loc:_sloc _1 ) +# 33572 "parsing/parser.ml" in - let override = -# 4017 "parsing/parser.mly" - ( Override ) -# 32630 "parsing/parser.ml" - in - let _endpos = _endpos_attrs2_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in ( -# 1680 "parsing/parser.mly" - ( - let attrs = attrs1 @ attrs2 in - let loc = make_loc _sloc in - let docs = symbol_docs _sloc in - Opn.mk me ~override ~attrs ~loc ~docs, ext - ) -# 32643 "parsing/parser.ml" - : (Parsetree.open_declaration * string Asttypes.loc option)) +# 1436 "parsing/parser.mly" + ( _1 ) +# 33578 "parsing/parser.ml" + : (Parsetree.module_expr)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32653,90 +33588,44 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = me2; + MenhirLib.EngineTypes.startp = _startpos_me2_; + MenhirLib.EngineTypes.endp = _endpos_me2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ext; - MenhirLib.EngineTypes.startp = _startpos_ext_; - MenhirLib.EngineTypes.endp = _endpos_ext_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = me1; + MenhirLib.EngineTypes.startp = _startpos_me1_; + MenhirLib.EngineTypes.endp = _endpos_me1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let _1_inlined2 : (Longident.t) = Obj.magic _1_inlined2 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let ext : (string Asttypes.loc option) = Obj.magic ext in - let _1 : unit = Obj.magic _1 in + let me2 : (Parsetree.module_expr) = Obj.magic me2 in + let me1 : (Parsetree.module_expr) = Obj.magic me1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined3_ in + let _startpos = _startpos_me1_ in + let _endpos = _endpos_me2_ in let _v = - let attrs2 = - let _1 = _1_inlined3 in - -# 4110 "parsing/parser.mly" - ( _1 ) -# 32700 "parsing/parser.ml" - - in - let _endpos_attrs2_ = _endpos__1_inlined3_ in - let id = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let _1 = + let _1 = +# 1428 "parsing/parser.mly" + ( Pmod_apply(me1, me2) ) +# 33613 "parsing/parser.ml" + in + let (_endpos__1_, _startpos__1_) = (_endpos_me2_, _startpos_me1_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 32712 "parsing/parser.ml" - - in - let attrs1 = - let _1 = _1_inlined1 in - -# 4114 "parsing/parser.mly" - ( _1 ) -# 32720 "parsing/parser.ml" +# 1015 "parsing/parser.mly" + ( mkmod ~loc:_sloc _1 ) +# 33622 "parsing/parser.ml" in - let override = -# 4016 "parsing/parser.mly" - ( Fresh ) -# 32726 "parsing/parser.ml" - in - let _endpos = _endpos_attrs2_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in ( -# 1695 "parsing/parser.mly" - ( - let attrs = attrs1 @ attrs2 in - let loc = make_loc _sloc in - let docs = symbol_docs _sloc in - Opn.mk id ~override ~attrs ~loc ~docs, ext - ) -# 32739 "parsing/parser.ml" - : (Parsetree.open_description * string Asttypes.loc option)) +# 1436 "parsing/parser.mly" + ( _1 ) +# 33628 "parsing/parser.ml" + : (Parsetree.module_expr)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32749,97 +33638,51 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined4; - MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ext; - MenhirLib.EngineTypes.startp = _startpos_ext_; - MenhirLib.EngineTypes.endp = _endpos_ext_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = me; + MenhirLib.EngineTypes.startp = _startpos_me_; + MenhirLib.EngineTypes.endp = _endpos_me_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in - let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in - let _1_inlined3 : (Longident.t) = Obj.magic _1_inlined3 in - let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let ext : (string Asttypes.loc option) = Obj.magic ext in - let _1_inlined1 : unit = Obj.magic _1_inlined1 in - let _1 : unit = Obj.magic _1 in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let me : (Parsetree.module_expr) = Obj.magic me in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined4_ in + let _startpos = _startpos_me_ in + let _endpos = _endpos__3_ in let _v = - let attrs2 = - let _1 = _1_inlined4 in - -# 4110 "parsing/parser.mly" - ( _1 ) -# 32803 "parsing/parser.ml" - - in - let _endpos_attrs2_ = _endpos__1_inlined4_ in - let id = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in + let _1 = + let _1 = +# 1431 "parsing/parser.mly" + ( Pmod_apply_unit me ) +# 33670 "parsing/parser.ml" + in + let (_endpos__1_, _startpos__1_) = (_endpos__3_, _startpos_me_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 32815 "parsing/parser.ml" - - in - let attrs1 = - let _1 = _1_inlined2 in - -# 4114 "parsing/parser.mly" - ( _1 ) -# 32823 "parsing/parser.ml" +# 1015 "parsing/parser.mly" + ( mkmod ~loc:_sloc _1 ) +# 33679 "parsing/parser.ml" in - let override = -# 4017 "parsing/parser.mly" - ( Override ) -# 32829 "parsing/parser.ml" - in - let _endpos = _endpos_attrs2_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in ( -# 1695 "parsing/parser.mly" - ( - let attrs = attrs1 @ attrs2 in - let loc = make_loc _sloc in - let docs = symbol_docs _sloc in - Opn.mk id ~override ~attrs ~loc ~docs, ext - ) -# 32842 "parsing/parser.ml" - : (Parsetree.open_description * string Asttypes.loc option)) +# 1436 "parsing/parser.mly" + ( _1 ) +# 33685 "parsing/parser.ml" + : (Parsetree.module_expr)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32852,24 +33695,38 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = ex; + MenhirLib.EngineTypes.startp = _startpos_ex_; + MenhirLib.EngineTypes.endp = _endpos_ex_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _1 : ( -# 821 "parsing/parser.mly" - (string) -# 32864 "parsing/parser.ml" - ) = Obj.magic _1 in + let ex : (Parsetree.extension) = Obj.magic ex in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Asttypes.label) = -# 3808 "parsing/parser.mly" - ( _1 ) -# 32872 "parsing/parser.ml" - in + let _startpos = _startpos_ex_ in + let _endpos = _endpos_ex_ in + let _v = + let _1 = + let _1 = +# 1434 "parsing/parser.mly" + ( Pmod_extension ex ) +# 33713 "parsing/parser.ml" + in + let (_endpos__1_, _startpos__1_) = (_endpos_ex_, _startpos_ex_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1015 "parsing/parser.mly" + ( mkmod ~loc:_sloc _1 ) +# 33722 "parsing/parser.ml" + + in + ( +# 1436 "parsing/parser.mly" + ( _1 ) +# 33728 "parsing/parser.ml" + : (Parsetree.module_expr)) + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -32881,23 +33738,23 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _1 : ( -# 779 "parsing/parser.mly" + let x : ( +# 836 "parsing/parser.mly" (string) -# 32893 "parsing/parser.ml" - ) = Obj.magic _1 in +# 33750 "parsing/parser.ml" + ) = Obj.magic x in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Asttypes.label) = -# 3809 "parsing/parser.mly" - ( _1 ) -# 32901 "parsing/parser.ml" + let _startpos = _startpos_x_ in + let _endpos = _endpos_x_ in + let _v : (string option) = +# 1390 "parsing/parser.mly" + ( Some x ) +# 33758 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32915,18 +33772,14 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _1 : ( -# 780 "parsing/parser.mly" - (string) -# 32922 "parsing/parser.ml" - ) = Obj.magic _1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in - let _v : (Asttypes.label) = -# 3810 "parsing/parser.mly" - ( _1 ) -# 32930 "parsing/parser.ml" + let _v : (string option) = +# 1393 "parsing/parser.mly" + ( None ) +# 33783 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32939,45 +33792,115 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _1_inlined4; + MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ext; + MenhirLib.EngineTypes.startp = _startpos_ext_; + MenhirLib.EngineTypes.endp = _endpos_ext_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; }; }; }; } = _menhir_stack in - let _4 : unit = Obj.magic _4 in - let _3 : (string) = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : ( -# 778 "parsing/parser.mly" + let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in + let _1_inlined3 : (Longident.t) = Obj.magic _1_inlined3 in + let _5 : unit = Obj.magic _5 in + let _1_inlined2 : ( +# 836 "parsing/parser.mly" (string) -# 32972 "parsing/parser.ml" - ) = Obj.magic _1 in +# 33843 "parsing/parser.ml" + ) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let ext : (string Asttypes.loc option) = Obj.magic ext in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__4_ in - let _v : (Asttypes.label) = -# 3811 "parsing/parser.mly" - ( "."^ _1 ^"(" ^ _3 ^ ")" ) -# 32980 "parsing/parser.ml" - in + let _endpos = _endpos__1_inlined4_ in + let _v = + let attrs2 = + let _1 = _1_inlined4 in + +# 4282 "parsing/parser.mly" + ( _1 ) +# 33857 "parsing/parser.ml" + + in + let _endpos_attrs2_ = _endpos__1_inlined4_ in + let body = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 972 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 33869 "parsing/parser.ml" + + in + let uid = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 972 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 33880 "parsing/parser.ml" + + in + let attrs1 = + let _1 = _1_inlined1 in + +# 4286 "parsing/parser.mly" + ( _1 ) +# 33888 "parsing/parser.ml" + + in + let _endpos = _endpos_attrs2_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + ( +# 1857 "parsing/parser.mly" + ( + let attrs = attrs1 @ attrs2 in + let loc = make_loc _sloc in + let docs = symbol_docs _sloc in + Ms.mk uid body ~attrs ~loc ~docs, ext + ) +# 33902 "parsing/parser.ml" + : (Parsetree.module_substitution * string Asttypes.loc option)) + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -32989,52 +33912,81 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; }; }; }; } = _menhir_stack in + let _6 : unit = Obj.magic _6 in let _5 : unit = Obj.magic _5 in - let _4 : unit = Obj.magic _4 in - let _3 : (string) = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : ( -# 778 "parsing/parser.mly" + let _1_inlined2 : ( +# 836 "parsing/parser.mly" (string) -# 33029 "parsing/parser.ml" - ) = Obj.magic _1 in +# 33956 "parsing/parser.ml" + ) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _2 : (string Asttypes.loc option) = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in - let _v : (Asttypes.label) = -# 3812 "parsing/parser.mly" - ( "."^ _1 ^ "(" ^ _3 ^ ")<-" ) -# 33037 "parsing/parser.ml" - in + let _endpos = _endpos__6_ in + let _v = + let _4 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 972 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 33973 "parsing/parser.ml" + + in + let _3 = + let _1 = _1_inlined1 in + +# 4286 "parsing/parser.mly" + ( _1 ) +# 33981 "parsing/parser.ml" + + in + let _loc__6_ = (_startpos__6_, _endpos__6_) in + ( +# 1864 "parsing/parser.mly" + ( expecting _loc__6_ "module path" ) +# 33988 "parsing/parser.ml" + : (Parsetree.module_substitution * string Asttypes.loc option)) + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -33051,14 +34003,14 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = s; + MenhirLib.EngineTypes.startp = _startpos_s_; + MenhirLib.EngineTypes.endp = _endpos_s_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -33070,21 +34022,30 @@ module Tables = struct }; } = _menhir_stack in let _4 : unit = Obj.magic _4 in - let _3 : (string) = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : ( -# 778 "parsing/parser.mly" - (string) -# 33079 "parsing/parser.ml" - ) = Obj.magic _1 in + let s : (Parsetree.signature) = Obj.magic s in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__4_ in - let _v : (Asttypes.label) = -# 3813 "parsing/parser.mly" - ( "."^ _1 ^"[" ^ _3 ^ "]" ) -# 33087 "parsing/parser.ml" - in + let _v = + let attrs = + let _1 = _1_inlined1 in + +# 4286 "parsing/parser.mly" + ( _1 ) +# 34038 "parsing/parser.ml" + + in + let _endpos = _endpos__4_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + ( +# 1703 "parsing/parser.mly" + ( mkmty ~loc:_sloc ~attrs (Pmty_signature s) ) +# 34047 "parsing/parser.ml" + : (Parsetree.module_type)) + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -33096,52 +34057,53 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; } = _menhir_stack in - let _5 : unit = Obj.magic _5 in let _4 : unit = Obj.magic _4 in - let _3 : (string) = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : ( -# 778 "parsing/parser.mly" - (string) -# 33136 "parsing/parser.ml" - ) = Obj.magic _1 in + let _3 : (Parsetree.signature) = Obj.magic _3 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in - let _v : (Asttypes.label) = -# 3814 "parsing/parser.mly" - ( "."^ _1 ^ "[" ^ _3 ^ "]<-" ) -# 33144 "parsing/parser.ml" - in + let _endpos = _endpos__4_ in + let _v = + let _2 = + let _1 = _1_inlined1 in + +# 4286 "parsing/parser.mly" + ( _1 ) +# 34097 "parsing/parser.ml" + + in + let _loc__4_ = (_startpos__4_, _endpos__4_) in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + ( +# 1705 "parsing/parser.mly" + ( unclosed "sig" _loc__1_ "end" _loc__4_ ) +# 34105 "parsing/parser.ml" + : (Parsetree.module_type)) + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -33153,45 +34115,30 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _4 : unit = Obj.magic _4 in - let _3 : (string) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in - let _1 : ( -# 778 "parsing/parser.mly" - (string) -# 33186 "parsing/parser.ml" - ) = Obj.magic _1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__4_ in - let _v : (Asttypes.label) = -# 3815 "parsing/parser.mly" - ( "."^ _1 ^"{" ^ _3 ^ "}" ) -# 33194 "parsing/parser.ml" - in + let _endpos = _endpos__2_ in + let _v = + let _loc__1_ = (_startpos__1_, _endpos__1_) in + ( +# 1707 "parsing/parser.mly" + ( expecting _loc__1_ "sig" ) +# 34140 "parsing/parser.ml" + : (Parsetree.module_type)) + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -33203,9 +34150,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = mty; + MenhirLib.EngineTypes.startp = _startpos_mty_; + MenhirLib.EngineTypes.endp = _endpos_mty_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _4; @@ -33213,14 +34160,14 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -33232,148 +34179,39 @@ module Tables = struct }; }; } = _menhir_stack in - let _5 : unit = Obj.magic _5 in + let mty : (Parsetree.module_type) = Obj.magic mty in let _4 : unit = Obj.magic _4 in - let _3 : (string) = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : ( -# 778 "parsing/parser.mly" - (string) -# 33243 "parsing/parser.ml" - ) = Obj.magic _1 in + let _1_inlined2 : ((Lexing.position * Parsetree.functor_parameter) list) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in - let _v : (Asttypes.label) = -# 3816 "parsing/parser.mly" - ( "."^ _1 ^ "{" ^ _3 ^ "}<-" ) -# 33251 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : ( -# 832 "parsing/parser.mly" - (string) -# 33272 "parsing/parser.ml" - ) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Asttypes.label) = -# 3817 "parsing/parser.mly" - ( _1 ) -# 33280 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : unit = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Asttypes.label) = -# 3818 "parsing/parser.mly" - ( "!" ) -# 33305 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = op; - MenhirLib.EngineTypes.startp = _startpos_op_; - MenhirLib.EngineTypes.endp = _endpos_op_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let op : ( -# 773 "parsing/parser.mly" - (string) -# 33326 "parsing/parser.ml" - ) = Obj.magic op in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_op_ in - let _endpos = _endpos_op_ in - let _v = - let _1 = -# 3822 "parsing/parser.mly" - ( op ) -# 33335 "parsing/parser.ml" - in - ( -# 3819 "parsing/parser.mly" - ( _1 ) -# 33340 "parsing/parser.ml" - : (Asttypes.label)) - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = op; - MenhirLib.EngineTypes.startp = _startpos_op_; - MenhirLib.EngineTypes.endp = _endpos_op_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let op : ( -# 774 "parsing/parser.mly" - (string) -# 33362 "parsing/parser.ml" - ) = Obj.magic op in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_op_ in - let _endpos = _endpos_op_ in + let _endpos = _endpos_mty_ in let _v = - let _1 = -# 3823 "parsing/parser.mly" - ( op ) -# 33371 "parsing/parser.ml" - in + let args = + let _1 = _1_inlined2 in + +# 1373 "parsing/parser.mly" + ( _1 ) +# 34197 "parsing/parser.ml" + + in + let attrs = + let _1 = _1_inlined1 in + +# 4286 "parsing/parser.mly" + ( _1 ) +# 34205 "parsing/parser.ml" + + in + let _endpos = _endpos_mty_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in ( -# 3819 "parsing/parser.mly" - ( _1 ) -# 33376 "parsing/parser.ml" - : (Asttypes.label)) +# 1711 "parsing/parser.mly" + ( wrap_mty_attrs ~loc:_sloc attrs (mk_functor_typ args mty) ) +# 34214 "parsing/parser.ml" + : (Parsetree.module_type)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33385,31 +34223,41 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = op; - MenhirLib.EngineTypes.startp = _startpos_op_; - MenhirLib.EngineTypes.endp = _endpos_op_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = mty; + MenhirLib.EngineTypes.startp = _startpos_mty_; + MenhirLib.EngineTypes.endp = _endpos_mty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; } = _menhir_stack in - let op : ( -# 775 "parsing/parser.mly" - (string) -# 33398 "parsing/parser.ml" - ) = Obj.magic op in + let mty : (Parsetree.module_type) = Obj.magic mty in + let _2 : unit = Obj.magic _2 in + let _1 : ((Lexing.position * Parsetree.functor_parameter) list) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_op_ in - let _endpos = _endpos_op_ in + let _startpos = _startpos__1_ in + let _endpos = _endpos_mty_ in let _v = - let _1 = -# 3824 "parsing/parser.mly" - ( op ) -# 33407 "parsing/parser.ml" + let args = +# 1373 "parsing/parser.mly" + ( _1 ) +# 34255 "parsing/parser.ml" in ( -# 3819 "parsing/parser.mly" - ( _1 ) -# 33412 "parsing/parser.ml" - : (Asttypes.label)) +# 1715 "parsing/parser.mly" + ( mk_functor_typ args mty ) +# 34260 "parsing/parser.ml" + : (Parsetree.module_type)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33421,31 +34269,61 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = op; - MenhirLib.EngineTypes.startp = _startpos_op_; - MenhirLib.EngineTypes.endp = _endpos_op_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; } = _menhir_stack in - let op : ( -# 776 "parsing/parser.mly" - (string) -# 33434 "parsing/parser.ml" - ) = Obj.magic op in + let _5 : (Parsetree.module_expr) = Obj.magic _5 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_op_ in - let _endpos = _endpos_op_ in + let _startpos = _startpos__1_ in + let _endpos = _endpos__5_ in let _v = - let _1 = -# 3825 "parsing/parser.mly" - ( op ) -# 33443 "parsing/parser.ml" - in + let _4 = + let _1 = _1_inlined1 in + +# 4286 "parsing/parser.mly" + ( _1 ) +# 34317 "parsing/parser.ml" + + in + let _endpos = _endpos__5_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in ( -# 3819 "parsing/parser.mly" - ( _1 ) -# 33448 "parsing/parser.ml" - : (Asttypes.label)) +# 1717 "parsing/parser.mly" + ( mkmty ~loc:_sloc ~attrs:_4 (Pmty_typeof _5) ) +# 34326 "parsing/parser.ml" + : (Parsetree.module_type)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33457,32 +34335,35 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = op; - MenhirLib.EngineTypes.startp = _startpos_op_; - MenhirLib.EngineTypes.endp = _endpos_op_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; } = _menhir_stack in - let op : ( -# 777 "parsing/parser.mly" - (string) -# 33470 "parsing/parser.ml" - ) = Obj.magic op in + let _3 : unit = Obj.magic _3 in + let _2 : (Parsetree.module_type) = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_op_ in - let _endpos = _endpos_op_ in - let _v = - let _1 = -# 3826 "parsing/parser.mly" - ( op ) -# 33479 "parsing/parser.ml" - in - ( -# 3819 "parsing/parser.mly" - ( _1 ) -# 33484 "parsing/parser.ml" - : (Asttypes.label)) - in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Parsetree.module_type) = +# 1719 "parsing/parser.mly" + ( _2 ) +# 34366 "parsing/parser.ml" + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -33493,27 +34374,38 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let _2 : (Parsetree.module_type) = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in + let _endpos = _endpos__3_ in let _v = - let _1 = -# 3827 "parsing/parser.mly" - ("+") -# 33511 "parsing/parser.ml" - in + let _loc__3_ = (_startpos__3_, _endpos__3_) in + let _loc__1_ = (_startpos__1_, _endpos__1_) in ( -# 3819 "parsing/parser.mly" - ( _1 ) -# 33516 "parsing/parser.ml" - : (Asttypes.label)) +# 1721 "parsing/parser.mly" + ( unclosed "(" _loc__1_ ")" _loc__3_ ) +# 34408 "parsing/parser.ml" + : (Parsetree.module_type)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33525,28 +34417,28 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _2 : (Parsetree.attribute) = Obj.magic _2 in + let _1 : (Parsetree.module_type) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v = - let _1 = -# 3828 "parsing/parser.mly" - ("+.") -# 33543 "parsing/parser.ml" - in - ( -# 3819 "parsing/parser.mly" - ( _1 ) -# 33548 "parsing/parser.ml" - : (Asttypes.label)) - in + let _endpos = _endpos__2_ in + let _v : (Parsetree.module_type) = +# 1723 "parsing/parser.mly" + ( Mty.attr _1 _2 ) +# 34441 "parsing/parser.ml" + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -33563,21 +34455,43 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _1 : (Longident.t) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v = - let _1 = -# 3829 "parsing/parser.mly" - ("+=") -# 33575 "parsing/parser.ml" - in + let _1 = + let _1 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 972 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 34473 "parsing/parser.ml" + + in + +# 1726 "parsing/parser.mly" + ( Pmty_ident _1 ) +# 34479 "parsing/parser.ml" + + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1017 "parsing/parser.mly" + ( mkmty ~loc:_sloc _1 ) +# 34488 "parsing/parser.ml" + + in ( -# 3819 "parsing/parser.mly" - ( _1 ) -# 33580 "parsing/parser.ml" - : (Asttypes.label)) +# 1737 "parsing/parser.mly" + ( _1 ) +# 34494 "parsing/parser.ml" + : (Parsetree.module_type)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33589,27 +34503,52 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _3 : (Parsetree.module_type) = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.module_type) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in + let _endpos = _endpos__3_ in let _v = - let _1 = -# 3830 "parsing/parser.mly" - ("-") -# 33607 "parsing/parser.ml" - in + let _1 = + let _1 = +# 1729 "parsing/parser.mly" + ( Pmty_functor(Named (mknoloc None, _1), _3) ) +# 34536 "parsing/parser.ml" + in + let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1017 "parsing/parser.mly" + ( mkmty ~loc:_sloc _1 ) +# 34545 "parsing/parser.ml" + + in ( -# 3819 "parsing/parser.mly" - ( _1 ) -# 33612 "parsing/parser.ml" - : (Asttypes.label)) +# 1737 "parsing/parser.mly" + ( _1 ) +# 34551 "parsing/parser.ml" + : (Parsetree.module_type)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33621,27 +34560,66 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let xs : (Parsetree.with_constraint list) = Obj.magic xs in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.module_type) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in + let _endpos = _endpos_xs_ in let _v = - let _1 = -# 3831 "parsing/parser.mly" - ("-.") -# 33639 "parsing/parser.ml" - in + let _1 = + let _1 = + let _3 = + let xs = +# 264 "" + ( List.rev xs ) +# 34595 "parsing/parser.ml" + in + +# 1127 "parsing/parser.mly" + ( xs ) +# 34600 "parsing/parser.ml" + + in + +# 1731 "parsing/parser.mly" + ( Pmty_with(_1, _3) ) +# 34606 "parsing/parser.ml" + + in + let _endpos__1_ = _endpos_xs_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1017 "parsing/parser.mly" + ( mkmty ~loc:_sloc _1 ) +# 34616 "parsing/parser.ml" + + in ( -# 3819 "parsing/parser.mly" - ( _1 ) -# 33644 "parsing/parser.ml" - : (Asttypes.label)) +# 1737 "parsing/parser.mly" + ( _1 ) +# 34622 "parsing/parser.ml" + : (Parsetree.module_type)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33659,21 +34637,31 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _1 : (Parsetree.extension) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v = - let _1 = -# 3832 "parsing/parser.mly" - ("*") -# 33671 "parsing/parser.ml" - in + let _1 = + let _1 = +# 1735 "parsing/parser.mly" + ( Pmty_extension _1 ) +# 34650 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1017 "parsing/parser.mly" + ( mkmty ~loc:_sloc _1 ) +# 34658 "parsing/parser.ml" + + in ( -# 3819 "parsing/parser.mly" - ( _1 ) -# 33676 "parsing/parser.ml" - : (Asttypes.label)) +# 1737 "parsing/parser.mly" + ( _1 ) +# 34664 "parsing/parser.ml" + : (Parsetree.module_type)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33685,27 +34673,100 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = typ; + MenhirLib.EngineTypes.startp = _startpos_typ_; + MenhirLib.EngineTypes.endp = _endpos_typ_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ext; + MenhirLib.EngineTypes.startp = _startpos_ext_; + MenhirLib.EngineTypes.endp = _endpos_ext_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let typ : (Parsetree.module_type option) = Obj.magic typ in + let _1_inlined2 : (Asttypes.label) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let ext : (string Asttypes.loc option) = Obj.magic ext in + let _2 : unit = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in + let _endpos = _endpos__1_inlined3_ in let _v = - let _1 = -# 3833 "parsing/parser.mly" - ("%") -# 33703 "parsing/parser.ml" - in + let attrs2 = + let _1 = _1_inlined3 in + +# 4282 "parsing/parser.mly" + ( _1 ) +# 34735 "parsing/parser.ml" + + in + let _endpos_attrs2_ = _endpos__1_inlined3_ in + let id = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 972 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 34747 "parsing/parser.ml" + + in + let attrs1 = + let _1 = _1_inlined1 in + +# 4286 "parsing/parser.mly" + ( _1 ) +# 34755 "parsing/parser.ml" + + in + let _endpos = _endpos_attrs2_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in ( -# 3819 "parsing/parser.mly" - ( _1 ) -# 33708 "parsing/parser.ml" - : (Asttypes.label)) +# 1649 "parsing/parser.mly" + ( + let attrs = attrs1 @ attrs2 in + let loc = make_loc _sloc in + let docs = symbol_docs _sloc in + Mtd.mk id ?typ ~attrs ~loc ~docs, ext + ) +# 34769 "parsing/parser.ml" + : (Parsetree.module_type_declaration * string Asttypes.loc option)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33717,27 +34778,107 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = typ; + MenhirLib.EngineTypes.startp = _startpos_typ_; + MenhirLib.EngineTypes.endp = _endpos_typ_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ext; + MenhirLib.EngineTypes.startp = _startpos_ext_; + MenhirLib.EngineTypes.endp = _endpos_ext_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; } = _menhir_stack in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let typ : (Parsetree.module_type) = Obj.magic typ in + let _6 : unit = Obj.magic _6 in + let _1_inlined2 : (Asttypes.label) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let ext : (string Asttypes.loc option) = Obj.magic ext in + let _2 : unit = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in + let _endpos = _endpos__1_inlined3_ in let _v = - let _1 = -# 3834 "parsing/parser.mly" - ("=") -# 33735 "parsing/parser.ml" - in + let attrs2 = + let _1 = _1_inlined3 in + +# 4282 "parsing/parser.mly" + ( _1 ) +# 34847 "parsing/parser.ml" + + in + let _endpos_attrs2_ = _endpos__1_inlined3_ in + let id = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 972 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 34859 "parsing/parser.ml" + + in + let attrs1 = + let _1 = _1_inlined1 in + +# 4286 "parsing/parser.mly" + ( _1 ) +# 34867 "parsing/parser.ml" + + in + let _endpos = _endpos_attrs2_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in ( -# 3819 "parsing/parser.mly" - ( _1 ) -# 33740 "parsing/parser.ml" - : (Asttypes.label)) +# 1913 "parsing/parser.mly" + ( + let attrs = attrs1 @ attrs2 in + let loc = make_loc _sloc in + let docs = symbol_docs _sloc in + Mtd.mk id ~typ ~attrs ~loc ~docs, ext + ) +# 34881 "parsing/parser.ml" + : (Parsetree.module_type_declaration * string Asttypes.loc option)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33755,22 +34896,15 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _1 : (Longident.t) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in - let _v = - let _1 = -# 3835 "parsing/parser.mly" - ("<") -# 33767 "parsing/parser.ml" - in - ( -# 3819 "parsing/parser.mly" - ( _1 ) -# 33772 "parsing/parser.ml" - : (Asttypes.label)) - in + let _v : (Longident.t) = +# 4063 "parsing/parser.mly" + ( _1 ) +# 34907 "parsing/parser.ml" + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -33780,29 +34914,15 @@ module Tables = struct }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v = - let _1 = -# 3836 "parsing/parser.mly" - (">") -# 33799 "parsing/parser.ml" - in - ( -# 3819 "parsing/parser.mly" - ( _1 ) -# 33804 "parsing/parser.ml" - : (Asttypes.label)) - in + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (Asttypes.mutable_flag) = +# 4144 "parsing/parser.mly" + ( Immutable ) +# 34925 "parsing/parser.ml" + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -33823,18 +34943,11 @@ module Tables = struct let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in - let _v = - let _1 = -# 3837 "parsing/parser.mly" - ("or") -# 33831 "parsing/parser.ml" - in - ( -# 3819 "parsing/parser.mly" - ( _1 ) -# 33836 "parsing/parser.ml" - : (Asttypes.label)) - in + let _v : (Asttypes.mutable_flag) = +# 4145 "parsing/parser.mly" + ( Mutable ) +# 34950 "parsing/parser.ml" + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -33844,29 +34957,15 @@ module Tables = struct }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v = - let _1 = -# 3838 "parsing/parser.mly" - ("||") -# 33863 "parsing/parser.ml" - in - ( -# 3819 "parsing/parser.mly" - ( _1 ) -# 33868 "parsing/parser.ml" - : (Asttypes.label)) - in + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (Asttypes.mutable_flag * Asttypes.virtual_flag) = +# 4153 "parsing/parser.mly" + ( Immutable, Concrete ) +# 34968 "parsing/parser.ml" + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -33887,18 +34986,11 @@ module Tables = struct let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in - let _v = - let _1 = -# 3839 "parsing/parser.mly" - ("&") -# 33895 "parsing/parser.ml" - in - ( -# 3819 "parsing/parser.mly" - ( _1 ) -# 33900 "parsing/parser.ml" - : (Asttypes.label)) - in + let _v : (Asttypes.mutable_flag * Asttypes.virtual_flag) = +# 4155 "parsing/parser.mly" + ( Mutable, Concrete ) +# 34993 "parsing/parser.ml" + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -33919,18 +35011,11 @@ module Tables = struct let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in - let _v = - let _1 = -# 3840 "parsing/parser.mly" - ("&&") -# 33927 "parsing/parser.ml" - in - ( -# 3819 "parsing/parser.mly" - ( _1 ) -# 33932 "parsing/parser.ml" - : (Asttypes.label)) - in + let _v : (Asttypes.mutable_flag * Asttypes.virtual_flag) = +# 4157 "parsing/parser.mly" + ( Immutable, Virtual ) +# 35018 "parsing/parser.ml" + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -33941,28 +35026,28 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; } = _menhir_stack in + let _2 : unit = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v = - let _1 = -# 3841 "parsing/parser.mly" - (":=") -# 33959 "parsing/parser.ml" - in - ( -# 3819 "parsing/parser.mly" - ( _1 ) -# 33964 "parsing/parser.ml" - : (Asttypes.label)) - in + let _endpos = _endpos__2_ in + let _v : (Asttypes.mutable_flag * Asttypes.virtual_flag) = +# 4160 "parsing/parser.mly" + ( Mutable, Virtual ) +# 35050 "parsing/parser.ml" + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -33973,56 +35058,27 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; } = _menhir_stack in + let _2 : unit = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (bool) = -# 3716 "parsing/parser.mly" - ( true ) -# 33990 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (bool) = -# 3717 "parsing/parser.mly" - ( false ) -# 34008 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (unit option) = -# 111 "" - ( None ) -# 34026 "parsing/parser.ml" + let _endpos = _endpos__2_ in + let _v : (Asttypes.mutable_flag * Asttypes.virtual_flag) = +# 4160 "parsing/parser.mly" + ( Mutable, Virtual ) +# 35082 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34034,38 +35090,27 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; } = _menhir_stack in - let x : unit = Obj.magic x in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_x_ in - let _endpos = _endpos_x_ in - let _v : (unit option) = -# 114 "" - ( Some x ) -# 34051 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in + let _2 : (Asttypes.label) = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (unit option) = -# 111 "" - ( None ) -# 34069 "parsing/parser.ml" + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (Asttypes.label) = +# 4115 "parsing/parser.mly" + ( _2 ) +# 35114 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34078,38 +35123,36 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let x : unit = Obj.magic x in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_x_ in - let _endpos = _endpos_x_ in - let _v : (unit option) = -# 114 "" - ( Some x ) -# 34094 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in + let _1 : ( +# 785 "parsing/parser.mly" + (string) +# 35135 "parsing/parser.ml" + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (string Asttypes.loc option) = -# 111 "" - ( None ) -# 34112 "parsing/parser.ml" - in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v = + let x = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 972 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 35148 "parsing/parser.ml" + + in + ( +# 228 "" + ( [ x ] ) +# 35154 "parsing/parser.ml" + : (string Asttypes.loc list)) + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -34121,9 +35164,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -34132,39 +35175,31 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _1_inlined1 : ( -# 797 "parsing/parser.mly" + let xs : (string Asttypes.loc list) = Obj.magic xs in + let _1 : ( +# 785 "parsing/parser.mly" (string) -# 34139 "parsing/parser.ml" - ) = Obj.magic _1_inlined1 in - let _1 : unit = Obj.magic _1 in +# 35183 "parsing/parser.ml" + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined1_ in + let _endpos = _endpos_xs_ in let _v = let x = - let x = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 984 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 34155 "parsing/parser.ml" - - in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 188 "" - ( x ) -# 34161 "parsing/parser.ml" +# 972 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 35196 "parsing/parser.ml" in ( -# 114 "" - ( Some x ) -# 34167 "parsing/parser.ml" - : (string Asttypes.loc option)) +# 231 "" + ( x :: xs ) +# 35202 "parsing/parser.ml" + : (string Asttypes.loc list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34175,15 +35210,33 @@ module Tables = struct }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = s; + MenhirLib.EngineTypes.startp = _startpos_s_; + MenhirLib.EngineTypes.endp = _endpos_s_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let s : ( +# 823 "parsing/parser.mly" + (string * Location.t * string option) +# 35224 "parsing/parser.ml" + ) = Obj.magic s in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (Parsetree.core_type option) = -# 111 "" - ( None ) -# 34186 "parsing/parser.ml" - in + let _startpos = _startpos_s_ in + let _endpos = _endpos_s_ in + let _v = + let x = +# 4111 "parsing/parser.mly" + ( let body, _, _ = s in body ) +# 35233 "parsing/parser.ml" + in + ( +# 228 "" + ( [ x ] ) +# 35238 "parsing/parser.ml" + : (string list)) + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -34195,33 +35248,37 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = s; + MenhirLib.EngineTypes.startp = _startpos_s_; + MenhirLib.EngineTypes.endp = _endpos_s_; MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let x : (Parsetree.core_type) = Obj.magic x in - let _1 : unit = Obj.magic _1 in + let xs : (string list) = Obj.magic xs in + let s : ( +# 823 "parsing/parser.mly" + (string * Location.t * string option) +# 35267 "parsing/parser.ml" + ) = Obj.magic s in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos_x_ in + let _startpos = _startpos_s_ in + let _endpos = _endpos_xs_ in let _v = let x = -# 188 "" - ( x ) -# 34219 "parsing/parser.ml" +# 4111 "parsing/parser.mly" + ( let body, _, _ = s in body ) +# 35276 "parsing/parser.ml" in ( -# 114 "" - ( Some x ) -# 34224 "parsing/parser.ml" - : (Parsetree.core_type option)) +# 231 "" + ( x :: xs ) +# 35281 "parsing/parser.ml" + : (string list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34232,15 +35289,29 @@ module Tables = struct }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let ty : (Parsetree.core_type) = Obj.magic ty in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (Parsetree.core_type option) = -# 111 "" - ( None ) -# 34243 "parsing/parser.ml" - in + let _startpos = _startpos_ty_ in + let _endpos = _endpos_ty_ in + let _v = + let priv = +# 4140 "parsing/parser.mly" + ( Public ) +# 35308 "parsing/parser.ml" + in + ( +# 3309 "parsing/parser.mly" + ( (Ptype_abstract, priv, Some ty) ) +# 35313 "parsing/parser.ml" + : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option)) + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -34252,9 +35323,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -34263,22 +35334,22 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let x : (Parsetree.core_type) = Obj.magic x in + let ty : (Parsetree.core_type) = Obj.magic ty in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_x_ in + let _endpos = _endpos_ty_ in let _v = - let x = -# 188 "" - ( x ) -# 34276 "parsing/parser.ml" + let priv = +# 4141 "parsing/parser.mly" + ( Private ) +# 35347 "parsing/parser.ml" in ( -# 114 "" - ( Some x ) -# 34281 "parsing/parser.ml" - : (Parsetree.core_type option)) +# 3309 "parsing/parser.mly" + ( (Ptype_abstract, priv, Some ty) ) +# 35352 "parsing/parser.ml" + : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34289,15 +35360,41 @@ module Tables = struct }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = cs; + MenhirLib.EngineTypes.startp = _startpos_cs_; + MenhirLib.EngineTypes.endp = _endpos_cs_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let cs : (Parsetree.constructor_declaration list) = Obj.magic cs in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (Parsetree.expression option) = -# 111 "" + let _startpos = _startpos_cs_ in + let _endpos = _endpos_cs_ in + let _v = + let priv = +# 4140 "parsing/parser.mly" + ( Public ) +# 35379 "parsing/parser.ml" + in + let oty = + let _1 = +# 123 "" ( None ) -# 34300 "parsing/parser.ml" - in +# 35385 "parsing/parser.ml" + in + +# 3325 "parsing/parser.mly" + ( _1 ) +# 35390 "parsing/parser.ml" + + in + ( +# 3313 "parsing/parser.mly" + ( (Ptype_variant cs, priv, oty) ) +# 35396 "parsing/parser.ml" + : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option)) + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -34309,9 +35406,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = cs; + MenhirLib.EngineTypes.startp = _startpos_cs_; + MenhirLib.EngineTypes.endp = _endpos_cs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -34320,37 +35417,34 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in + let cs : (Parsetree.constructor_declaration list) = Obj.magic cs in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined1_ in + let _endpos = _endpos_cs_ in let _v = - let x = - let x = - let _1 = _1_inlined1 in - let _1 = -# 2309 "parsing/parser.mly" - ( _1 ) -# 34336 "parsing/parser.ml" - in - -# 2453 "parsing/parser.mly" - ( _1 ) -# 34341 "parsing/parser.ml" - - in + let priv = +# 4141 "parsing/parser.mly" + ( Private ) +# 35430 "parsing/parser.ml" + in + let oty = + let _1 = +# 123 "" + ( None ) +# 35436 "parsing/parser.ml" + in -# 188 "" - ( x ) -# 34347 "parsing/parser.ml" +# 3325 "parsing/parser.mly" + ( _1 ) +# 35441 "parsing/parser.ml" in ( -# 114 "" - ( Some x ) -# 34353 "parsing/parser.ml" - : (Parsetree.expression option)) +# 3313 "parsing/parser.mly" + ( (Ptype_variant cs, priv, oty) ) +# 35447 "parsing/parser.ml" + : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34363,121 +35457,59 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = cs; + MenhirLib.EngineTypes.startp = _startpos_cs_; + MenhirLib.EngineTypes.endp = _endpos_cs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in - let xs : (Parsetree.case list) = Obj.magic xs in - let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in - let _1_inlined1 : unit = Obj.magic _1_inlined1 in - let _1 : unit = Obj.magic _1 in + let cs : (Parsetree.constructor_declaration list) = Obj.magic cs in + let _2 : unit = Obj.magic _2 in + let x : (Parsetree.core_type) = Obj.magic x in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos_xs_ in + let _startpos = _startpos_x_ in + let _endpos = _endpos_cs_ in let _v = - let x = - let x = - let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in - let _1 = - let _3 = - let xs = - let xs = -# 264 "" - ( List.rev xs ) -# 34414 "parsing/parser.ml" - in - -# 1200 "parsing/parser.mly" - ( xs ) -# 34419 "parsing/parser.ml" - - in - -# 2798 "parsing/parser.mly" - ( xs ) -# 34425 "parsing/parser.ml" - - in - let _endpos__3_ = _endpos_xs_ in - let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4114 "parsing/parser.mly" - ( _1 ) -# 34436 "parsing/parser.ml" - - in - -# 4127 "parsing/parser.mly" - ( _1, _2 ) -# 34442 "parsing/parser.ml" - - in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2311 "parsing/parser.mly" - ( let loc = make_loc _sloc in - let cases = _3 in - (* There are two choices of where to put attributes: on the - Pexp_function node; on the Pfunction_cases body. We put them on the - Pexp_function node here because the compiler only uses - Pfunction_cases attributes for enabling/disabling warnings in - typechecking. For standalone function cases, we want the compiler to - respect, e.g., [@inline] attributes. - *) - let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in - mkexp_attrs ~loc:_sloc desc _2 - ) -# 34462 "parsing/parser.ml" - - in + let priv = +# 4140 "parsing/parser.mly" + ( Public ) +# 35488 "parsing/parser.ml" + in + let oty = + let _1 = + let x = +# 196 "" + ( x ) +# 35495 "parsing/parser.ml" + in -# 2453 "parsing/parser.mly" - ( _1 ) -# 34468 "parsing/parser.ml" +# 126 "" + ( Some x ) +# 35500 "parsing/parser.ml" in -# 188 "" - ( x ) -# 34474 "parsing/parser.ml" +# 3325 "parsing/parser.mly" + ( _1 ) +# 35506 "parsing/parser.ml" in ( -# 114 "" - ( Some x ) -# 34480 "parsing/parser.ml" - : (Parsetree.expression option)) +# 3313 "parsing/parser.mly" + ( (Ptype_variant cs, priv, oty) ) +# 35512 "parsing/parser.ml" + : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34486,55 +35518,70 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos; MenhirLib.EngineTypes.next = _menhir_stack; }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (Parsetree.module_type option) = -# 111 "" - ( None ) -# 34499 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.semv = cs; + MenhirLib.EngineTypes.startp = _startpos_cs_; + MenhirLib.EngineTypes.endp = _endpos_cs_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1; MenhirLib.EngineTypes.startp = _startpos__1_; MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; }; } = _menhir_stack in - let x : (Parsetree.module_type) = Obj.magic x in + let cs : (Parsetree.constructor_declaration list) = Obj.magic cs in let _1 : unit = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let x : (Parsetree.core_type) = Obj.magic x in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos_x_ in + let _startpos = _startpos_x_ in + let _endpos = _endpos_cs_ in let _v = - let x = -# 188 "" - ( x ) -# 34532 "parsing/parser.ml" + let priv = +# 4141 "parsing/parser.mly" + ( Private ) +# 35560 "parsing/parser.ml" in - ( -# 114 "" + let oty = + let _1 = + let x = +# 196 "" + ( x ) +# 35567 "parsing/parser.ml" + in + +# 126 "" ( Some x ) -# 34537 "parsing/parser.ml" - : (Parsetree.module_type option)) +# 35572 "parsing/parser.ml" + + in + +# 3325 "parsing/parser.mly" + ( _1 ) +# 35578 "parsing/parser.ml" + + in + ( +# 3313 "parsing/parser.mly" + ( (Ptype_variant cs, priv, oty) ) +# 35584 "parsing/parser.ml" + : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34545,15 +35592,41 @@ module Tables = struct }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (Parsetree.pattern option) = -# 111 "" + let _startpos = _startpos__3_ in + let _endpos = _endpos__3_ in + let _v = + let priv = +# 4140 "parsing/parser.mly" + ( Public ) +# 35611 "parsing/parser.ml" + in + let oty = + let _1 = +# 123 "" ( None ) -# 34556 "parsing/parser.ml" - in +# 35617 "parsing/parser.ml" + in + +# 3325 "parsing/parser.mly" + ( _1 ) +# 35622 "parsing/parser.ml" + + in + ( +# 3317 "parsing/parser.mly" + ( (Ptype_open, priv, oty) ) +# 35628 "parsing/parser.ml" + : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option)) + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -34565,9 +35638,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -34576,22 +35649,34 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let x : (Parsetree.pattern) = Obj.magic x in + let _3 : unit = Obj.magic _3 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_x_ in + let _endpos = _endpos__3_ in let _v = - let x = -# 188 "" - ( x ) -# 34589 "parsing/parser.ml" + let priv = +# 4141 "parsing/parser.mly" + ( Private ) +# 35662 "parsing/parser.ml" in + let oty = + let _1 = +# 123 "" + ( None ) +# 35668 "parsing/parser.ml" + in + +# 3325 "parsing/parser.mly" + ( _1 ) +# 35673 "parsing/parser.ml" + + in ( -# 114 "" - ( Some x ) -# 34594 "parsing/parser.ml" - : (Parsetree.pattern option)) +# 3317 "parsing/parser.mly" + ( (Ptype_open, priv, oty) ) +# 35679 "parsing/parser.ml" + : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34600,55 +35685,63 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos; MenhirLib.EngineTypes.next = _menhir_stack; }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (Parsetree.expression option) = -# 111 "" - ( None ) -# 34613 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; } = _menhir_stack in - let x : (Parsetree.expression) = Obj.magic x in - let _1 : unit = Obj.magic _1 in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let x : (Parsetree.core_type) = Obj.magic x in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos_x_ in + let _startpos = _startpos_x_ in + let _endpos = _endpos__3_ in let _v = - let x = -# 188 "" - ( x ) -# 34646 "parsing/parser.ml" + let priv = +# 4140 "parsing/parser.mly" + ( Public ) +# 35720 "parsing/parser.ml" in - ( -# 114 "" + let oty = + let _1 = + let x = +# 196 "" + ( x ) +# 35727 "parsing/parser.ml" + in + +# 126 "" ( Some x ) -# 34651 "parsing/parser.ml" - : (Parsetree.expression option)) +# 35732 "parsing/parser.ml" + + in + +# 3325 "parsing/parser.mly" + ( _1 ) +# 35738 "parsing/parser.ml" + + in + ( +# 3317 "parsing/parser.mly" + ( (Ptype_open, priv, oty) ) +# 35744 "parsing/parser.ml" + : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34657,42 +35750,71 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos; MenhirLib.EngineTypes.next = _menhir_stack; }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (Parsetree.type_constraint option) = -# 111 "" - ( None ) -# 34670 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; } = _menhir_stack in - let x : (Parsetree.type_constraint) = Obj.magic x in + let _3 : unit = Obj.magic _3 in + let _1 : unit = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let x : (Parsetree.core_type) = Obj.magic x in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_x_ in - let _endpos = _endpos_x_ in - let _v : (Parsetree.type_constraint option) = -# 114 "" + let _endpos = _endpos__3_ in + let _v = + let priv = +# 4141 "parsing/parser.mly" + ( Private ) +# 35792 "parsing/parser.ml" + in + let oty = + let _1 = + let x = +# 196 "" + ( x ) +# 35799 "parsing/parser.ml" + in + +# 126 "" ( Some x ) -# 34695 "parsing/parser.ml" - in +# 35804 "parsing/parser.ml" + + in + +# 3325 "parsing/parser.mly" + ( _1 ) +# 35810 "parsing/parser.ml" + + in + ( +# 3317 "parsing/parser.mly" + ( (Ptype_open, priv, oty) ) +# 35816 "parsing/parser.ml" + : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option)) + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -34703,25 +35825,54 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ls; + MenhirLib.EngineTypes.startp = _startpos_ls_; + MenhirLib.EngineTypes.endp = _endpos_ls_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; } = _menhir_stack in - let _1 : ( -# 814 "parsing/parser.mly" - (string) -# 34716 "parsing/parser.ml" - ) = Obj.magic _1 in + let _5 : unit = Obj.magic _5 in + let ls : (Parsetree.label_declaration list) = Obj.magic ls in + let _3 : unit = Obj.magic _3 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (string) = -# 4028 "parsing/parser.mly" - ( _1 ) -# 34724 "parsing/parser.ml" - in + let _startpos = _startpos__3_ in + let _endpos = _endpos__5_ in + let _v = + let priv = +# 4140 "parsing/parser.mly" + ( Public ) +# 35857 "parsing/parser.ml" + in + let oty = + let _1 = +# 123 "" + ( None ) +# 35863 "parsing/parser.ml" + in + +# 3325 "parsing/parser.mly" + ( _1 ) +# 35868 "parsing/parser.ml" + + in + ( +# 3321 "parsing/parser.mly" + ( (Ptype_record ls, priv, oty) ) +# 35874 "parsing/parser.ml" + : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option)) + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -34733,38 +35884,60 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = ls; + MenhirLib.EngineTypes.startp = _startpos_ls_; + MenhirLib.EngineTypes.endp = _endpos_ls_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; }; } = _menhir_stack in + let _5 : unit = Obj.magic _5 in + let ls : (Parsetree.label_declaration list) = Obj.magic ls in let _3 : unit = Obj.magic _3 in - let _2 : ( -# 797 "parsing/parser.mly" - (string) -# 34758 "parsing/parser.ml" - ) = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (string) = -# 4029 "parsing/parser.mly" - ( _2 ) -# 34767 "parsing/parser.ml" - in + let _endpos = _endpos__5_ in + let _v = + let priv = +# 4141 "parsing/parser.mly" + ( Private ) +# 35922 "parsing/parser.ml" + in + let oty = + let _1 = +# 123 "" + ( None ) +# 35928 "parsing/parser.ml" + in + +# 3325 "parsing/parser.mly" + ( _1 ) +# 35933 "parsing/parser.ml" + + in + ( +# 3321 "parsing/parser.mly" + ( (Ptype_record ls, priv, oty) ) +# 35939 "parsing/parser.ml" + : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option)) + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -34781,9 +35954,9 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = mty; - MenhirLib.EngineTypes.startp = _startpos_mty_; - MenhirLib.EngineTypes.endp = _endpos_mty_; + MenhirLib.EngineTypes.semv = ls; + MenhirLib.EngineTypes.startp = _startpos_ls_; + MenhirLib.EngineTypes.endp = _endpos_ls_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _3; @@ -34791,14 +35964,14 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = me; - MenhirLib.EngineTypes.startp = _startpos_me_; - MenhirLib.EngineTypes.endp = _endpos_me_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; MenhirLib.EngineTypes.next = _menhir_stack; }; }; @@ -34806,22 +35979,43 @@ module Tables = struct }; } = _menhir_stack in let _5 : unit = Obj.magic _5 in - let mty : (Parsetree.module_type) = Obj.magic mty in + let ls : (Parsetree.label_declaration list) = Obj.magic ls in let _3 : unit = Obj.magic _3 in - let me : (Parsetree.module_expr) = Obj.magic me in - let _1 : unit = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let x : (Parsetree.core_type) = Obj.magic x in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in + let _startpos = _startpos_x_ in let _endpos = _endpos__5_ in let _v = - let _endpos = _endpos__5_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let priv = +# 4140 "parsing/parser.mly" + ( Public ) +# 35994 "parsing/parser.ml" + in + let oty = + let _1 = + let x = +# 196 "" + ( x ) +# 36001 "parsing/parser.ml" + in + +# 126 "" + ( Some x ) +# 36006 "parsing/parser.ml" + + in + +# 3325 "parsing/parser.mly" + ( _1 ) +# 36012 "parsing/parser.ml" + + in ( -# 1457 "parsing/parser.mly" - ( mkmod ~loc:_sloc (Pmod_constraint(me, mty)) ) -# 34824 "parsing/parser.ml" - : (Parsetree.module_expr)) +# 3321 "parsing/parser.mly" + ( (Ptype_record ls, priv, oty) ) +# 36018 "parsing/parser.ml" + : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34839,9 +36033,9 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = ls; + MenhirLib.EngineTypes.startp = _startpos_ls_; + MenhirLib.EngineTypes.endp = _endpos_ls_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _3; @@ -34849,36 +36043,65 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; }; }; }; } = _menhir_stack in let _5 : unit = Obj.magic _5 in - let _4 : (Parsetree.module_type) = Obj.magic _4 in + let ls : (Parsetree.label_declaration list) = Obj.magic ls in let _3 : unit = Obj.magic _3 in - let _2 : (Parsetree.module_expr) = Obj.magic _2 in let _1 : unit = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let x : (Parsetree.core_type) = Obj.magic x in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in + let _startpos = _startpos_x_ in let _endpos = _endpos__5_ in let _v = - let _loc__5_ = (_startpos__5_, _endpos__5_) in - let _loc__1_ = (_startpos__1_, _endpos__1_) in + let priv = +# 4141 "parsing/parser.mly" + ( Private ) +# 36080 "parsing/parser.ml" + in + let oty = + let _1 = + let x = +# 196 "" + ( x ) +# 36087 "parsing/parser.ml" + in + +# 126 "" + ( Some x ) +# 36092 "parsing/parser.ml" + + in + +# 3325 "parsing/parser.mly" + ( _1 ) +# 36098 "parsing/parser.ml" + + in ( -# 1459 "parsing/parser.mly" - ( unclosed "(" _loc__1_ ")" _loc__5_ ) -# 34881 "parsing/parser.ml" - : (Parsetree.module_expr)) +# 3321 "parsing/parser.mly" + ( (Ptype_record ls, priv, oty) ) +# 36104 "parsing/parser.ml" + : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34896,9 +36119,9 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = me; - MenhirLib.EngineTypes.startp = _startpos_me_; - MenhirLib.EngineTypes.endp = _endpos_me_; + MenhirLib.EngineTypes.semv = meth_list; + MenhirLib.EngineTypes.startp = _startpos_meth_list_; + MenhirLib.EngineTypes.endp = _endpos_meth_list_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -34909,16 +36132,34 @@ module Tables = struct }; } = _menhir_stack in let _3 : unit = Obj.magic _3 in - let me : (Parsetree.module_expr) = Obj.magic me in + let meth_list : (Parsetree.object_field list * Asttypes.closed_flag) = Obj.magic meth_list in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in - let _v : (Parsetree.module_expr) = -# 1462 "parsing/parser.mly" - ( me (* TODO consider reloc *) ) -# 34921 "parsing/parser.ml" - in + let _v = + let _1 = + let _1 = +# 3795 "parsing/parser.mly" + ( let (f, c) = meth_list in Ptyp_object (f, c) ) +# 36146 "parsing/parser.ml" + in + let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1009 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +# 36155 "parsing/parser.ml" + + in + ( +# 3799 "parsing/parser.mly" + ( _1 ) +# 36161 "parsing/parser.ml" + : (Parsetree.core_type)) + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -34930,37 +36171,44 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _3 : unit = Obj.magic _3 in - let _2 : (Parsetree.module_expr) = Obj.magic _2 in + let _2 : unit = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in + let _endpos = _endpos__2_ in let _v = - let _loc__3_ = (_startpos__3_, _endpos__3_) in - let _loc__1_ = (_startpos__1_, _endpos__1_) in + let _1 = + let _1 = +# 3797 "parsing/parser.mly" + ( Ptyp_object ([], Closed) ) +# 36196 "parsing/parser.ml" + in + let _endpos__1_ = _endpos__2_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1009 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +# 36205 "parsing/parser.ml" + + in ( -# 1464 "parsing/parser.mly" - ( unclosed "(" _loc__1_ ")" _loc__3_ ) -# 34963 "parsing/parser.ml" - : (Parsetree.module_expr)) +# 3799 "parsing/parser.mly" + ( _1 ) +# 36211 "parsing/parser.ml" + : (Parsetree.core_type)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34973,14 +36221,14 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = me; + MenhirLib.EngineTypes.startp = _startpos_me_; + MenhirLib.EngineTypes.endp = _endpos_me_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1_inlined1; @@ -34988,9 +36236,9 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = ext; + MenhirLib.EngineTypes.startp = _startpos_ext_; + MenhirLib.EngineTypes.endp = _endpos_ext_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -35002,51 +36250,50 @@ module Tables = struct }; }; } = _menhir_stack in - let _5 : unit = Obj.magic _5 in - let _1_inlined2 : (Parsetree.expression) = Obj.magic _1_inlined2 in + let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in + let me : (Parsetree.module_expr) = Obj.magic me in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let _2 : unit = Obj.magic _2 in + let ext : (string Asttypes.loc option) = Obj.magic ext in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in + let _endpos = _endpos__1_inlined2_ in let _v = - let e = + let attrs2 = let _1 = _1_inlined2 in - let e = - let _1 = -# 2309 "parsing/parser.mly" - ( _1 ) -# 35021 "parsing/parser.ml" - in - -# 2453 "parsing/parser.mly" - ( _1 ) -# 35026 "parsing/parser.ml" - - in -# 1481 "parsing/parser.mly" - ( e ) -# 35032 "parsing/parser.ml" +# 4282 "parsing/parser.mly" + ( _1 ) +# 36268 "parsing/parser.ml" in - let attrs = + let _endpos_attrs2_ = _endpos__1_inlined2_ in + let attrs1 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 35040 "parsing/parser.ml" +# 36277 "parsing/parser.ml" in - let _endpos = _endpos__5_ in + let override = +# 4187 "parsing/parser.mly" + ( Fresh ) +# 36283 "parsing/parser.ml" + in + let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 1468 "parsing/parser.mly" - ( mkmod ~loc:_sloc ~attrs (Pmod_unpack e) ) -# 35049 "parsing/parser.ml" - : (Parsetree.module_expr)) +# 1668 "parsing/parser.mly" + ( + let attrs = attrs1 @ attrs2 in + let loc = make_loc _sloc in + let docs = symbol_docs _sloc in + Opn.mk me ~override ~attrs ~loc ~docs, ext + ) +# 36296 "parsing/parser.ml" + : (Parsetree.open_declaration * string Asttypes.loc option)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -35059,153 +36306,86 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = me; + MenhirLib.EngineTypes.startp = _startpos_me_; + MenhirLib.EngineTypes.endp = _endpos_me_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined4; - MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = ext; + MenhirLib.EngineTypes.startp = _startpos_ext_; + MenhirLib.EngineTypes.endp = _endpos_ext_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; }; }; } = _menhir_stack in - let _5 : unit = Obj.magic _5 in - let xs : (Parsetree.case list) = Obj.magic xs in - let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in - let _1_inlined3 : (string Asttypes.loc option) = Obj.magic _1_inlined3 in - let _1_inlined2 : unit = Obj.magic _1_inlined2 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let _2 : unit = Obj.magic _2 in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let me : (Parsetree.module_expr) = Obj.magic me in + let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in + let ext : (string Asttypes.loc option) = Obj.magic ext in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in + let _endpos = _endpos__1_inlined3_ in let _v = - let e = - let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined2_, _1_inlined4, _1_inlined3) in - let e = - let _1 = - let _3 = - let xs = - let xs = -# 264 "" - ( List.rev xs ) -# 35131 "parsing/parser.ml" - in - -# 1200 "parsing/parser.mly" - ( xs ) -# 35136 "parsing/parser.ml" - - in - -# 2798 "parsing/parser.mly" - ( xs ) -# 35142 "parsing/parser.ml" - - in - let _endpos__3_ = _endpos_xs_ in - let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4114 "parsing/parser.mly" - ( _1 ) -# 35153 "parsing/parser.ml" - - in - -# 4127 "parsing/parser.mly" - ( _1, _2 ) -# 35159 "parsing/parser.ml" - - in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2311 "parsing/parser.mly" - ( let loc = make_loc _sloc in - let cases = _3 in - (* There are two choices of where to put attributes: on the - Pexp_function node; on the Pfunction_cases body. We put them on the - Pexp_function node here because the compiler only uses - Pfunction_cases attributes for enabling/disabling warnings in - typechecking. For standalone function cases, we want the compiler to - respect, e.g., [@inline] attributes. - *) - let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in - mkexp_attrs ~loc:_sloc desc _2 - ) -# 35179 "parsing/parser.ml" - - in - -# 2453 "parsing/parser.mly" - ( _1 ) -# 35185 "parsing/parser.ml" - - in + let attrs2 = + let _1 = _1_inlined3 in -# 1481 "parsing/parser.mly" - ( e ) -# 35191 "parsing/parser.ml" +# 4282 "parsing/parser.mly" + ( _1 ) +# 36360 "parsing/parser.ml" in - let attrs = - let _1 = _1_inlined1 in + let _endpos_attrs2_ = _endpos__1_inlined3_ in + let attrs1 = + let _1 = _1_inlined2 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 35199 "parsing/parser.ml" +# 36369 "parsing/parser.ml" in - let _endpos = _endpos__5_ in + let override = +# 4188 "parsing/parser.mly" + ( Override ) +# 36375 "parsing/parser.ml" + in + let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 1468 "parsing/parser.mly" - ( mkmod ~loc:_sloc ~attrs (Pmod_unpack e) ) -# 35208 "parsing/parser.ml" - : (Parsetree.module_expr)) +# 1668 "parsing/parser.mly" + ( + let attrs = attrs1 @ attrs2 in + let loc = make_loc _sloc in + let docs = symbol_docs _sloc in + Opn.mk me ~override ~attrs ~loc ~docs, ext + ) +# 36388 "parsing/parser.ml" + : (Parsetree.open_declaration * string Asttypes.loc option)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -35218,112 +36398,90 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2_inlined1; - MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = ext; + MenhirLib.EngineTypes.startp = _startpos_ext_; + MenhirLib.EngineTypes.endp = _endpos_ext_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; }; } = _menhir_stack in - let _5 : unit = Obj.magic _5 in - let _1_inlined3 : (Parsetree.module_type) = Obj.magic _1_inlined3 in - let _2_inlined1 : unit = Obj.magic _2_inlined1 in - let _1_inlined2 : (Parsetree.expression) = Obj.magic _1_inlined2 in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let _1_inlined2 : (Longident.t) = Obj.magic _1_inlined2 in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let _2 : unit = Obj.magic _2 in + let ext : (string Asttypes.loc option) = Obj.magic ext in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in + let _endpos = _endpos__1_inlined3_ in let _v = - let e = - let (_endpos__1_inlined1_, _startpos__1_inlined1_, _startpos__1_, _1_inlined1, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _startpos__1_inlined2_, _1_inlined3, _1_inlined2) in - let ty = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 3691 "parsing/parser.mly" - ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in - let descr = Ptyp_package (lid, cstrs) in - mktyp ~loc:_sloc ~attrs descr ) -# 35286 "parsing/parser.ml" - - in - let _endpos_ty_ = _endpos__1_inlined1_ in - let e = - let _1 = -# 2309 "parsing/parser.mly" - ( _1 ) -# 35294 "parsing/parser.ml" - in - -# 2453 "parsing/parser.mly" - ( _1 ) -# 35299 "parsing/parser.ml" - - in - let _startpos_e_ = _startpos__1_ in - let _endpos = _endpos_ty_ in - let _startpos = _startpos_e_ in - let _loc = (_startpos, _endpos) in + let attrs2 = + let _1 = _1_inlined3 in -# 1483 "parsing/parser.mly" - ( ghexp ~loc:_loc (Pexp_constraint (e, ty)) ) -# 35309 "parsing/parser.ml" +# 4282 "parsing/parser.mly" + ( _1 ) +# 36445 "parsing/parser.ml" in - let attrs = + let _endpos_attrs2_ = _endpos__1_inlined3_ in + let id = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 972 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 36457 "parsing/parser.ml" + + in + let attrs1 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 35317 "parsing/parser.ml" +# 36465 "parsing/parser.ml" in - let _endpos = _endpos__5_ in + let override = +# 4187 "parsing/parser.mly" + ( Fresh ) +# 36471 "parsing/parser.ml" + in + let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 1468 "parsing/parser.mly" - ( mkmod ~loc:_sloc ~attrs (Pmod_unpack e) ) -# 35326 "parsing/parser.ml" - : (Parsetree.module_expr)) +# 1683 "parsing/parser.mly" + ( + let attrs = attrs1 @ attrs2 in + let loc = make_loc _sloc in + let docs = symbol_docs _sloc in + Opn.mk id ~override ~attrs ~loc ~docs, ext + ) +# 36484 "parsing/parser.ml" + : (Parsetree.open_description * string Asttypes.loc option)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -35336,185 +36494,97 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _1_inlined4; + MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined5; - MenhirLib.EngineTypes.startp = _startpos__1_inlined5_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined5_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2_inlined1; - MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = ext; + MenhirLib.EngineTypes.startp = _startpos_ext_; + MenhirLib.EngineTypes.endp = _endpos_ext_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined4; - MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; }; }; } = _menhir_stack in - let _5 : unit = Obj.magic _5 in - let _1_inlined5 : (Parsetree.module_type) = Obj.magic _1_inlined5 in - let _2_inlined1 : unit = Obj.magic _2_inlined1 in - let xs : (Parsetree.case list) = Obj.magic xs in let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in - let _1_inlined3 : (string Asttypes.loc option) = Obj.magic _1_inlined3 in - let _1_inlined2 : unit = Obj.magic _1_inlined2 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let _2 : unit = Obj.magic _2 in + let _1_inlined3 : (Longident.t) = Obj.magic _1_inlined3 in + let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in + let ext : (string Asttypes.loc option) = Obj.magic ext in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in + let _endpos = _endpos__1_inlined4_ in let _v = - let e = - let (_endpos__1_inlined3_, _startpos__1_inlined3_, _startpos__1_, _1_inlined3, _1_inlined2, _1_inlined1) = (_endpos__1_inlined5_, _startpos__1_inlined5_, _startpos__1_inlined2_, _1_inlined5, _1_inlined4, _1_inlined3) in - let ty = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 3691 "parsing/parser.mly" - ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in - let descr = Ptyp_package (lid, cstrs) in - mktyp ~loc:_sloc ~attrs descr ) -# 35425 "parsing/parser.ml" - - in - let _endpos_ty_ = _endpos__1_inlined3_ in - let e = - let _1 = - let _3 = - let xs = - let xs = -# 264 "" - ( List.rev xs ) -# 35436 "parsing/parser.ml" - in - -# 1200 "parsing/parser.mly" - ( xs ) -# 35441 "parsing/parser.ml" - - in - -# 2798 "parsing/parser.mly" - ( xs ) -# 35447 "parsing/parser.ml" - - in - let _endpos__3_ = _endpos_xs_ in - let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4114 "parsing/parser.mly" + let attrs2 = + let _1 = _1_inlined4 in + +# 4282 "parsing/parser.mly" ( _1 ) -# 35458 "parsing/parser.ml" - - in - -# 4127 "parsing/parser.mly" - ( _1, _2 ) -# 35464 "parsing/parser.ml" - - in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2311 "parsing/parser.mly" - ( let loc = make_loc _sloc in - let cases = _3 in - (* There are two choices of where to put attributes: on the - Pexp_function node; on the Pfunction_cases body. We put them on the - Pexp_function node here because the compiler only uses - Pfunction_cases attributes for enabling/disabling warnings in - typechecking. For standalone function cases, we want the compiler to - respect, e.g., [@inline] attributes. - *) - let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in - mkexp_attrs ~loc:_sloc desc _2 - ) -# 35484 "parsing/parser.ml" - - in - -# 2453 "parsing/parser.mly" - ( _1 ) -# 35490 "parsing/parser.ml" - - in - let _startpos_e_ = _startpos__1_ in - let _endpos = _endpos_ty_ in - let _startpos = _startpos_e_ in - let _loc = (_startpos, _endpos) in +# 36548 "parsing/parser.ml" -# 1483 "parsing/parser.mly" - ( ghexp ~loc:_loc (Pexp_constraint (e, ty)) ) -# 35500 "parsing/parser.ml" + in + let _endpos_attrs2_ = _endpos__1_inlined4_ in + let id = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 972 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 36560 "parsing/parser.ml" in - let attrs = - let _1 = _1_inlined1 in + let attrs1 = + let _1 = _1_inlined2 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 35508 "parsing/parser.ml" +# 36568 "parsing/parser.ml" in - let _endpos = _endpos__5_ in + let override = +# 4188 "parsing/parser.mly" + ( Override ) +# 36574 "parsing/parser.ml" + in + let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 1468 "parsing/parser.mly" - ( mkmod ~loc:_sloc ~attrs (Pmod_unpack e) ) -# 35517 "parsing/parser.ml" - : (Parsetree.module_expr)) +# 1683 "parsing/parser.mly" + ( + let attrs = attrs1 @ attrs2 in + let loc = make_loc _sloc in + let docs = symbol_docs _sloc in + Opn.mk id ~override ~attrs ~loc ~docs, ext + ) +# 36587 "parsing/parser.ml" + : (Parsetree.open_description * string Asttypes.loc option)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -35523,143 +36593,5733 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos; MenhirLib.EngineTypes.next = _menhir_stack; }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : ( +# 809 "parsing/parser.mly" + (string) +# 36609 "parsing/parser.ml" + ) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Asttypes.label) = +# 3979 "parsing/parser.mly" + ( _1 ) +# 36617 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : ( +# 767 "parsing/parser.mly" + (string) +# 36638 "parsing/parser.ml" + ) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Asttypes.label) = +# 3980 "parsing/parser.mly" + ( _1 ) +# 36646 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : ( +# 768 "parsing/parser.mly" + (string) +# 36667 "parsing/parser.ml" + ) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Asttypes.label) = +# 3981 "parsing/parser.mly" + ( _1 ) +# 36675 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined4; - MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2_inlined1; - MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; } = _menhir_stack in - let _5 : unit = Obj.magic _5 in - let _1_inlined4 : (Parsetree.module_type) = Obj.magic _1_inlined4 in let _4 : unit = Obj.magic _4 in - let _1_inlined3 : (Parsetree.module_type) = Obj.magic _1_inlined3 in - let _2_inlined1 : unit = Obj.magic _2_inlined1 in - let _1_inlined2 : (Parsetree.expression) = Obj.magic _1_inlined2 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _3 : (string) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in + let _1 : ( +# 766 "parsing/parser.mly" + (string) +# 36717 "parsing/parser.ml" + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in - let _v = - let e = - let (_endpos__1_inlined2_, _startpos__1_inlined2_, _endpos__1_inlined1_, _startpos__1_inlined1_, _startpos__1_, _1_inlined2, _1_inlined1, _1) = (_endpos__1_inlined4_, _startpos__1_inlined4_, _endpos__1_inlined3_, _startpos__1_inlined3_, _startpos__1_inlined2_, _1_inlined4, _1_inlined3, _1_inlined2) in - let ty2 = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 3691 "parsing/parser.mly" - ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in - let descr = Ptyp_package (lid, cstrs) in - mktyp ~loc:_sloc ~attrs descr ) -# 35609 "parsing/parser.ml" - + let _endpos = _endpos__4_ in + let _v : (Asttypes.label) = +# 3982 "parsing/parser.mly" + ( "."^ _1 ^"(" ^ _3 ^ ")" ) +# 36725 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _5 : unit = Obj.magic _5 in + let _4 : unit = Obj.magic _4 in + let _3 : (string) = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : ( +# 766 "parsing/parser.mly" + (string) +# 36774 "parsing/parser.ml" + ) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__5_ in + let _v : (Asttypes.label) = +# 3983 "parsing/parser.mly" + ( "."^ _1 ^ "(" ^ _3 ^ ")<-" ) +# 36782 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let _4 : unit = Obj.magic _4 in + let _3 : (string) = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : ( +# 766 "parsing/parser.mly" + (string) +# 36824 "parsing/parser.ml" + ) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__4_ in + let _v : (Asttypes.label) = +# 3984 "parsing/parser.mly" + ( "."^ _1 ^"[" ^ _3 ^ "]" ) +# 36832 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _5 : unit = Obj.magic _5 in + let _4 : unit = Obj.magic _4 in + let _3 : (string) = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : ( +# 766 "parsing/parser.mly" + (string) +# 36881 "parsing/parser.ml" + ) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__5_ in + let _v : (Asttypes.label) = +# 3985 "parsing/parser.mly" + ( "."^ _1 ^ "[" ^ _3 ^ "]<-" ) +# 36889 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let _4 : unit = Obj.magic _4 in + let _3 : (string) = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : ( +# 766 "parsing/parser.mly" + (string) +# 36931 "parsing/parser.ml" + ) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__4_ in + let _v : (Asttypes.label) = +# 3986 "parsing/parser.mly" + ( "."^ _1 ^"{" ^ _3 ^ "}" ) +# 36939 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _5 : unit = Obj.magic _5 in + let _4 : unit = Obj.magic _4 in + let _3 : (string) = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : ( +# 766 "parsing/parser.mly" + (string) +# 36988 "parsing/parser.ml" + ) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__5_ in + let _v : (Asttypes.label) = +# 3987 "parsing/parser.mly" + ( "."^ _1 ^ "{" ^ _3 ^ "}<-" ) +# 36996 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : ( +# 820 "parsing/parser.mly" + (string) +# 37017 "parsing/parser.ml" + ) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Asttypes.label) = +# 3988 "parsing/parser.mly" + ( _1 ) +# 37025 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Asttypes.label) = +# 3989 "parsing/parser.mly" + ( "!" ) +# 37050 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = op; + MenhirLib.EngineTypes.startp = _startpos_op_; + MenhirLib.EngineTypes.endp = _endpos_op_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let op : ( +# 761 "parsing/parser.mly" + (string) +# 37071 "parsing/parser.ml" + ) = Obj.magic op in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_op_ in + let _endpos = _endpos_op_ in + let _v = + let _1 = +# 3993 "parsing/parser.mly" + ( op ) +# 37080 "parsing/parser.ml" + in + ( +# 3990 "parsing/parser.mly" + ( _1 ) +# 37085 "parsing/parser.ml" + : (Asttypes.label)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = op; + MenhirLib.EngineTypes.startp = _startpos_op_; + MenhirLib.EngineTypes.endp = _endpos_op_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let op : ( +# 762 "parsing/parser.mly" + (string) +# 37107 "parsing/parser.ml" + ) = Obj.magic op in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_op_ in + let _endpos = _endpos_op_ in + let _v = + let _1 = +# 3994 "parsing/parser.mly" + ( op ) +# 37116 "parsing/parser.ml" + in + ( +# 3990 "parsing/parser.mly" + ( _1 ) +# 37121 "parsing/parser.ml" + : (Asttypes.label)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = op; + MenhirLib.EngineTypes.startp = _startpos_op_; + MenhirLib.EngineTypes.endp = _endpos_op_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let op : ( +# 763 "parsing/parser.mly" + (string) +# 37143 "parsing/parser.ml" + ) = Obj.magic op in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_op_ in + let _endpos = _endpos_op_ in + let _v = + let _1 = +# 3995 "parsing/parser.mly" + ( op ) +# 37152 "parsing/parser.ml" + in + ( +# 3990 "parsing/parser.mly" + ( _1 ) +# 37157 "parsing/parser.ml" + : (Asttypes.label)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = op; + MenhirLib.EngineTypes.startp = _startpos_op_; + MenhirLib.EngineTypes.endp = _endpos_op_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let op : ( +# 764 "parsing/parser.mly" + (string) +# 37179 "parsing/parser.ml" + ) = Obj.magic op in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_op_ in + let _endpos = _endpos_op_ in + let _v = + let _1 = +# 3996 "parsing/parser.mly" + ( op ) +# 37188 "parsing/parser.ml" + in + ( +# 3990 "parsing/parser.mly" + ( _1 ) +# 37193 "parsing/parser.ml" + : (Asttypes.label)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = op; + MenhirLib.EngineTypes.startp = _startpos_op_; + MenhirLib.EngineTypes.endp = _endpos_op_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let op : ( +# 765 "parsing/parser.mly" + (string) +# 37215 "parsing/parser.ml" + ) = Obj.magic op in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_op_ in + let _endpos = _endpos_op_ in + let _v = + let _1 = +# 3997 "parsing/parser.mly" + ( op ) +# 37224 "parsing/parser.ml" + in + ( +# 3990 "parsing/parser.mly" + ( _1 ) +# 37229 "parsing/parser.ml" + : (Asttypes.label)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v = + let _1 = +# 3998 "parsing/parser.mly" + ("+") +# 37256 "parsing/parser.ml" + in + ( +# 3990 "parsing/parser.mly" + ( _1 ) +# 37261 "parsing/parser.ml" + : (Asttypes.label)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v = + let _1 = +# 3999 "parsing/parser.mly" + ("+.") +# 37288 "parsing/parser.ml" + in + ( +# 3990 "parsing/parser.mly" + ( _1 ) +# 37293 "parsing/parser.ml" + : (Asttypes.label)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v = + let _1 = +# 4000 "parsing/parser.mly" + ("+=") +# 37320 "parsing/parser.ml" + in + ( +# 3990 "parsing/parser.mly" + ( _1 ) +# 37325 "parsing/parser.ml" + : (Asttypes.label)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v = + let _1 = +# 4001 "parsing/parser.mly" + ("-") +# 37352 "parsing/parser.ml" + in + ( +# 3990 "parsing/parser.mly" + ( _1 ) +# 37357 "parsing/parser.ml" + : (Asttypes.label)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v = + let _1 = +# 4002 "parsing/parser.mly" + ("-.") +# 37384 "parsing/parser.ml" + in + ( +# 3990 "parsing/parser.mly" + ( _1 ) +# 37389 "parsing/parser.ml" + : (Asttypes.label)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v = + let _1 = +# 4003 "parsing/parser.mly" + ("*") +# 37416 "parsing/parser.ml" + in + ( +# 3990 "parsing/parser.mly" + ( _1 ) +# 37421 "parsing/parser.ml" + : (Asttypes.label)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v = + let _1 = +# 4004 "parsing/parser.mly" + ("%") +# 37448 "parsing/parser.ml" + in + ( +# 3990 "parsing/parser.mly" + ( _1 ) +# 37453 "parsing/parser.ml" + : (Asttypes.label)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v = + let _1 = +# 4005 "parsing/parser.mly" + ("=") +# 37480 "parsing/parser.ml" + in + ( +# 3990 "parsing/parser.mly" + ( _1 ) +# 37485 "parsing/parser.ml" + : (Asttypes.label)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v = + let _1 = +# 4006 "parsing/parser.mly" + ("<") +# 37512 "parsing/parser.ml" + in + ( +# 3990 "parsing/parser.mly" + ( _1 ) +# 37517 "parsing/parser.ml" + : (Asttypes.label)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v = + let _1 = +# 4007 "parsing/parser.mly" + (">") +# 37544 "parsing/parser.ml" + in + ( +# 3990 "parsing/parser.mly" + ( _1 ) +# 37549 "parsing/parser.ml" + : (Asttypes.label)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v = + let _1 = +# 4008 "parsing/parser.mly" + ("or") +# 37576 "parsing/parser.ml" + in + ( +# 3990 "parsing/parser.mly" + ( _1 ) +# 37581 "parsing/parser.ml" + : (Asttypes.label)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v = + let _1 = +# 4009 "parsing/parser.mly" + ("||") +# 37608 "parsing/parser.ml" + in + ( +# 3990 "parsing/parser.mly" + ( _1 ) +# 37613 "parsing/parser.ml" + : (Asttypes.label)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v = + let _1 = +# 4010 "parsing/parser.mly" + ("&") +# 37640 "parsing/parser.ml" + in + ( +# 3990 "parsing/parser.mly" + ( _1 ) +# 37645 "parsing/parser.ml" + : (Asttypes.label)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v = + let _1 = +# 4011 "parsing/parser.mly" + ("&&") +# 37672 "parsing/parser.ml" + in + ( +# 3990 "parsing/parser.mly" + ( _1 ) +# 37677 "parsing/parser.ml" + : (Asttypes.label)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v = + let _1 = +# 4012 "parsing/parser.mly" + (":=") +# 37704 "parsing/parser.ml" + in + ( +# 3990 "parsing/parser.mly" + ( _1 ) +# 37709 "parsing/parser.ml" + : (Asttypes.label)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (bool) = +# 3887 "parsing/parser.mly" + ( true ) +# 37735 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (bool) = +# 3888 "parsing/parser.mly" + ( false ) +# 37753 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (unit option) = +# 111 "" + ( None ) +# 37771 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let x : unit = Obj.magic x in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_x_ in + let _endpos = _endpos_x_ in + let _v : (unit option) = +# 114 "" + ( Some x ) +# 37796 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (unit option) = +# 111 "" + ( None ) +# 37814 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let x : unit = Obj.magic x in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_x_ in + let _endpos = _endpos_x_ in + let _v : (unit option) = +# 114 "" + ( Some x ) +# 37839 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (string Asttypes.loc option) = +# 111 "" + ( None ) +# 37857 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _1_inlined1 : ( +# 785 "parsing/parser.mly" + (string) +# 37884 "parsing/parser.ml" + ) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined1_ in + let _v = + let x = + let x = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 972 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 37900 "parsing/parser.ml" + + in + +# 188 "" + ( x ) +# 37906 "parsing/parser.ml" + + in + ( +# 114 "" + ( Some x ) +# 37912 "parsing/parser.ml" + : (string Asttypes.loc option)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (Parsetree.core_type option) = +# 111 "" + ( None ) +# 37931 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let x : (Parsetree.core_type) = Obj.magic x in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos_x_ in + let _v = + let x = +# 188 "" + ( x ) +# 37964 "parsing/parser.ml" + in + ( +# 114 "" + ( Some x ) +# 37969 "parsing/parser.ml" + : (Parsetree.core_type option)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (Parsetree.core_type option) = +# 111 "" + ( None ) +# 37988 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let x : (Parsetree.core_type) = Obj.magic x in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos_x_ in + let _v = + let x = +# 188 "" + ( x ) +# 38021 "parsing/parser.ml" + in + ( +# 114 "" + ( Some x ) +# 38026 "parsing/parser.ml" + : (Parsetree.core_type option)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (Parsetree.expression option) = +# 111 "" + ( None ) +# 38045 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined1_ in + let _v = + let x = + let x = + let _1 = _1_inlined1 in + let _1 = +# 2297 "parsing/parser.mly" + ( _1 ) +# 38081 "parsing/parser.ml" + in + +# 2440 "parsing/parser.mly" + ( _1 ) +# 38086 "parsing/parser.ml" + + in + +# 188 "" + ( x ) +# 38092 "parsing/parser.ml" + + in + ( +# 114 "" + ( Some x ) +# 38098 "parsing/parser.ml" + : (Parsetree.expression option)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos_xs_ in + let _v = + let x = + let x = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _3 = + let xs = + let xs = +# 264 "" + ( List.rev xs ) +# 38159 "parsing/parser.ml" + in + +# 1188 "parsing/parser.mly" + ( xs ) +# 38164 "parsing/parser.ml" + + in + +# 2783 "parsing/parser.mly" + ( xs ) +# 38170 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +# 4286 "parsing/parser.mly" + ( _1 ) +# 38181 "parsing/parser.ml" + + in + +# 4299 "parsing/parser.mly" + ( _1, _2 ) +# 38187 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2299 "parsing/parser.mly" + ( let loc = make_loc _sloc in + let cases = _3 in + (* There are two choices of where to put attributes: on the + Pexp_function node; on the Pfunction_cases body. We put them on the + Pexp_function node here because the compiler only uses + Pfunction_cases attributes for enabling/disabling warnings in + typechecking. For standalone function cases, we want the compiler to + respect, e.g., [@inline] attributes. + *) + let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in + mkexp_attrs ~loc:_sloc desc _2 + ) +# 38207 "parsing/parser.ml" + + in + +# 2440 "parsing/parser.mly" + ( _1 ) +# 38213 "parsing/parser.ml" + + in + +# 188 "" + ( x ) +# 38219 "parsing/parser.ml" + + in + ( +# 114 "" + ( Some x ) +# 38225 "parsing/parser.ml" + : (Parsetree.expression option)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (Parsetree.module_type option) = +# 111 "" + ( None ) +# 38244 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let x : (Parsetree.module_type) = Obj.magic x in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos_x_ in + let _v = + let x = +# 188 "" + ( x ) +# 38277 "parsing/parser.ml" + in + ( +# 114 "" + ( Some x ) +# 38282 "parsing/parser.ml" + : (Parsetree.module_type option)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (Parsetree.pattern option) = +# 111 "" + ( None ) +# 38301 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let x : (Parsetree.pattern) = Obj.magic x in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos_x_ in + let _v = + let x = +# 188 "" + ( x ) +# 38334 "parsing/parser.ml" + in + ( +# 114 "" + ( Some x ) +# 38339 "parsing/parser.ml" + : (Parsetree.pattern option)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (Parsetree.expression option) = +# 111 "" + ( None ) +# 38358 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let x : (Parsetree.expression) = Obj.magic x in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos_x_ in + let _v = + let x = +# 188 "" + ( x ) +# 38391 "parsing/parser.ml" + in + ( +# 114 "" + ( Some x ) +# 38396 "parsing/parser.ml" + : (Parsetree.expression option)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (Parsetree.type_constraint option) = +# 111 "" + ( None ) +# 38415 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let x : (Parsetree.type_constraint) = Obj.magic x in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_x_ in + let _endpos = _endpos_x_ in + let _v : (Parsetree.type_constraint option) = +# 114 "" + ( Some x ) +# 38440 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : ( +# 802 "parsing/parser.mly" + (string) +# 38461 "parsing/parser.ml" + ) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4199 "parsing/parser.mly" + ( _1 ) +# 38469 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let _2 : ( +# 785 "parsing/parser.mly" + (string) +# 38503 "parsing/parser.ml" + ) = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (string) = +# 4200 "parsing/parser.mly" + ( _2 ) +# 38512 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = mty; + MenhirLib.EngineTypes.startp = _startpos_mty_; + MenhirLib.EngineTypes.endp = _endpos_mty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = me; + MenhirLib.EngineTypes.startp = _startpos_me_; + MenhirLib.EngineTypes.endp = _endpos_me_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _5 : unit = Obj.magic _5 in + let mty : (Parsetree.module_type) = Obj.magic mty in + let _3 : unit = Obj.magic _3 in + let me : (Parsetree.module_expr) = Obj.magic me in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__5_ in + let _v = + let _endpos = _endpos__5_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + ( +# 1445 "parsing/parser.mly" + ( mkmod ~loc:_sloc (Pmod_constraint(me, mty)) ) +# 38569 "parsing/parser.ml" + : (Parsetree.module_expr)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _5 : unit = Obj.magic _5 in + let _4 : (Parsetree.module_type) = Obj.magic _4 in + let _3 : unit = Obj.magic _3 in + let _2 : (Parsetree.module_expr) = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__5_ in + let _v = + let _loc__5_ = (_startpos__5_, _endpos__5_) in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + ( +# 1447 "parsing/parser.mly" + ( unclosed "(" _loc__1_ ")" _loc__5_ ) +# 38626 "parsing/parser.ml" + : (Parsetree.module_expr)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = me; + MenhirLib.EngineTypes.startp = _startpos_me_; + MenhirLib.EngineTypes.endp = _endpos_me_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let me : (Parsetree.module_expr) = Obj.magic me in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Parsetree.module_expr) = +# 1450 "parsing/parser.mly" + ( me (* TODO consider reloc *) ) +# 38666 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let _2 : (Parsetree.module_expr) = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v = + let _loc__3_ = (_startpos__3_, _endpos__3_) in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + ( +# 1452 "parsing/parser.mly" + ( unclosed "(" _loc__1_ ")" _loc__3_ ) +# 38708 "parsing/parser.ml" + : (Parsetree.module_expr)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _5 : unit = Obj.magic _5 in + let _1_inlined2 : (Parsetree.expression) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__5_ in + let _v = + let e = + let _1 = _1_inlined2 in + let e = + let _1 = +# 2297 "parsing/parser.mly" + ( _1 ) +# 38766 "parsing/parser.ml" + in + +# 2440 "parsing/parser.mly" + ( _1 ) +# 38771 "parsing/parser.ml" + + in + +# 1469 "parsing/parser.mly" + ( e ) +# 38777 "parsing/parser.ml" + + in + let attrs = + let _1 = _1_inlined1 in + +# 4286 "parsing/parser.mly" + ( _1 ) +# 38785 "parsing/parser.ml" + + in + let _endpos = _endpos__5_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + ( +# 1456 "parsing/parser.mly" + ( mkmod ~loc:_sloc ~attrs (Pmod_unpack e) ) +# 38794 "parsing/parser.ml" + : (Parsetree.module_expr)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined4; + MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _5 : unit = Obj.magic _5 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in + let _1_inlined3 : (string Asttypes.loc option) = Obj.magic _1_inlined3 in + let _1_inlined2 : unit = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__5_ in + let _v = + let e = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined2_, _1_inlined4, _1_inlined3) in + let e = + let _1 = + let _3 = + let xs = + let xs = +# 264 "" + ( List.rev xs ) +# 38876 "parsing/parser.ml" + in + +# 1188 "parsing/parser.mly" + ( xs ) +# 38881 "parsing/parser.ml" + + in + +# 2783 "parsing/parser.mly" + ( xs ) +# 38887 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +# 4286 "parsing/parser.mly" + ( _1 ) +# 38898 "parsing/parser.ml" + + in + +# 4299 "parsing/parser.mly" + ( _1, _2 ) +# 38904 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2299 "parsing/parser.mly" + ( let loc = make_loc _sloc in + let cases = _3 in + (* There are two choices of where to put attributes: on the + Pexp_function node; on the Pfunction_cases body. We put them on the + Pexp_function node here because the compiler only uses + Pfunction_cases attributes for enabling/disabling warnings in + typechecking. For standalone function cases, we want the compiler to + respect, e.g., [@inline] attributes. + *) + let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in + mkexp_attrs ~loc:_sloc desc _2 + ) +# 38924 "parsing/parser.ml" + + in + +# 2440 "parsing/parser.mly" + ( _1 ) +# 38930 "parsing/parser.ml" + + in + +# 1469 "parsing/parser.mly" + ( e ) +# 38936 "parsing/parser.ml" + + in + let attrs = + let _1 = _1_inlined1 in + +# 4286 "parsing/parser.mly" + ( _1 ) +# 38944 "parsing/parser.ml" + + in + let _endpos = _endpos__5_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + ( +# 1456 "parsing/parser.mly" + ( mkmod ~loc:_sloc ~attrs (Pmod_unpack e) ) +# 38953 "parsing/parser.ml" + : (Parsetree.module_expr)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _5 : unit = Obj.magic _5 in + let _1_inlined3 : (Parsetree.module_type) = Obj.magic _1_inlined3 in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let _1_inlined2 : (Parsetree.expression) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__5_ in + let _v = + let e = + let (_endpos__1_inlined1_, _startpos__1_inlined1_, _startpos__1_, _1_inlined1, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _startpos__1_inlined2_, _1_inlined3, _1_inlined2) in + let ty = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 3860 "parsing/parser.mly" + ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in + Typ.package_type ~loc:(make_loc _sloc) ~attrs lid cstrs ) +# 39031 "parsing/parser.ml" + + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 3864 "parsing/parser.mly" + ( mktyp ~loc:_sloc (Ptyp_package _1) ) +# 39040 "parsing/parser.ml" + + in + let _endpos_ty_ = _endpos__1_inlined1_ in + let e = + let _1 = +# 2297 "parsing/parser.mly" + ( _1 ) +# 39048 "parsing/parser.ml" + in + +# 2440 "parsing/parser.mly" + ( _1 ) +# 39053 "parsing/parser.ml" + + in + let _startpos_e_ = _startpos__1_ in + let _endpos = _endpos_ty_ in + let _startpos = _startpos_e_ in + let _loc = (_startpos, _endpos) in + +# 1471 "parsing/parser.mly" + ( ghexp ~loc:_loc (Pexp_constraint (e, ty)) ) +# 39063 "parsing/parser.ml" + + in + let attrs = + let _1 = _1_inlined1 in + +# 4286 "parsing/parser.mly" + ( _1 ) +# 39071 "parsing/parser.ml" + + in + let _endpos = _endpos__5_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + ( +# 1456 "parsing/parser.mly" + ( mkmod ~loc:_sloc ~attrs (Pmod_unpack e) ) +# 39080 "parsing/parser.ml" + : (Parsetree.module_expr)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined5; + MenhirLib.EngineTypes.startp = _startpos__1_inlined5_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined4; + MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _5 : unit = Obj.magic _5 in + let _1_inlined5 : (Parsetree.module_type) = Obj.magic _1_inlined5 in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in + let _1_inlined3 : (string Asttypes.loc option) = Obj.magic _1_inlined3 in + let _1_inlined2 : unit = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__5_ in + let _v = + let e = + let (_endpos__1_inlined3_, _startpos__1_inlined3_, _startpos__1_, _1_inlined3, _1_inlined2, _1_inlined1) = (_endpos__1_inlined5_, _startpos__1_inlined5_, _startpos__1_inlined2_, _1_inlined5, _1_inlined4, _1_inlined3) in + let ty = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 3860 "parsing/parser.mly" + ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in + Typ.package_type ~loc:(make_loc _sloc) ~attrs lid cstrs ) +# 39179 "parsing/parser.ml" + + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 3864 "parsing/parser.mly" + ( mktyp ~loc:_sloc (Ptyp_package _1) ) +# 39188 "parsing/parser.ml" + + in + let _endpos_ty_ = _endpos__1_inlined3_ in + let e = + let _1 = + let _3 = + let xs = + let xs = +# 264 "" + ( List.rev xs ) +# 39199 "parsing/parser.ml" + in + +# 1188 "parsing/parser.mly" + ( xs ) +# 39204 "parsing/parser.ml" + + in + +# 2783 "parsing/parser.mly" + ( xs ) +# 39210 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +# 4286 "parsing/parser.mly" + ( _1 ) +# 39221 "parsing/parser.ml" + + in + +# 4299 "parsing/parser.mly" + ( _1, _2 ) +# 39227 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2299 "parsing/parser.mly" + ( let loc = make_loc _sloc in + let cases = _3 in + (* There are two choices of where to put attributes: on the + Pexp_function node; on the Pfunction_cases body. We put them on the + Pexp_function node here because the compiler only uses + Pfunction_cases attributes for enabling/disabling warnings in + typechecking. For standalone function cases, we want the compiler to + respect, e.g., [@inline] attributes. + *) + let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in + mkexp_attrs ~loc:_sloc desc _2 + ) +# 39247 "parsing/parser.ml" + + in + +# 2440 "parsing/parser.mly" + ( _1 ) +# 39253 "parsing/parser.ml" + + in + let _startpos_e_ = _startpos__1_ in + let _endpos = _endpos_ty_ in + let _startpos = _startpos_e_ in + let _loc = (_startpos, _endpos) in + +# 1471 "parsing/parser.mly" + ( ghexp ~loc:_loc (Pexp_constraint (e, ty)) ) +# 39263 "parsing/parser.ml" + + in + let attrs = + let _1 = _1_inlined1 in + +# 4286 "parsing/parser.mly" + ( _1 ) +# 39271 "parsing/parser.ml" + + in + let _endpos = _endpos__5_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + ( +# 1456 "parsing/parser.mly" + ( mkmod ~loc:_sloc ~attrs (Pmod_unpack e) ) +# 39280 "parsing/parser.ml" + : (Parsetree.module_expr)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined4; + MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _5 : unit = Obj.magic _5 in + let _1_inlined4 : (Parsetree.module_type) = Obj.magic _1_inlined4 in + let _4 : unit = Obj.magic _4 in + let _1_inlined3 : (Parsetree.module_type) = Obj.magic _1_inlined3 in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let _1_inlined2 : (Parsetree.expression) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__5_ in + let _v = + let e = + let (_endpos__1_inlined2_, _startpos__1_inlined2_, _endpos__1_inlined1_, _startpos__1_inlined1_, _startpos__1_, _1_inlined2, _1_inlined1, _1) = (_endpos__1_inlined4_, _startpos__1_inlined4_, _endpos__1_inlined3_, _startpos__1_inlined3_, _startpos__1_inlined2_, _1_inlined4, _1_inlined3, _1_inlined2) in + let ty2 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 3860 "parsing/parser.mly" + ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in + Typ.package_type ~loc:(make_loc _sloc) ~attrs lid cstrs ) +# 39372 "parsing/parser.ml" + + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 3864 "parsing/parser.mly" + ( mktyp ~loc:_sloc (Ptyp_package _1) ) +# 39381 "parsing/parser.ml" + + in + let _endpos_ty2_ = _endpos__1_inlined2_ in + let ty1 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 3860 "parsing/parser.mly" + ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in + Typ.package_type ~loc:(make_loc _sloc) ~attrs lid cstrs ) +# 39395 "parsing/parser.ml" + + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 3864 "parsing/parser.mly" + ( mktyp ~loc:_sloc (Ptyp_package _1) ) +# 39404 "parsing/parser.ml" + + in + let e = + let _1 = +# 2297 "parsing/parser.mly" + ( _1 ) +# 39411 "parsing/parser.ml" + in + +# 2440 "parsing/parser.mly" + ( _1 ) +# 39416 "parsing/parser.ml" + + in + let _startpos_e_ = _startpos__1_ in + let _endpos = _endpos_ty2_ in + let _startpos = _startpos_e_ in + let _loc = (_startpos, _endpos) in + +# 1473 "parsing/parser.mly" + ( ghexp ~loc:_loc (Pexp_coerce (e, Some ty1, ty2)) ) +# 39426 "parsing/parser.ml" + + in + let attrs = + let _1 = _1_inlined1 in + +# 4286 "parsing/parser.mly" + ( _1 ) +# 39434 "parsing/parser.ml" + + in + let _endpos = _endpos__5_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + ( +# 1456 "parsing/parser.mly" + ( mkmod ~loc:_sloc ~attrs (Pmod_unpack e) ) +# 39443 "parsing/parser.ml" + : (Parsetree.module_expr)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined6; + MenhirLib.EngineTypes.startp = _startpos__1_inlined6_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined6_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined5; + MenhirLib.EngineTypes.startp = _startpos__1_inlined5_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined4; + MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _5 : unit = Obj.magic _5 in + let _1_inlined6 : (Parsetree.module_type) = Obj.magic _1_inlined6 in + let _4 : unit = Obj.magic _4 in + let _1_inlined5 : (Parsetree.module_type) = Obj.magic _1_inlined5 in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in + let _1_inlined3 : (string Asttypes.loc option) = Obj.magic _1_inlined3 in + let _1_inlined2 : unit = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__5_ in + let _v = + let e = + let (_endpos__1_inlined4_, _startpos__1_inlined4_, _endpos__1_inlined3_, _startpos__1_inlined3_, _startpos__1_, _1_inlined4, _1_inlined3, _1_inlined2, _1_inlined1) = (_endpos__1_inlined6_, _startpos__1_inlined6_, _endpos__1_inlined5_, _startpos__1_inlined5_, _startpos__1_inlined2_, _1_inlined6, _1_inlined5, _1_inlined4, _1_inlined3) in + let ty2 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined4_, _startpos__1_inlined4_, _1_inlined4) in + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 3860 "parsing/parser.mly" + ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in + Typ.package_type ~loc:(make_loc _sloc) ~attrs lid cstrs ) +# 39556 "parsing/parser.ml" + + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 3864 "parsing/parser.mly" + ( mktyp ~loc:_sloc (Ptyp_package _1) ) +# 39565 "parsing/parser.ml" + + in + let _endpos_ty2_ = _endpos__1_inlined4_ in + let ty1 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 3860 "parsing/parser.mly" + ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in + Typ.package_type ~loc:(make_loc _sloc) ~attrs lid cstrs ) +# 39579 "parsing/parser.ml" + + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 3864 "parsing/parser.mly" + ( mktyp ~loc:_sloc (Ptyp_package _1) ) +# 39588 "parsing/parser.ml" + + in + let e = + let _1 = + let _3 = + let xs = + let xs = +# 264 "" + ( List.rev xs ) +# 39598 "parsing/parser.ml" + in + +# 1188 "parsing/parser.mly" + ( xs ) +# 39603 "parsing/parser.ml" + + in + +# 2783 "parsing/parser.mly" + ( xs ) +# 39609 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +# 4286 "parsing/parser.mly" + ( _1 ) +# 39620 "parsing/parser.ml" + + in + +# 4299 "parsing/parser.mly" + ( _1, _2 ) +# 39626 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2299 "parsing/parser.mly" + ( let loc = make_loc _sloc in + let cases = _3 in + (* There are two choices of where to put attributes: on the + Pexp_function node; on the Pfunction_cases body. We put them on the + Pexp_function node here because the compiler only uses + Pfunction_cases attributes for enabling/disabling warnings in + typechecking. For standalone function cases, we want the compiler to + respect, e.g., [@inline] attributes. + *) + let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in + mkexp_attrs ~loc:_sloc desc _2 + ) +# 39646 "parsing/parser.ml" + + in + +# 2440 "parsing/parser.mly" + ( _1 ) +# 39652 "parsing/parser.ml" + + in + let _startpos_e_ = _startpos__1_ in + let _endpos = _endpos_ty2_ in + let _startpos = _startpos_e_ in + let _loc = (_startpos, _endpos) in + +# 1473 "parsing/parser.mly" + ( ghexp ~loc:_loc (Pexp_coerce (e, Some ty1, ty2)) ) +# 39662 "parsing/parser.ml" + + in + let attrs = + let _1 = _1_inlined1 in + +# 4286 "parsing/parser.mly" + ( _1 ) +# 39670 "parsing/parser.ml" + + in + let _endpos = _endpos__5_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + ( +# 1456 "parsing/parser.mly" + ( mkmod ~loc:_sloc ~attrs (Pmod_unpack e) ) +# 39679 "parsing/parser.ml" + : (Parsetree.module_expr)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _5 : unit = Obj.magic _5 in + let _1_inlined3 : (Parsetree.module_type) = Obj.magic _1_inlined3 in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let _1_inlined2 : (Parsetree.expression) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__5_ in + let _v = + let e = + let (_endpos__1_inlined1_, _startpos__1_inlined1_, _startpos__1_, _1_inlined1, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _startpos__1_inlined2_, _1_inlined3, _1_inlined2) in + let ty2 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 3860 "parsing/parser.mly" + ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in + Typ.package_type ~loc:(make_loc _sloc) ~attrs lid cstrs ) +# 39757 "parsing/parser.ml" + + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 3864 "parsing/parser.mly" + ( mktyp ~loc:_sloc (Ptyp_package _1) ) +# 39766 "parsing/parser.ml" + + in + let _endpos_ty2_ = _endpos__1_inlined1_ in + let e = + let _1 = +# 2297 "parsing/parser.mly" + ( _1 ) +# 39774 "parsing/parser.ml" + in + +# 2440 "parsing/parser.mly" + ( _1 ) +# 39779 "parsing/parser.ml" + + in + let _startpos_e_ = _startpos__1_ in + let _endpos = _endpos_ty2_ in + let _startpos = _startpos_e_ in + let _loc = (_startpos, _endpos) in + +# 1475 "parsing/parser.mly" + ( ghexp ~loc:_loc (Pexp_coerce (e, None, ty2)) ) +# 39789 "parsing/parser.ml" + + in + let attrs = + let _1 = _1_inlined1 in + +# 4286 "parsing/parser.mly" + ( _1 ) +# 39797 "parsing/parser.ml" + + in + let _endpos = _endpos__5_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + ( +# 1456 "parsing/parser.mly" + ( mkmod ~loc:_sloc ~attrs (Pmod_unpack e) ) +# 39806 "parsing/parser.ml" + : (Parsetree.module_expr)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined5; + MenhirLib.EngineTypes.startp = _startpos__1_inlined5_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined4; + MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _5 : unit = Obj.magic _5 in + let _1_inlined5 : (Parsetree.module_type) = Obj.magic _1_inlined5 in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in + let _1_inlined3 : (string Asttypes.loc option) = Obj.magic _1_inlined3 in + let _1_inlined2 : unit = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__5_ in + let _v = + let e = + let (_endpos__1_inlined3_, _startpos__1_inlined3_, _startpos__1_, _1_inlined3, _1_inlined2, _1_inlined1) = (_endpos__1_inlined5_, _startpos__1_inlined5_, _startpos__1_inlined2_, _1_inlined5, _1_inlined4, _1_inlined3) in + let ty2 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 3860 "parsing/parser.mly" + ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in + Typ.package_type ~loc:(make_loc _sloc) ~attrs lid cstrs ) +# 39905 "parsing/parser.ml" + + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 3864 "parsing/parser.mly" + ( mktyp ~loc:_sloc (Ptyp_package _1) ) +# 39914 "parsing/parser.ml" + + in + let _endpos_ty2_ = _endpos__1_inlined3_ in + let e = + let _1 = + let _3 = + let xs = + let xs = +# 264 "" + ( List.rev xs ) +# 39925 "parsing/parser.ml" + in + +# 1188 "parsing/parser.mly" + ( xs ) +# 39930 "parsing/parser.ml" + + in + +# 2783 "parsing/parser.mly" + ( xs ) +# 39936 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +# 4286 "parsing/parser.mly" + ( _1 ) +# 39947 "parsing/parser.ml" + + in + +# 4299 "parsing/parser.mly" + ( _1, _2 ) +# 39953 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2299 "parsing/parser.mly" + ( let loc = make_loc _sloc in + let cases = _3 in + (* There are two choices of where to put attributes: on the + Pexp_function node; on the Pfunction_cases body. We put them on the + Pexp_function node here because the compiler only uses + Pfunction_cases attributes for enabling/disabling warnings in + typechecking. For standalone function cases, we want the compiler to + respect, e.g., [@inline] attributes. + *) + let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in + mkexp_attrs ~loc:_sloc desc _2 + ) +# 39973 "parsing/parser.ml" + + in + +# 2440 "parsing/parser.mly" + ( _1 ) +# 39979 "parsing/parser.ml" + + in + let _startpos_e_ = _startpos__1_ in + let _endpos = _endpos_ty2_ in + let _startpos = _startpos_e_ in + let _loc = (_startpos, _endpos) in + +# 1475 "parsing/parser.mly" + ( ghexp ~loc:_loc (Pexp_coerce (e, None, ty2)) ) +# 39989 "parsing/parser.ml" + + in + let attrs = + let _1 = _1_inlined1 in + +# 4286 "parsing/parser.mly" + ( _1 ) +# 39997 "parsing/parser.ml" + + in + let _endpos = _endpos__5_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + ( +# 1456 "parsing/parser.mly" + ( mkmod ~loc:_sloc ~attrs (Pmod_unpack e) ) +# 40006 "parsing/parser.ml" + : (Parsetree.module_expr)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _6 : unit = Obj.magic _6 in + let _5 : unit = Obj.magic _5 in + let _1_inlined2 : (Parsetree.expression) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__6_ in + let _v = + let _4 = + let _1 = _1_inlined2 in + let _1 = +# 2297 "parsing/parser.mly" + ( _1 ) +# 40070 "parsing/parser.ml" + in + +# 2440 "parsing/parser.mly" + ( _1 ) +# 40075 "parsing/parser.ml" + + in + let _3 = + let _1 = _1_inlined1 in + +# 4286 "parsing/parser.mly" + ( _1 ) +# 40083 "parsing/parser.ml" + + in + let _loc__6_ = (_startpos__6_, _endpos__6_) in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + ( +# 1458 "parsing/parser.mly" + ( unclosed "(" _loc__1_ ")" _loc__6_ ) +# 40091 "parsing/parser.ml" + : (Parsetree.module_expr)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined4; + MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _6 : unit = Obj.magic _6 in + let _5 : unit = Obj.magic _5 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in + let _1_inlined3 : (string Asttypes.loc option) = Obj.magic _1_inlined3 in + let _1_inlined2 : unit = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__6_ in + let _v = + let _4 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined2_, _1_inlined4, _1_inlined3) in + let _1 = + let _3 = + let xs = + let xs = +# 264 "" + ( List.rev xs ) +# 40179 "parsing/parser.ml" + in + +# 1188 "parsing/parser.mly" + ( xs ) +# 40184 "parsing/parser.ml" + + in + +# 2783 "parsing/parser.mly" + ( xs ) +# 40190 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +# 4286 "parsing/parser.mly" + ( _1 ) +# 40201 "parsing/parser.ml" + + in + +# 4299 "parsing/parser.mly" + ( _1, _2 ) +# 40207 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2299 "parsing/parser.mly" + ( let loc = make_loc _sloc in + let cases = _3 in + (* There are two choices of where to put attributes: on the + Pexp_function node; on the Pfunction_cases body. We put them on the + Pexp_function node here because the compiler only uses + Pfunction_cases attributes for enabling/disabling warnings in + typechecking. For standalone function cases, we want the compiler to + respect, e.g., [@inline] attributes. + *) + let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in + mkexp_attrs ~loc:_sloc desc _2 + ) +# 40227 "parsing/parser.ml" + + in + +# 2440 "parsing/parser.mly" + ( _1 ) +# 40233 "parsing/parser.ml" + + in + let _3 = + let _1 = _1_inlined1 in + +# 4286 "parsing/parser.mly" + ( _1 ) +# 40241 "parsing/parser.ml" + + in + let _loc__6_ = (_startpos__6_, _endpos__6_) in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + ( +# 1458 "parsing/parser.mly" + ( unclosed "(" _loc__1_ ")" _loc__6_ ) +# 40249 "parsing/parser.ml" + : (Parsetree.module_expr)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _6 : unit = Obj.magic _6 in + let _5 : unit = Obj.magic _5 in + let _1_inlined2 : (Parsetree.expression) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__6_ in + let _v = + let _4 = + let _1 = _1_inlined2 in + let _1 = +# 2297 "parsing/parser.mly" + ( _1 ) +# 40313 "parsing/parser.ml" + in + +# 2440 "parsing/parser.mly" + ( _1 ) +# 40318 "parsing/parser.ml" + + in + let _3 = + let _1 = _1_inlined1 in + +# 4286 "parsing/parser.mly" + ( _1 ) +# 40326 "parsing/parser.ml" + + in + let _loc__6_ = (_startpos__6_, _endpos__6_) in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + ( +# 1460 "parsing/parser.mly" + ( unclosed "(" _loc__1_ ")" _loc__6_ ) +# 40334 "parsing/parser.ml" + : (Parsetree.module_expr)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined4; + MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _6 : unit = Obj.magic _6 in + let _5 : unit = Obj.magic _5 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in + let _1_inlined3 : (string Asttypes.loc option) = Obj.magic _1_inlined3 in + let _1_inlined2 : unit = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__6_ in + let _v = + let _4 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined2_, _1_inlined4, _1_inlined3) in + let _1 = + let _3 = + let xs = + let xs = +# 264 "" + ( List.rev xs ) +# 40422 "parsing/parser.ml" + in + +# 1188 "parsing/parser.mly" + ( xs ) +# 40427 "parsing/parser.ml" + + in + +# 2783 "parsing/parser.mly" + ( xs ) +# 40433 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +# 4286 "parsing/parser.mly" + ( _1 ) +# 40444 "parsing/parser.ml" + + in + +# 4299 "parsing/parser.mly" + ( _1, _2 ) +# 40450 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2299 "parsing/parser.mly" + ( let loc = make_loc _sloc in + let cases = _3 in + (* There are two choices of where to put attributes: on the + Pexp_function node; on the Pfunction_cases body. We put them on the + Pexp_function node here because the compiler only uses + Pfunction_cases attributes for enabling/disabling warnings in + typechecking. For standalone function cases, we want the compiler to + respect, e.g., [@inline] attributes. + *) + let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in + mkexp_attrs ~loc:_sloc desc _2 + ) +# 40470 "parsing/parser.ml" + + in + +# 2440 "parsing/parser.mly" + ( _1 ) +# 40476 "parsing/parser.ml" + + in + let _3 = + let _1 = _1_inlined1 in + +# 4286 "parsing/parser.mly" + ( _1 ) +# 40484 "parsing/parser.ml" + + in + let _loc__6_ = (_startpos__6_, _endpos__6_) in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + ( +# 1460 "parsing/parser.mly" + ( unclosed "(" _loc__1_ ")" _loc__6_ ) +# 40492 "parsing/parser.ml" + : (Parsetree.module_expr)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _5 : unit = Obj.magic _5 in + let _1_inlined2 : (Parsetree.expression) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__5_ in + let _v = + let _4 = + let _1 = _1_inlined2 in + let _1 = +# 2297 "parsing/parser.mly" + ( _1 ) +# 40549 "parsing/parser.ml" + in + +# 2440 "parsing/parser.mly" + ( _1 ) +# 40554 "parsing/parser.ml" + + in + let _3 = + let _1 = _1_inlined1 in + +# 4286 "parsing/parser.mly" + ( _1 ) +# 40562 "parsing/parser.ml" + + in + let _loc__5_ = (_startpos__5_, _endpos__5_) in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + ( +# 1462 "parsing/parser.mly" + ( unclosed "(" _loc__1_ ")" _loc__5_ ) +# 40570 "parsing/parser.ml" + : (Parsetree.module_expr)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined4; + MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _5 : unit = Obj.magic _5 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in + let _1_inlined3 : (string Asttypes.loc option) = Obj.magic _1_inlined3 in + let _1_inlined2 : unit = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__5_ in + let _v = + let _4 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined2_, _1_inlined4, _1_inlined3) in + let _1 = + let _3 = + let xs = + let xs = +# 264 "" + ( List.rev xs ) +# 40651 "parsing/parser.ml" + in + +# 1188 "parsing/parser.mly" + ( xs ) +# 40656 "parsing/parser.ml" + + in + +# 2783 "parsing/parser.mly" + ( xs ) +# 40662 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +# 4286 "parsing/parser.mly" + ( _1 ) +# 40673 "parsing/parser.ml" + + in + +# 4299 "parsing/parser.mly" + ( _1, _2 ) +# 40679 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2299 "parsing/parser.mly" + ( let loc = make_loc _sloc in + let cases = _3 in + (* There are two choices of where to put attributes: on the + Pexp_function node; on the Pfunction_cases body. We put them on the + Pexp_function node here because the compiler only uses + Pfunction_cases attributes for enabling/disabling warnings in + typechecking. For standalone function cases, we want the compiler to + respect, e.g., [@inline] attributes. + *) + let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in + mkexp_attrs ~loc:_sloc desc _2 + ) +# 40699 "parsing/parser.ml" + + in + +# 2440 "parsing/parser.mly" + ( _1 ) +# 40705 "parsing/parser.ml" + + in + let _3 = + let _1 = _1_inlined1 in + +# 4286 "parsing/parser.mly" + ( _1 ) +# 40713 "parsing/parser.ml" + + in + let _loc__5_ = (_startpos__5_, _endpos__5_) in + let _loc__1_ = (_startpos__1_, _endpos__1_) in + ( +# 1462 "parsing/parser.mly" + ( unclosed "(" _loc__1_ ")" _loc__5_ ) +# 40721 "parsing/parser.ml" + : (Parsetree.module_expr)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (Longident.t) = +# 1363 "parsing/parser.mly" + ( _1 ) +# 40754 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (Longident.t) = +# 1348 "parsing/parser.mly" + ( _1 ) +# 40786 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.core_type) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (Parsetree.core_type) = +# 1323 "parsing/parser.mly" + ( _1 ) +# 40818 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.expression) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (Parsetree.expression) = +# 1328 "parsing/parser.mly" + ( _1 ) +# 40850 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (Longident.t) = +# 1353 "parsing/parser.mly" + ( _1 ) +# 40882 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (Longident.t) = +# 1358 "parsing/parser.mly" + ( _1 ) +# 40914 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.module_expr) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (Parsetree.module_expr) = +# 1318 "parsing/parser.mly" + ( _1 ) +# 40946 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.module_type) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (Parsetree.module_type) = +# 1313 "parsing/parser.mly" + ( _1 ) +# 40978 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (Longident.t) = +# 1338 "parsing/parser.mly" + ( _1 ) +# 41010 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (Parsetree.pattern) = +# 1333 "parsing/parser.mly" + ( _1 ) +# 41042 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (Longident.t) = +# 1343 "parsing/parser.mly" + ( _1 ) +# 41074 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : (Parsetree.pattern) = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v = + let _1 = + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _loc__2_ = (_startpos__2_, _endpos__2_) in + let _sloc = (_symbolstartpos, _endpos) in + +# 2980 "parsing/parser.mly" + ( mkpat_cons ~loc:_sloc _loc__2_ + (ghpat ~loc:_sloc (Ppat_tuple ([None, _1; None, _3], Closed))) ) +# 41120 "parsing/parser.ml" + + in + ( +# 2966 "parsing/parser.mly" + ( _1 ) +# 41126 "parsing/parser.ml" + : (Parsetree.pattern)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _2 : (Parsetree.attribute) = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v = + let _1 = +# 2983 "parsing/parser.mly" + ( Pat.attr _1 _2 ) +# 41160 "parsing/parser.ml" + in + ( +# 2966 "parsing/parser.mly" + ( _1 ) +# 41165 "parsing/parser.ml" + : (Parsetree.pattern)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Parsetree.pattern) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v = + let _1 = +# 2985 "parsing/parser.mly" + ( _1 ) +# 41192 "parsing/parser.ml" + in + ( +# 2966 "parsing/parser.mly" + ( _1 ) +# 41197 "parsing/parser.ml" + : (Parsetree.pattern)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined1_ in + let _v = + let _1 = + let _1 = + let _1 = + let _3 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 972 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 41246 "parsing/parser.ml" + + in + +# 2988 "parsing/parser.mly" + ( Ppat_alias(_1, _3) ) +# 41252 "parsing/parser.ml" + + in + let _endpos__1_ = _endpos__1_inlined1_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1007 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +# 41262 "parsing/parser.ml" + + in + +# 2999 "parsing/parser.mly" + ( _1 ) +# 41268 "parsing/parser.ml" + + in + ( +# 2966 "parsing/parser.mly" + ( _1 ) +# 41274 "parsing/parser.ml" + : (Parsetree.pattern)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v = + let _1 = + let _1 = + let _1 = + let _loc__3_ = (_startpos__3_, _endpos__3_) in + +# 2990 "parsing/parser.mly" + ( expecting _loc__3_ "identifier" ) +# 41319 "parsing/parser.ml" + + in + let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1007 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +# 41329 "parsing/parser.ml" + + in + +# 2999 "parsing/parser.mly" + ( _1 ) +# 41335 "parsing/parser.ml" + + in + ( +# 2966 "parsing/parser.mly" + ( _1 ) +# 41341 "parsing/parser.ml" + : (Parsetree.pattern)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Parsetree.pattern_desc) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v = + let _1 = + let _1 = + let _1 = +# 2992 "parsing/parser.mly" + ( _1 ) +# 41370 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1007 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +# 41378 "parsing/parser.ml" + + in + +# 2999 "parsing/parser.mly" + ( _1 ) +# 41384 "parsing/parser.ml" + + in + ( +# 2966 "parsing/parser.mly" + ( _1 ) +# 41390 "parsing/parser.ml" + : (Parsetree.pattern)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v = + let _1 = + let _1 = + let _1 = + let _loc__3_ = (_startpos__3_, _endpos__3_) in + +# 2994 "parsing/parser.mly" + ( expecting _loc__3_ "pattern" ) +# 41435 "parsing/parser.ml" + + in + let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1007 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +# 41445 "parsing/parser.ml" + + in + +# 2999 "parsing/parser.mly" + ( _1 ) +# 41451 "parsing/parser.ml" + + in + ( +# 2966 "parsing/parser.mly" + ( _1 ) +# 41457 "parsing/parser.ml" + : (Parsetree.pattern)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : (Parsetree.pattern) = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v = + let _1 = + let _1 = + let _1 = +# 2996 "parsing/parser.mly" + ( Ppat_or(_1, _3) ) +# 41500 "parsing/parser.ml" + in + let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1007 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +# 41509 "parsing/parser.ml" + + in + +# 2999 "parsing/parser.mly" + ( _1 ) +# 41515 "parsing/parser.ml" + + in + ( +# 2966 "parsing/parser.mly" + ( _1 ) +# 41521 "parsing/parser.ml" + : (Parsetree.pattern)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v = + let _1 = + let _1 = + let _1 = + let _loc__3_ = (_startpos__3_, _endpos__3_) in + +# 2998 "parsing/parser.mly" + ( expecting _loc__3_ "pattern" ) +# 41566 "parsing/parser.ml" + + in + let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1007 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +# 41576 "parsing/parser.ml" + + in + +# 2999 "parsing/parser.mly" + ( _1 ) +# 41582 "parsing/parser.ml" + + in + ( +# 2966 "parsing/parser.mly" + ( _1 ) +# 41588 "parsing/parser.ml" + : (Parsetree.pattern)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let _3 : (Parsetree.pattern) = Obj.magic _3 in + let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v = + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +# 4286 "parsing/parser.mly" + ( _1 ) +# 41640 "parsing/parser.ml" + + in + +# 4299 "parsing/parser.mly" + ( _1, _2 ) +# 41646 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + ( +# 2968 "parsing/parser.mly" + ( mkpat_attrs ~loc:_sloc (Ppat_exception _3) _2) +# 41655 "parsing/parser.ml" + : (Parsetree.pattern)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let _4 : (Parsetree.pattern) = Obj.magic _4 in + let _3 : unit = Obj.magic _3 in + let _2 : (Parsetree.pattern) = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__4_ in + let _v = + let _endpos = _endpos__4_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + ( +# 2970 "parsing/parser.mly" + ( mkpat ~loc:_sloc (Ppat_effect(_2,_4)) ) +# 41706 "parsing/parser.ml" + : (Parsetree.pattern)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Parsetree.pattern) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.pattern) = +# 3004 "parsing/parser.mly" + ( _1 ) +# 41732 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _2 : (Parsetree.pattern) = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v = + let _1 = + let _1 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 972 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 41771 "parsing/parser.ml" + + in + +# 3007 "parsing/parser.mly" + ( Ppat_construct(_1, Some ([], _2)) ) +# 41777 "parsing/parser.ml" + in - let _endpos_ty2_ = _endpos__1_inlined2_ in - let ty1 = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _endpos__1_ = _endpos__2_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1007 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +# 41787 "parsing/parser.ml" + + in + ( +# 3013 "parsing/parser.mly" + ( _1 ) +# 41793 "parsing/parser.ml" + : (Parsetree.pattern)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = pat; + MenhirLib.EngineTypes.startp = _startpos_pat_; + MenhirLib.EngineTypes.endp = _endpos_pat_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + } = _menhir_stack in + let pat : (Parsetree.pattern) = Obj.magic pat in + let _5 : unit = Obj.magic _5 in + let xs : (string Asttypes.loc list) = Obj.magic xs in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos_pat_ in + let _v = + let _1 = + let _1 = + let newtypes = +# 2664 "parsing/parser.mly" + ( xs ) +# 41857 "parsing/parser.ml" + in + let constr = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 972 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 41866 "parsing/parser.ml" + + in + +# 3010 "parsing/parser.mly" + ( Ppat_construct(constr, Some (newtypes, pat)) ) +# 41872 "parsing/parser.ml" + + in + let _endpos__1_ = _endpos_pat_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1007 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +# 41882 "parsing/parser.ml" + + in + ( +# 3013 "parsing/parser.mly" + ( _1 ) +# 41888 "parsing/parser.ml" + : (Parsetree.pattern)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _2 : (Parsetree.pattern) = Obj.magic _2 in + let _1 : (Asttypes.label) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v = + let _1 = + let _1 = +# 3012 "parsing/parser.mly" + ( Ppat_variant(_1, Some _2) ) +# 41923 "parsing/parser.ml" + in + let _endpos__1_ = _endpos__2_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1007 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +# 41932 "parsing/parser.ml" + + in + ( +# 3013 "parsing/parser.mly" + ( _1 ) +# 41938 "parsing/parser.ml" + : (Parsetree.pattern)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + } = _menhir_stack in + let _3 : (Parsetree.pattern) = Obj.magic _3 in + let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v = + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +# 4286 "parsing/parser.mly" + ( _1 ) +# 41990 "parsing/parser.ml" + + in + +# 4299 "parsing/parser.mly" + ( _1, _2 ) +# 41996 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + ( +# 3015 "parsing/parser.mly" + ( mkpat_attrs ~loc:_sloc (Ppat_lazy _3) _2) +# 42005 "parsing/parser.ml" + : (Parsetree.pattern)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : (Parsetree.pattern) = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v = + let _1 = + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _loc__2_ = (_startpos__2_, _endpos__2_) in + let _sloc = (_symbolstartpos, _endpos) in + +# 2980 "parsing/parser.mly" + ( mkpat_cons ~loc:_sloc _loc__2_ + (ghpat ~loc:_sloc (Ppat_tuple ([None, _1; None, _3], Closed))) ) +# 42052 "parsing/parser.ml" + + in + ( +# 2975 "parsing/parser.mly" + ( _1 ) +# 42058 "parsing/parser.ml" + : (Parsetree.pattern)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _2 : (Parsetree.attribute) = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v = + let _1 = +# 2983 "parsing/parser.mly" + ( Pat.attr _1 _2 ) +# 42092 "parsing/parser.ml" + in + ( +# 2975 "parsing/parser.mly" + ( _1 ) +# 42097 "parsing/parser.ml" + : (Parsetree.pattern)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Parsetree.pattern) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v = + let _1 = +# 2985 "parsing/parser.mly" + ( _1 ) +# 42124 "parsing/parser.ml" + in + ( +# 2975 "parsing/parser.mly" + ( _1 ) +# 42129 "parsing/parser.ml" + : (Parsetree.pattern)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined1_ in + let _v = + let _1 = + let _1 = + let _1 = + let _3 = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 972 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 42178 "parsing/parser.ml" + + in + +# 2988 "parsing/parser.mly" + ( Ppat_alias(_1, _3) ) +# 42184 "parsing/parser.ml" + + in + let _endpos__1_ = _endpos__1_inlined1_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3691 "parsing/parser.mly" - ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in - let descr = Ptyp_package (lid, cstrs) in - mktyp ~loc:_sloc ~attrs descr ) -# 35623 "parsing/parser.ml" +# 1007 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +# 42194 "parsing/parser.ml" in - let e = - let _1 = -# 2309 "parsing/parser.mly" + +# 2999 "parsing/parser.mly" + ( _1 ) +# 42200 "parsing/parser.ml" + + in + ( +# 2975 "parsing/parser.mly" + ( _1 ) +# 42206 "parsing/parser.ml" + : (Parsetree.pattern)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v = + let _1 = + let _1 = + let _1 = + let _loc__3_ = (_startpos__3_, _endpos__3_) in + +# 2990 "parsing/parser.mly" + ( expecting _loc__3_ "identifier" ) +# 42251 "parsing/parser.ml" + + in + let _endpos__1_ = _endpos__3_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1007 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +# 42261 "parsing/parser.ml" + + in + +# 2999 "parsing/parser.mly" + ( _1 ) +# 42267 "parsing/parser.ml" + + in + ( +# 2975 "parsing/parser.mly" ( _1 ) -# 35630 "parsing/parser.ml" +# 42273 "parsing/parser.ml" + : (Parsetree.pattern)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Parsetree.pattern_desc) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v = + let _1 = + let _1 = + let _1 = +# 2992 "parsing/parser.mly" + ( _1 ) +# 42302 "parsing/parser.ml" in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2453 "parsing/parser.mly" - ( _1 ) -# 35635 "parsing/parser.ml" +# 1007 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +# 42310 "parsing/parser.ml" in - let _startpos_e_ = _startpos__1_ in - let _endpos = _endpos_ty2_ in - let _startpos = _startpos_e_ in - let _loc = (_startpos, _endpos) in - -# 1485 "parsing/parser.mly" - ( ghexp ~loc:_loc (Pexp_coerce (e, Some ty1, ty2)) ) -# 35645 "parsing/parser.ml" - in - let attrs = - let _1 = _1_inlined1 in - -# 4114 "parsing/parser.mly" +# 2999 "parsing/parser.mly" ( _1 ) -# 35653 "parsing/parser.ml" +# 42316 "parsing/parser.ml" in - let _endpos = _endpos__5_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in ( -# 1468 "parsing/parser.mly" - ( mkmod ~loc:_sloc ~attrs (Pmod_unpack e) ) -# 35662 "parsing/parser.ml" - : (Parsetree.module_expr)) +# 2975 "parsing/parser.mly" + ( _1 ) +# 42322 "parsing/parser.ml" + : (Parsetree.pattern)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -35672,212 +42332,125 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined6; - MenhirLib.EngineTypes.startp = _startpos__1_inlined6_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined6_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined5; - MenhirLib.EngineTypes.startp = _startpos__1_inlined5_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined5_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2_inlined1; - MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined4; - MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in - let _5 : unit = Obj.magic _5 in - let _1_inlined6 : (Parsetree.module_type) = Obj.magic _1_inlined6 in - let _4 : unit = Obj.magic _4 in - let _1_inlined5 : (Parsetree.module_type) = Obj.magic _1_inlined5 in - let _2_inlined1 : unit = Obj.magic _2_inlined1 in - let xs : (Parsetree.case list) = Obj.magic xs in - let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in - let _1_inlined3 : (string Asttypes.loc option) = Obj.magic _1_inlined3 in - let _1_inlined2 : unit = Obj.magic _1_inlined2 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _3 : unit = Obj.magic _3 in let _2 : unit = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in + let _endpos = _endpos__3_ in let _v = - let e = - let (_endpos__1_inlined4_, _startpos__1_inlined4_, _endpos__1_inlined3_, _startpos__1_inlined3_, _startpos__1_, _1_inlined4, _1_inlined3, _1_inlined2, _1_inlined1) = (_endpos__1_inlined6_, _startpos__1_inlined6_, _endpos__1_inlined5_, _startpos__1_inlined5_, _startpos__1_inlined2_, _1_inlined6, _1_inlined5, _1_inlined4, _1_inlined3) in - let ty2 = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined4_, _startpos__1_inlined4_, _1_inlined4) in + let _1 = + let _1 = + let _1 = + let _loc__3_ = (_startpos__3_, _endpos__3_) in + +# 2994 "parsing/parser.mly" + ( expecting _loc__3_ "pattern" ) +# 42367 "parsing/parser.ml" + + in + let _endpos__1_ = _endpos__3_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3691 "parsing/parser.mly" - ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in - let descr = Ptyp_package (lid, cstrs) in - mktyp ~loc:_sloc ~attrs descr ) -# 35775 "parsing/parser.ml" +# 1007 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +# 42377 "parsing/parser.ml" in - let _endpos_ty2_ = _endpos__1_inlined4_ in - let ty1 = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in + +# 2999 "parsing/parser.mly" + ( _1 ) +# 42383 "parsing/parser.ml" + + in + ( +# 2975 "parsing/parser.mly" + ( _1 ) +# 42389 "parsing/parser.ml" + : (Parsetree.pattern)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let _3 : (Parsetree.pattern) = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v = + let _1 = + let _1 = + let _1 = +# 2996 "parsing/parser.mly" + ( Ppat_or(_1, _3) ) +# 42432 "parsing/parser.ml" + in + let _endpos__1_ = _endpos__3_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3691 "parsing/parser.mly" - ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in - let descr = Ptyp_package (lid, cstrs) in - mktyp ~loc:_sloc ~attrs descr ) -# 35789 "parsing/parser.ml" - - in - let e = - let _1 = - let _3 = - let xs = - let xs = -# 264 "" - ( List.rev xs ) -# 35799 "parsing/parser.ml" - in - -# 1200 "parsing/parser.mly" - ( xs ) -# 35804 "parsing/parser.ml" - - in - -# 2798 "parsing/parser.mly" - ( xs ) -# 35810 "parsing/parser.ml" - - in - let _endpos__3_ = _endpos_xs_ in - let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4114 "parsing/parser.mly" - ( _1 ) -# 35821 "parsing/parser.ml" - - in - -# 4127 "parsing/parser.mly" - ( _1, _2 ) -# 35827 "parsing/parser.ml" - - in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2311 "parsing/parser.mly" - ( let loc = make_loc _sloc in - let cases = _3 in - (* There are two choices of where to put attributes: on the - Pexp_function node; on the Pfunction_cases body. We put them on the - Pexp_function node here because the compiler only uses - Pfunction_cases attributes for enabling/disabling warnings in - typechecking. For standalone function cases, we want the compiler to - respect, e.g., [@inline] attributes. - *) - let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in - mkexp_attrs ~loc:_sloc desc _2 - ) -# 35847 "parsing/parser.ml" - - in - -# 2453 "parsing/parser.mly" - ( _1 ) -# 35853 "parsing/parser.ml" +# 1007 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +# 42441 "parsing/parser.ml" in - let _startpos_e_ = _startpos__1_ in - let _endpos = _endpos_ty2_ in - let _startpos = _startpos_e_ in - let _loc = (_startpos, _endpos) in - -# 1485 "parsing/parser.mly" - ( ghexp ~loc:_loc (Pexp_coerce (e, Some ty1, ty2)) ) -# 35863 "parsing/parser.ml" - - in - let attrs = - let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 2999 "parsing/parser.mly" ( _1 ) -# 35871 "parsing/parser.ml" +# 42447 "parsing/parser.ml" in - let _endpos = _endpos__5_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in ( -# 1468 "parsing/parser.mly" - ( mkmod ~loc:_sloc ~attrs (Pmod_unpack e) ) -# 35880 "parsing/parser.ml" - : (Parsetree.module_expr)) +# 2975 "parsing/parser.mly" + ( _1 ) +# 42453 "parsing/parser.ml" + : (Parsetree.pattern)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -35890,112 +42463,161 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2_inlined1; - MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in - let _5 : unit = Obj.magic _5 in - let _1_inlined3 : (Parsetree.module_type) = Obj.magic _1_inlined3 in - let _2_inlined1 : unit = Obj.magic _2_inlined1 in - let _1_inlined2 : (Parsetree.expression) = Obj.magic _1_inlined2 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _3 : unit = Obj.magic _3 in let _2 : unit = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in + let _endpos = _endpos__3_ in let _v = - let e = - let (_endpos__1_inlined1_, _startpos__1_inlined1_, _startpos__1_, _1_inlined1, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _startpos__1_inlined2_, _1_inlined3, _1_inlined2) in - let ty2 = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _1 = + let _1 = + let _1 = + let _loc__3_ = (_startpos__3_, _endpos__3_) in + +# 2998 "parsing/parser.mly" + ( expecting _loc__3_ "pattern" ) +# 42498 "parsing/parser.ml" + + in + let _endpos__1_ = _endpos__3_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3691 "parsing/parser.mly" - ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in - let descr = Ptyp_package (lid, cstrs) in - mktyp ~loc:_sloc ~attrs descr ) -# 35958 "parsing/parser.ml" +# 1007 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +# 42508 "parsing/parser.ml" in - let _endpos_ty2_ = _endpos__1_inlined1_ in - let e = - let _1 = -# 2309 "parsing/parser.mly" + +# 2999 "parsing/parser.mly" + ( _1 ) +# 42514 "parsing/parser.ml" + + in + ( +# 2975 "parsing/parser.mly" ( _1 ) -# 35966 "parsing/parser.ml" - in +# 42520 "parsing/parser.ml" + : (Parsetree.pattern)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : ( +# 785 "parsing/parser.mly" + (string) +# 42542 "parsing/parser.ml" + ) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v = + let _1 = + let _1 = + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 972 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 42557 "parsing/parser.ml" + + in -# 2453 "parsing/parser.mly" - ( _1 ) -# 35971 "parsing/parser.ml" +# 2356 "parsing/parser.mly" + ( Ppat_var _1 ) +# 42563 "parsing/parser.ml" in - let _startpos_e_ = _startpos__1_ in - let _endpos = _endpos_ty2_ in - let _startpos = _startpos_e_ in - let _loc = (_startpos, _endpos) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 1487 "parsing/parser.mly" - ( ghexp ~loc:_loc (Pexp_coerce (e, None, ty2)) ) -# 35981 "parsing/parser.ml" +# 1007 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +# 42572 "parsing/parser.ml" in - let attrs = - let _1 = _1_inlined1 in - -# 4114 "parsing/parser.mly" + ( +# 2358 "parsing/parser.mly" ( _1 ) -# 35989 "parsing/parser.ml" +# 42578 "parsing/parser.ml" + : (Parsetree.pattern)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v = + let _1 = + let _1 = +# 2357 "parsing/parser.mly" + ( Ppat_any ) +# 42606 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1007 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +# 42614 "parsing/parser.ml" in - let _endpos = _endpos__5_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in ( -# 1468 "parsing/parser.mly" - ( mkmod ~loc:_sloc ~attrs (Pmod_unpack e) ) -# 35998 "parsing/parser.ml" - : (Parsetree.module_expr)) +# 2358 "parsing/parser.mly" + ( _1 ) +# 42620 "parsing/parser.ml" + : (Parsetree.pattern)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36004,190 +42626,120 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos; MenhirLib.EngineTypes.next = _menhir_stack; }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Parsetree.structure) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.payload) = +# 4312 "parsing/parser.mly" + ( PStr _1 ) +# 42646 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _2 : (Parsetree.signature) = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (Parsetree.payload) = +# 4313 "parsing/parser.mly" + ( PSig _2 ) +# 42678 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + } = _menhir_stack in + let _2 : (Parsetree.core_type) = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__2_ in + let _v : (Parsetree.payload) = +# 4314 "parsing/parser.mly" + ( PTyp _2 ) +# 42710 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined5; - MenhirLib.EngineTypes.startp = _startpos__1_inlined5_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined5_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2_inlined1; - MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined4; - MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _5 : unit = Obj.magic _5 in - let _1_inlined5 : (Parsetree.module_type) = Obj.magic _1_inlined5 in - let _2_inlined1 : unit = Obj.magic _2_inlined1 in - let xs : (Parsetree.case list) = Obj.magic xs in - let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in - let _1_inlined3 : (string Asttypes.loc option) = Obj.magic _1_inlined3 in - let _1_inlined2 : unit = Obj.magic _1_inlined2 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let _2 : unit = Obj.magic _2 in + let _2 : (Parsetree.pattern) = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in - let _v = - let e = - let (_endpos__1_inlined3_, _startpos__1_inlined3_, _startpos__1_, _1_inlined3, _1_inlined2, _1_inlined1) = (_endpos__1_inlined5_, _startpos__1_inlined5_, _startpos__1_inlined2_, _1_inlined5, _1_inlined4, _1_inlined3) in - let ty2 = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 3691 "parsing/parser.mly" - ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in - let descr = Ptyp_package (lid, cstrs) in - mktyp ~loc:_sloc ~attrs descr ) -# 36097 "parsing/parser.ml" - - in - let _endpos_ty2_ = _endpos__1_inlined3_ in - let e = - let _1 = - let _3 = - let xs = - let xs = -# 264 "" - ( List.rev xs ) -# 36108 "parsing/parser.ml" - in - -# 1200 "parsing/parser.mly" - ( xs ) -# 36113 "parsing/parser.ml" - - in - -# 2798 "parsing/parser.mly" - ( xs ) -# 36119 "parsing/parser.ml" - - in - let _endpos__3_ = _endpos_xs_ in - let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4114 "parsing/parser.mly" - ( _1 ) -# 36130 "parsing/parser.ml" - - in - -# 4127 "parsing/parser.mly" - ( _1, _2 ) -# 36136 "parsing/parser.ml" - - in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2311 "parsing/parser.mly" - ( let loc = make_loc _sloc in - let cases = _3 in - (* There are two choices of where to put attributes: on the - Pexp_function node; on the Pfunction_cases body. We put them on the - Pexp_function node here because the compiler only uses - Pfunction_cases attributes for enabling/disabling warnings in - typechecking. For standalone function cases, we want the compiler to - respect, e.g., [@inline] attributes. - *) - let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in - mkexp_attrs ~loc:_sloc desc _2 - ) -# 36156 "parsing/parser.ml" - - in - -# 2453 "parsing/parser.mly" - ( _1 ) -# 36162 "parsing/parser.ml" - - in - let _startpos_e_ = _startpos__1_ in - let _endpos = _endpos_ty2_ in - let _startpos = _startpos_e_ in - let _loc = (_startpos, _endpos) in - -# 1487 "parsing/parser.mly" - ( ghexp ~loc:_loc (Pexp_coerce (e, None, ty2)) ) -# 36172 "parsing/parser.ml" - - in - let attrs = - let _1 = _1_inlined1 in - -# 4114 "parsing/parser.mly" - ( _1 ) -# 36180 "parsing/parser.ml" - - in - let _endpos = _endpos__5_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - ( -# 1468 "parsing/parser.mly" - ( mkmod ~loc:_sloc ~attrs (Pmod_unpack e) ) -# 36189 "parsing/parser.ml" - : (Parsetree.module_expr)) - in + let _endpos = _endpos__2_ in + let _v : (Parsetree.payload) = +# 4315 "parsing/parser.mly" + ( PPat (_2, None) ) +# 42742 "parsing/parser.ml" + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -36199,80 +42751,66 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _6; - MenhirLib.EngineTypes.startp = _startpos__6_; - MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; } = _menhir_stack in - let _6 : unit = Obj.magic _6 in - let _5 : unit = Obj.magic _5 in - let _1_inlined2 : (Parsetree.expression) = Obj.magic _1_inlined2 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let _2 : unit = Obj.magic _2 in + let _4 : (Parsetree.expression) = Obj.magic _4 in + let _3 : unit = Obj.magic _3 in + let _2 : (Parsetree.pattern) = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__6_ in - let _v = - let _4 = - let _1 = _1_inlined2 in - let _1 = -# 2309 "parsing/parser.mly" - ( _1 ) -# 36253 "parsing/parser.ml" - in - -# 2453 "parsing/parser.mly" - ( _1 ) -# 36258 "parsing/parser.ml" - - in - let _3 = - let _1 = _1_inlined1 in - -# 4114 "parsing/parser.mly" + let _endpos = _endpos__4_ in + let _v : (Parsetree.payload) = +# 4316 "parsing/parser.mly" + ( PPat (_2, Some _4) ) +# 42788 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Parsetree.core_type) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.core_type) = +# 3598 "parsing/parser.mly" ( _1 ) -# 36266 "parsing/parser.ml" - - in - let _loc__6_ = (_startpos__6_, _endpos__6_) in - let _loc__1_ = (_startpos__1_, _endpos__1_) in - ( -# 1470 "parsing/parser.mly" - ( unclosed "(" _loc__1_ ")" _loc__6_ ) -# 36274 "parsing/parser.ml" - : (Parsetree.module_expr)) - in +# 42813 "parsing/parser.ml" + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -36284,152 +42822,72 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _6; - MenhirLib.EngineTypes.startp = _startpos__6_; - MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = xs; MenhirLib.EngineTypes.startp = _startpos_xs_; MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined4; - MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; - }; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in - let _6 : unit = Obj.magic _6 in - let _5 : unit = Obj.magic _5 in - let xs : (Parsetree.case list) = Obj.magic xs in - let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in - let _1_inlined3 : (string Asttypes.loc option) = Obj.magic _1_inlined3 in - let _1_inlined2 : unit = Obj.magic _1_inlined2 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _3 : (Parsetree.core_type) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in + let xs : (Asttypes.label Asttypes.loc list) = Obj.magic xs in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__6_ in + let _startpos = _startpos_xs_ in + let _endpos = _endpos__3_ in let _v = - let _4 = - let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined2_, _1_inlined4, _1_inlined3) in + let _1 = let _1 = - let _3 = - let xs = + let _1 = + let _1 = let xs = # 264 "" ( List.rev xs ) -# 36362 "parsing/parser.ml" +# 42857 "parsing/parser.ml" in -# 1200 "parsing/parser.mly" +# 1074 "parsing/parser.mly" ( xs ) -# 36367 "parsing/parser.ml" +# 42862 "parsing/parser.ml" in -# 2798 "parsing/parser.mly" - ( xs ) -# 36373 "parsing/parser.ml" - - in - let _endpos__3_ = _endpos_xs_ in - let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4114 "parsing/parser.mly" +# 3590 "parsing/parser.mly" ( _1 ) -# 36384 "parsing/parser.ml" - - in - -# 4127 "parsing/parser.mly" - ( _1, _2 ) -# 36390 "parsing/parser.ml" +# 42868 "parsing/parser.ml" in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2311 "parsing/parser.mly" - ( let loc = make_loc _sloc in - let cases = _3 in - (* There are two choices of where to put attributes: on the - Pexp_function node; on the Pfunction_cases body. We put them on the - Pexp_function node here because the compiler only uses - Pfunction_cases attributes for enabling/disabling warnings in - typechecking. For standalone function cases, we want the compiler to - respect, e.g., [@inline] attributes. - *) - let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in - mkexp_attrs ~loc:_sloc desc _2 - ) -# 36410 "parsing/parser.ml" +# 3594 "parsing/parser.mly" + ( Ptyp_poly(_1, _3) ) +# 42874 "parsing/parser.ml" in + let (_endpos__1_, _startpos__1_) = (_endpos__3_, _startpos_xs_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2453 "parsing/parser.mly" - ( _1 ) -# 36416 "parsing/parser.ml" - - in - let _3 = - let _1 = _1_inlined1 in - -# 4114 "parsing/parser.mly" - ( _1 ) -# 36424 "parsing/parser.ml" +# 1009 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +# 42884 "parsing/parser.ml" in - let _loc__6_ = (_startpos__6_, _endpos__6_) in - let _loc__1_ = (_startpos__1_, _endpos__1_) in ( -# 1470 "parsing/parser.mly" - ( unclosed "(" _loc__1_ ")" _loc__6_ ) -# 36432 "parsing/parser.ml" - : (Parsetree.module_expr)) +# 3600 "parsing/parser.mly" + ( _1 ) +# 42890 "parsing/parser.ml" + : (Parsetree.core_type)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36441,80 +42899,27 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _6; - MenhirLib.EngineTypes.startp = _startpos__6_; - MenhirLib.EngineTypes.endp = _endpos__6_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _6 : unit = Obj.magic _6 in - let _5 : unit = Obj.magic _5 in - let _1_inlined2 : (Parsetree.expression) = Obj.magic _1_inlined2 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let _2 : unit = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in + let _1 : (Parsetree.core_type) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__6_ in + let _endpos = _endpos__1_ in let _v = - let _4 = - let _1 = _1_inlined2 in - let _1 = -# 2309 "parsing/parser.mly" - ( _1 ) -# 36496 "parsing/parser.ml" - in - -# 2453 "parsing/parser.mly" - ( _1 ) -# 36501 "parsing/parser.ml" - - in - let _3 = - let _1 = _1_inlined1 in - -# 4114 "parsing/parser.mly" + let _1 = +# 3629 "parsing/parser.mly" ( _1 ) -# 36509 "parsing/parser.ml" - - in - let _loc__6_ = (_startpos__6_, _endpos__6_) in - let _loc__1_ = (_startpos__1_, _endpos__1_) in +# 42917 "parsing/parser.ml" + in ( -# 1472 "parsing/parser.mly" - ( unclosed "(" _loc__1_ ")" _loc__6_ ) -# 36517 "parsing/parser.ml" - : (Parsetree.module_expr)) +# 3598 "parsing/parser.mly" + ( _1 ) +# 42922 "parsing/parser.ml" + : (Parsetree.core_type)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36527,152 +42932,77 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _6; - MenhirLib.EngineTypes.startp = _startpos__6_; - MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined4; - MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; - }; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in - let _6 : unit = Obj.magic _6 in - let _5 : unit = Obj.magic _5 in - let xs : (Parsetree.case list) = Obj.magic xs in - let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in - let _1_inlined3 : (string Asttypes.loc option) = Obj.magic _1_inlined3 in - let _1_inlined2 : unit = Obj.magic _1_inlined2 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let _1 : (Parsetree.core_type) = Obj.magic _1 in let _2 : unit = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in + let xs : (Asttypes.label Asttypes.loc list) = Obj.magic xs in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__6_ in + let _startpos = _startpos_xs_ in + let _endpos = _endpos__1_ in let _v = - let _4 = - let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined2_, _1_inlined4, _1_inlined3) in + let _1 = let _1 = - let _3 = - let xs = + let _3 = +# 3629 "parsing/parser.mly" + ( _1 ) +# 42965 "parsing/parser.ml" + in + let _1 = + let _1 = let xs = # 264 "" ( List.rev xs ) -# 36605 "parsing/parser.ml" +# 42972 "parsing/parser.ml" in -# 1200 "parsing/parser.mly" +# 1074 "parsing/parser.mly" ( xs ) -# 36610 "parsing/parser.ml" +# 42977 "parsing/parser.ml" in -# 2798 "parsing/parser.mly" - ( xs ) -# 36616 "parsing/parser.ml" - - in - let _endpos__3_ = _endpos_xs_ in - let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4114 "parsing/parser.mly" +# 3590 "parsing/parser.mly" ( _1 ) -# 36627 "parsing/parser.ml" - - in - -# 4127 "parsing/parser.mly" - ( _1, _2 ) -# 36633 "parsing/parser.ml" +# 42983 "parsing/parser.ml" in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2311 "parsing/parser.mly" - ( let loc = make_loc _sloc in - let cases = _3 in - (* There are two choices of where to put attributes: on the - Pexp_function node; on the Pfunction_cases body. We put them on the - Pexp_function node here because the compiler only uses - Pfunction_cases attributes for enabling/disabling warnings in - typechecking. For standalone function cases, we want the compiler to - respect, e.g., [@inline] attributes. - *) - let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in - mkexp_attrs ~loc:_sloc desc _2 - ) -# 36653 "parsing/parser.ml" +# 3594 "parsing/parser.mly" + ( Ptyp_poly(_1, _3) ) +# 42989 "parsing/parser.ml" in + let _startpos__1_ = _startpos_xs_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2453 "parsing/parser.mly" - ( _1 ) -# 36659 "parsing/parser.ml" - - in - let _3 = - let _1 = _1_inlined1 in - -# 4114 "parsing/parser.mly" - ( _1 ) -# 36667 "parsing/parser.ml" +# 1009 "parsing/parser.mly" + ( mktyp ~loc:_sloc _1 ) +# 42999 "parsing/parser.ml" in - let _loc__6_ = (_startpos__6_, _endpos__6_) in - let _loc__1_ = (_startpos__1_, _endpos__1_) in ( -# 1472 "parsing/parser.mly" - ( unclosed "(" _loc__1_ ")" _loc__6_ ) -# 36675 "parsing/parser.ml" - : (Parsetree.module_expr)) +# 3600 "parsing/parser.mly" + ( _1 ) +# 43005 "parsing/parser.ml" + : (Parsetree.core_type)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36685,72 +43015,45 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; } = _menhir_stack in - let _5 : unit = Obj.magic _5 in - let _1_inlined2 : (Parsetree.expression) = Obj.magic _1_inlined2 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let _2 : unit = Obj.magic _2 in + let _4 : unit = Obj.magic _4 in + let _3 : (Parsetree.payload) = Obj.magic _3 in + let _2 : (Ast_helper.str) = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in + let _endpos = _endpos__4_ in let _v = - let _4 = - let _1 = _1_inlined2 in - let _1 = -# 2309 "parsing/parser.mly" - ( _1 ) -# 36732 "parsing/parser.ml" - in - -# 2453 "parsing/parser.mly" - ( _1 ) -# 36737 "parsing/parser.ml" - - in - let _3 = - let _1 = _1_inlined1 in - -# 4114 "parsing/parser.mly" - ( _1 ) -# 36745 "parsing/parser.ml" - - in - let _loc__5_ = (_startpos__5_, _endpos__5_) in - let _loc__1_ = (_startpos__1_, _endpos__1_) in + let _endpos = _endpos__4_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in ( -# 1474 "parsing/parser.mly" - ( unclosed "(" _loc__1_ ")" _loc__5_ ) -# 36753 "parsing/parser.ml" - : (Parsetree.module_expr)) +# 4273 "parsing/parser.mly" + ( mk_attr ~loc:(make_loc _sloc) _2 _3 ) +# 43056 "parsing/parser.ml" + : (Parsetree.attribute)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36763,45 +43066,51 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.semv = prim; + MenhirLib.EngineTypes.startp = _startpos_prim_; + MenhirLib.EngineTypes.endp = _endpos_prim_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined4; - MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.semv = _7; + MenhirLib.EngineTypes.startp = _startpos__7_; + MenhirLib.EngineTypes.endp = _endpos__7_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ext; + MenhirLib.EngineTypes.startp = _startpos_ext_; + MenhirLib.EngineTypes.endp = _endpos_ext_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; }; }; @@ -36810,98 +43119,84 @@ module Tables = struct }; }; } = _menhir_stack in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let prim : (string list) = Obj.magic prim in + let _7 : unit = Obj.magic _7 in + let ty : (Parsetree.core_type) = Obj.magic ty in let _5 : unit = Obj.magic _5 in - let xs : (Parsetree.case list) = Obj.magic xs in - let _1_inlined4 : (Parsetree.attributes) = Obj.magic _1_inlined4 in - let _1_inlined3 : (string Asttypes.loc option) = Obj.magic _1_inlined3 in - let _1_inlined2 : unit = Obj.magic _1_inlined2 in + let _1_inlined2 : (Asttypes.label) = Obj.magic _1_inlined2 in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let _2 : unit = Obj.magic _2 in + let ext : (string Asttypes.loc option) = Obj.magic ext in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in + let _endpos = _endpos__1_inlined3_ in let _v = - let _4 = - let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined2_, _1_inlined4, _1_inlined3) in - let _1 = - let _3 = - let xs = - let xs = -# 264 "" - ( List.rev xs ) -# 36834 "parsing/parser.ml" - in - -# 1200 "parsing/parser.mly" - ( xs ) -# 36839 "parsing/parser.ml" - - in - -# 2798 "parsing/parser.mly" - ( xs ) -# 36845 "parsing/parser.ml" - - in - let _endpos__3_ = _endpos_xs_ in - let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4114 "parsing/parser.mly" + let attrs2 = + let _1 = _1_inlined3 in + +# 4282 "parsing/parser.mly" ( _1 ) -# 36856 "parsing/parser.ml" - - in - -# 4127 "parsing/parser.mly" - ( _1, _2 ) -# 36862 "parsing/parser.ml" - - in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2311 "parsing/parser.mly" - ( let loc = make_loc _sloc in - let cases = _3 in - (* There are two choices of where to put attributes: on the - Pexp_function node; on the Pfunction_cases body. We put them on the - Pexp_function node here because the compiler only uses - Pfunction_cases attributes for enabling/disabling warnings in - typechecking. For standalone function cases, we want the compiler to - respect, e.g., [@inline] attributes. - *) - let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in - mkexp_attrs ~loc:_sloc desc _2 - ) -# 36882 "parsing/parser.ml" - - in +# 43141 "parsing/parser.ml" -# 2453 "parsing/parser.mly" - ( _1 ) -# 36888 "parsing/parser.ml" + in + let _endpos_attrs2_ = _endpos__1_inlined3_ in + let id = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 972 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 43153 "parsing/parser.ml" in - let _3 = + let attrs1 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 36896 "parsing/parser.ml" +# 43161 "parsing/parser.ml" in - let _loc__5_ = (_startpos__5_, _endpos__5_) in - let _loc__1_ = (_startpos__1_, _endpos__1_) in + let _endpos = _endpos_attrs2_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in ( -# 1474 "parsing/parser.mly" - ( unclosed "(" _loc__1_ ")" _loc__5_ ) -# 36904 "parsing/parser.ml" - : (Parsetree.module_expr)) +# 3219 "parsing/parser.mly" + ( let attrs = attrs1 @ attrs2 in + let loc = make_loc _sloc in + let docs = symbol_docs _sloc in + Val.mk id ty ~prim ~attrs ~loc ~docs, + ext ) +# 43174 "parsing/parser.ml" + : (Parsetree.value_description * string Asttypes.loc option)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v = + let _1 = +# 4140 "parsing/parser.mly" + ( Public ) +# 43194 "parsing/parser.ml" + in + ( +# 4137 "parsing/parser.mly" + ( _1 ) +# 43199 "parsing/parser.ml" + : (Asttypes.private_flag)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36913,27 +43208,45 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Longident.t) = -# 1375 "parsing/parser.mly" + let _endpos = _endpos__1_ in + let _v = + let _1 = +# 4141 "parsing/parser.mly" + ( Private ) +# 43226 "parsing/parser.ml" + in + ( +# 4137 "parsing/parser.mly" ( _1 ) -# 36937 "parsing/parser.ml" +# 43231 "parsing/parser.ml" + : (Asttypes.private_flag)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (Asttypes.private_flag * Asttypes.virtual_flag) = +# 4163 "parsing/parser.mly" + ( Public, Concrete ) +# 43250 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36945,27 +43258,20 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Longident.t) = -# 1360 "parsing/parser.mly" - ( _1 ) -# 36969 "parsing/parser.ml" + let _endpos = _endpos__1_ in + let _v : (Asttypes.private_flag * Asttypes.virtual_flag) = +# 4164 "parsing/parser.mly" + ( Private, Concrete ) +# 43275 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36977,27 +43283,20 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.core_type) = Obj.magic _1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Parsetree.core_type) = -# 1335 "parsing/parser.mly" - ( _1 ) -# 37001 "parsing/parser.ml" + let _endpos = _endpos__1_ in + let _v : (Asttypes.private_flag * Asttypes.virtual_flag) = +# 4165 "parsing/parser.mly" + ( Public, Virtual ) +# 43300 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37022,14 +43321,14 @@ module Tables = struct }; } = _menhir_stack in let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.expression) = Obj.magic _1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in - let _v : (Parsetree.expression) = -# 1340 "parsing/parser.mly" - ( _1 ) -# 37033 "parsing/parser.ml" + let _v : (Asttypes.private_flag * Asttypes.virtual_flag) = +# 4166 "parsing/parser.mly" + ( Private, Virtual ) +# 43332 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37054,14 +43353,32 @@ module Tables = struct }; } = _menhir_stack in let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in - let _v : (Longident.t) = -# 1365 "parsing/parser.mly" - ( _1 ) -# 37065 "parsing/parser.ml" + let _v : (Asttypes.private_flag * Asttypes.virtual_flag) = +# 4167 "parsing/parser.mly" + ( Private, Virtual ) +# 43364 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in + let _endpos = _startpos in + let _v : (Asttypes.rec_flag) = +# 4118 "parsing/parser.mly" + ( Nonrecursive ) +# 43382 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37073,27 +43390,20 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Longident.t) = -# 1370 "parsing/parser.mly" - ( _1 ) -# 37097 "parsing/parser.ml" + let _endpos = _endpos__1_ in + let _v : (Asttypes.rec_flag) = +# 4119 "parsing/parser.mly" + ( Recursive ) +# 43407 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37102,31 +43412,86 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos; MenhirLib.EngineTypes.next = _menhir_stack; }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = fields; + MenhirLib.EngineTypes.startp = _startpos_fields_; + MenhirLib.EngineTypes.endp = _endpos_fields_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let fields : ((Longident.t Asttypes.loc * Parsetree.expression) list) = Obj.magic fields in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_fields_ in + let _endpos = _endpos_fields_ in + let _v = + let eo = +# 123 "" + ( None ) +# 43433 "parsing/parser.ml" + in + ( +# 2898 "parsing/parser.mly" + ( eo, fields ) +# 43438 "parsing/parser.ml" + : (Parsetree.expression option * + (Longident.t Asttypes.loc * Parsetree.expression) list)) + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = fields; + MenhirLib.EngineTypes.startp = _startpos_fields_; + MenhirLib.EngineTypes.endp = _endpos_fields_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; } = _menhir_stack in + let fields : ((Longident.t Asttypes.loc * Parsetree.expression) list) = Obj.magic fields in let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.module_expr) = Obj.magic _1 in + let x : (Parsetree.expression) = Obj.magic x in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Parsetree.module_expr) = -# 1330 "parsing/parser.mly" - ( _1 ) -# 37129 "parsing/parser.ml" - in + let _startpos = _startpos_x_ in + let _endpos = _endpos_fields_ in + let _v = + let eo = + let x = +# 196 "" + ( x ) +# 43481 "parsing/parser.ml" + in + +# 126 "" + ( Some x ) +# 43486 "parsing/parser.ml" + + in + ( +# 2898 "parsing/parser.mly" + ( eo, fields ) +# 43492 "parsing/parser.ml" + : (Parsetree.expression option * + (Longident.t Asttypes.loc * Parsetree.expression) list)) + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -37137,28 +43502,33 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = d; + MenhirLib.EngineTypes.startp = _startpos_d_; + MenhirLib.EngineTypes.endp = _endpos_d_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.module_type) = Obj.magic _1 in + let d : (Ast_helper.str * Ast_helper.str list * Parsetree.constructor_arguments * + Parsetree.core_type option * Parsetree.attributes * Location.t * + Docstrings.info) = Obj.magic d in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Parsetree.module_type) = -# 1325 "parsing/parser.mly" - ( _1 ) -# 37161 "parsing/parser.ml" - in + let _startpos = _startpos_d_ in + let _endpos = _endpos_d_ in + let _v = + let x = +# 3410 "parsing/parser.mly" + ( + let cid, vars, args, res, attrs, loc, info = d in + Type.constructor cid ~vars ~args ?res ~attrs ~loc ~info + ) +# 43525 "parsing/parser.ml" + in + ( +# 1205 "parsing/parser.mly" + ( [x] ) +# 43530 "parsing/parser.ml" + : (Parsetree.constructor_declaration list)) + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -37169,28 +43539,33 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = d; + MenhirLib.EngineTypes.startp = _startpos_d_; + MenhirLib.EngineTypes.endp = _endpos_d_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in + let d : (Ast_helper.str * Ast_helper.str list * Parsetree.constructor_arguments * + Parsetree.core_type option * Parsetree.attributes * Location.t * + Docstrings.info) = Obj.magic d in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Longident.t) = -# 1350 "parsing/parser.mly" - ( _1 ) -# 37193 "parsing/parser.ml" - in + let _startpos = _startpos_d_ in + let _endpos = _endpos_d_ in + let _v = + let x = +# 3410 "parsing/parser.mly" + ( + let cid, vars, args, res, attrs, loc, info = d in + Type.constructor cid ~vars ~args ?res ~attrs ~loc ~info + ) +# 43562 "parsing/parser.ml" + in + ( +# 1208 "parsing/parser.mly" + ( [x] ) +# 43567 "parsing/parser.ml" + : (Parsetree.constructor_declaration list)) + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -37202,27 +43577,39 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = d; + MenhirLib.EngineTypes.startp = _startpos_d_; + MenhirLib.EngineTypes.endp = _endpos_d_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.pattern) = Obj.magic _1 in + let d : (Ast_helper.str * Ast_helper.str list * Parsetree.constructor_arguments * + Parsetree.core_type option * Parsetree.attributes * Location.t * + Docstrings.info) = Obj.magic d in + let xs : (Parsetree.constructor_declaration list) = Obj.magic xs in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Parsetree.pattern) = -# 1345 "parsing/parser.mly" - ( _1 ) -# 37225 "parsing/parser.ml" - in + let _startpos = _startpos_xs_ in + let _endpos = _endpos_d_ in + let _v = + let x = +# 3410 "parsing/parser.mly" + ( + let cid, vars, args, res, attrs, loc, info = d in + Type.constructor cid ~vars ~args ?res ~attrs ~loc ~info + ) +# 43606 "parsing/parser.ml" + in + ( +# 1212 "parsing/parser.mly" + ( x :: xs ) +# 43611 "parsing/parser.ml" + : (Parsetree.constructor_declaration list)) + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -37233,28 +43620,40 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = d; + MenhirLib.EngineTypes.startp = _startpos_d_; + MenhirLib.EngineTypes.endp = _endpos_d_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in + let d : (Ast_helper.str * Ast_helper.str list * Parsetree.constructor_arguments * + Parsetree.core_type option * Parsetree.attributes * Location.t * + Docstrings.info) = Obj.magic d in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Longident.t) = -# 1355 "parsing/parser.mly" - ( _1 ) -# 37257 "parsing/parser.ml" - in + let _startpos = _startpos_d_ in + let _endpos = _endpos_d_ in + let _v = + let x = + let _1 = +# 3528 "parsing/parser.mly" + ( + let cid, vars, args, res, attrs, loc, info = d in + Te.decl cid ~vars ~args ?res ~attrs ~loc ~info + ) +# 43644 "parsing/parser.ml" + in + +# 3522 "parsing/parser.mly" + ( _1 ) +# 43649 "parsing/parser.ml" + + in + ( +# 1205 "parsing/parser.mly" + ( [x] ) +# 43655 "parsing/parser.ml" + : (Parsetree.extension_constructor list)) + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -37265,47 +43664,27 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _3 : (Parsetree.pattern) = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.pattern) = Obj.magic _1 in + let _1 : (Parsetree.extension_constructor) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in + let _endpos = _endpos__1_ in let _v = - let _1 = - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _loc__2_ = (_startpos__2_, _endpos__2_) in - let _sloc = (_symbolstartpos, _endpos) in - -# 2920 "parsing/parser.mly" - ( mkpat_cons ~loc:_sloc _loc__2_ (ghpat ~loc:_sloc (Ppat_tuple[_1;_3])) ) -# 37302 "parsing/parser.ml" - - in - ( -# 2906 "parsing/parser.mly" + let x = +# 3524 "parsing/parser.mly" ( _1 ) -# 37308 "parsing/parser.ml" - : (Parsetree.pattern)) +# 43682 "parsing/parser.ml" + in + ( +# 1205 "parsing/parser.mly" + ( [x] ) +# 43687 "parsing/parser.ml" + : (Parsetree.extension_constructor list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37317,34 +43696,39 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = d; + MenhirLib.EngineTypes.startp = _startpos_d_; + MenhirLib.EngineTypes.endp = _endpos_d_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _2 : (Parsetree.attribute) = Obj.magic _2 in - let _1 : (Parsetree.pattern) = Obj.magic _1 in + let d : (Ast_helper.str * Ast_helper.str list * Parsetree.constructor_arguments * + Parsetree.core_type option * Parsetree.attributes * Location.t * + Docstrings.info) = Obj.magic d in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in + let _startpos = _startpos_d_ in + let _endpos = _endpos_d_ in let _v = - let _1 = -# 2922 "parsing/parser.mly" - ( Pat.attr _1 _2 ) -# 37342 "parsing/parser.ml" - in - ( -# 2906 "parsing/parser.mly" + let x = + let _1 = +# 3528 "parsing/parser.mly" + ( + let cid, vars, args, res, attrs, loc, info = d in + Te.decl cid ~vars ~args ?res ~attrs ~loc ~info + ) +# 43720 "parsing/parser.ml" + in + +# 3522 "parsing/parser.mly" ( _1 ) -# 37347 "parsing/parser.ml" - : (Parsetree.pattern)) +# 43725 "parsing/parser.ml" + + in + ( +# 1208 "parsing/parser.mly" + ( [x] ) +# 43731 "parsing/parser.ml" + : (Parsetree.extension_constructor list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37362,21 +43746,21 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _1 : (Parsetree.pattern) = Obj.magic _1 in + let _1 : (Parsetree.extension_constructor) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v = - let _1 = -# 2924 "parsing/parser.mly" + let x = +# 3524 "parsing/parser.mly" ( _1 ) -# 37374 "parsing/parser.ml" +# 43758 "parsing/parser.ml" in ( -# 2906 "parsing/parser.mly" - ( _1 ) -# 37379 "parsing/parser.ml" - : (Parsetree.pattern)) +# 1208 "parsing/parser.mly" + ( [x] ) +# 43763 "parsing/parser.ml" + : (Parsetree.extension_constructor list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37389,71 +43773,45 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = d; + MenhirLib.EngineTypes.startp = _startpos_d_; + MenhirLib.EngineTypes.endp = _endpos_d_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.pattern) = Obj.magic _1 in + let d : (Ast_helper.str * Ast_helper.str list * Parsetree.constructor_arguments * + Parsetree.core_type option * Parsetree.attributes * Location.t * + Docstrings.info) = Obj.magic d in + let xs : (Parsetree.extension_constructor list) = Obj.magic xs in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined1_ in + let _startpos = _startpos_xs_ in + let _endpos = _endpos_d_ in let _v = - let _1 = - let _1 = - let _1 = - let _3 = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 984 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 37428 "parsing/parser.ml" - - in - -# 2927 "parsing/parser.mly" - ( Ppat_alias(_1, _3) ) -# 37434 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__1_inlined1_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1019 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 37444 "parsing/parser.ml" - - in + let x = + let _1 = +# 3528 "parsing/parser.mly" + ( + let cid, vars, args, res, attrs, loc, info = d in + Te.decl cid ~vars ~args ?res ~attrs ~loc ~info + ) +# 43803 "parsing/parser.ml" + in -# 2938 "parsing/parser.mly" - ( _1 ) -# 37450 "parsing/parser.ml" +# 3522 "parsing/parser.mly" + ( _1 ) +# 43808 "parsing/parser.ml" in ( -# 2906 "parsing/parser.mly" - ( _1 ) -# 37456 "parsing/parser.ml" - : (Parsetree.pattern)) +# 1212 "parsing/parser.mly" + ( x :: xs ) +# 43814 "parsing/parser.ml" + : (Parsetree.extension_constructor list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37466,61 +43824,33 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _3 : unit = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.pattern) = Obj.magic _1 in + let _1 : (Parsetree.extension_constructor) = Obj.magic _1 in + let xs : (Parsetree.extension_constructor list) = Obj.magic xs in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in + let _startpos = _startpos_xs_ in + let _endpos = _endpos__1_ in let _v = - let _1 = - let _1 = - let _1 = - let _loc__3_ = (_startpos__3_, _endpos__3_) in - -# 2929 "parsing/parser.mly" - ( expecting _loc__3_ "identifier" ) -# 37501 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__3_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1019 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 37511 "parsing/parser.ml" - - in - -# 2938 "parsing/parser.mly" - ( _1 ) -# 37517 "parsing/parser.ml" - - in - ( -# 2906 "parsing/parser.mly" + let x = +# 3524 "parsing/parser.mly" ( _1 ) -# 37523 "parsing/parser.ml" - : (Parsetree.pattern)) +# 43848 "parsing/parser.ml" + in + ( +# 1212 "parsing/parser.mly" + ( x :: xs ) +# 43853 "parsing/parser.ml" + : (Parsetree.extension_constructor list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37533,43 +43863,31 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = d; + MenhirLib.EngineTypes.startp = _startpos_d_; + MenhirLib.EngineTypes.endp = _endpos_d_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _1 : (Parsetree.pattern list) = Obj.magic _1 in + let d : (Ast_helper.str * Ast_helper.str list * Parsetree.constructor_arguments * + Parsetree.core_type option * Parsetree.attributes * Location.t * + Docstrings.info) = Obj.magic d in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in + let _startpos = _startpos_d_ in + let _endpos = _endpos_d_ in let _v = - let _1 = - let _1 = - let _1 = -# 2931 "parsing/parser.mly" - ( Ppat_tuple(List.rev _1) ) -# 37552 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1019 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 37560 "parsing/parser.ml" - - in - -# 2938 "parsing/parser.mly" - ( _1 ) -# 37566 "parsing/parser.ml" - - in + let x = +# 3528 "parsing/parser.mly" + ( + let cid, vars, args, res, attrs, loc, info = d in + Te.decl cid ~vars ~args ?res ~attrs ~loc ~info + ) +# 43885 "parsing/parser.ml" + in ( -# 2906 "parsing/parser.mly" - ( _1 ) -# 37572 "parsing/parser.ml" - : (Parsetree.pattern)) +# 1205 "parsing/parser.mly" + ( [x] ) +# 43890 "parsing/parser.ml" + : (Parsetree.extension_constructor list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37581,62 +43899,32 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = d; + MenhirLib.EngineTypes.startp = _startpos_d_; + MenhirLib.EngineTypes.endp = _endpos_d_; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _3 : unit = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.pattern) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v = - let _1 = - let _1 = - let _1 = - let _loc__3_ = (_startpos__3_, _endpos__3_) in - -# 2933 "parsing/parser.mly" - ( expecting _loc__3_ "pattern" ) -# 37617 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__3_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1019 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 37627 "parsing/parser.ml" - - in - -# 2938 "parsing/parser.mly" - ( _1 ) -# 37633 "parsing/parser.ml" - - in + let d : (Ast_helper.str * Ast_helper.str list * Parsetree.constructor_arguments * + Parsetree.core_type option * Parsetree.attributes * Location.t * + Docstrings.info) = Obj.magic d in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_d_ in + let _endpos = _endpos_d_ in + let _v = + let x = +# 3528 "parsing/parser.mly" + ( + let cid, vars, args, res, attrs, loc, info = d in + Te.decl cid ~vars ~args ?res ~attrs ~loc ~info + ) +# 43922 "parsing/parser.ml" + in ( -# 2906 "parsing/parser.mly" - ( _1 ) -# 37639 "parsing/parser.ml" - : (Parsetree.pattern)) +# 1208 "parsing/parser.mly" + ( [x] ) +# 43927 "parsing/parser.ml" + : (Parsetree.extension_constructor list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37649,58 +43937,38 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = d; + MenhirLib.EngineTypes.startp = _startpos_d_; + MenhirLib.EngineTypes.endp = _endpos_d_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _3 : (Parsetree.pattern) = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.pattern) = Obj.magic _1 in + let d : (Ast_helper.str * Ast_helper.str list * Parsetree.constructor_arguments * + Parsetree.core_type option * Parsetree.attributes * Location.t * + Docstrings.info) = Obj.magic d in + let xs : (Parsetree.extension_constructor list) = Obj.magic xs in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in + let _startpos = _startpos_xs_ in + let _endpos = _endpos_d_ in let _v = - let _1 = - let _1 = - let _1 = -# 2935 "parsing/parser.mly" - ( Ppat_or(_1, _3) ) -# 37682 "parsing/parser.ml" - in - let _endpos__1_ = _endpos__3_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1019 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 37691 "parsing/parser.ml" - - in - -# 2938 "parsing/parser.mly" - ( _1 ) -# 37697 "parsing/parser.ml" - - in + let x = +# 3528 "parsing/parser.mly" + ( + let cid, vars, args, res, attrs, loc, info = d in + Te.decl cid ~vars ~args ?res ~attrs ~loc ~info + ) +# 43966 "parsing/parser.ml" + in ( -# 2906 "parsing/parser.mly" - ( _1 ) -# 37703 "parsing/parser.ml" - : (Parsetree.pattern)) +# 1212 "parsing/parser.mly" + ( x :: xs ) +# 43971 "parsing/parser.ml" + : (Parsetree.extension_constructor list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37713,9 +43981,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _2; @@ -37723,51 +43991,44 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in - let _3 : unit = Obj.magic _3 in + let _1 : (Parsetree.expression) = Obj.magic _1 in let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.pattern) = Obj.magic _1 in + let xs : ((string option * Parsetree.expression) list) = Obj.magic xs in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in + let _startpos = _startpos_xs_ in + let _endpos = _endpos__1_ in let _v = - let _1 = + let x = let _1 = - let _1 = - let _loc__3_ = (_startpos__3_, _endpos__3_) in - -# 2937 "parsing/parser.mly" - ( expecting _loc__3_ "pattern" ) -# 37748 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__3_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _1 = +# 2297 "parsing/parser.mly" + ( _1 ) +# 44014 "parsing/parser.ml" + in -# 1019 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 37758 "parsing/parser.ml" +# 2440 "parsing/parser.mly" + ( _1 ) +# 44019 "parsing/parser.ml" in -# 2938 "parsing/parser.mly" - ( _1 ) -# 37764 "parsing/parser.ml" +# 2851 "parsing/parser.mly" + ( None, _1 ) +# 44025 "parsing/parser.ml" in ( -# 2906 "parsing/parser.mly" - ( _1 ) -# 37770 "parsing/parser.ml" - : (Parsetree.pattern)) +# 2867 "parsing/parser.mly" + ( x :: xs ) +# 44031 "parsing/parser.ml" + : ((string option * Parsetree.expression) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37780,9 +44041,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = xs_inlined1; + MenhirLib.EngineTypes.startp = _startpos_xs_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_xs_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1_inlined2; @@ -37794,47 +44055,114 @@ module Tables = struct MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1; MenhirLib.EngineTypes.startp = _startpos__1_; MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; }; }; }; } = _menhir_stack in - let _3 : (Parsetree.pattern) = Obj.magic _3 in + let xs_inlined1 : (Parsetree.case list) = Obj.magic xs_inlined1 in let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let xs : ((string option * Parsetree.expression) list) = Obj.magic xs in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in + let _startpos = _startpos_xs_ in + let _endpos = _endpos_xs_inlined1_ in let _v = - let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4114 "parsing/parser.mly" + let x = + let (_endpos_xs_, xs) = (_endpos_xs_inlined1_, xs_inlined1) in + let _1 = + let _1 = + let _3 = + let xs = + let xs = +# 264 "" + ( List.rev xs ) +# 44099 "parsing/parser.ml" + in + +# 1188 "parsing/parser.mly" + ( xs ) +# 44104 "parsing/parser.ml" + + in + +# 2783 "parsing/parser.mly" + ( xs ) +# 44110 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +# 4286 "parsing/parser.mly" ( _1 ) -# 37822 "parsing/parser.ml" +# 44121 "parsing/parser.ml" + + in + +# 4299 "parsing/parser.mly" + ( _1, _2 ) +# 44127 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2299 "parsing/parser.mly" + ( let loc = make_loc _sloc in + let cases = _3 in + (* There are two choices of where to put attributes: on the + Pexp_function node; on the Pfunction_cases body. We put them on the + Pexp_function node here because the compiler only uses + Pfunction_cases attributes for enabling/disabling warnings in + typechecking. For standalone function cases, we want the compiler to + respect, e.g., [@inline] attributes. + *) + let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in + mkexp_attrs ~loc:_sloc desc _2 + ) +# 44147 "parsing/parser.ml" + + in + +# 2440 "parsing/parser.mly" + ( _1 ) +# 44153 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" - ( _1, _2 ) -# 37828 "parsing/parser.ml" +# 2851 "parsing/parser.mly" + ( None, _1 ) +# 44159 "parsing/parser.ml" in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in ( -# 2908 "parsing/parser.mly" - ( mkpat_attrs ~loc:_sloc (Ppat_exception _3) _2) -# 37837 "parsing/parser.ml" - : (Parsetree.pattern)) +# 2867 "parsing/parser.mly" + ( x :: xs ) +# 44165 "parsing/parser.ml" + : ((string option * Parsetree.expression) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37847,14 +44175,14 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _2; @@ -37862,30 +44190,39 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; } = _menhir_stack in - let _4 : (Parsetree.pattern) = Obj.magic _4 in - let _3 : unit = Obj.magic _3 in - let _2 : (Parsetree.pattern) = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in + let _2_inlined1 : (Parsetree.expression) = Obj.magic _2_inlined1 in + let _1 : ( +# 772 "parsing/parser.mly" + (string) +# 44206 "parsing/parser.ml" + ) = Obj.magic _1 in + let _2 : unit = Obj.magic _2 in + let xs : ((string option * Parsetree.expression) list) = Obj.magic xs in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__4_ in + let _startpos = _startpos_xs_ in + let _endpos = _endpos__2_inlined1_ in let _v = - let _endpos = _endpos__4_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let x = + let _2 = _2_inlined1 in + +# 2853 "parsing/parser.mly" + ( Some _1, _2 ) +# 44219 "parsing/parser.ml" + + in ( -# 2910 "parsing/parser.mly" - ( mkpat ~loc:_sloc (Ppat_effect(_2,_4)) ) -# 37888 "parsing/parser.ml" - : (Parsetree.pattern)) +# 2867 "parsing/parser.mly" + ( x :: xs ) +# 44225 "parsing/parser.ml" + : ((string option * Parsetree.expression) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37898,34 +44235,56 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; }; } = _menhir_stack in - let _3 : (Parsetree.pattern) = Obj.magic _3 in + let label : ( +# 785 "parsing/parser.mly" + (string) +# 44265 "parsing/parser.ml" + ) = Obj.magic label in + let _1 : unit = Obj.magic _1 in let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.pattern list) = Obj.magic _1 in + let xs : ((string option * Parsetree.expression) list) = Obj.magic xs in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.pattern list) = -# 3038 "parsing/parser.mly" - ( _3 :: _1 ) -# 37928 "parsing/parser.ml" - in + let _startpos = _startpos_xs_ in + let _endpos = _endpos_label_ in + let _v = + let x = + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +# 2855 "parsing/parser.mly" + ( let loc = _loc_label_ in + Some label, mkexpvar ~loc label ) +# 44280 "parsing/parser.ml" + + in + ( +# 2867 "parsing/parser.mly" + ( x :: xs ) +# 44286 "parsing/parser.ml" + : ((string option * Parsetree.expression) list)) + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -37937,34 +44296,80 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = c; + MenhirLib.EngineTypes.startp = _startpos_c_; + MenhirLib.EngineTypes.endp = _endpos_c_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; }; }; } = _menhir_stack in - let _3 : (Parsetree.pattern) = Obj.magic _3 in + let _5 : unit = Obj.magic _5 in + let c : (Parsetree.type_constraint) = Obj.magic c in + let label : ( +# 785 "parsing/parser.mly" + (string) +# 44346 "parsing/parser.ml" + ) = Obj.magic label in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let _1 : unit = Obj.magic _1 in let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.pattern) = Obj.magic _1 in + let xs : ((string option * Parsetree.expression) list) = Obj.magic xs in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.pattern list) = -# 3039 "parsing/parser.mly" - ( [_3; _1] ) -# 37967 "parsing/parser.ml" - in + let _startpos = _startpos_xs_ in + let _endpos = _endpos__5_ in + let _v = + let x = + let _startpos__2_ = _startpos__2_inlined1_ in + let _endpos = _endpos__5_ in + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +# 2858 "parsing/parser.mly" + ( Some label, + mkexp_constraint ~loc:(_startpos__2_, _endpos) + (mkexpvar ~loc:_loc_label_ label) c ) +# 44365 "parsing/parser.ml" + + in + ( +# 2867 "parsing/parser.mly" + ( x :: xs ) +# 44371 "parsing/parser.ml" + : ((string option * Parsetree.expression) list)) + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -37976,9 +44381,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _2; @@ -37993,19 +44398,50 @@ module Tables = struct }; }; } = _menhir_stack in - let _3 : unit = Obj.magic _3 in + let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.pattern) = Obj.magic _1 in + let _1 : (Parsetree.expression) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in + let _endpos = _endpos__1_inlined1_ in let _v = - let _loc__3_ = (_startpos__3_, _endpos__3_) in + let x2 = + let _1 = _1_inlined1 in + let _1 = + let _1 = +# 2297 "parsing/parser.mly" + ( _1 ) +# 44415 "parsing/parser.ml" + in + +# 2440 "parsing/parser.mly" + ( _1 ) +# 44420 "parsing/parser.ml" + + in + +# 2851 "parsing/parser.mly" + ( None, _1 ) +# 44426 "parsing/parser.ml" + + in + let x1 = + let _1 = +# 2297 "parsing/parser.mly" + ( _1 ) +# 44433 "parsing/parser.ml" + in + +# 2440 "parsing/parser.mly" + ( _1 ) +# 44438 "parsing/parser.ml" + + in ( -# 3040 "parsing/parser.mly" - ( expecting _loc__3_ "pattern" ) -# 38008 "parsing/parser.ml" - : (Parsetree.pattern list)) +# 2872 "parsing/parser.mly" + ( [ x2; None, x1 ] ) +# 44444 "parsing/parser.ml" + : ((string option * Parsetree.expression) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38018,34 +44454,141 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; }; }; } = _menhir_stack in - let _3 : (Parsetree.pattern) = Obj.magic _3 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.pattern list) = Obj.magic _1 in + let _1 : (Parsetree.expression) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.pattern list) = -# 3038 "parsing/parser.mly" - ( _3 :: _1 ) -# 38048 "parsing/parser.ml" - in + let _endpos = _endpos_xs_ in + let _v = + let x2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _1 = + let _3 = + let xs = + let xs = +# 264 "" + ( List.rev xs ) +# 44512 "parsing/parser.ml" + in + +# 1188 "parsing/parser.mly" + ( xs ) +# 44517 "parsing/parser.ml" + + in + +# 2783 "parsing/parser.mly" + ( xs ) +# 44523 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +# 4286 "parsing/parser.mly" + ( _1 ) +# 44534 "parsing/parser.ml" + + in + +# 4299 "parsing/parser.mly" + ( _1, _2 ) +# 44540 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2299 "parsing/parser.mly" + ( let loc = make_loc _sloc in + let cases = _3 in + (* There are two choices of where to put attributes: on the + Pexp_function node; on the Pfunction_cases body. We put them on the + Pexp_function node here because the compiler only uses + Pfunction_cases attributes for enabling/disabling warnings in + typechecking. For standalone function cases, we want the compiler to + respect, e.g., [@inline] attributes. + *) + let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in + mkexp_attrs ~loc:_sloc desc _2 + ) +# 44560 "parsing/parser.ml" + + in + +# 2440 "parsing/parser.mly" + ( _1 ) +# 44566 "parsing/parser.ml" + + in + +# 2851 "parsing/parser.mly" + ( None, _1 ) +# 44572 "parsing/parser.ml" + + in + let x1 = + let _1 = +# 2297 "parsing/parser.mly" + ( _1 ) +# 44579 "parsing/parser.ml" + in + +# 2440 "parsing/parser.mly" + ( _1 ) +# 44584 "parsing/parser.ml" + + in + ( +# 2872 "parsing/parser.mly" + ( [ x2; None, x1 ] ) +# 44590 "parsing/parser.ml" + : ((string option * Parsetree.expression) list)) + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -38057,34 +44600,67 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; }; } = _menhir_stack in - let _3 : (Parsetree.pattern) = Obj.magic _3 in + let _2_inlined1 : (Parsetree.expression) = Obj.magic _2_inlined1 in + let _1_inlined1 : ( +# 772 "parsing/parser.mly" + (string) +# 44631 "parsing/parser.ml" + ) = Obj.magic _1_inlined1 in let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.pattern) = Obj.magic _1 in + let _1 : (Parsetree.expression) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in - let _v : (Parsetree.pattern list) = -# 3039 "parsing/parser.mly" - ( [_3; _1] ) -# 38087 "parsing/parser.ml" - in + let _endpos = _endpos__2_inlined1_ in + let _v = + let x2 = + let (_2, _1) = (_2_inlined1, _1_inlined1) in + +# 2853 "parsing/parser.mly" + ( Some _1, _2 ) +# 44644 "parsing/parser.ml" + + in + let x1 = + let _1 = +# 2297 "parsing/parser.mly" + ( _1 ) +# 44651 "parsing/parser.ml" + in + +# 2440 "parsing/parser.mly" + ( _1 ) +# 44656 "parsing/parser.ml" + + in + ( +# 2872 "parsing/parser.mly" + ( [ x2; None, x1 ] ) +# 44662 "parsing/parser.ml" + : ((string option * Parsetree.expression) list)) + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -38096,36 +44672,67 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; }; } = _menhir_stack in - let _3 : unit = Obj.magic _3 in + let label : ( +# 785 "parsing/parser.mly" + (string) +# 44702 "parsing/parser.ml" + ) = Obj.magic label in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.pattern) = Obj.magic _1 in + let _1 : (Parsetree.expression) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in + let _endpos = _endpos_label_ in let _v = - let _loc__3_ = (_startpos__3_, _endpos__3_) in + let x2 = + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +# 2855 "parsing/parser.mly" + ( let loc = _loc_label_ in + Some label, mkexpvar ~loc label ) +# 44717 "parsing/parser.ml" + + in + let x1 = + let _1 = +# 2297 "parsing/parser.mly" + ( _1 ) +# 44724 "parsing/parser.ml" + in + +# 2440 "parsing/parser.mly" + ( _1 ) +# 44729 "parsing/parser.ml" + + in ( -# 3040 "parsing/parser.mly" - ( expecting _loc__3_ "pattern" ) -# 38128 "parsing/parser.ml" - : (Parsetree.pattern list)) +# 2872 "parsing/parser.mly" + ( [ x2; None, x1 ] ) +# 44735 "parsing/parser.ml" + : ((string option * Parsetree.expression) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38134,85 +44741,95 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos; MenhirLib.EngineTypes.next = _menhir_stack; }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : (Parsetree.pattern) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Parsetree.pattern) = -# 2943 "parsing/parser.mly" - ( _1 ) -# 38154 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = c; + MenhirLib.EngineTypes.startp = _startpos_c_; + MenhirLib.EngineTypes.endp = _endpos_c_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; }; } = _menhir_stack in - let _2 : (Parsetree.pattern) = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in + let _5 : unit = Obj.magic _5 in + let c : (Parsetree.type_constraint) = Obj.magic c in + let label : ( +# 785 "parsing/parser.mly" + (string) +# 44795 "parsing/parser.ml" + ) = Obj.magic label in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.expression) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in + let _endpos = _endpos__5_ in let _v = - let _1 = - let _1 = - let _1 = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 984 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 38193 "parsing/parser.ml" - - in - -# 2946 "parsing/parser.mly" - ( Ppat_construct(_1, Some ([], _2)) ) -# 38199 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__2_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let x2 = + let _startpos__2_ = _startpos__2_inlined1_ in + let _endpos = _endpos__5_ in + let _loc_label_ = (_startpos_label_, _endpos_label_) in -# 1019 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 38209 "parsing/parser.ml" +# 2858 "parsing/parser.mly" + ( Some label, + mkexp_constraint ~loc:(_startpos__2_, _endpos) + (mkexpvar ~loc:_loc_label_ label) c ) +# 44814 "parsing/parser.ml" in - ( -# 2952 "parsing/parser.mly" + let x1 = + let _1 = +# 2297 "parsing/parser.mly" ( _1 ) -# 38215 "parsing/parser.ml" - : (Parsetree.pattern)) +# 44821 "parsing/parser.ml" + in + +# 2440 "parsing/parser.mly" + ( _1 ) +# 44826 "parsing/parser.ml" + + in + ( +# 2872 "parsing/parser.mly" + ( [ x2; None, x1 ] ) +# 44832 "parsing/parser.ml" + : ((string option * Parsetree.expression) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38225,14 +44842,14 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = pat; - MenhirLib.EngineTypes.startp = _startpos_pat_; - MenhirLib.EngineTypes.endp = _endpos_pat_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = xs; @@ -38240,14 +44857,14 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -38260,54 +44877,105 @@ module Tables = struct }; }; } = _menhir_stack in - let pat : (Parsetree.pattern) = Obj.magic pat in - let _5 : unit = Obj.magic _5 in - let xs : (string Asttypes.loc list) = Obj.magic xs in - let _3 : unit = Obj.magic _3 in + let _1_inlined3 : (Parsetree.expression) = Obj.magic _1_inlined3 in let _2 : unit = Obj.magic _2 in - let _1 : (Longident.t) = Obj.magic _1 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos_pat_ in + let _endpos = _endpos__1_inlined3_ in let _v = - let _1 = + let x2 = + let _1 = _1_inlined3 in let _1 = - let newtypes = -# 2679 "parsing/parser.mly" - ( xs ) -# 38279 "parsing/parser.ml" + let _1 = +# 2297 "parsing/parser.mly" + ( _1 ) +# 44897 "parsing/parser.ml" in - let constr = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + +# 2440 "parsing/parser.mly" + ( _1 ) +# 44902 "parsing/parser.ml" + + in + +# 2851 "parsing/parser.mly" + ( None, _1 ) +# 44908 "parsing/parser.ml" + + in + let x1 = + let _1 = + let _3 = + let xs = + let xs = +# 264 "" + ( List.rev xs ) +# 44918 "parsing/parser.ml" + in + +# 1188 "parsing/parser.mly" + ( xs ) +# 44923 "parsing/parser.ml" + + in -# 984 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 38288 "parsing/parser.ml" +# 2783 "parsing/parser.mly" + ( xs ) +# 44929 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +# 4286 "parsing/parser.mly" + ( _1 ) +# 44940 "parsing/parser.ml" + + in + +# 4299 "parsing/parser.mly" + ( _1, _2 ) +# 44946 "parsing/parser.ml" in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2949 "parsing/parser.mly" - ( Ppat_construct(constr, Some (newtypes, pat)) ) -# 38294 "parsing/parser.ml" +# 2299 "parsing/parser.mly" + ( let loc = make_loc _sloc in + let cases = _3 in + (* There are two choices of where to put attributes: on the + Pexp_function node; on the Pfunction_cases body. We put them on the + Pexp_function node here because the compiler only uses + Pfunction_cases attributes for enabling/disabling warnings in + typechecking. For standalone function cases, we want the compiler to + respect, e.g., [@inline] attributes. + *) + let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in + mkexp_attrs ~loc:_sloc desc _2 + ) +# 44966 "parsing/parser.ml" in - let _endpos__1_ = _endpos_pat_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 1019 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 38304 "parsing/parser.ml" +# 2440 "parsing/parser.mly" + ( _1 ) +# 44972 "parsing/parser.ml" in ( -# 2952 "parsing/parser.mly" - ( _1 ) -# 38310 "parsing/parser.ml" - : (Parsetree.pattern)) +# 2872 "parsing/parser.mly" + ( [ x2; None, x1 ] ) +# 44978 "parsing/parser.ml" + : ((string option * Parsetree.expression) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38320,44 +44988,213 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = xs_inlined1; + MenhirLib.EngineTypes.startp = _startpos_xs_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_xs_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined5; + MenhirLib.EngineTypes.startp = _startpos__1_inlined5_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined4; + MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; }; } = _menhir_stack in - let _2 : (Parsetree.pattern) = Obj.magic _2 in - let _1 : (Asttypes.label) = Obj.magic _1 in + let xs_inlined1 : (Parsetree.case list) = Obj.magic xs_inlined1 in + let _1_inlined5 : (Parsetree.attributes) = Obj.magic _1_inlined5 in + let _1_inlined4 : (string Asttypes.loc option) = Obj.magic _1_inlined4 in + let _1_inlined3 : unit = Obj.magic _1_inlined3 in + let _2 : unit = Obj.magic _2 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in + let _endpos = _endpos_xs_inlined1_ in let _v = - let _1 = - let _1 = -# 2951 "parsing/parser.mly" - ( Ppat_variant(_1, Some _2) ) -# 38345 "parsing/parser.ml" - in - let _endpos__1_ = _endpos__2_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let x2 = + let (_endpos_xs_, _startpos__1_, xs, _1_inlined2, _1_inlined1) = (_endpos_xs_inlined1_, _startpos__1_inlined3_, xs_inlined1, _1_inlined5, _1_inlined4) in + let _1 = + let _1 = + let _3 = + let xs = + let xs = +# 264 "" + ( List.rev xs ) +# 45067 "parsing/parser.ml" + in + +# 1188 "parsing/parser.mly" + ( xs ) +# 45072 "parsing/parser.ml" + + in + +# 2783 "parsing/parser.mly" + ( xs ) +# 45078 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +# 4286 "parsing/parser.mly" + ( _1 ) +# 45089 "parsing/parser.ml" + + in + +# 4299 "parsing/parser.mly" + ( _1, _2 ) +# 45095 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2299 "parsing/parser.mly" + ( let loc = make_loc _sloc in + let cases = _3 in + (* There are two choices of where to put attributes: on the + Pexp_function node; on the Pfunction_cases body. We put them on the + Pexp_function node here because the compiler only uses + Pfunction_cases attributes for enabling/disabling warnings in + typechecking. For standalone function cases, we want the compiler to + respect, e.g., [@inline] attributes. + *) + let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in + mkexp_attrs ~loc:_sloc desc _2 + ) +# 45115 "parsing/parser.ml" + + in + +# 2440 "parsing/parser.mly" + ( _1 ) +# 45121 "parsing/parser.ml" + + in + +# 2851 "parsing/parser.mly" + ( None, _1 ) +# 45127 "parsing/parser.ml" + + in + let x1 = + let _1 = + let _3 = + let xs = + let xs = +# 264 "" + ( List.rev xs ) +# 45137 "parsing/parser.ml" + in + +# 1188 "parsing/parser.mly" + ( xs ) +# 45142 "parsing/parser.ml" + + in + +# 2783 "parsing/parser.mly" + ( xs ) +# 45148 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +# 4286 "parsing/parser.mly" + ( _1 ) +# 45159 "parsing/parser.ml" + + in + +# 4299 "parsing/parser.mly" + ( _1, _2 ) +# 45165 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2299 "parsing/parser.mly" + ( let loc = make_loc _sloc in + let cases = _3 in + (* There are two choices of where to put attributes: on the + Pexp_function node; on the Pfunction_cases body. We put them on the + Pexp_function node here because the compiler only uses + Pfunction_cases attributes for enabling/disabling warnings in + typechecking. For standalone function cases, we want the compiler to + respect, e.g., [@inline] attributes. + *) + let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in + mkexp_attrs ~loc:_sloc desc _2 + ) +# 45185 "parsing/parser.ml" + + in -# 1019 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 38354 "parsing/parser.ml" +# 2440 "parsing/parser.mly" + ( _1 ) +# 45191 "parsing/parser.ml" in ( -# 2952 "parsing/parser.mly" - ( _1 ) -# 38360 "parsing/parser.ml" - : (Parsetree.pattern)) +# 2872 "parsing/parser.mly" + ( [ x2; None, x1 ] ) +# 45197 "parsing/parser.ml" + : ((string option * Parsetree.expression) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38370,61 +45207,139 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; }; }; }; } = _menhir_stack in - let _3 : (Parsetree.pattern) = Obj.magic _3 in + let _2_inlined1 : (Parsetree.expression) = Obj.magic _2_inlined1 in + let _1_inlined3 : ( +# 772 "parsing/parser.mly" + (string) +# 45256 "parsing/parser.ml" + ) = Obj.magic _1_inlined3 in + let _2 : unit = Obj.magic _2 in + let xs : (Parsetree.case list) = Obj.magic xs in let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in + let _endpos = _endpos__2_inlined1_ in let _v = - let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4114 "parsing/parser.mly" + let x2 = + let (_2, _1) = (_2_inlined1, _1_inlined3) in + +# 2853 "parsing/parser.mly" + ( Some _1, _2 ) +# 45272 "parsing/parser.ml" + + in + let x1 = + let _1 = + let _3 = + let xs = + let xs = +# 264 "" + ( List.rev xs ) +# 45282 "parsing/parser.ml" + in + +# 1188 "parsing/parser.mly" + ( xs ) +# 45287 "parsing/parser.ml" + + in + +# 2783 "parsing/parser.mly" + ( xs ) +# 45293 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +# 4286 "parsing/parser.mly" ( _1 ) -# 38412 "parsing/parser.ml" +# 45304 "parsing/parser.ml" + + in + +# 4299 "parsing/parser.mly" + ( _1, _2 ) +# 45310 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2299 "parsing/parser.mly" + ( let loc = make_loc _sloc in + let cases = _3 in + (* There are two choices of where to put attributes: on the + Pexp_function node; on the Pfunction_cases body. We put them on the + Pexp_function node here because the compiler only uses + Pfunction_cases attributes for enabling/disabling warnings in + typechecking. For standalone function cases, we want the compiler to + respect, e.g., [@inline] attributes. + *) + let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in + mkexp_attrs ~loc:_sloc desc _2 + ) +# 45330 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" - ( _1, _2 ) -# 38418 "parsing/parser.ml" +# 2440 "parsing/parser.mly" + ( _1 ) +# 45336 "parsing/parser.ml" in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in ( -# 2954 "parsing/parser.mly" - ( mkpat_attrs ~loc:_sloc (Ppat_lazy _3) _2) -# 38427 "parsing/parser.ml" - : (Parsetree.pattern)) +# 2872 "parsing/parser.mly" + ( [ x2; None, x1 ] ) +# 45342 "parsing/parser.ml" + : ((string option * Parsetree.expression) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38437,194 +45352,140 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; }; }; } = _menhir_stack in - let _3 : (Parsetree.pattern) = Obj.magic _3 in + let label : ( +# 785 "parsing/parser.mly" + (string) +# 45400 "parsing/parser.ml" + ) = Obj.magic label in + let _1_inlined3 : unit = Obj.magic _1_inlined3 in let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.pattern) = Obj.magic _1 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in + let _endpos = _endpos_label_ in let _v = - let _1 = - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _loc__2_ = (_startpos__2_, _endpos__2_) in - let _sloc = (_symbolstartpos, _endpos) in + let x2 = + let _loc_label_ = (_startpos_label_, _endpos_label_) in -# 2920 "parsing/parser.mly" - ( mkpat_cons ~loc:_sloc _loc__2_ (ghpat ~loc:_sloc (Ppat_tuple[_1;_3])) ) -# 38473 "parsing/parser.ml" +# 2855 "parsing/parser.mly" + ( let loc = _loc_label_ in + Some label, mkexpvar ~loc label ) +# 45418 "parsing/parser.ml" in - ( -# 2915 "parsing/parser.mly" - ( _1 ) -# 38479 "parsing/parser.ml" - : (Parsetree.pattern)) - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - } = _menhir_stack in - let _2 : (Parsetree.attribute) = Obj.magic _2 in - let _1 : (Parsetree.pattern) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v = - let _1 = -# 2922 "parsing/parser.mly" - ( Pat.attr _1 _2 ) -# 38513 "parsing/parser.ml" - in - ( -# 2915 "parsing/parser.mly" - ( _1 ) -# 38518 "parsing/parser.ml" - : (Parsetree.pattern)) - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : (Parsetree.pattern) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v = - let _1 = -# 2924 "parsing/parser.mly" - ( _1 ) -# 38545 "parsing/parser.ml" - in - ( -# 2915 "parsing/parser.mly" - ( _1 ) -# 38550 "parsing/parser.ml" - : (Parsetree.pattern)) - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - } = _menhir_stack in - let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.pattern) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined1_ in - let _v = - let _1 = + let x1 = let _1 = - let _1 = - let _3 = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _3 = + let xs = + let xs = +# 264 "" + ( List.rev xs ) +# 45428 "parsing/parser.ml" + in -# 984 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 38599 "parsing/parser.ml" +# 1188 "parsing/parser.mly" + ( xs ) +# 45433 "parsing/parser.ml" in -# 2927 "parsing/parser.mly" - ( Ppat_alias(_1, _3) ) -# 38605 "parsing/parser.ml" +# 2783 "parsing/parser.mly" + ( xs ) +# 45439 "parsing/parser.ml" in - let _endpos__1_ = _endpos__1_inlined1_ in - let _endpos = _endpos__1_ in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +# 4286 "parsing/parser.mly" + ( _1 ) +# 45450 "parsing/parser.ml" + + in + +# 4299 "parsing/parser.mly" + ( _1, _2 ) +# 45456 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1019 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 38615 "parsing/parser.ml" +# 2299 "parsing/parser.mly" + ( let loc = make_loc _sloc in + let cases = _3 in + (* There are two choices of where to put attributes: on the + Pexp_function node; on the Pfunction_cases body. We put them on the + Pexp_function node here because the compiler only uses + Pfunction_cases attributes for enabling/disabling warnings in + typechecking. For standalone function cases, we want the compiler to + respect, e.g., [@inline] attributes. + *) + let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in + mkexp_attrs ~loc:_sloc desc _2 + ) +# 45476 "parsing/parser.ml" in -# 2938 "parsing/parser.mly" - ( _1 ) -# 38621 "parsing/parser.ml" +# 2440 "parsing/parser.mly" + ( _1 ) +# 45482 "parsing/parser.ml" in ( -# 2915 "parsing/parser.mly" - ( _1 ) -# 38627 "parsing/parser.ml" - : (Parsetree.pattern)) +# 2872 "parsing/parser.mly" + ( [ x2; None, x1 ] ) +# 45488 "parsing/parser.ml" + : ((string option * Parsetree.expression) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38637,61 +45498,164 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = c; + MenhirLib.EngineTypes.startp = _startpos_c_; + MenhirLib.EngineTypes.endp = _endpos_c_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; }; }; } = _menhir_stack in - let _3 : unit = Obj.magic _3 in + let _5 : unit = Obj.magic _5 in + let c : (Parsetree.type_constraint) = Obj.magic c in + let label : ( +# 785 "parsing/parser.mly" + (string) +# 45566 "parsing/parser.ml" + ) = Obj.magic label in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let _1_inlined3 : unit = Obj.magic _1_inlined3 in let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.pattern) = Obj.magic _1 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in + let _endpos = _endpos__5_ in let _v = - let _1 = + let x2 = + let _startpos__2_ = _startpos__2_inlined1_ in + let _endpos = _endpos__5_ in + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +# 2858 "parsing/parser.mly" + ( Some label, + mkexp_constraint ~loc:(_startpos__2_, _endpos) + (mkexpvar ~loc:_loc_label_ label) c ) +# 45588 "parsing/parser.ml" + + in + let x1 = let _1 = - let _1 = - let _loc__3_ = (_startpos__3_, _endpos__3_) in + let _3 = + let xs = + let xs = +# 264 "" + ( List.rev xs ) +# 45598 "parsing/parser.ml" + in + +# 1188 "parsing/parser.mly" + ( xs ) +# 45603 "parsing/parser.ml" + + in -# 2929 "parsing/parser.mly" - ( expecting _loc__3_ "identifier" ) -# 38672 "parsing/parser.ml" +# 2783 "parsing/parser.mly" + ( xs ) +# 45609 "parsing/parser.ml" in - let _endpos__1_ = _endpos__3_ in - let _endpos = _endpos__1_ in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +# 4286 "parsing/parser.mly" + ( _1 ) +# 45620 "parsing/parser.ml" + + in + +# 4299 "parsing/parser.mly" + ( _1, _2 ) +# 45626 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1019 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 38682 "parsing/parser.ml" +# 2299 "parsing/parser.mly" + ( let loc = make_loc _sloc in + let cases = _3 in + (* There are two choices of where to put attributes: on the + Pexp_function node; on the Pfunction_cases body. We put them on the + Pexp_function node here because the compiler only uses + Pfunction_cases attributes for enabling/disabling warnings in + typechecking. For standalone function cases, we want the compiler to + respect, e.g., [@inline] attributes. + *) + let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in + mkexp_attrs ~loc:_sloc desc _2 + ) +# 45646 "parsing/parser.ml" in -# 2938 "parsing/parser.mly" - ( _1 ) -# 38688 "parsing/parser.ml" +# 2440 "parsing/parser.mly" + ( _1 ) +# 45652 "parsing/parser.ml" in ( -# 2915 "parsing/parser.mly" - ( _1 ) -# 38694 "parsing/parser.ml" - : (Parsetree.pattern)) +# 2872 "parsing/parser.mly" + ( [ x2; None, x1 ] ) +# 45658 "parsing/parser.ml" + : ((string option * Parsetree.expression) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38703,44 +45667,66 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1; MenhirLib.EngineTypes.startp = _startpos__1_; MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = x1; + MenhirLib.EngineTypes.startp = _startpos_x1_; + MenhirLib.EngineTypes.endp = _endpos_x1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = l1; + MenhirLib.EngineTypes.startp = _startpos_l1_; + MenhirLib.EngineTypes.endp = _endpos_l1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; } = _menhir_stack in - let _1 : (Parsetree.pattern list) = Obj.magic _1 in + let _1 : (Parsetree.expression) = Obj.magic _1 in + let _3 : unit = Obj.magic _3 in + let x1 : (Parsetree.expression) = Obj.magic x1 in + let l1 : ( +# 772 "parsing/parser.mly" + (string) +# 45701 "parsing/parser.ml" + ) = Obj.magic l1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in + let _startpos = _startpos_l1_ in let _endpos = _endpos__1_ in let _v = - let _1 = + let x2 = let _1 = let _1 = -# 2931 "parsing/parser.mly" - ( Ppat_tuple(List.rev _1) ) -# 38723 "parsing/parser.ml" +# 2297 "parsing/parser.mly" + ( _1 ) +# 45712 "parsing/parser.ml" in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 1019 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 38731 "parsing/parser.ml" +# 2440 "parsing/parser.mly" + ( _1 ) +# 45717 "parsing/parser.ml" in -# 2938 "parsing/parser.mly" - ( _1 ) -# 38737 "parsing/parser.ml" +# 2851 "parsing/parser.mly" + ( None, _1 ) +# 45723 "parsing/parser.ml" in ( -# 2915 "parsing/parser.mly" - ( _1 ) -# 38743 "parsing/parser.ml" - : (Parsetree.pattern)) +# 2876 "parsing/parser.mly" + ( [ x2; Some l1, x1 ] ) +# 45729 "parsing/parser.ml" + : ((string option * Parsetree.expression) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38753,61 +45739,138 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = x1; + MenhirLib.EngineTypes.startp = _startpos_x1_; + MenhirLib.EngineTypes.endp = _endpos_x1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = l1; + MenhirLib.EngineTypes.startp = _startpos_l1_; + MenhirLib.EngineTypes.endp = _endpos_l1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; }; }; } = _menhir_stack in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in + let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in + let _1 : unit = Obj.magic _1 in let _3 : unit = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.pattern) = Obj.magic _1 in + let x1 : (Parsetree.expression) = Obj.magic x1 in + let l1 : ( +# 772 "parsing/parser.mly" + (string) +# 45793 "parsing/parser.ml" + ) = Obj.magic l1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in + let _startpos = _startpos_l1_ in + let _endpos = _endpos_xs_ in let _v = - let _1 = + let x2 = let _1 = let _1 = - let _loc__3_ = (_startpos__3_, _endpos__3_) in + let _3 = + let xs = + let xs = +# 264 "" + ( List.rev xs ) +# 45807 "parsing/parser.ml" + in + +# 1188 "parsing/parser.mly" + ( xs ) +# 45812 "parsing/parser.ml" + + in + +# 2783 "parsing/parser.mly" + ( xs ) +# 45818 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +# 4286 "parsing/parser.mly" + ( _1 ) +# 45829 "parsing/parser.ml" + + in + +# 4299 "parsing/parser.mly" + ( _1, _2 ) +# 45835 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2933 "parsing/parser.mly" - ( expecting _loc__3_ "pattern" ) -# 38788 "parsing/parser.ml" +# 2299 "parsing/parser.mly" + ( let loc = make_loc _sloc in + let cases = _3 in + (* There are two choices of where to put attributes: on the + Pexp_function node; on the Pfunction_cases body. We put them on the + Pexp_function node here because the compiler only uses + Pfunction_cases attributes for enabling/disabling warnings in + typechecking. For standalone function cases, we want the compiler to + respect, e.g., [@inline] attributes. + *) + let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in + mkexp_attrs ~loc:_sloc desc _2 + ) +# 45855 "parsing/parser.ml" in - let _endpos__1_ = _endpos__3_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 1019 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 38798 "parsing/parser.ml" +# 2440 "parsing/parser.mly" + ( _1 ) +# 45861 "parsing/parser.ml" in -# 2938 "parsing/parser.mly" - ( _1 ) -# 38804 "parsing/parser.ml" +# 2851 "parsing/parser.mly" + ( None, _1 ) +# 45867 "parsing/parser.ml" in ( -# 2915 "parsing/parser.mly" - ( _1 ) -# 38810 "parsing/parser.ml" - : (Parsetree.pattern)) +# 2876 "parsing/parser.mly" + ( [ x2; Some l1, x1 ] ) +# 45873 "parsing/parser.ml" + : ((string option * Parsetree.expression) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38820,58 +45883,62 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = x1; + MenhirLib.EngineTypes.startp = _startpos_x1_; + MenhirLib.EngineTypes.endp = _endpos_x1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = l1; + MenhirLib.EngineTypes.startp = _startpos_l1_; + MenhirLib.EngineTypes.endp = _endpos_l1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; }; }; } = _menhir_stack in - let _3 : (Parsetree.pattern) = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.pattern) = Obj.magic _1 in + let _2 : (Parsetree.expression) = Obj.magic _2 in + let _1 : ( +# 772 "parsing/parser.mly" + (string) +# 45920 "parsing/parser.ml" + ) = Obj.magic _1 in + let _3 : unit = Obj.magic _3 in + let x1 : (Parsetree.expression) = Obj.magic x1 in + let l1 : ( +# 772 "parsing/parser.mly" + (string) +# 45927 "parsing/parser.ml" + ) = Obj.magic l1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in + let _startpos = _startpos_l1_ in + let _endpos = _endpos__2_ in let _v = - let _1 = - let _1 = - let _1 = -# 2935 "parsing/parser.mly" - ( Ppat_or(_1, _3) ) -# 38853 "parsing/parser.ml" - in - let _endpos__1_ = _endpos__3_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1019 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 38862 "parsing/parser.ml" - - in - -# 2938 "parsing/parser.mly" - ( _1 ) -# 38868 "parsing/parser.ml" - - in + let x2 = +# 2853 "parsing/parser.mly" + ( Some _1, _2 ) +# 45936 "parsing/parser.ml" + in ( -# 2915 "parsing/parser.mly" - ( _1 ) -# 38874 "parsing/parser.ml" - : (Parsetree.pattern)) +# 2876 "parsing/parser.mly" + ( [ x2; Some l1, x1 ] ) +# 45941 "parsing/parser.ml" + : ((string option * Parsetree.expression) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38884,61 +45951,66 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = x1; + MenhirLib.EngineTypes.startp = _startpos_x1_; + MenhirLib.EngineTypes.endp = _endpos_x1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = l1; + MenhirLib.EngineTypes.startp = _startpos_l1_; + MenhirLib.EngineTypes.endp = _endpos_l1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; }; }; } = _menhir_stack in + let label : ( +# 785 "parsing/parser.mly" + (string) +# 45987 "parsing/parser.ml" + ) = Obj.magic label in + let _1 : unit = Obj.magic _1 in let _3 : unit = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.pattern) = Obj.magic _1 in + let x1 : (Parsetree.expression) = Obj.magic x1 in + let l1 : ( +# 772 "parsing/parser.mly" + (string) +# 45995 "parsing/parser.ml" + ) = Obj.magic l1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__3_ in + let _startpos = _startpos_l1_ in + let _endpos = _endpos_label_ in let _v = - let _1 = - let _1 = - let _1 = - let _loc__3_ = (_startpos__3_, _endpos__3_) in - -# 2937 "parsing/parser.mly" - ( expecting _loc__3_ "pattern" ) -# 38919 "parsing/parser.ml" - - in - let _endpos__1_ = _endpos__3_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 1019 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 38929 "parsing/parser.ml" - - in + let x2 = + let _loc_label_ = (_startpos_label_, _endpos_label_) in -# 2938 "parsing/parser.mly" - ( _1 ) -# 38935 "parsing/parser.ml" +# 2855 "parsing/parser.mly" + ( let loc = _loc_label_ in + Some label, mkexpvar ~loc label ) +# 46007 "parsing/parser.ml" in ( -# 2915 "parsing/parser.mly" - ( _1 ) -# 38941 "parsing/parser.ml" - : (Parsetree.pattern)) +# 2876 "parsing/parser.mly" + ( [ x2; Some l1, x1 ] ) +# 46013 "parsing/parser.ml" + : ((string option * Parsetree.expression) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38950,53 +46022,90 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = c; + MenhirLib.EngineTypes.startp = _startpos_c_; + MenhirLib.EngineTypes.endp = _endpos_c_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = x1; + MenhirLib.EngineTypes.startp = _startpos_x1_; + MenhirLib.EngineTypes.endp = _endpos_x1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = l1; + MenhirLib.EngineTypes.startp = _startpos_l1_; + MenhirLib.EngineTypes.endp = _endpos_l1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; } = _menhir_stack in - let _1 : ( -# 797 "parsing/parser.mly" + let _5 : unit = Obj.magic _5 in + let c : (Parsetree.type_constraint) = Obj.magic c in + let label : ( +# 785 "parsing/parser.mly" (string) -# 38963 "parsing/parser.ml" - ) = Obj.magic _1 in +# 46079 "parsing/parser.ml" + ) = Obj.magic label in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _3 : unit = Obj.magic _3 in + let x1 : (Parsetree.expression) = Obj.magic x1 in + let l1 : ( +# 772 "parsing/parser.mly" + (string) +# 46088 "parsing/parser.ml" + ) = Obj.magic l1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in + let _startpos = _startpos_l1_ in + let _endpos = _endpos__5_ in let _v = - let _1 = - let _1 = - let _1 = - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 984 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 38978 "parsing/parser.ml" - - in - -# 2370 "parsing/parser.mly" - ( Ppat_var _1 ) -# 38984 "parsing/parser.ml" - - in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let x2 = + let _endpos = _endpos__5_ in + let _loc_label_ = (_startpos_label_, _endpos_label_) in -# 1019 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 38993 "parsing/parser.ml" +# 2858 "parsing/parser.mly" + ( Some label, + mkexp_constraint ~loc:(_startpos__2_, _endpos) + (mkexpvar ~loc:_loc_label_ label) c ) +# 46102 "parsing/parser.ml" in ( -# 2372 "parsing/parser.mly" - ( _1 ) -# 38999 "parsing/parser.ml" - : (Parsetree.pattern)) +# 2876 "parsing/parser.mly" + ( [ x2; Some l1, x1 ] ) +# 46108 "parsing/parser.ml" + : ((string option * Parsetree.expression) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39008,37 +46117,69 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = l1; + MenhirLib.EngineTypes.startp = _startpos_l1_; + MenhirLib.EngineTypes.endp = _endpos_l1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; } = _menhir_stack in + let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in + let _3 : unit = Obj.magic _3 in + let l1 : ( +# 785 "parsing/parser.mly" + (string) +# 46150 "parsing/parser.ml" + ) = Obj.magic l1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in + let _endpos = _endpos__1_inlined1_ in let _v = - let _1 = - let _1 = -# 2371 "parsing/parser.mly" - ( Ppat_any ) -# 39027 "parsing/parser.ml" - in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let x2 = + let _1 = _1_inlined1 in + let _1 = + let _1 = +# 2297 "parsing/parser.mly" + ( _1 ) +# 46163 "parsing/parser.ml" + in + +# 2440 "parsing/parser.mly" + ( _1 ) +# 46168 "parsing/parser.ml" + + in -# 1019 "parsing/parser.mly" - ( mkpat ~loc:_sloc _1 ) -# 39035 "parsing/parser.ml" +# 2851 "parsing/parser.mly" + ( None, _1 ) +# 46174 "parsing/parser.ml" in + let _loc_l1_ = (_startpos_l1_, _endpos_l1_) in ( -# 2372 "parsing/parser.mly" - ( _1 ) -# 39041 "parsing/parser.ml" - : (Parsetree.pattern)) +# 2880 "parsing/parser.mly" + ( let loc = _loc_l1_ in + [ x2; Some l1, mkexpvar ~loc l1] ) +# 46182 "parsing/parser.ml" + : ((string option * Parsetree.expression) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39047,56 +46188,146 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos; MenhirLib.EngineTypes.next = _menhir_stack; }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : (Parsetree.structure) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Parsetree.payload) = -# 4140 "parsing/parser.mly" - ( PStr _1 ) -# 39067 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = l1; + MenhirLib.EngineTypes.startp = _startpos_l1_; + MenhirLib.EngineTypes.endp = _endpos_l1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; }; } = _menhir_stack in - let _2 : (Parsetree.signature) = Obj.magic _2 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _3 : unit = Obj.magic _3 in + let l1 : ( +# 785 "parsing/parser.mly" + (string) +# 46245 "parsing/parser.ml" + ) = Obj.magic l1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Parsetree.payload) = -# 4141 "parsing/parser.mly" - ( PSig _2 ) -# 39099 "parsing/parser.ml" - in + let _endpos = _endpos_xs_ in + let _v = + let x2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in + let _1 = + let _1 = + let _3 = + let xs = + let xs = +# 264 "" + ( List.rev xs ) +# 46261 "parsing/parser.ml" + in + +# 1188 "parsing/parser.mly" + ( xs ) +# 46266 "parsing/parser.ml" + + in + +# 2783 "parsing/parser.mly" + ( xs ) +# 46272 "parsing/parser.ml" + + in + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +# 4286 "parsing/parser.mly" + ( _1 ) +# 46283 "parsing/parser.ml" + + in + +# 4299 "parsing/parser.mly" + ( _1, _2 ) +# 46289 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2299 "parsing/parser.mly" + ( let loc = make_loc _sloc in + let cases = _3 in + (* There are two choices of where to put attributes: on the + Pexp_function node; on the Pfunction_cases body. We put them on the + Pexp_function node here because the compiler only uses + Pfunction_cases attributes for enabling/disabling warnings in + typechecking. For standalone function cases, we want the compiler to + respect, e.g., [@inline] attributes. + *) + let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in + mkexp_attrs ~loc:_sloc desc _2 + ) +# 46309 "parsing/parser.ml" + + in + +# 2440 "parsing/parser.mly" + ( _1 ) +# 46315 "parsing/parser.ml" + + in + +# 2851 "parsing/parser.mly" + ( None, _1 ) +# 46321 "parsing/parser.ml" + + in + let _loc_l1_ = (_startpos_l1_, _endpos_l1_) in + ( +# 2880 "parsing/parser.mly" + ( let loc = _loc_l1_ in + [ x2; Some l1, mkexpvar ~loc l1] ) +# 46329 "parsing/parser.ml" + : ((string option * Parsetree.expression) list)) + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -39112,23 +46343,64 @@ module Tables = struct MenhirLib.EngineTypes.startp = _startpos__2_; MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = l1; + MenhirLib.EngineTypes.startp = _startpos_l1_; + MenhirLib.EngineTypes.endp = _endpos_l1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; }; } = _menhir_stack in - let _2 : (Parsetree.core_type) = Obj.magic _2 in + let _2 : (Parsetree.expression) = Obj.magic _2 in + let _1_inlined1 : ( +# 772 "parsing/parser.mly" + (string) +# 46376 "parsing/parser.ml" + ) = Obj.magic _1_inlined1 in + let _3 : unit = Obj.magic _3 in + let l1 : ( +# 785 "parsing/parser.mly" + (string) +# 46382 "parsing/parser.ml" + ) = Obj.magic l1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in - let _v : (Parsetree.payload) = -# 4142 "parsing/parser.mly" - ( PTyp _2 ) -# 39131 "parsing/parser.ml" - in + let _v = + let x2 = + let _1 = _1_inlined1 in + +# 2853 "parsing/parser.mly" + ( Some _1, _2 ) +# 46394 "parsing/parser.ml" + + in + let _loc_l1_ = (_startpos_l1_, _endpos_l1_) in + ( +# 2880 "parsing/parser.mly" + ( let loc = _loc_l1_ in + [ x2; Some l1, mkexpvar ~loc l1] ) +# 46402 "parsing/parser.ml" + : ((string option * Parsetree.expression) list)) + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -39140,27 +46412,69 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = l1; + MenhirLib.EngineTypes.startp = _startpos_l1_; + MenhirLib.EngineTypes.endp = _endpos_l1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; }; } = _menhir_stack in - let _2 : (Parsetree.pattern) = Obj.magic _2 in + let label : ( +# 785 "parsing/parser.mly" + (string) +# 46448 "parsing/parser.ml" + ) = Obj.magic label in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _3 : unit = Obj.magic _3 in + let l1 : ( +# 785 "parsing/parser.mly" + (string) +# 46455 "parsing/parser.ml" + ) = Obj.magic l1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Parsetree.payload) = -# 4143 "parsing/parser.mly" - ( PPat (_2, None) ) -# 39163 "parsing/parser.ml" - in + let _endpos = _endpos_label_ in + let _v = + let x2 = + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +# 2855 "parsing/parser.mly" + ( let loc = _loc_label_ in + Some label, mkexpvar ~loc label ) +# 46468 "parsing/parser.ml" + + in + let _loc_l1_ = (_startpos_l1_, _endpos_l1_) in + ( +# 2880 "parsing/parser.mly" + ( let loc = _loc_l1_ in + [ x2; Some l1, mkexpvar ~loc l1] ) +# 46476 "parsing/parser.ml" + : ((string option * Parsetree.expression) list)) + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -39172,66 +46486,92 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = c; + MenhirLib.EngineTypes.startp = _startpos_c_; + MenhirLib.EngineTypes.endp = _endpos_c_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = l1; + MenhirLib.EngineTypes.startp = _startpos_l1_; + MenhirLib.EngineTypes.endp = _endpos_l1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; }; }; }; } = _menhir_stack in - let _4 : (Parsetree.expression) = Obj.magic _4 in + let _5 : unit = Obj.magic _5 in + let c : (Parsetree.type_constraint) = Obj.magic c in + let label : ( +# 785 "parsing/parser.mly" + (string) +# 46542 "parsing/parser.ml" + ) = Obj.magic label in + let _2 : unit = Obj.magic _2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _3 : unit = Obj.magic _3 in - let _2 : (Parsetree.pattern) = Obj.magic _2 in + let l1 : ( +# 785 "parsing/parser.mly" + (string) +# 46550 "parsing/parser.ml" + ) = Obj.magic l1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__4_ in - let _v : (Parsetree.payload) = -# 4144 "parsing/parser.mly" - ( PPat (_2, Some _4) ) -# 39209 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : (Parsetree.core_type) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Parsetree.core_type) = -# 3474 "parsing/parser.mly" - ( _1 ) -# 39234 "parsing/parser.ml" - in + let _endpos = _endpos__5_ in + let _v = + let x2 = + let _endpos = _endpos__5_ in + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +# 2858 "parsing/parser.mly" + ( Some label, + mkexp_constraint ~loc:(_startpos__2_, _endpos) + (mkexpvar ~loc:_loc_label_ label) c ) +# 46565 "parsing/parser.ml" + + in + let _loc_l1_ = (_startpos_l1_, _endpos_l1_) in + ( +# 2880 "parsing/parser.mly" + ( let loc = _loc_l1_ in + [ x2; Some l1, mkexpvar ~loc l1] ) +# 46573 "parsing/parser.ml" + : ((string option * Parsetree.expression) list)) + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -39243,104 +46583,94 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = c; + MenhirLib.EngineTypes.startp = _startpos_c_; + MenhirLib.EngineTypes.endp = _endpos_c_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = l1; + MenhirLib.EngineTypes.startp = _startpos_l1_; + MenhirLib.EngineTypes.endp = _endpos_l1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; }; }; } = _menhir_stack in - let _3 : (Parsetree.core_type) = Obj.magic _3 in + let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in + let _6 : unit = Obj.magic _6 in + let _5 : unit = Obj.magic _5 in + let c : (Parsetree.type_constraint) = Obj.magic c in + let l1 : ( +# 785 "parsing/parser.mly" + (string) +# 46635 "parsing/parser.ml" + ) = Obj.magic l1 in let _2 : unit = Obj.magic _2 in - let xs : (Asttypes.label Asttypes.loc list) = Obj.magic xs in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_xs_ in - let _endpos = _endpos__3_ in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined1_ in let _v = - let _1 = + let x2 = + let _1 = _1_inlined1 in let _1 = - let _1 = - let _1 = - let xs = -# 264 "" - ( List.rev xs ) -# 39278 "parsing/parser.ml" - in - -# 1086 "parsing/parser.mly" - ( xs ) -# 39283 "parsing/parser.ml" - - in - -# 3466 "parsing/parser.mly" - ( _1 ) -# 39289 "parsing/parser.ml" - - in + let _1 = +# 2297 "parsing/parser.mly" + ( _1 ) +# 46649 "parsing/parser.ml" + in -# 3470 "parsing/parser.mly" - ( Ptyp_poly(_1, _3) ) -# 39295 "parsing/parser.ml" +# 2440 "parsing/parser.mly" + ( _1 ) +# 46654 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos__3_, _startpos_xs_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 1021 "parsing/parser.mly" - ( mktyp ~loc:_sloc _1 ) -# 39305 "parsing/parser.ml" +# 2851 "parsing/parser.mly" + ( None, _1 ) +# 46660 "parsing/parser.ml" in + let _endpos_x2_ = _endpos__1_inlined1_ in + let _endpos = _endpos_x2_ in + let _loc_l1_ = (_startpos_l1_, _endpos_l1_) in ( -# 3476 "parsing/parser.mly" - ( _1 ) -# 39311 "parsing/parser.ml" - : (Parsetree.core_type)) - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : (Parsetree.core_type) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v = - let _1 = -# 3505 "parsing/parser.mly" - ( _1 ) -# 39338 "parsing/parser.ml" - in - ( -# 3474 "parsing/parser.mly" - ( _1 ) -# 39343 "parsing/parser.ml" - : (Parsetree.core_type)) +# 2885 "parsing/parser.mly" + ( let x1 = + mkexp_constraint ~loc:(_startpos__2_, _endpos) + (mkexpvar ~loc:_loc_l1_ l1) c + in + [ x2; Some l1, x1] ) +# 46673 "parsing/parser.ml" + : ((string option * Parsetree.expression) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39353,128 +46683,167 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = c; + MenhirLib.EngineTypes.startp = _startpos_c_; + MenhirLib.EngineTypes.endp = _endpos_c_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = l1; + MenhirLib.EngineTypes.startp = _startpos_l1_; + MenhirLib.EngineTypes.endp = _endpos_l1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; }; }; } = _menhir_stack in - let _1 : (Parsetree.core_type) = Obj.magic _1 in + let xs : (Parsetree.case list) = Obj.magic xs in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _6 : unit = Obj.magic _6 in + let _5 : unit = Obj.magic _5 in + let c : (Parsetree.type_constraint) = Obj.magic c in + let l1 : ( +# 785 "parsing/parser.mly" + (string) +# 46756 "parsing/parser.ml" + ) = Obj.magic l1 in let _2 : unit = Obj.magic _2 in - let xs : (Asttypes.label Asttypes.loc list) = Obj.magic xs in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_xs_ in - let _endpos = _endpos__1_ in + let _startpos = _startpos__1_ in + let _endpos = _endpos_xs_ in let _v = - let _1 = + let x2 = + let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in let _1 = - let _3 = -# 3505 "parsing/parser.mly" - ( _1 ) -# 39386 "parsing/parser.ml" - in let _1 = - let _1 = - let xs = + let _3 = + let xs = + let xs = # 264 "" ( List.rev xs ) -# 39393 "parsing/parser.ml" - in +# 46773 "parsing/parser.ml" + in + +# 1188 "parsing/parser.mly" + ( xs ) +# 46778 "parsing/parser.ml" + + in -# 1086 "parsing/parser.mly" +# 2783 "parsing/parser.mly" ( xs ) -# 39398 "parsing/parser.ml" +# 46784 "parsing/parser.ml" in - -# 3466 "parsing/parser.mly" + let _endpos__3_ = _endpos_xs_ in + let _2 = + let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in + let _2 = + let _1 = _1_inlined1 in + +# 4286 "parsing/parser.mly" ( _1 ) -# 39404 "parsing/parser.ml" +# 46795 "parsing/parser.ml" + + in + +# 4299 "parsing/parser.mly" + ( _1, _2 ) +# 46801 "parsing/parser.ml" + + in + let _endpos = _endpos__3_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2299 "parsing/parser.mly" + ( let loc = make_loc _sloc in + let cases = _3 in + (* There are two choices of where to put attributes: on the + Pexp_function node; on the Pfunction_cases body. We put them on the + Pexp_function node here because the compiler only uses + Pfunction_cases attributes for enabling/disabling warnings in + typechecking. For standalone function cases, we want the compiler to + respect, e.g., [@inline] attributes. + *) + let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in + mkexp_attrs ~loc:_sloc desc _2 + ) +# 46821 "parsing/parser.ml" in -# 3470 "parsing/parser.mly" - ( Ptyp_poly(_1, _3) ) -# 39410 "parsing/parser.ml" +# 2440 "parsing/parser.mly" + ( _1 ) +# 46827 "parsing/parser.ml" in - let _startpos__1_ = _startpos_xs_ in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 1021 "parsing/parser.mly" - ( mktyp ~loc:_sloc _1 ) -# 39420 "parsing/parser.ml" +# 2851 "parsing/parser.mly" + ( None, _1 ) +# 46833 "parsing/parser.ml" in + let _endpos_x2_ = _endpos_xs_ in + let _endpos = _endpos_x2_ in + let _loc_l1_ = (_startpos_l1_, _endpos_l1_) in ( -# 3476 "parsing/parser.mly" - ( _1 ) -# 39426 "parsing/parser.ml" - : (Parsetree.core_type)) - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - } = _menhir_stack in - let _4 : unit = Obj.magic _4 in - let _3 : (Parsetree.payload) = Obj.magic _3 in - let _2 : (Ast_helper.str) = Obj.magic _2 in - let _1 : unit = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__4_ in - let _v = - let _endpos = _endpos__4_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - ( -# 4101 "parsing/parser.mly" - ( mk_attr ~loc:(make_loc _sloc) _2 _3 ) -# 39477 "parsing/parser.ml" - : (Parsetree.attribute)) +# 2885 "parsing/parser.mly" + ( let x1 = + mkexp_constraint ~loc:(_startpos__2_, _endpos) + (mkexpvar ~loc:_loc_l1_ l1) c + in + [ x2; Some l1, x1] ) +# 46846 "parsing/parser.ml" + : ((string option * Parsetree.expression) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39487,51 +46856,45 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = prim; - MenhirLib.EngineTypes.startp = _startpos_prim_; - MenhirLib.EngineTypes.endp = _endpos_prim_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _7; - MenhirLib.EngineTypes.startp = _startpos__7_; - MenhirLib.EngineTypes.endp = _endpos__7_; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ty; - MenhirLib.EngineTypes.startp = _startpos_ty_; - MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = c; + MenhirLib.EngineTypes.startp = _startpos_c_; + MenhirLib.EngineTypes.endp = _endpos_c_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.semv = l1; + MenhirLib.EngineTypes.startp = _startpos_l1_; + MenhirLib.EngineTypes.endp = _endpos_l1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = ext; - MenhirLib.EngineTypes.startp = _startpos_ext_; - MenhirLib.EngineTypes.endp = _endpos_ext_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; @@ -39540,116 +46903,46 @@ module Tables = struct }; }; } = _menhir_stack in - let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let prim : (string list) = Obj.magic prim in - let _7 : unit = Obj.magic _7 in - let ty : (Parsetree.core_type) = Obj.magic ty in + let _2_inlined1 : (Parsetree.expression) = Obj.magic _2_inlined1 in + let _1_inlined1 : ( +# 772 "parsing/parser.mly" + (string) +# 46911 "parsing/parser.ml" + ) = Obj.magic _1_inlined1 in + let _6 : unit = Obj.magic _6 in let _5 : unit = Obj.magic _5 in - let _1_inlined2 : (Asttypes.label) = Obj.magic _1_inlined2 in - let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in - let ext : (string Asttypes.loc option) = Obj.magic ext in + let c : (Parsetree.type_constraint) = Obj.magic c in + let l1 : ( +# 785 "parsing/parser.mly" + (string) +# 46919 "parsing/parser.ml" + ) = Obj.magic l1 in + let _2 : unit = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined3_ in + let _endpos = _endpos__2_inlined1_ in let _v = - let attrs2 = - let _1 = _1_inlined3 in - -# 4110 "parsing/parser.mly" - ( _1 ) -# 39562 "parsing/parser.ml" - - in - let _endpos_attrs2_ = _endpos__1_inlined3_ in - let id = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 984 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 39574 "parsing/parser.ml" - - in - let attrs1 = - let _1 = _1_inlined1 in + let x2 = + let (_2, _1) = (_2_inlined1, _1_inlined1) in -# 4114 "parsing/parser.mly" - ( _1 ) -# 39582 "parsing/parser.ml" +# 2853 "parsing/parser.mly" + ( Some _1, _2 ) +# 46932 "parsing/parser.ml" in - let _endpos = _endpos_attrs2_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - ( -# 3102 "parsing/parser.mly" - ( let attrs = attrs1 @ attrs2 in - let loc = make_loc _sloc in - let docs = symbol_docs _sloc in - Val.mk id ty ~prim ~attrs ~loc ~docs, - ext ) -# 39595 "parsing/parser.ml" - : (Parsetree.value_description * string Asttypes.loc option)) - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v = - let _1 = -# 3969 "parsing/parser.mly" - ( Public ) -# 39615 "parsing/parser.ml" - in - ( -# 3966 "parsing/parser.mly" - ( _1 ) -# 39620 "parsing/parser.ml" - : (Asttypes.private_flag)) - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : unit = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v = - let _1 = -# 3970 "parsing/parser.mly" - ( Private ) -# 39647 "parsing/parser.ml" - in + let _endpos_x2_ = _endpos__2_inlined1_ in + let _endpos = _endpos_x2_ in + let _loc_l1_ = (_startpos_l1_, _endpos_l1_) in ( -# 3966 "parsing/parser.mly" - ( _1 ) -# 39652 "parsing/parser.ml" - : (Asttypes.private_flag)) +# 2885 "parsing/parser.mly" + ( let x1 = + mkexp_constraint ~loc:(_startpos__2_, _endpos) + (mkexpvar ~loc:_loc_l1_ l1) c + in + [ x2; Some l1, x1] ) +# 46945 "parsing/parser.ml" + : ((string option * Parsetree.expression) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39658,99 +46951,99 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos; MenhirLib.EngineTypes.next = _menhir_stack; }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (Asttypes.private_flag * Asttypes.virtual_flag) = -# 3992 "parsing/parser.mly" - ( Public, Concrete ) -# 39671 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : unit = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Asttypes.private_flag * Asttypes.virtual_flag) = -# 3993 "parsing/parser.mly" - ( Private, Concrete ) -# 39696 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let _1 : unit = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in - let _v : (Asttypes.private_flag * Asttypes.virtual_flag) = -# 3994 "parsing/parser.mly" - ( Public, Virtual ) -# 39721 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = c; + MenhirLib.EngineTypes.startp = _startpos_c_; + MenhirLib.EngineTypes.endp = _endpos_c_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = l1; + MenhirLib.EngineTypes.startp = _startpos_l1_; + MenhirLib.EngineTypes.endp = _endpos_l1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; }; } = _menhir_stack in + let label : ( +# 785 "parsing/parser.mly" + (string) +# 47009 "parsing/parser.ml" + ) = Obj.magic label in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _6 : unit = Obj.magic _6 in + let _5 : unit = Obj.magic _5 in + let c : (Parsetree.type_constraint) = Obj.magic c in + let l1 : ( +# 785 "parsing/parser.mly" + (string) +# 47018 "parsing/parser.ml" + ) = Obj.magic l1 in let _2 : unit = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Asttypes.private_flag * Asttypes.virtual_flag) = -# 3995 "parsing/parser.mly" - ( Private, Virtual ) -# 39753 "parsing/parser.ml" - in + let _endpos = _endpos_label_ in + let _v = + let x2 = + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +# 2855 "parsing/parser.mly" + ( let loc = _loc_label_ in + Some label, mkexpvar ~loc label ) +# 47032 "parsing/parser.ml" + + in + let _endpos_x2_ = _endpos_label_ in + let _endpos = _endpos_x2_ in + let _loc_l1_ = (_startpos_l1_, _endpos_l1_) in + ( +# 2885 "parsing/parser.mly" + ( let x1 = + mkexp_constraint ~loc:(_startpos__2_, _endpos) + (mkexpvar ~loc:_loc_l1_ l1) c + in + [ x2; Some l1, x1] ) +# 47045 "parsing/parser.ml" + : ((string option * Parsetree.expression) list)) + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -39762,45 +47055,119 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _5_inlined1; + MenhirLib.EngineTypes.startp = _startpos__5_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__5_inlined1_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = c_inlined1; + MenhirLib.EngineTypes.startp = _startpos_c_inlined1_; + MenhirLib.EngineTypes.endp = _endpos_c_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = c; + MenhirLib.EngineTypes.startp = _startpos_c_; + MenhirLib.EngineTypes.endp = _endpos_c_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = l1; + MenhirLib.EngineTypes.startp = _startpos_l1_; + MenhirLib.EngineTypes.endp = _endpos_l1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + }; + }; }; } = _menhir_stack in + let _5_inlined1 : unit = Obj.magic _5_inlined1 in + let c_inlined1 : (Parsetree.type_constraint) = Obj.magic c_inlined1 in + let label : ( +# 785 "parsing/parser.mly" + (string) +# 47129 "parsing/parser.ml" + ) = Obj.magic label in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let _6 : unit = Obj.magic _6 in + let _5 : unit = Obj.magic _5 in + let c : (Parsetree.type_constraint) = Obj.magic c in + let l1 : ( +# 785 "parsing/parser.mly" + (string) +# 47139 "parsing/parser.ml" + ) = Obj.magic l1 in let _2 : unit = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__2_ in - let _v : (Asttypes.private_flag * Asttypes.virtual_flag) = -# 3996 "parsing/parser.mly" - ( Private, Virtual ) -# 39785 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in - let _endpos = _startpos in - let _v : (Asttypes.rec_flag) = -# 3947 "parsing/parser.mly" - ( Nonrecursive ) -# 39803 "parsing/parser.ml" - in + let _endpos = _endpos__5_inlined1_ in + let _v = + let x2 = + let (_endpos__5_, _startpos__2_, c) = (_endpos__5_inlined1_, _startpos__2_inlined1_, c_inlined1) in + let _endpos = _endpos__5_ in + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +# 2858 "parsing/parser.mly" + ( Some label, + mkexp_constraint ~loc:(_startpos__2_, _endpos) + (mkexpvar ~loc:_loc_label_ label) c ) +# 47156 "parsing/parser.ml" + + in + let _endpos_x2_ = _endpos__5_inlined1_ in + let _endpos = _endpos_x2_ in + let _loc_l1_ = (_startpos_l1_, _endpos_l1_) in + ( +# 2885 "parsing/parser.mly" + ( let x1 = + mkexp_constraint ~loc:(_startpos__2_, _endpos) + (mkexpvar ~loc:_loc_l1_ l1) c + in + [ x2; Some l1, x1] ) +# 47169 "parsing/parser.ml" + : ((string option * Parsetree.expression) list)) + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -39817,14 +47184,14 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _1 : unit = Obj.magic _1 in + let _1 : ((string option * Parsetree.pattern) list) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in - let _v : (Asttypes.rec_flag) = -# 3948 "parsing/parser.mly" - ( Recursive ) -# 39828 "parsing/parser.ml" + let _v : (Asttypes.closed_flag * (string option * Parsetree.pattern) list) = +# 3148 "parsing/parser.mly" + ( Closed, _1 ) +# 47195 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39833,46 +47200,13 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos; MenhirLib.EngineTypes.next = _menhir_stack; }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = fields; - MenhirLib.EngineTypes.startp = _startpos_fields_; - MenhirLib.EngineTypes.endp = _endpos_fields_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let fields : ((Longident.t Asttypes.loc * Parsetree.expression) list) = Obj.magic fields in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_fields_ in - let _endpos = _endpos_fields_ in - let _v = - let eo = -# 123 "" - ( None ) -# 39854 "parsing/parser.ml" - in - ( -# 2838 "parsing/parser.mly" - ( eo, fields ) -# 39859 "parsing/parser.ml" - : (Parsetree.expression option * - (Longident.t Asttypes.loc * Parsetree.expression) list)) - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = fields; - MenhirLib.EngineTypes.startp = _startpos_fields_; - MenhirLib.EngineTypes.endp = _endpos_fields_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _2; @@ -39880,113 +47214,24 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in - let fields : ((Longident.t Asttypes.loc * Parsetree.expression) list) = Obj.magic fields in - let _2 : unit = Obj.magic _2 in - let x : (Parsetree.expression) = Obj.magic x in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_x_ in - let _endpos = _endpos_fields_ in - let _v = - let eo = - let x = -# 196 "" - ( x ) -# 39902 "parsing/parser.ml" - in - -# 126 "" - ( Some x ) -# 39907 "parsing/parser.ml" - - in - ( -# 2838 "parsing/parser.mly" - ( eo, fields ) -# 39913 "parsing/parser.ml" - : (Parsetree.expression option * - (Longident.t Asttypes.loc * Parsetree.expression) list)) - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = d; - MenhirLib.EngineTypes.startp = _startpos_d_; - MenhirLib.EngineTypes.endp = _endpos_d_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let d : (Ast_helper.str * Ast_helper.str list * Parsetree.constructor_arguments * - Parsetree.core_type option * Parsetree.attributes * Location.t * - Docstrings.info) = Obj.magic d in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_d_ in - let _endpos = _endpos_d_ in - let _v = - let x = -# 3287 "parsing/parser.mly" - ( - let cid, vars, args, res, attrs, loc, info = d in - Type.constructor cid ~vars ~args ?res ~attrs ~loc ~info - ) -# 39946 "parsing/parser.ml" - in - ( -# 1217 "parsing/parser.mly" - ( [x] ) -# 39951 "parsing/parser.ml" - : (Parsetree.constructor_declaration list)) - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = d; - MenhirLib.EngineTypes.startp = _startpos_d_; - MenhirLib.EngineTypes.endp = _endpos_d_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let d : (Ast_helper.str * Ast_helper.str list * Parsetree.constructor_arguments * - Parsetree.core_type option * Parsetree.attributes * Location.t * - Docstrings.info) = Obj.magic d in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_d_ in - let _endpos = _endpos_d_ in - let _v = - let x = -# 3287 "parsing/parser.mly" - ( - let cid, vars, args, res, attrs, loc, info = d in - Type.constructor cid ~vars ~args ?res ~attrs ~loc ~info - ) -# 39983 "parsing/parser.ml" - in - ( -# 1220 "parsing/parser.mly" - ( [x] ) -# 39988 "parsing/parser.ml" - : (Parsetree.constructor_declaration list)) - in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : ((string option * Parsetree.pattern) list) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Asttypes.closed_flag * (string option * Parsetree.pattern) list) = +# 3150 "parsing/parser.mly" + ( Open, _1 ) +# 47234 "parsing/parser.ml" + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -39998,38 +47243,40 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = d; - MenhirLib.EngineTypes.startp = _startpos_d_; - MenhirLib.EngineTypes.endp = _endpos_d_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; } = _menhir_stack in - let d : (Ast_helper.str * Ast_helper.str list * Parsetree.constructor_arguments * - Parsetree.core_type option * Parsetree.attributes * Location.t * - Docstrings.info) = Obj.magic d in - let xs : (Parsetree.constructor_declaration list) = Obj.magic xs in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_xs_ in - let _endpos = _endpos_d_ in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in let _v = - let x = -# 3287 "parsing/parser.mly" - ( - let cid, vars, args, res, attrs, loc, info = d in - Type.constructor cid ~vars ~args ?res ~attrs ~loc ~info - ) -# 40027 "parsing/parser.ml" + let _1 = +# 3126 "parsing/parser.mly" + ( None, _1 ) +# 47274 "parsing/parser.ml" in ( -# 1224 "parsing/parser.mly" - ( x :: xs ) -# 40032 "parsing/parser.ml" - : (Parsetree.constructor_declaration list)) +# 3152 "parsing/parser.mly" + ( Open, [ _1 ] ) +# 47279 "parsing/parser.ml" + : (Asttypes.closed_flag * (string option * Parsetree.pattern) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40041,39 +47288,55 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = d; - MenhirLib.EngineTypes.startp = _startpos_d_; - MenhirLib.EngineTypes.endp = _endpos_d_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; } = _menhir_stack in - let d : (Ast_helper.str * Ast_helper.str list * Parsetree.constructor_arguments * - Parsetree.core_type option * Parsetree.attributes * Location.t * - Docstrings.info) = Obj.magic d in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _2_inlined1 : (Parsetree.pattern) = Obj.magic _2_inlined1 in + let _1 : ( +# 772 "parsing/parser.mly" + (string) +# 47322 "parsing/parser.ml" + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_d_ in - let _endpos = _endpos_d_ in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in let _v = - let x = - let _1 = -# 3404 "parsing/parser.mly" - ( - let cid, vars, args, res, attrs, loc, info = d in - Te.decl cid ~vars ~args ?res ~attrs ~loc ~info - ) -# 40065 "parsing/parser.ml" - in + let _1 = + let _2 = _2_inlined1 in -# 3398 "parsing/parser.mly" - ( _1 ) -# 40070 "parsing/parser.ml" +# 3128 "parsing/parser.mly" + ( Some _1, _2 ) +# 47333 "parsing/parser.ml" in ( -# 1217 "parsing/parser.mly" - ( [x] ) -# 40076 "parsing/parser.ml" - : (Parsetree.extension_constructor list)) +# 3152 "parsing/parser.mly" + ( Open, [ _1 ] ) +# 47339 "parsing/parser.ml" + : (Asttypes.closed_flag * (string option * Parsetree.pattern) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40085,27 +47348,56 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; } = _menhir_stack in - let _1 : (Parsetree.extension_constructor) = Obj.magic _1 in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let label : ( +# 785 "parsing/parser.mly" + (string) +# 47381 "parsing/parser.ml" + ) = Obj.magic label in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_ in + let _endpos = _endpos__3_ in let _v = - let x = -# 3400 "parsing/parser.mly" - ( _1 ) -# 40103 "parsing/parser.ml" - in + let _1 = + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +# 3130 "parsing/parser.mly" + ( let loc = _loc_label_ in + Some label, mkpatvar ~loc label ) +# 47394 "parsing/parser.ml" + + in ( -# 1217 "parsing/parser.mly" - ( [x] ) -# 40108 "parsing/parser.ml" - : (Parsetree.extension_constructor list)) +# 3152 "parsing/parser.mly" + ( Open, [ _1 ] ) +# 47400 "parsing/parser.ml" + : (Asttypes.closed_flag * (string option * Parsetree.pattern) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40117,39 +47409,88 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = d; - MenhirLib.EngineTypes.startp = _startpos_d_; - MenhirLib.EngineTypes.endp = _endpos_d_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = cty; + MenhirLib.EngineTypes.startp = _startpos_cty_; + MenhirLib.EngineTypes.endp = _endpos_cty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; } = _menhir_stack in - let d : (Ast_helper.str * Ast_helper.str list * Parsetree.constructor_arguments * - Parsetree.core_type option * Parsetree.attributes * Location.t * - Docstrings.info) = Obj.magic d in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _6 : unit = Obj.magic _6 in + let cty : (Parsetree.core_type) = Obj.magic cty in + let _4 : unit = Obj.magic _4 in + let label : ( +# 785 "parsing/parser.mly" + (string) +# 47469 "parsing/parser.ml" + ) = Obj.magic label in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_d_ in - let _endpos = _endpos_d_ in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in let _v = - let x = - let _1 = -# 3404 "parsing/parser.mly" - ( - let cid, vars, args, res, attrs, loc, info = d in - Te.decl cid ~vars ~args ?res ~attrs ~loc ~info - ) -# 40141 "parsing/parser.ml" - in + let _1 = + let _startpos__2_ = _startpos__2_inlined1_ in + let _endpos = _endpos__6_ in + let _loc_label_ = (_startpos_label_, _endpos_label_) in -# 3398 "parsing/parser.mly" - ( _1 ) -# 40146 "parsing/parser.ml" +# 3133 "parsing/parser.mly" + ( let lbl_loc = _loc_label_ in + let pat_loc = _startpos__2_, _endpos in + let pat = mkpatvar ~loc:lbl_loc label in + Some label, mkpat ~loc:pat_loc (Ppat_constraint(pat, cty)) ) +# 47487 "parsing/parser.ml" in ( -# 1220 "parsing/parser.mly" - ( [x] ) -# 40152 "parsing/parser.ml" - : (Parsetree.extension_constructor list)) +# 3152 "parsing/parser.mly" + ( Open, [ _1 ] ) +# 47493 "parsing/parser.ml" + : (Asttypes.closed_flag * (string option * Parsetree.pattern) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40167,22 +47508,15 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _1 : (Parsetree.extension_constructor) = Obj.magic _1 in + let _1 : ((string option * Parsetree.pattern) list) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in - let _v = - let x = -# 3400 "parsing/parser.mly" - ( _1 ) -# 40179 "parsing/parser.ml" - in - ( -# 1220 "parsing/parser.mly" - ( [x] ) -# 40184 "parsing/parser.ml" - : (Parsetree.extension_constructor list)) - in + let _v : (Asttypes.closed_flag * (string option * Parsetree.pattern) list) = +# 3148 "parsing/parser.mly" + ( Closed, _1 ) +# 47519 "parsing/parser.ml" + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -40194,46 +47528,34 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = d; - MenhirLib.EngineTypes.startp = _startpos_d_; - MenhirLib.EngineTypes.endp = _endpos_d_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; } = _menhir_stack in - let d : (Ast_helper.str * Ast_helper.str list * Parsetree.constructor_arguments * - Parsetree.core_type option * Parsetree.attributes * Location.t * - Docstrings.info) = Obj.magic d in - let xs : (Parsetree.extension_constructor list) = Obj.magic xs in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : ((string option * Parsetree.pattern) list) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_xs_ in - let _endpos = _endpos_d_ in - let _v = - let x = - let _1 = -# 3404 "parsing/parser.mly" - ( - let cid, vars, args, res, attrs, loc, info = d in - Te.decl cid ~vars ~args ?res ~attrs ~loc ~info - ) -# 40224 "parsing/parser.ml" - in - -# 3398 "parsing/parser.mly" - ( _1 ) -# 40229 "parsing/parser.ml" - - in - ( -# 1224 "parsing/parser.mly" - ( x :: xs ) -# 40235 "parsing/parser.ml" - : (Parsetree.extension_constructor list)) - in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in + let _v : (Asttypes.closed_flag * (string option * Parsetree.pattern) list) = +# 3150 "parsing/parser.mly" + ( Open, _1 ) +# 47558 "parsing/parser.ml" + in { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = Obj.repr _v; @@ -40245,33 +47567,40 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; }; } = _menhir_stack in - let _1 : (Parsetree.extension_constructor) = Obj.magic _1 in - let xs : (Parsetree.extension_constructor list) = Obj.magic xs in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.pattern) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_xs_ in - let _endpos = _endpos__1_ in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in let _v = - let x = -# 3400 "parsing/parser.mly" - ( _1 ) -# 40269 "parsing/parser.ml" + let _1 = +# 3126 "parsing/parser.mly" + ( None, _1 ) +# 47598 "parsing/parser.ml" in ( -# 1224 "parsing/parser.mly" - ( x :: xs ) -# 40274 "parsing/parser.ml" - : (Parsetree.extension_constructor list)) +# 3152 "parsing/parser.mly" + ( Open, [ _1 ] ) +# 47603 "parsing/parser.ml" + : (Asttypes.closed_flag * (string option * Parsetree.pattern) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40283,32 +47612,55 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = d; - MenhirLib.EngineTypes.startp = _startpos_d_; - MenhirLib.EngineTypes.endp = _endpos_d_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; } = _menhir_stack in - let d : (Ast_helper.str * Ast_helper.str list * Parsetree.constructor_arguments * - Parsetree.core_type option * Parsetree.attributes * Location.t * - Docstrings.info) = Obj.magic d in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _2_inlined1 : (Parsetree.pattern) = Obj.magic _2_inlined1 in + let _1 : ( +# 772 "parsing/parser.mly" + (string) +# 47646 "parsing/parser.ml" + ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_d_ in - let _endpos = _endpos_d_ in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in let _v = - let x = -# 3404 "parsing/parser.mly" - ( - let cid, vars, args, res, attrs, loc, info = d in - Te.decl cid ~vars ~args ?res ~attrs ~loc ~info - ) -# 40306 "parsing/parser.ml" - in + let _1 = + let _2 = _2_inlined1 in + +# 3128 "parsing/parser.mly" + ( Some _1, _2 ) +# 47657 "parsing/parser.ml" + + in ( -# 1217 "parsing/parser.mly" - ( [x] ) -# 40311 "parsing/parser.ml" - : (Parsetree.extension_constructor list)) +# 3152 "parsing/parser.mly" + ( Open, [ _1 ] ) +# 47663 "parsing/parser.ml" + : (Asttypes.closed_flag * (string option * Parsetree.pattern) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40320,32 +47672,56 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = d; - MenhirLib.EngineTypes.startp = _startpos_d_; - MenhirLib.EngineTypes.endp = _endpos_d_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; } = _menhir_stack in - let d : (Ast_helper.str * Ast_helper.str list * Parsetree.constructor_arguments * - Parsetree.core_type option * Parsetree.attributes * Location.t * - Docstrings.info) = Obj.magic d in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let label : ( +# 785 "parsing/parser.mly" + (string) +# 47705 "parsing/parser.ml" + ) = Obj.magic label in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_d_ in - let _endpos = _endpos_d_ in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in let _v = - let x = -# 3404 "parsing/parser.mly" - ( - let cid, vars, args, res, attrs, loc, info = d in - Te.decl cid ~vars ~args ?res ~attrs ~loc ~info - ) -# 40343 "parsing/parser.ml" - in + let _1 = + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +# 3130 "parsing/parser.mly" + ( let loc = _loc_label_ in + Some label, mkpatvar ~loc label ) +# 47718 "parsing/parser.ml" + + in ( -# 1220 "parsing/parser.mly" - ( [x] ) -# 40348 "parsing/parser.ml" - : (Parsetree.extension_constructor list)) +# 3152 "parsing/parser.mly" + ( Open, [ _1 ] ) +# 47724 "parsing/parser.ml" + : (Asttypes.closed_flag * (string option * Parsetree.pattern) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40358,38 +47734,87 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = d; - MenhirLib.EngineTypes.startp = _startpos_d_; - MenhirLib.EngineTypes.endp = _endpos_d_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = cty; + MenhirLib.EngineTypes.startp = _startpos_cty_; + MenhirLib.EngineTypes.endp = _endpos_cty_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; }; } = _menhir_stack in - let d : (Ast_helper.str * Ast_helper.str list * Parsetree.constructor_arguments * - Parsetree.core_type option * Parsetree.attributes * Location.t * - Docstrings.info) = Obj.magic d in - let xs : (Parsetree.extension_constructor list) = Obj.magic xs in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _6 : unit = Obj.magic _6 in + let cty : (Parsetree.core_type) = Obj.magic cty in + let _4 : unit = Obj.magic _4 in + let label : ( +# 785 "parsing/parser.mly" + (string) +# 47793 "parsing/parser.ml" + ) = Obj.magic label in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_xs_ in - let _endpos = _endpos_d_ in + let _startpos = _startpos__1_ in + let _endpos = _endpos__3_ in let _v = - let x = -# 3404 "parsing/parser.mly" - ( - let cid, vars, args, res, attrs, loc, info = d in - Te.decl cid ~vars ~args ?res ~attrs ~loc ~info - ) -# 40387 "parsing/parser.ml" - in + let _1 = + let _startpos__2_ = _startpos__2_inlined1_ in + let _endpos = _endpos__6_ in + let _loc_label_ = (_startpos_label_, _endpos_label_) in + +# 3133 "parsing/parser.mly" + ( let lbl_loc = _loc_label_ in + let pat_loc = _startpos__2_, _endpos in + let pat = mkpatvar ~loc:lbl_loc label in + Some label, mkpat ~loc:pat_loc (Ppat_constraint(pat, cty)) ) +# 47811 "parsing/parser.ml" + + in ( -# 1224 "parsing/parser.mly" - ( x :: xs ) -# 40392 "parsing/parser.ml" - : (Parsetree.extension_constructor list)) +# 3152 "parsing/parser.mly" + ( Open, [ _1 ] ) +# 47817 "parsing/parser.ml" + : (Asttypes.closed_flag * (string option * Parsetree.pattern) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40405,9 +47830,9 @@ module Tables = struct let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in let _endpos = _startpos in let _v : ((Parsetree.core_type * Parsetree.core_type * Ast_helper.loc) list) = -# 1062 "parsing/parser.mly" +# 1050 "parsing/parser.mly" ( [] ) -# 40411 "parsing/parser.ml" +# 47836 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40465,21 +47890,21 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2219 "parsing/parser.mly" +# 2207 "parsing/parser.mly" ( _1, _3, make_loc _sloc ) -# 40471 "parsing/parser.ml" +# 47896 "parsing/parser.ml" in # 188 "" ( x ) -# 40477 "parsing/parser.ml" +# 47902 "parsing/parser.ml" in ( -# 1064 "parsing/parser.mly" +# 1052 "parsing/parser.mly" ( x :: xs ) -# 40483 "parsing/parser.ml" +# 47908 "parsing/parser.ml" : ((Parsetree.core_type * Parsetree.core_type * Ast_helper.loc) list)) in { @@ -40503,9 +47928,9 @@ module Tables = struct let _startpos = _startpos_x_ in let _endpos = _endpos_x_ in let _v : (Parsetree.function_param list) = -# 1095 "parsing/parser.mly" +# 1083 "parsing/parser.mly" ( List.rev x ) -# 40509 "parsing/parser.ml" +# 47934 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40535,9 +47960,9 @@ module Tables = struct let _startpos = _startpos_xs_ in let _endpos = _endpos_x_ in let _v : (Parsetree.function_param list) = -# 1097 "parsing/parser.mly" +# 1085 "parsing/parser.mly" ( List.rev_append x xs ) -# 40541 "parsing/parser.ml" +# 47966 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40560,9 +47985,9 @@ module Tables = struct let _startpos = _startpos_x_ in let _endpos = _endpos_x_ in let _v : ((Lexing.position * Parsetree.functor_parameter) list) = -# 1076 "parsing/parser.mly" +# 1064 "parsing/parser.mly" ( [ x ] ) -# 40566 "parsing/parser.ml" +# 47991 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40592,9 +48017,9 @@ module Tables = struct let _startpos = _startpos_xs_ in let _endpos = _endpos_x_ in let _v : ((Lexing.position * Parsetree.functor_parameter) list) = -# 1078 "parsing/parser.mly" +# 1066 "parsing/parser.mly" ( x :: xs ) -# 40598 "parsing/parser.ml" +# 48023 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40617,9 +48042,9 @@ module Tables = struct let _startpos = _startpos_x_ in let _endpos = _endpos_x_ in let _v : ((Asttypes.arg_label * Parsetree.expression) list) = -# 1076 "parsing/parser.mly" +# 1064 "parsing/parser.mly" ( [ x ] ) -# 40623 "parsing/parser.ml" +# 48048 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40649,9 +48074,9 @@ module Tables = struct let _startpos = _startpos_xs_ in let _endpos = _endpos_x_ in let _v : ((Asttypes.arg_label * Parsetree.expression) list) = -# 1078 "parsing/parser.mly" +# 1066 "parsing/parser.mly" ( x :: xs ) -# 40655 "parsing/parser.ml" +# 48080 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40674,9 +48099,9 @@ module Tables = struct let _startpos = _startpos_x_ in let _endpos = _endpos_x_ in let _v : (Asttypes.label list) = -# 1076 "parsing/parser.mly" +# 1064 "parsing/parser.mly" ( [ x ] ) -# 40680 "parsing/parser.ml" +# 48105 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40706,9 +48131,9 @@ module Tables = struct let _startpos = _startpos_xs_ in let _endpos = _endpos_x_ in let _v : (Asttypes.label list) = -# 1078 "parsing/parser.mly" +# 1066 "parsing/parser.mly" ( x :: xs ) -# 40712 "parsing/parser.ml" +# 48137 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40743,15 +48168,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3462 "parsing/parser.mly" +# 3586 "parsing/parser.mly" ( mkrhs _2 _sloc ) -# 40749 "parsing/parser.ml" +# 48174 "parsing/parser.ml" in ( -# 1076 "parsing/parser.mly" +# 1064 "parsing/parser.mly" ( [ x ] ) -# 40755 "parsing/parser.ml" +# 48180 "parsing/parser.ml" : (Asttypes.label Asttypes.loc list)) in { @@ -40794,15 +48219,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3462 "parsing/parser.mly" +# 3586 "parsing/parser.mly" ( mkrhs _2 _sloc ) -# 40800 "parsing/parser.ml" +# 48225 "parsing/parser.ml" in ( -# 1078 "parsing/parser.mly" +# 1066 "parsing/parser.mly" ( x :: xs ) -# 40806 "parsing/parser.ml" +# 48231 "parsing/parser.ml" : (Asttypes.label Asttypes.loc list)) in { @@ -40829,12 +48254,12 @@ module Tables = struct let _1 = # 123 "" ( None ) -# 40833 "parsing/parser.ml" +# 48258 "parsing/parser.ml" in ( -# 1188 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( [x] ) -# 40838 "parsing/parser.ml" +# 48263 "parsing/parser.ml" : (Parsetree.case list)) in { @@ -40870,13 +48295,13 @@ module Tables = struct # 126 "" ( Some x ) -# 40874 "parsing/parser.ml" +# 48299 "parsing/parser.ml" in ( -# 1188 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( [x] ) -# 40880 "parsing/parser.ml" +# 48305 "parsing/parser.ml" : (Parsetree.case list)) in { @@ -40914,9 +48339,9 @@ module Tables = struct let _startpos = _startpos_xs_ in let _endpos = _endpos_x_ in let _v : (Parsetree.case list) = -# 1192 "parsing/parser.mly" +# 1180 "parsing/parser.mly" ( x :: xs ) -# 40920 "parsing/parser.ml" +# 48345 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40941,20 +48366,20 @@ module Tables = struct let _v = let xs = let x = -# 3505 "parsing/parser.mly" +# 3629 "parsing/parser.mly" ( _1 ) -# 40947 "parsing/parser.ml" +# 48372 "parsing/parser.ml" in -# 1123 "parsing/parser.mly" +# 1111 "parsing/parser.mly" ( [ x ] ) -# 40952 "parsing/parser.ml" +# 48377 "parsing/parser.ml" in ( -# 1131 "parsing/parser.mly" +# 1119 "parsing/parser.mly" ( xs ) -# 40958 "parsing/parser.ml" +# 48383 "parsing/parser.ml" : (Parsetree.core_type list)) in { @@ -40994,20 +48419,20 @@ module Tables = struct let _v = let xs = let x = -# 3505 "parsing/parser.mly" +# 3629 "parsing/parser.mly" ( _1 ) -# 41000 "parsing/parser.ml" +# 48425 "parsing/parser.ml" in -# 1127 "parsing/parser.mly" +# 1115 "parsing/parser.mly" ( x :: xs ) -# 41005 "parsing/parser.ml" +# 48430 "parsing/parser.ml" in ( -# 1131 "parsing/parser.mly" +# 1119 "parsing/parser.mly" ( xs ) -# 41011 "parsing/parser.ml" +# 48436 "parsing/parser.ml" : (Parsetree.core_type list)) in { @@ -41032,14 +48457,14 @@ module Tables = struct let _endpos = _endpos_x_ in let _v = let xs = -# 1123 "parsing/parser.mly" +# 1111 "parsing/parser.mly" ( [ x ] ) -# 41038 "parsing/parser.ml" +# 48463 "parsing/parser.ml" in ( -# 1131 "parsing/parser.mly" +# 1119 "parsing/parser.mly" ( xs ) -# 41043 "parsing/parser.ml" +# 48468 "parsing/parser.ml" : (Parsetree.with_constraint list)) in { @@ -41078,14 +48503,14 @@ module Tables = struct let _endpos = _endpos_x_ in let _v = let xs = -# 1127 "parsing/parser.mly" +# 1115 "parsing/parser.mly" ( x :: xs ) -# 41084 "parsing/parser.ml" +# 48509 "parsing/parser.ml" in ( -# 1131 "parsing/parser.mly" +# 1119 "parsing/parser.mly" ( xs ) -# 41089 "parsing/parser.ml" +# 48514 "parsing/parser.ml" : (Parsetree.with_constraint list)) in { @@ -41110,14 +48535,14 @@ module Tables = struct let _endpos = _endpos_x_ in let _v = let xs = -# 1123 "parsing/parser.mly" +# 1111 "parsing/parser.mly" ( [ x ] ) -# 41116 "parsing/parser.ml" +# 48541 "parsing/parser.ml" in ( -# 1131 "parsing/parser.mly" +# 1119 "parsing/parser.mly" ( xs ) -# 41121 "parsing/parser.ml" +# 48546 "parsing/parser.ml" : (Parsetree.row_field list)) in { @@ -41156,14 +48581,14 @@ module Tables = struct let _endpos = _endpos_x_ in let _v = let xs = -# 1127 "parsing/parser.mly" +# 1115 "parsing/parser.mly" ( x :: xs ) -# 41162 "parsing/parser.ml" +# 48587 "parsing/parser.ml" in ( -# 1131 "parsing/parser.mly" +# 1119 "parsing/parser.mly" ( xs ) -# 41167 "parsing/parser.ml" +# 48592 "parsing/parser.ml" : (Parsetree.row_field list)) in { @@ -41188,14 +48613,14 @@ module Tables = struct let _endpos = _endpos_x_ in let _v = let xs = -# 1123 "parsing/parser.mly" +# 1111 "parsing/parser.mly" ( [ x ] ) -# 41194 "parsing/parser.ml" +# 48619 "parsing/parser.ml" in ( -# 1131 "parsing/parser.mly" +# 1119 "parsing/parser.mly" ( xs ) -# 41199 "parsing/parser.ml" +# 48624 "parsing/parser.ml" : (Parsetree.core_type list)) in { @@ -41234,14 +48659,14 @@ module Tables = struct let _endpos = _endpos_x_ in let _v = let xs = -# 1127 "parsing/parser.mly" +# 1115 "parsing/parser.mly" ( x :: xs ) -# 41240 "parsing/parser.ml" +# 48665 "parsing/parser.ml" in ( -# 1131 "parsing/parser.mly" +# 1119 "parsing/parser.mly" ( xs ) -# 41245 "parsing/parser.ml" +# 48670 "parsing/parser.ml" : (Parsetree.core_type list)) in { @@ -41266,14 +48691,14 @@ module Tables = struct let _endpos = _endpos_x_ in let _v = let xs = -# 1123 "parsing/parser.mly" +# 1111 "parsing/parser.mly" ( [ x ] ) -# 41272 "parsing/parser.ml" +# 48697 "parsing/parser.ml" in ( -# 1131 "parsing/parser.mly" +# 1119 "parsing/parser.mly" ( xs ) -# 41277 "parsing/parser.ml" +# 48702 "parsing/parser.ml" : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list)) in { @@ -41312,14 +48737,14 @@ module Tables = struct let _endpos = _endpos_x_ in let _v = let xs = -# 1127 "parsing/parser.mly" +# 1115 "parsing/parser.mly" ( x :: xs ) -# 41318 "parsing/parser.ml" +# 48743 "parsing/parser.ml" in ( -# 1131 "parsing/parser.mly" +# 1119 "parsing/parser.mly" ( xs ) -# 41323 "parsing/parser.ml" +# 48748 "parsing/parser.ml" : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list)) in { @@ -41344,14 +48769,14 @@ module Tables = struct let _endpos = _endpos_x_ in let _v = let xs = -# 1123 "parsing/parser.mly" +# 1111 "parsing/parser.mly" ( [ x ] ) -# 41350 "parsing/parser.ml" +# 48775 "parsing/parser.ml" in ( -# 1131 "parsing/parser.mly" +# 1119 "parsing/parser.mly" ( xs ) -# 41355 "parsing/parser.ml" +# 48780 "parsing/parser.ml" : (Parsetree.core_type list)) in { @@ -41390,14 +48815,14 @@ module Tables = struct let _endpos = _endpos_x_ in let _v = let xs = -# 1127 "parsing/parser.mly" +# 1115 "parsing/parser.mly" ( x :: xs ) -# 41396 "parsing/parser.ml" +# 48821 "parsing/parser.ml" in ( -# 1131 "parsing/parser.mly" +# 1119 "parsing/parser.mly" ( xs ) -# 41401 "parsing/parser.ml" +# 48826 "parsing/parser.ml" : (Parsetree.core_type list)) in { @@ -41410,253 +48835,34 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - } = _menhir_stack in - let x : (Parsetree.core_type) = Obj.magic x in - let _2 : unit = Obj.magic _2 in - let xs : (Parsetree.core_type list) = Obj.magic xs in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_xs_ in - let _endpos = _endpos_x_ in - let _v : (Parsetree.core_type list) = -# 1154 "parsing/parser.mly" - ( x :: xs ) -# 41441 "parsing/parser.ml" - in - { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x2; - MenhirLib.EngineTypes.startp = _startpos_x2_; - MenhirLib.EngineTypes.endp = _endpos_x2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = x1; - MenhirLib.EngineTypes.startp = _startpos_x1_; - MenhirLib.EngineTypes.endp = _endpos_x1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - } = _menhir_stack in - let x2 : (Parsetree.core_type) = Obj.magic x2 in - let _2 : unit = Obj.magic _2 in - let x1 : (Parsetree.core_type) = Obj.magic x1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_x1_ in - let _endpos = _endpos_x2_ in - let _v : (Parsetree.core_type list) = -# 1158 "parsing/parser.mly" - ( [ x2; x1 ] ) -# 41480 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1; MenhirLib.EngineTypes.startp = _startpos__1_; MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let _1 : (Parsetree.expression) = Obj.magic _1 in - let _2 : unit = Obj.magic _2 in - let xs : (Parsetree.expression list) = Obj.magic xs in + let _1 : (Parsetree.core_type) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_xs_ in + let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v = - let x = - let _1 = -# 2309 "parsing/parser.mly" - ( _1 ) -# 41521 "parsing/parser.ml" + let xs = + let x = +# 3729 "parsing/parser.mly" + ( None, _1 ) +# 48854 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" - ( _1 ) -# 41526 "parsing/parser.ml" +# 1111 "parsing/parser.mly" + ( [ x ] ) +# 48859 "parsing/parser.ml" in ( -# 1154 "parsing/parser.mly" - ( x :: xs ) -# 41532 "parsing/parser.ml" - : (Parsetree.expression list)) - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs_inlined1; - MenhirLib.EngineTypes.startp = _startpos_xs_inlined1_; - MenhirLib.EngineTypes.endp = _endpos_xs_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; - } = _menhir_stack in - let xs_inlined1 : (Parsetree.case list) = Obj.magic xs_inlined1 in - let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in - let _1 : unit = Obj.magic _1 in - let _2 : unit = Obj.magic _2 in - let xs : (Parsetree.expression list) = Obj.magic xs in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_xs_ in - let _endpos = _endpos_xs_inlined1_ in - let _v = - let x = - let (_endpos_xs_, xs) = (_endpos_xs_inlined1_, xs_inlined1) in - let _1 = - let _3 = - let xs = - let xs = -# 264 "" - ( List.rev xs ) -# 41599 "parsing/parser.ml" - in - -# 1200 "parsing/parser.mly" +# 1119 "parsing/parser.mly" ( xs ) -# 41604 "parsing/parser.ml" - - in - -# 2798 "parsing/parser.mly" - ( xs ) -# 41610 "parsing/parser.ml" - - in - let _endpos__3_ = _endpos_xs_ in - let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4114 "parsing/parser.mly" - ( _1 ) -# 41621 "parsing/parser.ml" - - in - -# 4127 "parsing/parser.mly" - ( _1, _2 ) -# 41627 "parsing/parser.ml" - - in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2311 "parsing/parser.mly" - ( let loc = make_loc _sloc in - let cases = _3 in - (* There are two choices of where to put attributes: on the - Pexp_function node; on the Pfunction_cases body. We put them on the - Pexp_function node here because the compiler only uses - Pfunction_cases attributes for enabling/disabling warnings in - typechecking. For standalone function cases, we want the compiler to - respect, e.g., [@inline] attributes. - *) - let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in - mkexp_attrs ~loc:_sloc desc _2 - ) -# 41647 "parsing/parser.ml" - - in - -# 2453 "parsing/parser.mly" - ( _1 ) -# 41653 "parsing/parser.ml" - - in - ( -# 1154 "parsing/parser.mly" - ( x :: xs ) -# 41659 "parsing/parser.ml" - : (Parsetree.expression list)) +# 48865 "parsing/parser.ml" + : ((string option * Parsetree.core_type) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41669,9 +48875,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _2; @@ -41679,189 +48885,41 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in - let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.expression) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined1_ in - let _v = - let x2 = - let _1 = _1_inlined1 in - let _1 = -# 2309 "parsing/parser.mly" - ( _1 ) -# 41702 "parsing/parser.ml" - in - -# 2453 "parsing/parser.mly" - ( _1 ) -# 41707 "parsing/parser.ml" - - in - let x1 = - let _1 = -# 2309 "parsing/parser.mly" - ( _1 ) -# 41714 "parsing/parser.ml" - in - -# 2453 "parsing/parser.mly" - ( _1 ) -# 41719 "parsing/parser.ml" - - in - ( -# 1158 "parsing/parser.mly" - ( [ x2; x1 ] ) -# 41725 "parsing/parser.ml" - : (Parsetree.expression list)) - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; - } = _menhir_stack in - let xs : (Parsetree.case list) = Obj.magic xs in - let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let _1_inlined2 : (string Asttypes.loc option) = Obj.magic _1_inlined2 in - let _1_inlined1 : unit = Obj.magic _1_inlined1 in + let ty : (Parsetree.core_type) = Obj.magic ty in let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.expression) = Obj.magic _1 in + let label : ( +# 785 "parsing/parser.mly" + (string) +# 48901 "parsing/parser.ml" + ) = Obj.magic label in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos_xs_ in + let _startpos = _startpos_label_ in + let _endpos = _endpos_ty_ in let _v = - let x2 = - let (_startpos__1_, _1_inlined2, _1_inlined1) = (_startpos__1_inlined1_, _1_inlined3, _1_inlined2) in - let _1 = - let _3 = - let xs = - let xs = -# 264 "" - ( List.rev xs ) -# 41792 "parsing/parser.ml" - in - -# 1200 "parsing/parser.mly" - ( xs ) -# 41797 "parsing/parser.ml" - - in - -# 2798 "parsing/parser.mly" - ( xs ) -# 41803 "parsing/parser.ml" - - in - let _endpos__3_ = _endpos_xs_ in - let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4114 "parsing/parser.mly" - ( _1 ) -# 41814 "parsing/parser.ml" - - in - -# 4127 "parsing/parser.mly" - ( _1, _2 ) -# 41820 "parsing/parser.ml" - - in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2311 "parsing/parser.mly" - ( let loc = make_loc _sloc in - let cases = _3 in - (* There are two choices of where to put attributes: on the - Pexp_function node; on the Pfunction_cases body. We put them on the - Pexp_function node here because the compiler only uses - Pfunction_cases attributes for enabling/disabling warnings in - typechecking. For standalone function cases, we want the compiler to - respect, e.g., [@inline] attributes. - *) - let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in - mkexp_attrs ~loc:_sloc desc _2 - ) -# 41840 "parsing/parser.ml" - - in - -# 2453 "parsing/parser.mly" - ( _1 ) -# 41846 "parsing/parser.ml" - - in - let x1 = - let _1 = -# 2309 "parsing/parser.mly" - ( _1 ) -# 41853 "parsing/parser.ml" + let xs = + let x = +# 3731 "parsing/parser.mly" + ( Some label, ty ) +# 48911 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" - ( _1 ) -# 41858 "parsing/parser.ml" +# 1111 "parsing/parser.mly" + ( [ x ] ) +# 48916 "parsing/parser.ml" in ( -# 1158 "parsing/parser.mly" - ( [ x2; x1 ] ) -# 41864 "parsing/parser.ml" - : (Parsetree.expression list)) +# 1119 "parsing/parser.mly" + ( xs ) +# 48922 "parsing/parser.ml" + : ((string option * Parsetree.core_type) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41874,133 +48932,47 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _2; MenhirLib.EngineTypes.startp = _startpos__2_; MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = xs; MenhirLib.EngineTypes.startp = _startpos_xs_; MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; } = _menhir_stack in - let _1_inlined3 : (Parsetree.expression) = Obj.magic _1_inlined3 in + let _1 : (Parsetree.core_type) = Obj.magic _1 in let _2 : unit = Obj.magic _2 in - let xs : (Parsetree.case list) = Obj.magic xs in - let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in - let _1 : unit = Obj.magic _1 in + let xs : ((string option * Parsetree.core_type) list) = Obj.magic xs in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined3_ in + let _startpos = _startpos_xs_ in + let _endpos = _endpos__1_ in let _v = - let x2 = - let _1 = _1_inlined3 in - let _1 = -# 2309 "parsing/parser.mly" - ( _1 ) -# 41928 "parsing/parser.ml" + let xs = + let x = +# 3729 "parsing/parser.mly" + ( None, _1 ) +# 48964 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" - ( _1 ) -# 41933 "parsing/parser.ml" - - in - let x1 = - let _1 = - let _3 = - let xs = - let xs = -# 264 "" - ( List.rev xs ) -# 41943 "parsing/parser.ml" - in - -# 1200 "parsing/parser.mly" - ( xs ) -# 41948 "parsing/parser.ml" - - in - -# 2798 "parsing/parser.mly" - ( xs ) -# 41954 "parsing/parser.ml" - - in - let _endpos__3_ = _endpos_xs_ in - let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4114 "parsing/parser.mly" - ( _1 ) -# 41965 "parsing/parser.ml" - - in - -# 4127 "parsing/parser.mly" - ( _1, _2 ) -# 41971 "parsing/parser.ml" - - in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2311 "parsing/parser.mly" - ( let loc = make_loc _sloc in - let cases = _3 in - (* There are two choices of where to put attributes: on the - Pexp_function node; on the Pfunction_cases body. We put them on the - Pexp_function node here because the compiler only uses - Pfunction_cases attributes for enabling/disabling warnings in - typechecking. For standalone function cases, we want the compiler to - respect, e.g., [@inline] attributes. - *) - let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in - mkexp_attrs ~loc:_sloc desc _2 - ) -# 41991 "parsing/parser.ml" - - in - -# 2453 "parsing/parser.mly" - ( _1 ) -# 41997 "parsing/parser.ml" +# 1115 "parsing/parser.mly" + ( x :: xs ) +# 48969 "parsing/parser.ml" in ( -# 1158 "parsing/parser.mly" - ( [ x2; x1 ] ) -# 42003 "parsing/parser.ml" - : (Parsetree.expression list)) +# 1119 "parsing/parser.mly" + ( xs ) +# 48975 "parsing/parser.ml" + : ((string option * Parsetree.core_type) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42013,206 +48985,65 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs_inlined1; - MenhirLib.EngineTypes.startp = _startpos_xs_inlined1_; - MenhirLib.EngineTypes.endp = _endpos_xs_inlined1_; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined5; - MenhirLib.EngineTypes.startp = _startpos__1_inlined5_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined5_; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined4; - MenhirLib.EngineTypes.startp = _startpos__1_inlined4_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined4_; + MenhirLib.EngineTypes.semv = label; + MenhirLib.EngineTypes.startp = _startpos_label_; + MenhirLib.EngineTypes.endp = _endpos_label_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined3; - MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined2; - MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; }; } = _menhir_stack in - let xs_inlined1 : (Parsetree.case list) = Obj.magic xs_inlined1 in - let _1_inlined5 : (Parsetree.attributes) = Obj.magic _1_inlined5 in - let _1_inlined4 : (string Asttypes.loc option) = Obj.magic _1_inlined4 in - let _1_inlined3 : unit = Obj.magic _1_inlined3 in + let ty : (Parsetree.core_type) = Obj.magic ty in + let _2_inlined1 : unit = Obj.magic _2_inlined1 in + let label : ( +# 785 "parsing/parser.mly" + (string) +# 49023 "parsing/parser.ml" + ) = Obj.magic label in let _2 : unit = Obj.magic _2 in - let xs : (Parsetree.case list) = Obj.magic xs in - let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in - let _1 : unit = Obj.magic _1 in + let xs : ((string option * Parsetree.core_type) list) = Obj.magic xs in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos_xs_inlined1_ in + let _startpos = _startpos_xs_ in + let _endpos = _endpos_ty_ in let _v = - let x2 = - let (_endpos_xs_, _startpos__1_, xs, _1_inlined2, _1_inlined1) = (_endpos_xs_inlined1_, _startpos__1_inlined3_, xs_inlined1, _1_inlined5, _1_inlined4) in - let _1 = - let _3 = - let xs = - let xs = -# 264 "" - ( List.rev xs ) -# 42091 "parsing/parser.ml" - in - -# 1200 "parsing/parser.mly" - ( xs ) -# 42096 "parsing/parser.ml" - - in - -# 2798 "parsing/parser.mly" - ( xs ) -# 42102 "parsing/parser.ml" - - in - let _endpos__3_ = _endpos_xs_ in - let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4114 "parsing/parser.mly" - ( _1 ) -# 42113 "parsing/parser.ml" - - in - -# 4127 "parsing/parser.mly" - ( _1, _2 ) -# 42119 "parsing/parser.ml" - - in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2311 "parsing/parser.mly" - ( let loc = make_loc _sloc in - let cases = _3 in - (* There are two choices of where to put attributes: on the - Pexp_function node; on the Pfunction_cases body. We put them on the - Pexp_function node here because the compiler only uses - Pfunction_cases attributes for enabling/disabling warnings in - typechecking. For standalone function cases, we want the compiler to - respect, e.g., [@inline] attributes. - *) - let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in - mkexp_attrs ~loc:_sloc desc _2 - ) -# 42139 "parsing/parser.ml" - - in - -# 2453 "parsing/parser.mly" - ( _1 ) -# 42145 "parsing/parser.ml" - - in - let x1 = - let _1 = - let _3 = - let xs = - let xs = -# 264 "" - ( List.rev xs ) -# 42155 "parsing/parser.ml" - in - -# 1200 "parsing/parser.mly" - ( xs ) -# 42160 "parsing/parser.ml" - - in - -# 2798 "parsing/parser.mly" - ( xs ) -# 42166 "parsing/parser.ml" - - in - let _endpos__3_ = _endpos_xs_ in - let _2 = - let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in - let _2 = - let _1 = _1_inlined1 in - -# 4114 "parsing/parser.mly" - ( _1 ) -# 42177 "parsing/parser.ml" - - in - -# 4127 "parsing/parser.mly" - ( _1, _2 ) -# 42183 "parsing/parser.ml" - - in - let _endpos = _endpos__3_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2311 "parsing/parser.mly" - ( let loc = make_loc _sloc in - let cases = _3 in - (* There are two choices of where to put attributes: on the - Pexp_function node; on the Pfunction_cases body. We put them on the - Pexp_function node here because the compiler only uses - Pfunction_cases attributes for enabling/disabling warnings in - typechecking. For standalone function cases, we want the compiler to - respect, e.g., [@inline] attributes. - *) - let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in - mkexp_attrs ~loc:_sloc desc _2 - ) -# 42203 "parsing/parser.ml" - - in + let xs = + let x = +# 3731 "parsing/parser.mly" + ( Some label, ty ) +# 49035 "parsing/parser.ml" + in -# 2453 "parsing/parser.mly" - ( _1 ) -# 42209 "parsing/parser.ml" +# 1115 "parsing/parser.mly" + ( x :: xs ) +# 49040 "parsing/parser.ml" in ( -# 1158 "parsing/parser.mly" - ( [ x2; x1 ] ) -# 42215 "parsing/parser.ml" - : (Parsetree.expression list)) +# 1119 "parsing/parser.mly" + ( xs ) +# 49046 "parsing/parser.ml" + : ((string option * Parsetree.core_type) list)) in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42249,9 +49080,9 @@ module Tables = struct let _startpos = _startpos_xs_ in let _endpos = _endpos_x_ in let _v : (Parsetree.core_type list) = -# 1154 "parsing/parser.mly" +# 1142 "parsing/parser.mly" ( x :: xs ) -# 42255 "parsing/parser.ml" +# 49086 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42288,9 +49119,9 @@ module Tables = struct let _startpos = _startpos_x1_ in let _endpos = _endpos_x2_ in let _v : (Parsetree.core_type list) = -# 1158 "parsing/parser.mly" +# 1146 "parsing/parser.mly" ( [ x2; x1 ] ) -# 42294 "parsing/parser.ml" +# 49125 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42313,9 +49144,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.row_field) = -# 3701 "parsing/parser.mly" +# 3872 "parsing/parser.mly" ( _1 ) -# 42319 "parsing/parser.ml" +# 49150 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42342,9 +49173,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 3703 "parsing/parser.mly" +# 3874 "parsing/parser.mly" ( Rf.inherit_ ~loc:(make_loc _sloc) _1 ) -# 42348 "parsing/parser.ml" +# 49179 "parsing/parser.ml" : (Parsetree.row_field)) in { @@ -42371,24 +49202,24 @@ module Tables = struct let _2 = # 123 "" ( None ) -# 42375 "parsing/parser.ml" +# 49206 "parsing/parser.ml" in let x = let _1 = -# 2309 "parsing/parser.mly" +# 2297 "parsing/parser.mly" ( _1 ) -# 42381 "parsing/parser.ml" +# 49212 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 42386 "parsing/parser.ml" +# 49217 "parsing/parser.ml" in ( -# 1175 "parsing/parser.mly" +# 1163 "parsing/parser.mly" ( [x] ) -# 42392 "parsing/parser.ml" +# 49223 "parsing/parser.ml" : (Parsetree.expression list)) in { @@ -42422,24 +49253,24 @@ module Tables = struct let _2 = # 126 "" ( Some x ) -# 42426 "parsing/parser.ml" +# 49257 "parsing/parser.ml" in let x = let _1 = -# 2309 "parsing/parser.mly" +# 2297 "parsing/parser.mly" ( _1 ) -# 42432 "parsing/parser.ml" +# 49263 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 42437 "parsing/parser.ml" +# 49268 "parsing/parser.ml" in ( -# 1175 "parsing/parser.mly" +# 1163 "parsing/parser.mly" ( [x] ) -# 42443 "parsing/parser.ml" +# 49274 "parsing/parser.ml" : (Parsetree.expression list)) in { @@ -42487,7 +49318,7 @@ module Tables = struct let _2 = # 123 "" ( None ) -# 42491 "parsing/parser.ml" +# 49322 "parsing/parser.ml" in let x = let _1 = @@ -42496,18 +49327,18 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 42500 "parsing/parser.ml" +# 49331 "parsing/parser.ml" in -# 1200 "parsing/parser.mly" +# 1188 "parsing/parser.mly" ( xs ) -# 42505 "parsing/parser.ml" +# 49336 "parsing/parser.ml" in -# 2798 "parsing/parser.mly" +# 2783 "parsing/parser.mly" ( xs ) -# 42511 "parsing/parser.ml" +# 49342 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -42516,22 +49347,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 42522 "parsing/parser.ml" +# 49353 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 42528 "parsing/parser.ml" +# 49359 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2311 "parsing/parser.mly" +# 2299 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -42544,19 +49375,19 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 42548 "parsing/parser.ml" +# 49379 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 42554 "parsing/parser.ml" +# 49385 "parsing/parser.ml" in ( -# 1175 "parsing/parser.mly" +# 1163 "parsing/parser.mly" ( [x] ) -# 42560 "parsing/parser.ml" +# 49391 "parsing/parser.ml" : (Parsetree.expression list)) in { @@ -42611,7 +49442,7 @@ module Tables = struct let _2 = # 126 "" ( Some x ) -# 42615 "parsing/parser.ml" +# 49446 "parsing/parser.ml" in let x = let _1 = @@ -42620,18 +49451,18 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 42624 "parsing/parser.ml" +# 49455 "parsing/parser.ml" in -# 1200 "parsing/parser.mly" +# 1188 "parsing/parser.mly" ( xs ) -# 42629 "parsing/parser.ml" +# 49460 "parsing/parser.ml" in -# 2798 "parsing/parser.mly" +# 2783 "parsing/parser.mly" ( xs ) -# 42635 "parsing/parser.ml" +# 49466 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -42640,22 +49471,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 42646 "parsing/parser.ml" +# 49477 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 42652 "parsing/parser.ml" +# 49483 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2311 "parsing/parser.mly" +# 2299 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -42668,19 +49499,19 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 42672 "parsing/parser.ml" +# 49503 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 42678 "parsing/parser.ml" +# 49509 "parsing/parser.ml" in ( -# 1175 "parsing/parser.mly" +# 1163 "parsing/parser.mly" ( [x] ) -# 42684 "parsing/parser.ml" +# 49515 "parsing/parser.ml" : (Parsetree.expression list)) in { @@ -42720,20 +49551,20 @@ module Tables = struct let _v = let x = let _1 = -# 2309 "parsing/parser.mly" +# 2297 "parsing/parser.mly" ( _1 ) -# 42726 "parsing/parser.ml" +# 49557 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 42731 "parsing/parser.ml" +# 49562 "parsing/parser.ml" in ( -# 1179 "parsing/parser.mly" +# 1167 "parsing/parser.mly" ( x :: xs ) -# 42737 "parsing/parser.ml" +# 49568 "parsing/parser.ml" : (Parsetree.expression list)) in { @@ -42800,18 +49631,18 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 42804 "parsing/parser.ml" +# 49635 "parsing/parser.ml" in -# 1200 "parsing/parser.mly" +# 1188 "parsing/parser.mly" ( xs ) -# 42809 "parsing/parser.ml" +# 49640 "parsing/parser.ml" in -# 2798 "parsing/parser.mly" +# 2783 "parsing/parser.mly" ( xs ) -# 42815 "parsing/parser.ml" +# 49646 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -42820,22 +49651,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 42826 "parsing/parser.ml" +# 49657 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 42832 "parsing/parser.ml" +# 49663 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2311 "parsing/parser.mly" +# 2299 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -42848,19 +49679,19 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 42852 "parsing/parser.ml" +# 49683 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( _1 ) -# 42858 "parsing/parser.ml" +# 49689 "parsing/parser.ml" in ( -# 1179 "parsing/parser.mly" +# 1167 "parsing/parser.mly" ( x :: xs ) -# 42864 "parsing/parser.ml" +# 49695 "parsing/parser.ml" : (Parsetree.expression list)) in { @@ -42887,9 +49718,9 @@ module Tables = struct } = _menhir_stack in let oe : (Parsetree.expression option) = Obj.magic oe in let _1 : ( -# 797 "parsing/parser.mly" +# 785 "parsing/parser.mly" (string) -# 42893 "parsing/parser.ml" +# 49724 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -42898,26 +49729,26 @@ module Tables = struct let _2 = # 123 "" ( None ) -# 42902 "parsing/parser.ml" +# 49733 "parsing/parser.ml" in let x = let label = let _1 = -# 3765 "parsing/parser.mly" +# 3936 "parsing/parser.mly" ( _1 ) -# 42909 "parsing/parser.ml" +# 49740 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 42917 "parsing/parser.ml" +# 49748 "parsing/parser.ml" in -# 2861 "parsing/parser.mly" +# 2921 "parsing/parser.mly" ( let label, e = match oe with | None -> @@ -42927,13 +49758,13 @@ module Tables = struct label, e in label, e ) -# 42931 "parsing/parser.ml" +# 49762 "parsing/parser.ml" in ( -# 1175 "parsing/parser.mly" +# 1163 "parsing/parser.mly" ( [x] ) -# 42937 "parsing/parser.ml" +# 49768 "parsing/parser.ml" : ((Asttypes.label Asttypes.loc * Parsetree.expression) list)) in { @@ -42967,9 +49798,9 @@ module Tables = struct let x : unit = Obj.magic x in let oe : (Parsetree.expression option) = Obj.magic oe in let _1 : ( -# 797 "parsing/parser.mly" +# 785 "parsing/parser.mly" (string) -# 42973 "parsing/parser.ml" +# 49804 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -42978,26 +49809,26 @@ module Tables = struct let _2 = # 126 "" ( Some x ) -# 42982 "parsing/parser.ml" +# 49813 "parsing/parser.ml" in let x = let label = let _1 = -# 3765 "parsing/parser.mly" +# 3936 "parsing/parser.mly" ( _1 ) -# 42989 "parsing/parser.ml" +# 49820 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 42997 "parsing/parser.ml" +# 49828 "parsing/parser.ml" in -# 2861 "parsing/parser.mly" +# 2921 "parsing/parser.mly" ( let label, e = match oe with | None -> @@ -43007,13 +49838,13 @@ module Tables = struct label, e in label, e ) -# 43011 "parsing/parser.ml" +# 49842 "parsing/parser.ml" in ( -# 1175 "parsing/parser.mly" +# 1163 "parsing/parser.mly" ( [x] ) -# 43017 "parsing/parser.ml" +# 49848 "parsing/parser.ml" : ((Asttypes.label Asttypes.loc * Parsetree.expression) list)) in { @@ -43054,9 +49885,9 @@ module Tables = struct let _2 : unit = Obj.magic _2 in let oe : (Parsetree.expression option) = Obj.magic oe in let _1 : ( -# 797 "parsing/parser.mly" +# 785 "parsing/parser.mly" (string) -# 43060 "parsing/parser.ml" +# 49891 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -43065,21 +49896,21 @@ module Tables = struct let x = let label = let _1 = -# 3765 "parsing/parser.mly" +# 3936 "parsing/parser.mly" ( _1 ) -# 43071 "parsing/parser.ml" +# 49902 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 43079 "parsing/parser.ml" +# 49910 "parsing/parser.ml" in -# 2861 "parsing/parser.mly" +# 2921 "parsing/parser.mly" ( let label, e = match oe with | None -> @@ -43089,13 +49920,13 @@ module Tables = struct label, e in label, e ) -# 43093 "parsing/parser.ml" +# 49924 "parsing/parser.ml" in ( -# 1179 "parsing/parser.mly" +# 1167 "parsing/parser.mly" ( x :: xs ) -# 43099 "parsing/parser.ml" +# 49930 "parsing/parser.ml" : ((Asttypes.label Asttypes.loc * Parsetree.expression) list)) in { @@ -43122,12 +49953,12 @@ module Tables = struct let _2 = # 123 "" ( None ) -# 43126 "parsing/parser.ml" +# 49957 "parsing/parser.ml" in ( -# 1175 "parsing/parser.mly" +# 1163 "parsing/parser.mly" ( [x] ) -# 43131 "parsing/parser.ml" +# 49962 "parsing/parser.ml" : (Parsetree.pattern list)) in { @@ -43163,13 +49994,13 @@ module Tables = struct # 126 "" ( Some x ) -# 43167 "parsing/parser.ml" +# 49998 "parsing/parser.ml" in ( -# 1175 "parsing/parser.mly" +# 1163 "parsing/parser.mly" ( [x] ) -# 43173 "parsing/parser.ml" +# 50004 "parsing/parser.ml" : (Parsetree.pattern list)) in { @@ -43207,9 +50038,9 @@ module Tables = struct let _startpos = _startpos_x_ in let _endpos = _endpos_xs_ in let _v : (Parsetree.pattern list) = -# 1179 "parsing/parser.mly" +# 1167 "parsing/parser.mly" ( x :: xs ) -# 43213 "parsing/parser.ml" +# 50044 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -43249,7 +50080,7 @@ module Tables = struct let _2 = # 123 "" ( None ) -# 43253 "parsing/parser.ml" +# 50084 "parsing/parser.ml" in let x = let label = @@ -43257,9 +50088,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 43263 "parsing/parser.ml" +# 50094 "parsing/parser.ml" in let _startpos_label_ = _startpos__1_ in @@ -43267,7 +50098,7 @@ module Tables = struct let _symbolstartpos = _startpos_label_ in let _sloc = (_symbolstartpos, _endpos) in -# 2844 "parsing/parser.mly" +# 2904 "parsing/parser.mly" ( let constraint_loc, label, e = match eo with | None -> @@ -43277,13 +50108,13 @@ module Tables = struct (_startpos_c_, _endpos), label, e in label, mkexp_opt_constraint ~loc:constraint_loc e c ) -# 43281 "parsing/parser.ml" +# 50112 "parsing/parser.ml" in ( -# 1175 "parsing/parser.mly" +# 1163 "parsing/parser.mly" ( [x] ) -# 43287 "parsing/parser.ml" +# 50118 "parsing/parser.ml" : ((Longident.t Asttypes.loc * Parsetree.expression) list)) in { @@ -43331,7 +50162,7 @@ module Tables = struct let _2 = # 126 "" ( Some x ) -# 43335 "parsing/parser.ml" +# 50166 "parsing/parser.ml" in let x = let label = @@ -43339,9 +50170,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 43345 "parsing/parser.ml" +# 50176 "parsing/parser.ml" in let _startpos_label_ = _startpos__1_ in @@ -43349,7 +50180,7 @@ module Tables = struct let _symbolstartpos = _startpos_label_ in let _sloc = (_symbolstartpos, _endpos) in -# 2844 "parsing/parser.mly" +# 2904 "parsing/parser.mly" ( let constraint_loc, label, e = match eo with | None -> @@ -43359,13 +50190,13 @@ module Tables = struct (_startpos_c_, _endpos), label, e in label, mkexp_opt_constraint ~loc:constraint_loc e c ) -# 43363 "parsing/parser.ml" +# 50194 "parsing/parser.ml" in ( -# 1175 "parsing/parser.mly" +# 1163 "parsing/parser.mly" ( [x] ) -# 43369 "parsing/parser.ml" +# 50200 "parsing/parser.ml" : ((Longident.t Asttypes.loc * Parsetree.expression) list)) in { @@ -43423,9 +50254,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 43429 "parsing/parser.ml" +# 50260 "parsing/parser.ml" in let _startpos_label_ = _startpos__1_ in @@ -43433,7 +50264,7 @@ module Tables = struct let _symbolstartpos = _startpos_label_ in let _sloc = (_symbolstartpos, _endpos) in -# 2844 "parsing/parser.mly" +# 2904 "parsing/parser.mly" ( let constraint_loc, label, e = match eo with | None -> @@ -43443,13 +50274,13 @@ module Tables = struct (_startpos_c_, _endpos), label, e in label, mkexp_opt_constraint ~loc:constraint_loc e c ) -# 43447 "parsing/parser.ml" +# 50278 "parsing/parser.ml" in ( -# 1179 "parsing/parser.mly" +# 1167 "parsing/parser.mly" ( x :: xs ) -# 43453 "parsing/parser.ml" +# 50284 "parsing/parser.ml" : ((Longident.t Asttypes.loc * Parsetree.expression) list)) in { @@ -43474,14 +50305,14 @@ module Tables = struct let _endpos = _endpos__1_ in let _v = let _1 = -# 2309 "parsing/parser.mly" +# 2297 "parsing/parser.mly" ( _1 ) -# 43480 "parsing/parser.ml" +# 50311 "parsing/parser.ml" in ( -# 2347 "parsing/parser.mly" +# 2333 "parsing/parser.mly" ( _1 ) -# 43485 "parsing/parser.ml" +# 50316 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -43532,18 +50363,18 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 43536 "parsing/parser.ml" +# 50367 "parsing/parser.ml" in -# 1200 "parsing/parser.mly" +# 1188 "parsing/parser.mly" ( xs ) -# 43541 "parsing/parser.ml" +# 50372 "parsing/parser.ml" in -# 2798 "parsing/parser.mly" +# 2783 "parsing/parser.mly" ( xs ) -# 43547 "parsing/parser.ml" +# 50378 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -43552,22 +50383,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 43558 "parsing/parser.ml" +# 50389 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 43564 "parsing/parser.ml" +# 50395 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2311 "parsing/parser.mly" +# 2299 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -43580,13 +50411,13 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 43584 "parsing/parser.ml" +# 50415 "parsing/parser.ml" in ( -# 2347 "parsing/parser.mly" +# 2333 "parsing/parser.mly" ( _1 ) -# 43590 "parsing/parser.ml" +# 50421 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -43656,18 +50487,18 @@ module Tables = struct let attrs = let _1 = _1_inlined4 in -# 4110 "parsing/parser.mly" +# 4282 "parsing/parser.mly" ( _1 ) -# 43662 "parsing/parser.ml" +# 50493 "parsing/parser.ml" in let _endpos_attrs_ = _endpos__1_inlined4_ in let attrs2 = let _1 = _1_inlined3 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 43671 "parsing/parser.ml" +# 50502 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -43677,17 +50508,17 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 43683 "parsing/parser.ml" +# 50514 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 43691 "parsing/parser.ml" +# 50522 "parsing/parser.ml" in let _endpos = _endpos_attrs_ in @@ -43695,14 +50526,14 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 3317 "parsing/parser.mly" +# 3440 "parsing/parser.mly" ( let vars, args, res = vars_args_res in let loc = make_loc (_startpos, _endpos_attrs2_) in let docs = symbol_docs _sloc in - Te.mk_exception ~attrs + Te.mk_exception ~attrs ~loc (Te.decl id ~vars ~args ?res ~attrs:(attrs1 @ attrs2) ~loc ~docs) , ext ) -# 43706 "parsing/parser.ml" +# 50537 "parsing/parser.ml" : (Parsetree.type_exception * string Asttypes.loc option)) in { @@ -43730,21 +50561,21 @@ module Tables = struct let _1 = # 271 "" ( List.flatten xss ) -# 43734 "parsing/parser.ml" +# 50565 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_xss_) in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 977 "parsing/parser.mly" +# 965 "parsing/parser.mly" ( extra_sig _startpos _endpos _1 ) -# 43742 "parsing/parser.ml" +# 50573 "parsing/parser.ml" in ( -# 1755 "parsing/parser.mly" +# 1743 "parsing/parser.mly" ( _1 ) -# 43748 "parsing/parser.ml" +# 50579 "parsing/parser.ml" : (Parsetree.signature)) in { @@ -43778,9 +50609,9 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4110 "parsing/parser.mly" +# 4282 "parsing/parser.mly" ( _1 ) -# 43784 "parsing/parser.ml" +# 50615 "parsing/parser.ml" in let _endpos__2_ = _endpos__1_inlined1_ in @@ -43788,10 +50619,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 1770 "parsing/parser.mly" +# 1758 "parsing/parser.mly" ( let docs = symbol_docs _sloc in mksig ~loc:_sloc (Psig_extension (_1, (add_docs_attrs docs _2))) ) -# 43795 "parsing/parser.ml" +# 50626 "parsing/parser.ml" : (Parsetree.signature_item)) in { @@ -43817,23 +50648,23 @@ module Tables = struct let _v = let _1 = let _1 = -# 1774 "parsing/parser.mly" +# 1762 "parsing/parser.mly" ( Psig_attribute _1 ) -# 43823 "parsing/parser.ml" +# 50654 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1025 "parsing/parser.mly" +# 1013 "parsing/parser.mly" ( mksig ~loc:_sloc _1 ) -# 43831 "parsing/parser.ml" +# 50662 "parsing/parser.ml" in ( -# 1776 "parsing/parser.mly" +# 1764 "parsing/parser.mly" ( _1 ) -# 43837 "parsing/parser.ml" +# 50668 "parsing/parser.ml" : (Parsetree.signature_item)) in { @@ -43859,23 +50690,23 @@ module Tables = struct let _v = let _1 = let _1 = -# 1779 "parsing/parser.mly" +# 1767 "parsing/parser.mly" ( psig_value _1 ) -# 43865 "parsing/parser.ml" +# 50696 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1042 "parsing/parser.mly" +# 1030 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 43873 "parsing/parser.ml" +# 50704 "parsing/parser.ml" in ( -# 1811 "parsing/parser.mly" +# 1799 "parsing/parser.mly" ( _1 ) -# 43879 "parsing/parser.ml" +# 50710 "parsing/parser.ml" : (Parsetree.signature_item)) in { @@ -43901,23 +50732,23 @@ module Tables = struct let _v = let _1 = let _1 = -# 1781 "parsing/parser.mly" +# 1769 "parsing/parser.mly" ( psig_value _1 ) -# 43907 "parsing/parser.ml" +# 50738 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1042 "parsing/parser.mly" +# 1030 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 43915 "parsing/parser.ml" +# 50746 "parsing/parser.ml" in ( -# 1811 "parsing/parser.mly" +# 1799 "parsing/parser.mly" ( _1 ) -# 43921 "parsing/parser.ml" +# 50752 "parsing/parser.ml" : (Parsetree.signature_item)) in { @@ -43954,26 +50785,26 @@ module Tables = struct let _1 = let _1 = let _1 = -# 1236 "parsing/parser.mly" +# 1224 "parsing/parser.mly" ( let (x, b) = a in x, b :: bs ) -# 43960 "parsing/parser.ml" +# 50791 "parsing/parser.ml" in -# 3138 "parsing/parser.mly" +# 3255 "parsing/parser.mly" ( _1 ) -# 43965 "parsing/parser.ml" +# 50796 "parsing/parser.ml" in -# 3121 "parsing/parser.mly" +# 3238 "parsing/parser.mly" ( _1 ) -# 43971 "parsing/parser.ml" +# 50802 "parsing/parser.ml" in -# 1783 "parsing/parser.mly" +# 1771 "parsing/parser.mly" ( psig_type _1 ) -# 43977 "parsing/parser.ml" +# 50808 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_bs_, _startpos_a_) in @@ -43981,15 +50812,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1042 "parsing/parser.mly" +# 1030 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 43987 "parsing/parser.ml" +# 50818 "parsing/parser.ml" in ( -# 1811 "parsing/parser.mly" +# 1799 "parsing/parser.mly" ( _1 ) -# 43993 "parsing/parser.ml" +# 50824 "parsing/parser.ml" : (Parsetree.signature_item)) in { @@ -44026,26 +50857,26 @@ module Tables = struct let _1 = let _1 = let _1 = -# 1236 "parsing/parser.mly" +# 1224 "parsing/parser.mly" ( let (x, b) = a in x, b :: bs ) -# 44032 "parsing/parser.ml" +# 50863 "parsing/parser.ml" in -# 3138 "parsing/parser.mly" +# 3255 "parsing/parser.mly" ( _1 ) -# 44037 "parsing/parser.ml" +# 50868 "parsing/parser.ml" in -# 3126 "parsing/parser.mly" +# 3243 "parsing/parser.mly" ( _1 ) -# 44043 "parsing/parser.ml" +# 50874 "parsing/parser.ml" in -# 1785 "parsing/parser.mly" +# 1773 "parsing/parser.mly" ( psig_typesubst _1 ) -# 44049 "parsing/parser.ml" +# 50880 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_bs_, _startpos_a_) in @@ -44053,15 +50884,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1042 "parsing/parser.mly" +# 1030 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 44059 "parsing/parser.ml" +# 50890 "parsing/parser.ml" in ( -# 1811 "parsing/parser.mly" +# 1799 "parsing/parser.mly" ( _1 ) -# 44065 "parsing/parser.ml" +# 50896 "parsing/parser.ml" : (Parsetree.signature_item)) in { @@ -44148,16 +50979,16 @@ module Tables = struct let attrs2 = let _1 = _1_inlined3 in -# 4110 "parsing/parser.mly" +# 4282 "parsing/parser.mly" ( _1 ) -# 44154 "parsing/parser.ml" +# 50985 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in let cs = -# 1228 "parsing/parser.mly" +# 1216 "parsing/parser.mly" ( List.rev xs ) -# 44161 "parsing/parser.ml" +# 50992 "parsing/parser.ml" in let tid = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in @@ -44165,46 +50996,47 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 44171 "parsing/parser.ml" +# 51002 "parsing/parser.ml" in let _4 = -# 3955 "parsing/parser.mly" +# 4126 "parsing/parser.mly" ( Recursive ) -# 44177 "parsing/parser.ml" +# 51008 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 44184 "parsing/parser.ml" +# 51015 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3391 "parsing/parser.mly" +# 3514 "parsing/parser.mly" ( let docs = symbol_docs _sloc in let attrs = attrs1 @ attrs2 in - Te.mk tid cs ~params ~priv ~attrs ~docs, + let loc = make_loc _sloc in + Te.mk tid cs ~params ~priv ~attrs ~docs ~loc, ext ) -# 44196 "parsing/parser.ml" +# 51028 "parsing/parser.ml" in -# 3378 "parsing/parser.mly" +# 3501 "parsing/parser.mly" ( _1 ) -# 44202 "parsing/parser.ml" +# 51034 "parsing/parser.ml" in -# 1787 "parsing/parser.mly" +# 1775 "parsing/parser.mly" ( psig_typext _1 ) -# 44208 "parsing/parser.ml" +# 51040 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined3_ in @@ -44212,15 +51044,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1042 "parsing/parser.mly" +# 1030 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 44218 "parsing/parser.ml" +# 51050 "parsing/parser.ml" in ( -# 1811 "parsing/parser.mly" +# 1799 "parsing/parser.mly" ( _1 ) -# 44224 "parsing/parser.ml" +# 51056 "parsing/parser.ml" : (Parsetree.signature_item)) in { @@ -44314,16 +51146,16 @@ module Tables = struct let attrs2 = let _1 = _1_inlined4 in -# 4110 "parsing/parser.mly" +# 4282 "parsing/parser.mly" ( _1 ) -# 44320 "parsing/parser.ml" +# 51152 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined4_ in let cs = -# 1228 "parsing/parser.mly" +# 1216 "parsing/parser.mly" ( List.rev xs ) -# 44327 "parsing/parser.ml" +# 51159 "parsing/parser.ml" in let tid = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in @@ -44331,9 +51163,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 44337 "parsing/parser.ml" +# 51169 "parsing/parser.ml" in let _4 = @@ -44342,41 +51174,42 @@ module Tables = struct let _startpos = _startpos__1_ in let _loc = (_startpos, _endpos) in -# 3957 "parsing/parser.mly" +# 4128 "parsing/parser.mly" ( not_expecting _loc "nonrec flag" ) -# 44348 "parsing/parser.ml" +# 51180 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 44356 "parsing/parser.ml" +# 51188 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3391 "parsing/parser.mly" +# 3514 "parsing/parser.mly" ( let docs = symbol_docs _sloc in let attrs = attrs1 @ attrs2 in - Te.mk tid cs ~params ~priv ~attrs ~docs, + let loc = make_loc _sloc in + Te.mk tid cs ~params ~priv ~attrs ~docs ~loc, ext ) -# 44368 "parsing/parser.ml" +# 51201 "parsing/parser.ml" in -# 3378 "parsing/parser.mly" +# 3501 "parsing/parser.mly" ( _1 ) -# 44374 "parsing/parser.ml" +# 51207 "parsing/parser.ml" in -# 1787 "parsing/parser.mly" +# 1775 "parsing/parser.mly" ( psig_typext _1 ) -# 44380 "parsing/parser.ml" +# 51213 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined4_ in @@ -44384,15 +51217,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1042 "parsing/parser.mly" +# 1030 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 44390 "parsing/parser.ml" +# 51223 "parsing/parser.ml" in ( -# 1811 "parsing/parser.mly" +# 1799 "parsing/parser.mly" ( _1 ) -# 44396 "parsing/parser.ml" +# 51229 "parsing/parser.ml" : (Parsetree.signature_item)) in { @@ -44418,23 +51251,23 @@ module Tables = struct let _v = let _1 = let _1 = -# 1789 "parsing/parser.mly" +# 1777 "parsing/parser.mly" ( psig_exception _1 ) -# 44424 "parsing/parser.ml" +# 51257 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1042 "parsing/parser.mly" +# 1030 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 44432 "parsing/parser.ml" +# 51265 "parsing/parser.ml" in ( -# 1811 "parsing/parser.mly" +# 1799 "parsing/parser.mly" ( _1 ) -# 44438 "parsing/parser.ml" +# 51271 "parsing/parser.ml" : (Parsetree.signature_item)) in { @@ -44499,9 +51332,9 @@ module Tables = struct let attrs2 = let _1 = _1_inlined3 in -# 4110 "parsing/parser.mly" +# 4282 "parsing/parser.mly" ( _1 ) -# 44505 "parsing/parser.ml" +# 51338 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -44511,37 +51344,37 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 44517 "parsing/parser.ml" +# 51350 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 44525 "parsing/parser.ml" +# 51358 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1820 "parsing/parser.mly" +# 1808 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in let docs = symbol_docs _sloc in Md.mk name body ~attrs ~loc ~docs, ext ) -# 44539 "parsing/parser.ml" +# 51372 "parsing/parser.ml" in -# 1791 "parsing/parser.mly" +# 1779 "parsing/parser.mly" ( let (body, ext) = _1 in (Psig_module body, ext) ) -# 44545 "parsing/parser.ml" +# 51378 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined3_ in @@ -44549,15 +51382,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1042 "parsing/parser.mly" +# 1030 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 44555 "parsing/parser.ml" +# 51388 "parsing/parser.ml" in ( -# 1811 "parsing/parser.mly" +# 1799 "parsing/parser.mly" ( _1 ) -# 44561 "parsing/parser.ml" +# 51394 "parsing/parser.ml" : (Parsetree.signature_item)) in { @@ -44629,9 +51462,9 @@ module Tables = struct let attrs2 = let _1 = _1_inlined4 in -# 4110 "parsing/parser.mly" +# 4282 "parsing/parser.mly" ( _1 ) -# 44635 "parsing/parser.ml" +# 51468 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined4_ in @@ -44642,9 +51475,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 44648 "parsing/parser.ml" +# 51481 "parsing/parser.ml" in let (_endpos_id_, _startpos_id_) = (_endpos__1_, _startpos__1_) in @@ -44652,9 +51485,9 @@ module Tables = struct let _symbolstartpos = _startpos_id_ in let _sloc = (_symbolstartpos, _endpos) in -# 1859 "parsing/parser.mly" +# 1847 "parsing/parser.mly" ( Mty.alias ~loc:(make_loc _sloc) id ) -# 44658 "parsing/parser.ml" +# 51491 "parsing/parser.ml" in let name = @@ -44663,37 +51496,37 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 44669 "parsing/parser.ml" +# 51502 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 44677 "parsing/parser.ml" +# 51510 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1850 "parsing/parser.mly" +# 1838 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in let docs = symbol_docs _sloc in Md.mk name body ~attrs ~loc ~docs, ext ) -# 44691 "parsing/parser.ml" +# 51524 "parsing/parser.ml" in -# 1793 "parsing/parser.mly" +# 1781 "parsing/parser.mly" ( let (body, ext) = _1 in (Psig_module body, ext) ) -# 44697 "parsing/parser.ml" +# 51530 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined4_ in @@ -44701,15 +51534,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1042 "parsing/parser.mly" +# 1030 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 44707 "parsing/parser.ml" +# 51540 "parsing/parser.ml" in ( -# 1811 "parsing/parser.mly" +# 1799 "parsing/parser.mly" ( _1 ) -# 44713 "parsing/parser.ml" +# 51546 "parsing/parser.ml" : (Parsetree.signature_item)) in { @@ -44735,23 +51568,23 @@ module Tables = struct let _v = let _1 = let _1 = -# 1795 "parsing/parser.mly" +# 1783 "parsing/parser.mly" ( let (body, ext) = _1 in (Psig_modsubst body, ext) ) -# 44741 "parsing/parser.ml" +# 51574 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1042 "parsing/parser.mly" +# 1030 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 44749 "parsing/parser.ml" +# 51582 "parsing/parser.ml" in ( -# 1811 "parsing/parser.mly" +# 1799 "parsing/parser.mly" ( _1 ) -# 44755 "parsing/parser.ml" +# 51588 "parsing/parser.ml" : (Parsetree.signature_item)) in { @@ -44839,9 +51672,9 @@ module Tables = struct let attrs2 = let _1 = _1_inlined3 in -# 4110 "parsing/parser.mly" +# 4282 "parsing/parser.mly" ( _1 ) -# 44845 "parsing/parser.ml" +# 51678 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -44851,49 +51684,49 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 44857 "parsing/parser.ml" +# 51690 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 44865 "parsing/parser.ml" +# 51698 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1893 "parsing/parser.mly" +# 1881 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in let docs = symbol_docs _sloc in ext, Md.mk name mty ~attrs ~loc ~docs ) -# 44879 "parsing/parser.ml" +# 51712 "parsing/parser.ml" in -# 1236 "parsing/parser.mly" +# 1224 "parsing/parser.mly" ( let (x, b) = a in x, b :: bs ) -# 44885 "parsing/parser.ml" +# 51718 "parsing/parser.ml" in -# 1882 "parsing/parser.mly" +# 1870 "parsing/parser.mly" ( _1 ) -# 44891 "parsing/parser.ml" +# 51724 "parsing/parser.ml" in -# 1797 "parsing/parser.mly" +# 1785 "parsing/parser.mly" ( let (ext, l) = _1 in (Psig_recmodule l, ext) ) -# 44897 "parsing/parser.ml" +# 51730 "parsing/parser.ml" in let _endpos__1_ = _endpos_bs_ in @@ -44901,15 +51734,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1042 "parsing/parser.mly" +# 1030 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 44907 "parsing/parser.ml" +# 51740 "parsing/parser.ml" in ( -# 1811 "parsing/parser.mly" +# 1799 "parsing/parser.mly" ( _1 ) -# 44913 "parsing/parser.ml" +# 51746 "parsing/parser.ml" : (Parsetree.signature_item)) in { @@ -44935,23 +51768,23 @@ module Tables = struct let _v = let _1 = let _1 = -# 1799 "parsing/parser.mly" +# 1787 "parsing/parser.mly" ( let (body, ext) = _1 in (Psig_modtype body, ext) ) -# 44941 "parsing/parser.ml" +# 51774 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1042 "parsing/parser.mly" +# 1030 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 44949 "parsing/parser.ml" +# 51782 "parsing/parser.ml" in ( -# 1811 "parsing/parser.mly" +# 1799 "parsing/parser.mly" ( _1 ) -# 44955 "parsing/parser.ml" +# 51788 "parsing/parser.ml" : (Parsetree.signature_item)) in { @@ -44977,23 +51810,23 @@ module Tables = struct let _v = let _1 = let _1 = -# 1801 "parsing/parser.mly" +# 1789 "parsing/parser.mly" ( let (body, ext) = _1 in (Psig_modtypesubst body, ext) ) -# 44983 "parsing/parser.ml" +# 51816 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1042 "parsing/parser.mly" +# 1030 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 44991 "parsing/parser.ml" +# 51824 "parsing/parser.ml" in ( -# 1811 "parsing/parser.mly" +# 1799 "parsing/parser.mly" ( _1 ) -# 44997 "parsing/parser.ml" +# 51830 "parsing/parser.ml" : (Parsetree.signature_item)) in { @@ -45019,23 +51852,23 @@ module Tables = struct let _v = let _1 = let _1 = -# 1803 "parsing/parser.mly" +# 1791 "parsing/parser.mly" ( let (body, ext) = _1 in (Psig_open body, ext) ) -# 45025 "parsing/parser.ml" +# 51858 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1042 "parsing/parser.mly" +# 1030 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 45033 "parsing/parser.ml" +# 51866 "parsing/parser.ml" in ( -# 1811 "parsing/parser.mly" +# 1799 "parsing/parser.mly" ( _1 ) -# 45039 "parsing/parser.ml" +# 51872 "parsing/parser.ml" : (Parsetree.signature_item)) in { @@ -45093,38 +51926,38 @@ module Tables = struct let attrs2 = let _1 = _1_inlined2 in -# 4110 "parsing/parser.mly" +# 4282 "parsing/parser.mly" ( _1 ) -# 45099 "parsing/parser.ml" +# 51932 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined2_ in let attrs1 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 45108 "parsing/parser.ml" +# 51941 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1645 "parsing/parser.mly" +# 1633 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in let docs = symbol_docs _sloc in Incl.mk thing ~attrs ~loc ~docs, ext ) -# 45122 "parsing/parser.ml" +# 51955 "parsing/parser.ml" in -# 1805 "parsing/parser.mly" +# 1793 "parsing/parser.mly" ( psig_include _1 ) -# 45128 "parsing/parser.ml" +# 51961 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined2_ in @@ -45132,15 +51965,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1042 "parsing/parser.mly" +# 1030 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 45138 "parsing/parser.ml" +# 51971 "parsing/parser.ml" in ( -# 1811 "parsing/parser.mly" +# 1799 "parsing/parser.mly" ( _1 ) -# 45144 "parsing/parser.ml" +# 51977 "parsing/parser.ml" : (Parsetree.signature_item)) in { @@ -45218,9 +52051,9 @@ module Tables = struct let cty : (Parsetree.class_type) = Obj.magic cty in let _7 : unit = Obj.magic _7 in let _1_inlined2 : ( -# 797 "parsing/parser.mly" +# 785 "parsing/parser.mly" (string) -# 45224 "parsing/parser.ml" +# 52057 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in let virt : (Asttypes.virtual_flag) = Obj.magic virt in @@ -45239,9 +52072,9 @@ module Tables = struct let attrs2 = let _1 = _1_inlined3 in -# 4110 "parsing/parser.mly" +# 4282 "parsing/parser.mly" ( _1 ) -# 45245 "parsing/parser.ml" +# 52078 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -45251,24 +52084,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 45257 "parsing/parser.ml" +# 52090 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 45265 "parsing/parser.ml" +# 52098 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2240 "parsing/parser.mly" +# 2228 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in @@ -45276,25 +52109,25 @@ module Tables = struct ext, Ci.mk id cty ~virt ~params ~attrs ~loc ~docs ) -# 45280 "parsing/parser.ml" +# 52113 "parsing/parser.ml" in -# 1236 "parsing/parser.mly" +# 1224 "parsing/parser.mly" ( let (x, b) = a in x, b :: bs ) -# 45286 "parsing/parser.ml" +# 52119 "parsing/parser.ml" in -# 2228 "parsing/parser.mly" +# 2216 "parsing/parser.mly" ( _1 ) -# 45292 "parsing/parser.ml" +# 52125 "parsing/parser.ml" in -# 1807 "parsing/parser.mly" +# 1795 "parsing/parser.mly" ( let (ext, l) = _1 in (Psig_class l, ext) ) -# 45298 "parsing/parser.ml" +# 52131 "parsing/parser.ml" in let _endpos__1_ = _endpos_bs_ in @@ -45302,15 +52135,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1042 "parsing/parser.mly" +# 1030 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 45308 "parsing/parser.ml" +# 52141 "parsing/parser.ml" in ( -# 1811 "parsing/parser.mly" +# 1799 "parsing/parser.mly" ( _1 ) -# 45314 "parsing/parser.ml" +# 52147 "parsing/parser.ml" : (Parsetree.signature_item)) in { @@ -45336,23 +52169,23 @@ module Tables = struct let _v = let _1 = let _1 = -# 1809 "parsing/parser.mly" +# 1797 "parsing/parser.mly" ( let (ext, l) = _1 in (Psig_class_type l, ext) ) -# 45342 "parsing/parser.ml" +# 52175 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1042 "parsing/parser.mly" +# 1030 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 45350 "parsing/parser.ml" +# 52183 "parsing/parser.ml" in ( -# 1811 "parsing/parser.mly" +# 1799 "parsing/parser.mly" ( _1 ) -# 45356 "parsing/parser.ml" +# 52189 "parsing/parser.ml" : (Parsetree.signature_item)) in { @@ -45376,9 +52209,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.constant) = -# 3780 "parsing/parser.mly" +# 3951 "parsing/parser.mly" ( _1 ) -# 45382 "parsing/parser.ml" +# 52215 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45403,9 +52236,9 @@ module Tables = struct }; } = _menhir_stack in let _2 : ( -# 783 "parsing/parser.mly" +# 771 "parsing/parser.mly" (string * char option) -# 45409 "parsing/parser.ml" +# 52242 "parsing/parser.ml" ) = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -45416,10 +52249,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 3781 "parsing/parser.mly" +# 3952 "parsing/parser.mly" ( let (n, m) = _2 in mkconst ~loc:_sloc (Pconst_integer("-" ^ n, m)) ) -# 45423 "parsing/parser.ml" +# 52256 "parsing/parser.ml" : (Parsetree.constant)) in { @@ -45445,9 +52278,9 @@ module Tables = struct }; } = _menhir_stack in let _2 : ( -# 762 "parsing/parser.mly" +# 750 "parsing/parser.mly" (string * char option) -# 45451 "parsing/parser.ml" +# 52284 "parsing/parser.ml" ) = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -45458,10 +52291,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 3783 "parsing/parser.mly" +# 3954 "parsing/parser.mly" ( let (f, m) = _2 in mkconst ~loc:_sloc (Pconst_float("-" ^ f, m)) ) -# 45465 "parsing/parser.ml" +# 52298 "parsing/parser.ml" : (Parsetree.constant)) in { @@ -45487,9 +52320,9 @@ module Tables = struct }; } = _menhir_stack in let _2 : ( -# 783 "parsing/parser.mly" +# 771 "parsing/parser.mly" (string * char option) -# 45493 "parsing/parser.ml" +# 52326 "parsing/parser.ml" ) = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -45500,10 +52333,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 3785 "parsing/parser.mly" +# 3956 "parsing/parser.mly" ( let (n, m) = _2 in mkconst ~loc:_sloc (Pconst_integer (n, m)) ) -# 45507 "parsing/parser.ml" +# 52340 "parsing/parser.ml" : (Parsetree.constant)) in { @@ -45529,9 +52362,9 @@ module Tables = struct }; } = _menhir_stack in let _2 : ( -# 762 "parsing/parser.mly" +# 750 "parsing/parser.mly" (string * char option) -# 45535 "parsing/parser.ml" +# 52368 "parsing/parser.ml" ) = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -45542,10 +52375,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 3787 "parsing/parser.mly" +# 3958 "parsing/parser.mly" ( let (f, m) = _2 in mkconst ~loc:_sloc (Pconst_float(f, m)) ) -# 45549 "parsing/parser.ml" +# 52382 "parsing/parser.ml" : (Parsetree.constant)) in { @@ -45588,18 +52421,18 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3050 "parsing/parser.mly" +# 3167 "parsing/parser.mly" ( let fields, closed = _1 in let closed = match closed with Some () -> Open | None -> Closed in fields, closed ) -# 45596 "parsing/parser.ml" +# 52429 "parsing/parser.ml" in -# 3021 "parsing/parser.mly" +# 3082 "parsing/parser.mly" ( let (fields, closed) = _2 in Ppat_record(fields, closed) ) -# 45603 "parsing/parser.ml" +# 52436 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -45607,15 +52440,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1019 "parsing/parser.mly" +# 1007 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 45613 "parsing/parser.ml" +# 52446 "parsing/parser.ml" in ( -# 3035 "parsing/parser.mly" +# 3096 "parsing/parser.mly" ( _1 ) -# 45619 "parsing/parser.ml" +# 52452 "parsing/parser.ml" : (Parsetree.pattern)) in { @@ -45658,19 +52491,19 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3050 "parsing/parser.mly" +# 3167 "parsing/parser.mly" ( let fields, closed = _1 in let closed = match closed with Some () -> Open | None -> Closed in fields, closed ) -# 45666 "parsing/parser.ml" +# 52499 "parsing/parser.ml" in let _loc__3_ = (_startpos__3_, _endpos__3_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 3024 "parsing/parser.mly" +# 3085 "parsing/parser.mly" ( unclosed "{" _loc__1_ "}" _loc__3_ ) -# 45674 "parsing/parser.ml" +# 52507 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -45678,15 +52511,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1019 "parsing/parser.mly" +# 1007 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 45684 "parsing/parser.ml" +# 52517 "parsing/parser.ml" in ( -# 3035 "parsing/parser.mly" +# 3096 "parsing/parser.mly" ( _1 ) -# 45690 "parsing/parser.ml" +# 52523 "parsing/parser.ml" : (Parsetree.pattern)) in { @@ -45727,15 +52560,15 @@ module Tables = struct let _1 = let _1 = let _2 = -# 3044 "parsing/parser.mly" +# 3161 "parsing/parser.mly" ( ps ) -# 45733 "parsing/parser.ml" +# 52566 "parsing/parser.ml" in let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 3026 "parsing/parser.mly" +# 3087 "parsing/parser.mly" ( fst (mktailpat _loc__3_ _2) ) -# 45739 "parsing/parser.ml" +# 52572 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -45743,15 +52576,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1019 "parsing/parser.mly" +# 1007 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 45749 "parsing/parser.ml" +# 52582 "parsing/parser.ml" in ( -# 3035 "parsing/parser.mly" +# 3096 "parsing/parser.mly" ( _1 ) -# 45755 "parsing/parser.ml" +# 52588 "parsing/parser.ml" : (Parsetree.pattern)) in { @@ -45792,16 +52625,16 @@ module Tables = struct let _1 = let _1 = let _2 = -# 3044 "parsing/parser.mly" +# 3161 "parsing/parser.mly" ( ps ) -# 45798 "parsing/parser.ml" +# 52631 "parsing/parser.ml" in let _loc__3_ = (_startpos__3_, _endpos__3_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 3028 "parsing/parser.mly" +# 3089 "parsing/parser.mly" ( unclosed "[" _loc__1_ "]" _loc__3_ ) -# 45805 "parsing/parser.ml" +# 52638 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -45809,15 +52642,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1019 "parsing/parser.mly" +# 1007 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 45815 "parsing/parser.ml" +# 52648 "parsing/parser.ml" in ( -# 3035 "parsing/parser.mly" +# 3096 "parsing/parser.mly" ( _1 ) -# 45821 "parsing/parser.ml" +# 52654 "parsing/parser.ml" : (Parsetree.pattern)) in { @@ -45858,14 +52691,14 @@ module Tables = struct let _1 = let _1 = let _2 = -# 3044 "parsing/parser.mly" +# 3161 "parsing/parser.mly" ( ps ) -# 45864 "parsing/parser.ml" +# 52697 "parsing/parser.ml" in -# 3030 "parsing/parser.mly" +# 3091 "parsing/parser.mly" ( Ppat_array _2 ) -# 45869 "parsing/parser.ml" +# 52702 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -45873,15 +52706,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1019 "parsing/parser.mly" +# 1007 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 45879 "parsing/parser.ml" +# 52712 "parsing/parser.ml" in ( -# 3035 "parsing/parser.mly" +# 3096 "parsing/parser.mly" ( _1 ) -# 45885 "parsing/parser.ml" +# 52718 "parsing/parser.ml" : (Parsetree.pattern)) in { @@ -45914,24 +52747,24 @@ module Tables = struct let _v = let _1 = let _1 = -# 3032 "parsing/parser.mly" +# 3093 "parsing/parser.mly" ( Ppat_array [] ) -# 45920 "parsing/parser.ml" +# 52753 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1019 "parsing/parser.mly" +# 1007 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 45929 "parsing/parser.ml" +# 52762 "parsing/parser.ml" in ( -# 3035 "parsing/parser.mly" +# 3096 "parsing/parser.mly" ( _1 ) -# 45935 "parsing/parser.ml" +# 52768 "parsing/parser.ml" : (Parsetree.pattern)) in { @@ -45972,16 +52805,16 @@ module Tables = struct let _1 = let _1 = let _2 = -# 3044 "parsing/parser.mly" +# 3161 "parsing/parser.mly" ( ps ) -# 45978 "parsing/parser.ml" +# 52811 "parsing/parser.ml" in let _loc__3_ = (_startpos__3_, _endpos__3_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 3034 "parsing/parser.mly" +# 3095 "parsing/parser.mly" ( unclosed "[|" _loc__1_ "|]" _loc__3_ ) -# 45985 "parsing/parser.ml" +# 52818 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -45989,15 +52822,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1019 "parsing/parser.mly" +# 1007 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 45995 "parsing/parser.ml" +# 52828 "parsing/parser.ml" in ( -# 3035 "parsing/parser.mly" +# 3096 "parsing/parser.mly" ( _1 ) -# 46001 "parsing/parser.ml" +# 52834 "parsing/parser.ml" : (Parsetree.pattern)) in { @@ -46039,9 +52872,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2515 "parsing/parser.mly" +# 2502 "parsing/parser.mly" ( reloc_exp ~loc:_sloc _2 ) -# 46045 "parsing/parser.ml" +# 52878 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -46082,9 +52915,9 @@ module Tables = struct let _loc__3_ = (_startpos__3_, _endpos__3_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in ( -# 2517 "parsing/parser.mly" +# 2504 "parsing/parser.mly" ( unclosed "(" _loc__1_ ")" _loc__3_ ) -# 46088 "parsing/parser.ml" +# 52921 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -46133,9 +52966,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2519 "parsing/parser.mly" +# 2506 "parsing/parser.mly" ( mkexp_constraint ~loc:_sloc _2 _3 ) -# 46139 "parsing/parser.ml" +# 52972 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -46189,14 +53022,14 @@ module Tables = struct let _v = let _1 = let r = -# 2520 "parsing/parser.mly" +# 2507 "parsing/parser.mly" ( None ) -# 46195 "parsing/parser.ml" +# 53028 "parsing/parser.ml" in -# 2401 "parsing/parser.mly" +# 2387 "parsing/parser.mly" ( array, d, Paren, i, r ) -# 46200 "parsing/parser.ml" +# 53033 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__5_, _startpos_array_) in @@ -46204,9 +53037,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2521 "parsing/parser.mly" +# 2508 "parsing/parser.mly" ( mk_indexop_expr builtin_indexing_operators ~loc:_sloc _1 ) -# 46210 "parsing/parser.ml" +# 53043 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -46260,14 +53093,14 @@ module Tables = struct let _v = let _1 = let r = -# 2520 "parsing/parser.mly" +# 2507 "parsing/parser.mly" ( None ) -# 46266 "parsing/parser.ml" +# 53099 "parsing/parser.ml" in -# 2403 "parsing/parser.mly" +# 2389 "parsing/parser.mly" ( array, d, Brace, i, r ) -# 46271 "parsing/parser.ml" +# 53104 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__5_, _startpos_array_) in @@ -46275,9 +53108,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2521 "parsing/parser.mly" +# 2508 "parsing/parser.mly" ( mk_indexop_expr builtin_indexing_operators ~loc:_sloc _1 ) -# 46281 "parsing/parser.ml" +# 53114 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -46331,14 +53164,14 @@ module Tables = struct let _v = let _1 = let r = -# 2520 "parsing/parser.mly" +# 2507 "parsing/parser.mly" ( None ) -# 46337 "parsing/parser.ml" +# 53170 "parsing/parser.ml" in -# 2405 "parsing/parser.mly" +# 2391 "parsing/parser.mly" ( array, d, Bracket, i, r ) -# 46342 "parsing/parser.ml" +# 53175 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__5_, _startpos_array_) in @@ -46346,9 +53179,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2521 "parsing/parser.mly" +# 2508 "parsing/parser.mly" ( mk_indexop_expr builtin_indexing_operators ~loc:_sloc _1 ) -# 46352 "parsing/parser.ml" +# 53185 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -46395,9 +53228,9 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _3 : unit = Obj.magic _3 in let _2 : ( -# 778 "parsing/parser.mly" +# 766 "parsing/parser.mly" (string) -# 46401 "parsing/parser.ml" +# 53234 "parsing/parser.ml" ) = Obj.magic _2 in let array : (Parsetree.expression) = Obj.magic array in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -46406,31 +53239,31 @@ module Tables = struct let _v = let _1 = let r = -# 2522 "parsing/parser.mly" +# 2509 "parsing/parser.mly" ( None ) -# 46412 "parsing/parser.ml" +# 53245 "parsing/parser.ml" in let i = -# 2873 "parsing/parser.mly" +# 2933 "parsing/parser.mly" ( es ) -# 46417 "parsing/parser.ml" +# 53250 "parsing/parser.ml" in let d = let _1 = # 123 "" ( None ) -# 46423 "parsing/parser.ml" +# 53256 "parsing/parser.ml" in -# 2417 "parsing/parser.mly" +# 2403 "parsing/parser.mly" ( _1, _2 ) -# 46428 "parsing/parser.ml" +# 53261 "parsing/parser.ml" in -# 2401 "parsing/parser.mly" +# 2387 "parsing/parser.mly" ( array, d, Paren, i, r ) -# 46434 "parsing/parser.ml" +# 53267 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__5_, _startpos_array_) in @@ -46438,9 +53271,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2523 "parsing/parser.mly" +# 2510 "parsing/parser.mly" ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) -# 46444 "parsing/parser.ml" +# 53277 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -46499,9 +53332,9 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _3 : unit = Obj.magic _3 in let _2 : ( -# 778 "parsing/parser.mly" +# 766 "parsing/parser.mly" (string) -# 46505 "parsing/parser.ml" +# 53338 "parsing/parser.ml" ) = Obj.magic _2 in let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in let _1 : unit = Obj.magic _1 in @@ -46512,39 +53345,39 @@ module Tables = struct let _v = let _1 = let r = -# 2522 "parsing/parser.mly" +# 2509 "parsing/parser.mly" ( None ) -# 46518 "parsing/parser.ml" +# 53351 "parsing/parser.ml" in let i = -# 2873 "parsing/parser.mly" +# 2933 "parsing/parser.mly" ( es ) -# 46523 "parsing/parser.ml" +# 53356 "parsing/parser.ml" in let d = let _1 = let _2 = _2_inlined1 in let x = -# 2417 "parsing/parser.mly" +# 2403 "parsing/parser.mly" (_2) -# 46531 "parsing/parser.ml" +# 53364 "parsing/parser.ml" in # 126 "" ( Some x ) -# 46536 "parsing/parser.ml" +# 53369 "parsing/parser.ml" in -# 2417 "parsing/parser.mly" +# 2403 "parsing/parser.mly" ( _1, _2 ) -# 46542 "parsing/parser.ml" +# 53375 "parsing/parser.ml" in -# 2401 "parsing/parser.mly" +# 2387 "parsing/parser.mly" ( array, d, Paren, i, r ) -# 46548 "parsing/parser.ml" +# 53381 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__5_, _startpos_array_) in @@ -46552,9 +53385,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2523 "parsing/parser.mly" +# 2510 "parsing/parser.mly" ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) -# 46558 "parsing/parser.ml" +# 53391 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -46601,9 +53434,9 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _3 : unit = Obj.magic _3 in let _2 : ( -# 778 "parsing/parser.mly" +# 766 "parsing/parser.mly" (string) -# 46607 "parsing/parser.ml" +# 53440 "parsing/parser.ml" ) = Obj.magic _2 in let array : (Parsetree.expression) = Obj.magic array in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -46612,31 +53445,31 @@ module Tables = struct let _v = let _1 = let r = -# 2522 "parsing/parser.mly" +# 2509 "parsing/parser.mly" ( None ) -# 46618 "parsing/parser.ml" +# 53451 "parsing/parser.ml" in let i = -# 2873 "parsing/parser.mly" +# 2933 "parsing/parser.mly" ( es ) -# 46623 "parsing/parser.ml" +# 53456 "parsing/parser.ml" in let d = let _1 = # 123 "" ( None ) -# 46629 "parsing/parser.ml" +# 53462 "parsing/parser.ml" in -# 2417 "parsing/parser.mly" +# 2403 "parsing/parser.mly" ( _1, _2 ) -# 46634 "parsing/parser.ml" +# 53467 "parsing/parser.ml" in -# 2403 "parsing/parser.mly" +# 2389 "parsing/parser.mly" ( array, d, Brace, i, r ) -# 46640 "parsing/parser.ml" +# 53473 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__5_, _startpos_array_) in @@ -46644,9 +53477,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2523 "parsing/parser.mly" +# 2510 "parsing/parser.mly" ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) -# 46650 "parsing/parser.ml" +# 53483 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -46705,9 +53538,9 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _3 : unit = Obj.magic _3 in let _2 : ( -# 778 "parsing/parser.mly" +# 766 "parsing/parser.mly" (string) -# 46711 "parsing/parser.ml" +# 53544 "parsing/parser.ml" ) = Obj.magic _2 in let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in let _1 : unit = Obj.magic _1 in @@ -46718,39 +53551,39 @@ module Tables = struct let _v = let _1 = let r = -# 2522 "parsing/parser.mly" +# 2509 "parsing/parser.mly" ( None ) -# 46724 "parsing/parser.ml" +# 53557 "parsing/parser.ml" in let i = -# 2873 "parsing/parser.mly" +# 2933 "parsing/parser.mly" ( es ) -# 46729 "parsing/parser.ml" +# 53562 "parsing/parser.ml" in let d = let _1 = let _2 = _2_inlined1 in let x = -# 2417 "parsing/parser.mly" +# 2403 "parsing/parser.mly" (_2) -# 46737 "parsing/parser.ml" +# 53570 "parsing/parser.ml" in # 126 "" ( Some x ) -# 46742 "parsing/parser.ml" +# 53575 "parsing/parser.ml" in -# 2417 "parsing/parser.mly" +# 2403 "parsing/parser.mly" ( _1, _2 ) -# 46748 "parsing/parser.ml" +# 53581 "parsing/parser.ml" in -# 2403 "parsing/parser.mly" +# 2389 "parsing/parser.mly" ( array, d, Brace, i, r ) -# 46754 "parsing/parser.ml" +# 53587 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__5_, _startpos_array_) in @@ -46758,9 +53591,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2523 "parsing/parser.mly" +# 2510 "parsing/parser.mly" ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) -# 46764 "parsing/parser.ml" +# 53597 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -46807,9 +53640,9 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _3 : unit = Obj.magic _3 in let _2 : ( -# 778 "parsing/parser.mly" +# 766 "parsing/parser.mly" (string) -# 46813 "parsing/parser.ml" +# 53646 "parsing/parser.ml" ) = Obj.magic _2 in let array : (Parsetree.expression) = Obj.magic array in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -46818,31 +53651,31 @@ module Tables = struct let _v = let _1 = let r = -# 2522 "parsing/parser.mly" +# 2509 "parsing/parser.mly" ( None ) -# 46824 "parsing/parser.ml" +# 53657 "parsing/parser.ml" in let i = -# 2873 "parsing/parser.mly" +# 2933 "parsing/parser.mly" ( es ) -# 46829 "parsing/parser.ml" +# 53662 "parsing/parser.ml" in let d = let _1 = # 123 "" ( None ) -# 46835 "parsing/parser.ml" +# 53668 "parsing/parser.ml" in -# 2417 "parsing/parser.mly" +# 2403 "parsing/parser.mly" ( _1, _2 ) -# 46840 "parsing/parser.ml" +# 53673 "parsing/parser.ml" in -# 2405 "parsing/parser.mly" +# 2391 "parsing/parser.mly" ( array, d, Bracket, i, r ) -# 46846 "parsing/parser.ml" +# 53679 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__5_, _startpos_array_) in @@ -46850,9 +53683,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2523 "parsing/parser.mly" +# 2510 "parsing/parser.mly" ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) -# 46856 "parsing/parser.ml" +# 53689 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -46911,9 +53744,9 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _3 : unit = Obj.magic _3 in let _2 : ( -# 778 "parsing/parser.mly" +# 766 "parsing/parser.mly" (string) -# 46917 "parsing/parser.ml" +# 53750 "parsing/parser.ml" ) = Obj.magic _2 in let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in let _1 : unit = Obj.magic _1 in @@ -46924,39 +53757,39 @@ module Tables = struct let _v = let _1 = let r = -# 2522 "parsing/parser.mly" +# 2509 "parsing/parser.mly" ( None ) -# 46930 "parsing/parser.ml" +# 53763 "parsing/parser.ml" in let i = -# 2873 "parsing/parser.mly" +# 2933 "parsing/parser.mly" ( es ) -# 46935 "parsing/parser.ml" +# 53768 "parsing/parser.ml" in let d = let _1 = let _2 = _2_inlined1 in let x = -# 2417 "parsing/parser.mly" +# 2403 "parsing/parser.mly" (_2) -# 46943 "parsing/parser.ml" +# 53776 "parsing/parser.ml" in # 126 "" ( Some x ) -# 46948 "parsing/parser.ml" +# 53781 "parsing/parser.ml" in -# 2417 "parsing/parser.mly" +# 2403 "parsing/parser.mly" ( _1, _2 ) -# 46954 "parsing/parser.ml" +# 53787 "parsing/parser.ml" in -# 2405 "parsing/parser.mly" +# 2391 "parsing/parser.mly" ( array, d, Bracket, i, r ) -# 46960 "parsing/parser.ml" +# 53793 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__5_, _startpos_array_) in @@ -46964,9 +53797,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2523 "parsing/parser.mly" +# 2510 "parsing/parser.mly" ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) -# 46970 "parsing/parser.ml" +# 53803 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -47022,15 +53855,15 @@ module Tables = struct let _loc__p_ = (_startpos__p_, _endpos__p_) in let _loc__e_ = (_startpos__e_, _endpos__e_) in -# 2410 "parsing/parser.mly" +# 2396 "parsing/parser.mly" ( indexop_unclosed_error _loc__p_ Paren _loc__e_ ) -# 47028 "parsing/parser.ml" +# 53861 "parsing/parser.ml" in ( -# 2524 "parsing/parser.mly" +# 2511 "parsing/parser.mly" ( _1 ) -# 47034 "parsing/parser.ml" +# 53867 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -47086,15 +53919,15 @@ module Tables = struct let _loc__p_ = (_startpos__p_, _endpos__p_) in let _loc__e_ = (_startpos__e_, _endpos__e_) in -# 2412 "parsing/parser.mly" +# 2398 "parsing/parser.mly" ( indexop_unclosed_error _loc__p_ Brace _loc__e_ ) -# 47092 "parsing/parser.ml" +# 53925 "parsing/parser.ml" in ( -# 2524 "parsing/parser.mly" +# 2511 "parsing/parser.mly" ( _1 ) -# 47098 "parsing/parser.ml" +# 53931 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -47150,15 +53983,15 @@ module Tables = struct let _loc__p_ = (_startpos__p_, _endpos__p_) in let _loc__e_ = (_startpos__e_, _endpos__e_) in -# 2414 "parsing/parser.mly" +# 2400 "parsing/parser.mly" ( indexop_unclosed_error _loc__p_ Bracket _loc__e_ ) -# 47156 "parsing/parser.ml" +# 53989 "parsing/parser.ml" in ( -# 2524 "parsing/parser.mly" +# 2511 "parsing/parser.mly" ( _1 ) -# 47162 "parsing/parser.ml" +# 53995 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -47205,9 +54038,9 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _p : unit = Obj.magic _p in let _2 : ( -# 778 "parsing/parser.mly" +# 766 "parsing/parser.mly" (string) -# 47211 "parsing/parser.ml" +# 54044 "parsing/parser.ml" ) = Obj.magic _2 in let _1 : (Parsetree.expression) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -47216,34 +54049,34 @@ module Tables = struct let _v = let _1 = let _4 = -# 2873 "parsing/parser.mly" +# 2933 "parsing/parser.mly" ( es ) -# 47222 "parsing/parser.ml" +# 54055 "parsing/parser.ml" in let _2 = let _1 = # 123 "" ( None ) -# 47228 "parsing/parser.ml" +# 54061 "parsing/parser.ml" in -# 2417 "parsing/parser.mly" +# 2403 "parsing/parser.mly" ( _1, _2 ) -# 47233 "parsing/parser.ml" +# 54066 "parsing/parser.ml" in let _loc__p_ = (_startpos__p_, _endpos__p_) in let _loc__e_ = (_startpos__e_, _endpos__e_) in -# 2410 "parsing/parser.mly" +# 2396 "parsing/parser.mly" ( indexop_unclosed_error _loc__p_ Paren _loc__e_ ) -# 47241 "parsing/parser.ml" +# 54074 "parsing/parser.ml" in ( -# 2525 "parsing/parser.mly" +# 2512 "parsing/parser.mly" ( _1 ) -# 47247 "parsing/parser.ml" +# 54080 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -47302,9 +54135,9 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _p : unit = Obj.magic _p in let _2 : ( -# 778 "parsing/parser.mly" +# 766 "parsing/parser.mly" (string) -# 47308 "parsing/parser.ml" +# 54141 "parsing/parser.ml" ) = Obj.magic _2 in let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in let _1_inlined1 : unit = Obj.magic _1_inlined1 in @@ -47315,42 +54148,42 @@ module Tables = struct let _v = let _1 = let _4 = -# 2873 "parsing/parser.mly" +# 2933 "parsing/parser.mly" ( es ) -# 47321 "parsing/parser.ml" +# 54154 "parsing/parser.ml" in let _2 = let _1 = let _2 = _2_inlined1 in let x = -# 2417 "parsing/parser.mly" +# 2403 "parsing/parser.mly" (_2) -# 47329 "parsing/parser.ml" +# 54162 "parsing/parser.ml" in # 126 "" ( Some x ) -# 47334 "parsing/parser.ml" +# 54167 "parsing/parser.ml" in -# 2417 "parsing/parser.mly" +# 2403 "parsing/parser.mly" ( _1, _2 ) -# 47340 "parsing/parser.ml" +# 54173 "parsing/parser.ml" in let _loc__p_ = (_startpos__p_, _endpos__p_) in let _loc__e_ = (_startpos__e_, _endpos__e_) in -# 2410 "parsing/parser.mly" +# 2396 "parsing/parser.mly" ( indexop_unclosed_error _loc__p_ Paren _loc__e_ ) -# 47348 "parsing/parser.ml" +# 54181 "parsing/parser.ml" in ( -# 2525 "parsing/parser.mly" +# 2512 "parsing/parser.mly" ( _1 ) -# 47354 "parsing/parser.ml" +# 54187 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -47397,9 +54230,9 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _p : unit = Obj.magic _p in let _2 : ( -# 778 "parsing/parser.mly" +# 766 "parsing/parser.mly" (string) -# 47403 "parsing/parser.ml" +# 54236 "parsing/parser.ml" ) = Obj.magic _2 in let _1 : (Parsetree.expression) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -47408,34 +54241,34 @@ module Tables = struct let _v = let _1 = let _4 = -# 2873 "parsing/parser.mly" +# 2933 "parsing/parser.mly" ( es ) -# 47414 "parsing/parser.ml" +# 54247 "parsing/parser.ml" in let _2 = let _1 = # 123 "" ( None ) -# 47420 "parsing/parser.ml" +# 54253 "parsing/parser.ml" in -# 2417 "parsing/parser.mly" +# 2403 "parsing/parser.mly" ( _1, _2 ) -# 47425 "parsing/parser.ml" +# 54258 "parsing/parser.ml" in let _loc__p_ = (_startpos__p_, _endpos__p_) in let _loc__e_ = (_startpos__e_, _endpos__e_) in -# 2412 "parsing/parser.mly" +# 2398 "parsing/parser.mly" ( indexop_unclosed_error _loc__p_ Brace _loc__e_ ) -# 47433 "parsing/parser.ml" +# 54266 "parsing/parser.ml" in ( -# 2525 "parsing/parser.mly" +# 2512 "parsing/parser.mly" ( _1 ) -# 47439 "parsing/parser.ml" +# 54272 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -47494,9 +54327,9 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _p : unit = Obj.magic _p in let _2 : ( -# 778 "parsing/parser.mly" +# 766 "parsing/parser.mly" (string) -# 47500 "parsing/parser.ml" +# 54333 "parsing/parser.ml" ) = Obj.magic _2 in let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in let _1_inlined1 : unit = Obj.magic _1_inlined1 in @@ -47507,42 +54340,42 @@ module Tables = struct let _v = let _1 = let _4 = -# 2873 "parsing/parser.mly" +# 2933 "parsing/parser.mly" ( es ) -# 47513 "parsing/parser.ml" +# 54346 "parsing/parser.ml" in let _2 = let _1 = let _2 = _2_inlined1 in let x = -# 2417 "parsing/parser.mly" +# 2403 "parsing/parser.mly" (_2) -# 47521 "parsing/parser.ml" +# 54354 "parsing/parser.ml" in # 126 "" ( Some x ) -# 47526 "parsing/parser.ml" +# 54359 "parsing/parser.ml" in -# 2417 "parsing/parser.mly" +# 2403 "parsing/parser.mly" ( _1, _2 ) -# 47532 "parsing/parser.ml" +# 54365 "parsing/parser.ml" in let _loc__p_ = (_startpos__p_, _endpos__p_) in let _loc__e_ = (_startpos__e_, _endpos__e_) in -# 2412 "parsing/parser.mly" +# 2398 "parsing/parser.mly" ( indexop_unclosed_error _loc__p_ Brace _loc__e_ ) -# 47540 "parsing/parser.ml" +# 54373 "parsing/parser.ml" in ( -# 2525 "parsing/parser.mly" +# 2512 "parsing/parser.mly" ( _1 ) -# 47546 "parsing/parser.ml" +# 54379 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -47589,9 +54422,9 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _p : unit = Obj.magic _p in let _2 : ( -# 778 "parsing/parser.mly" +# 766 "parsing/parser.mly" (string) -# 47595 "parsing/parser.ml" +# 54428 "parsing/parser.ml" ) = Obj.magic _2 in let _1 : (Parsetree.expression) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -47600,34 +54433,34 @@ module Tables = struct let _v = let _1 = let _4 = -# 2873 "parsing/parser.mly" +# 2933 "parsing/parser.mly" ( es ) -# 47606 "parsing/parser.ml" +# 54439 "parsing/parser.ml" in let _2 = let _1 = # 123 "" ( None ) -# 47612 "parsing/parser.ml" +# 54445 "parsing/parser.ml" in -# 2417 "parsing/parser.mly" +# 2403 "parsing/parser.mly" ( _1, _2 ) -# 47617 "parsing/parser.ml" +# 54450 "parsing/parser.ml" in let _loc__p_ = (_startpos__p_, _endpos__p_) in let _loc__e_ = (_startpos__e_, _endpos__e_) in -# 2414 "parsing/parser.mly" +# 2400 "parsing/parser.mly" ( indexop_unclosed_error _loc__p_ Bracket _loc__e_ ) -# 47625 "parsing/parser.ml" +# 54458 "parsing/parser.ml" in ( -# 2525 "parsing/parser.mly" +# 2512 "parsing/parser.mly" ( _1 ) -# 47631 "parsing/parser.ml" +# 54464 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -47686,9 +54519,9 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _p : unit = Obj.magic _p in let _2 : ( -# 778 "parsing/parser.mly" +# 766 "parsing/parser.mly" (string) -# 47692 "parsing/parser.ml" +# 54525 "parsing/parser.ml" ) = Obj.magic _2 in let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in let _1_inlined1 : unit = Obj.magic _1_inlined1 in @@ -47699,42 +54532,42 @@ module Tables = struct let _v = let _1 = let _4 = -# 2873 "parsing/parser.mly" +# 2933 "parsing/parser.mly" ( es ) -# 47705 "parsing/parser.ml" +# 54538 "parsing/parser.ml" in let _2 = let _1 = let _2 = _2_inlined1 in let x = -# 2417 "parsing/parser.mly" +# 2403 "parsing/parser.mly" (_2) -# 47713 "parsing/parser.ml" +# 54546 "parsing/parser.ml" in # 126 "" ( Some x ) -# 47718 "parsing/parser.ml" +# 54551 "parsing/parser.ml" in -# 2417 "parsing/parser.mly" +# 2403 "parsing/parser.mly" ( _1, _2 ) -# 47724 "parsing/parser.ml" +# 54557 "parsing/parser.ml" in let _loc__p_ = (_startpos__p_, _endpos__p_) in let _loc__e_ = (_startpos__e_, _endpos__e_) in -# 2414 "parsing/parser.mly" +# 2400 "parsing/parser.mly" ( indexop_unclosed_error _loc__p_ Bracket _loc__e_ ) -# 47732 "parsing/parser.ml" +# 54565 "parsing/parser.ml" in ( -# 2525 "parsing/parser.mly" +# 2512 "parsing/parser.mly" ( _1 ) -# 47738 "parsing/parser.ml" +# 54571 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -47770,16 +54603,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2565 "parsing/parser.mly" - ( wrap_exp_attrs ~loc:_sloc e - (Some (mknoloc "metaocaml.escape"), []) ) -# 47777 "parsing/parser.ml" +# 2552 "parsing/parser.mly" + ( mkexp ~loc:_sloc (pexp_extension ~id:(mknoloc "metaocaml.escape") e) ) +# 54609 "parsing/parser.ml" in ( -# 2526 "parsing/parser.mly" +# 2513 "parsing/parser.mly" ( _1 ) -# 47783 "parsing/parser.ml" +# 54615 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -47822,16 +54654,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2568 "parsing/parser.mly" - ( wrap_exp_attrs ~loc:_sloc e - (Some (mknoloc "metaocaml.bracket"),[]) ) -# 47829 "parsing/parser.ml" +# 2554 "parsing/parser.mly" + ( mkexp ~loc:_sloc (pexp_extension ~id:(mknoloc "metaocaml.bracket") e) ) +# 54660 "parsing/parser.ml" in ( -# 2526 "parsing/parser.mly" +# 2513 "parsing/parser.mly" ( _1 ) -# 47835 "parsing/parser.ml" +# 54666 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -47887,15 +54718,15 @@ module Tables = struct let attrs = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 47893 "parsing/parser.ml" +# 54724 "parsing/parser.ml" in -# 2535 "parsing/parser.mly" +# 2522 "parsing/parser.mly" ( e.pexp_desc, (ext, attrs @ e.pexp_attributes) ) -# 47899 "parsing/parser.ml" +# 54730 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -47903,10 +54734,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2528 "parsing/parser.mly" +# 2515 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 47910 "parsing/parser.ml" +# 54741 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -47957,24 +54788,24 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 47963 "parsing/parser.ml" +# 54794 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 47969 "parsing/parser.ml" +# 54800 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2537 "parsing/parser.mly" +# 2524 "parsing/parser.mly" ( Pexp_construct (mkloc (Lident "()") (make_loc _sloc), None), _2 ) -# 47978 "parsing/parser.ml" +# 54809 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -47982,10 +54813,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2528 "parsing/parser.mly" +# 2515 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 47989 "parsing/parser.ml" +# 54820 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -48043,23 +54874,23 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 48049 "parsing/parser.ml" +# 54880 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 48055 "parsing/parser.ml" +# 54886 "parsing/parser.ml" in let _loc__4_ = (_startpos__4_, _endpos__4_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2539 "parsing/parser.mly" +# 2526 "parsing/parser.mly" ( unclosed "begin" _loc__1_ "end" _loc__4_ ) -# 48063 "parsing/parser.ml" +# 54894 "parsing/parser.ml" in let _endpos__1_ = _endpos__4_ in @@ -48067,10 +54898,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2528 "parsing/parser.mly" +# 2515 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 48074 "parsing/parser.ml" +# 54905 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -48122,9 +54953,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 48128 "parsing/parser.ml" +# 54959 "parsing/parser.ml" in let _2 = @@ -48132,21 +54963,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 48138 "parsing/parser.ml" +# 54969 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 48144 "parsing/parser.ml" +# 54975 "parsing/parser.ml" in -# 2541 "parsing/parser.mly" +# 2528 "parsing/parser.mly" ( Pexp_new(_3), _2 ) -# 48150 "parsing/parser.ml" +# 54981 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined3_ in @@ -48154,10 +54985,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2528 "parsing/parser.mly" +# 2515 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 48161 "parsing/parser.ml" +# 54992 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -48222,21 +55053,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 48228 "parsing/parser.ml" +# 55059 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 48234 "parsing/parser.ml" +# 55065 "parsing/parser.ml" in -# 2543 "parsing/parser.mly" - ( Pexp_pack _4, _3 ) -# 48240 "parsing/parser.ml" +# 2530 "parsing/parser.mly" + ( Pexp_pack (_4, None), _3 ) +# 55071 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -48244,10 +55075,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2528 "parsing/parser.mly" +# 2515 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 48251 "parsing/parser.ml" +# 55082 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -48327,11 +55158,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3691 "parsing/parser.mly" +# 3860 "parsing/parser.mly" ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in - let descr = Ptyp_package (lid, cstrs) in - mktyp ~loc:_sloc ~attrs descr ) -# 48335 "parsing/parser.ml" + Typ.package_type ~loc:(make_loc _sloc) ~attrs lid cstrs ) +# 55165 "parsing/parser.ml" in let _3 = @@ -48339,24 +55169,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 48345 "parsing/parser.ml" +# 55175 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 48351 "parsing/parser.ml" +# 55181 "parsing/parser.ml" in - let _endpos = _endpos__7_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2545 "parsing/parser.mly" - ( Pexp_constraint (ghexp ~loc:_sloc (Pexp_pack _4), _6), _3 ) -# 48360 "parsing/parser.ml" +# 2532 "parsing/parser.mly" + ( Pexp_pack (_4, Some _6), _3 ) +# 55187 "parsing/parser.ml" in let _endpos__1_ = _endpos__7_ in @@ -48364,10 +55191,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2528 "parsing/parser.mly" +# 2515 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 48371 "parsing/parser.ml" +# 55198 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -48439,23 +55266,23 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 48445 "parsing/parser.ml" +# 55272 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 48451 "parsing/parser.ml" +# 55278 "parsing/parser.ml" in let _loc__6_ = (_startpos__6_, _endpos__6_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2547 "parsing/parser.mly" +# 2534 "parsing/parser.mly" ( unclosed "(" _loc__1_ ")" _loc__6_ ) -# 48459 "parsing/parser.ml" +# 55286 "parsing/parser.ml" in let _endpos__1_ = _endpos__6_ in @@ -48463,10 +55290,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2528 "parsing/parser.mly" +# 2515 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 48470 "parsing/parser.ml" +# 55297 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -48533,27 +55360,27 @@ module Tables = struct let _1 = # 271 "" ( List.flatten xss ) -# 48537 "parsing/parser.ml" +# 55364 "parsing/parser.ml" in -# 2056 "parsing/parser.mly" +# 2044 "parsing/parser.mly" ( _1 ) -# 48542 "parsing/parser.ml" +# 55369 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_xss_) in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 978 "parsing/parser.mly" +# 966 "parsing/parser.mly" ( extra_cstr _startpos _endpos _1 ) -# 48551 "parsing/parser.ml" +# 55378 "parsing/parser.ml" in -# 2043 "parsing/parser.mly" +# 2031 "parsing/parser.mly" ( Cstr.mk _1 _2 ) -# 48557 "parsing/parser.ml" +# 55384 "parsing/parser.ml" in let _2 = @@ -48561,21 +55388,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 48567 "parsing/parser.ml" +# 55394 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 48573 "parsing/parser.ml" +# 55400 "parsing/parser.ml" in -# 2549 "parsing/parser.mly" +# 2536 "parsing/parser.mly" ( Pexp_object _3, _2 ) -# 48579 "parsing/parser.ml" +# 55406 "parsing/parser.ml" in let _endpos__1_ = _endpos__4_ in @@ -48583,10 +55410,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2528 "parsing/parser.mly" +# 2515 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 48590 "parsing/parser.ml" +# 55417 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -48653,27 +55480,27 @@ module Tables = struct let _1 = # 271 "" ( List.flatten xss ) -# 48657 "parsing/parser.ml" +# 55484 "parsing/parser.ml" in -# 2056 "parsing/parser.mly" +# 2044 "parsing/parser.mly" ( _1 ) -# 48662 "parsing/parser.ml" +# 55489 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_xss_) in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 978 "parsing/parser.mly" +# 966 "parsing/parser.mly" ( extra_cstr _startpos _endpos _1 ) -# 48671 "parsing/parser.ml" +# 55498 "parsing/parser.ml" in -# 2043 "parsing/parser.mly" +# 2031 "parsing/parser.mly" ( Cstr.mk _1 _2 ) -# 48677 "parsing/parser.ml" +# 55504 "parsing/parser.ml" in let _2 = @@ -48681,23 +55508,23 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 48687 "parsing/parser.ml" +# 55514 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 48693 "parsing/parser.ml" +# 55520 "parsing/parser.ml" in let _loc__4_ = (_startpos__4_, _endpos__4_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2551 "parsing/parser.mly" +# 2538 "parsing/parser.mly" ( unclosed "object" _loc__1_ "end" _loc__4_ ) -# 48701 "parsing/parser.ml" +# 55528 "parsing/parser.ml" in let _endpos__1_ = _endpos__4_ in @@ -48705,10 +55532,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2528 "parsing/parser.mly" +# 2515 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 48712 "parsing/parser.ml" +# 55539 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -48739,30 +55566,30 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 48745 "parsing/parser.ml" +# 55572 "parsing/parser.ml" in -# 2574 "parsing/parser.mly" +# 2559 "parsing/parser.mly" ( Pexp_ident (_1) ) -# 48751 "parsing/parser.ml" +# 55578 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 48760 "parsing/parser.ml" +# 55587 "parsing/parser.ml" in ( -# 2531 "parsing/parser.mly" +# 2518 "parsing/parser.mly" ( _1 ) -# 48766 "parsing/parser.ml" +# 55593 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -48788,23 +55615,23 @@ module Tables = struct let _v = let _1 = let _1 = -# 2576 "parsing/parser.mly" +# 2561 "parsing/parser.mly" ( Pexp_constant _1 ) -# 48794 "parsing/parser.ml" +# 55621 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 48802 "parsing/parser.ml" +# 55629 "parsing/parser.ml" in ( -# 2531 "parsing/parser.mly" +# 2518 "parsing/parser.mly" ( _1 ) -# 48808 "parsing/parser.ml" +# 55635 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -48835,30 +55662,30 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 48841 "parsing/parser.ml" +# 55668 "parsing/parser.ml" in -# 2578 "parsing/parser.mly" +# 2563 "parsing/parser.mly" ( Pexp_construct(_1, None) ) -# 48847 "parsing/parser.ml" +# 55674 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 48856 "parsing/parser.ml" +# 55683 "parsing/parser.ml" in ( -# 2531 "parsing/parser.mly" +# 2518 "parsing/parser.mly" ( _1 ) -# 48862 "parsing/parser.ml" +# 55689 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -48884,23 +55711,23 @@ module Tables = struct let _v = let _1 = let _1 = -# 2580 "parsing/parser.mly" +# 2565 "parsing/parser.mly" ( Pexp_variant(_1, None) ) -# 48890 "parsing/parser.ml" +# 55717 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 48898 "parsing/parser.ml" +# 55725 "parsing/parser.ml" in ( -# 2531 "parsing/parser.mly" +# 2518 "parsing/parser.mly" ( _1 ) -# 48904 "parsing/parser.ml" +# 55731 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -48927,9 +55754,9 @@ module Tables = struct } = _menhir_stack in let _2 : (Parsetree.expression) = Obj.magic _2 in let _1 : ( -# 821 "parsing/parser.mly" +# 809 "parsing/parser.mly" (string) -# 48933 "parsing/parser.ml" +# 55760 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -48942,15 +55769,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1011 "parsing/parser.mly" +# 999 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 48948 "parsing/parser.ml" +# 55775 "parsing/parser.ml" in -# 2582 "parsing/parser.mly" +# 2567 "parsing/parser.mly" ( Pexp_apply(_1, [Nolabel,_2]) ) -# 48954 "parsing/parser.ml" +# 55781 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in @@ -48958,15 +55785,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 48964 "parsing/parser.ml" +# 55791 "parsing/parser.ml" in ( -# 2531 "parsing/parser.mly" +# 2518 "parsing/parser.mly" ( _1 ) -# 48970 "parsing/parser.ml" +# 55797 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -49001,23 +55828,23 @@ module Tables = struct let _1 = let _1 = let _1 = -# 2583 "parsing/parser.mly" +# 2568 "parsing/parser.mly" ("!") -# 49007 "parsing/parser.ml" +# 55834 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1011 "parsing/parser.mly" +# 999 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 49015 "parsing/parser.ml" +# 55842 "parsing/parser.ml" in -# 2584 "parsing/parser.mly" +# 2569 "parsing/parser.mly" ( Pexp_apply(_1, [Nolabel,_2]) ) -# 49021 "parsing/parser.ml" +# 55848 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in @@ -49025,15 +55852,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 49031 "parsing/parser.ml" +# 55858 "parsing/parser.ml" in ( -# 2531 "parsing/parser.mly" +# 2518 "parsing/parser.mly" ( _1 ) -# 49037 "parsing/parser.ml" +# 55864 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -49074,14 +55901,14 @@ module Tables = struct let _1 = let _1 = let _2 = -# 2856 "parsing/parser.mly" +# 2916 "parsing/parser.mly" ( xs ) -# 49080 "parsing/parser.ml" +# 55907 "parsing/parser.ml" in -# 2586 "parsing/parser.mly" +# 2571 "parsing/parser.mly" ( Pexp_override _2 ) -# 49085 "parsing/parser.ml" +# 55912 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -49089,15 +55916,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 49095 "parsing/parser.ml" +# 55922 "parsing/parser.ml" in ( -# 2531 "parsing/parser.mly" +# 2518 "parsing/parser.mly" ( _1 ) -# 49101 "parsing/parser.ml" +# 55928 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -49138,16 +55965,16 @@ module Tables = struct let _1 = let _1 = let _2 = -# 2856 "parsing/parser.mly" +# 2916 "parsing/parser.mly" ( xs ) -# 49144 "parsing/parser.ml" +# 55971 "parsing/parser.ml" in let _loc__3_ = (_startpos__3_, _endpos__3_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2588 "parsing/parser.mly" +# 2573 "parsing/parser.mly" ( unclosed "{<" _loc__1_ ">}" _loc__3_ ) -# 49151 "parsing/parser.ml" +# 55978 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -49155,15 +55982,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 49161 "parsing/parser.ml" +# 55988 "parsing/parser.ml" in ( -# 2531 "parsing/parser.mly" +# 2518 "parsing/parser.mly" ( _1 ) -# 49167 "parsing/parser.ml" +# 55994 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -49196,24 +56023,24 @@ module Tables = struct let _v = let _1 = let _1 = -# 2590 "parsing/parser.mly" +# 2575 "parsing/parser.mly" ( Pexp_override [] ) -# 49202 "parsing/parser.ml" +# 56029 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 49211 "parsing/parser.ml" +# 56038 "parsing/parser.ml" in ( -# 2531 "parsing/parser.mly" +# 2518 "parsing/parser.mly" ( _1 ) -# 49217 "parsing/parser.ml" +# 56044 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -49259,15 +56086,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 49265 "parsing/parser.ml" +# 56092 "parsing/parser.ml" in -# 2592 "parsing/parser.mly" +# 2577 "parsing/parser.mly" ( Pexp_field(_1, _3) ) -# 49271 "parsing/parser.ml" +# 56098 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined1_ in @@ -49275,15 +56102,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 49281 "parsing/parser.ml" +# 56108 "parsing/parser.ml" in ( -# 2531 "parsing/parser.mly" +# 2518 "parsing/parser.mly" ( _1 ) -# 49287 "parsing/parser.ml" +# 56114 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -49343,24 +56170,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 49349 "parsing/parser.ml" +# 56176 "parsing/parser.ml" in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1704 "parsing/parser.mly" +# 1692 "parsing/parser.mly" ( let loc = make_loc _loc__1_ in let me = Mod.ident ~loc _1 in Opn.mk ~loc me ) -# 49358 "parsing/parser.ml" +# 56185 "parsing/parser.ml" in -# 2594 "parsing/parser.mly" +# 2579 "parsing/parser.mly" ( Pexp_open(od, _4) ) -# 49364 "parsing/parser.ml" +# 56191 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -49368,15 +56195,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 49374 "parsing/parser.ml" +# 56201 "parsing/parser.ml" in ( -# 2531 "parsing/parser.mly" +# 2518 "parsing/parser.mly" ( _1 ) -# 49380 "parsing/parser.ml" +# 56207 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -49431,9 +56258,9 @@ module Tables = struct let _1 = let _1 = let _4 = -# 2856 "parsing/parser.mly" +# 2916 "parsing/parser.mly" ( xs ) -# 49437 "parsing/parser.ml" +# 56264 "parsing/parser.ml" in let od = let _1 = @@ -49441,18 +56268,18 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 49447 "parsing/parser.ml" +# 56274 "parsing/parser.ml" in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1704 "parsing/parser.mly" +# 1692 "parsing/parser.mly" ( let loc = make_loc _loc__1_ in let me = Mod.ident ~loc _1 in Opn.mk ~loc me ) -# 49456 "parsing/parser.ml" +# 56283 "parsing/parser.ml" in let _startpos_od_ = _startpos__1_ in @@ -49460,10 +56287,10 @@ module Tables = struct let _symbolstartpos = _startpos_od_ in let _sloc = (_symbolstartpos, _endpos) in -# 2596 "parsing/parser.mly" +# 2581 "parsing/parser.mly" ( (* TODO: review the location of Pexp_override *) Pexp_open(od, mkexp ~loc:_sloc (Pexp_override _4)) ) -# 49467 "parsing/parser.ml" +# 56294 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -49471,15 +56298,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 49477 "parsing/parser.ml" +# 56304 "parsing/parser.ml" in ( -# 2531 "parsing/parser.mly" +# 2518 "parsing/parser.mly" ( _1 ) -# 49483 "parsing/parser.ml" +# 56310 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -49534,16 +56361,16 @@ module Tables = struct let _1 = let _1 = let _4 = -# 2856 "parsing/parser.mly" +# 2916 "parsing/parser.mly" ( xs ) -# 49540 "parsing/parser.ml" +# 56367 "parsing/parser.ml" in let _loc__5_ = (_startpos__5_, _endpos__5_) in let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2599 "parsing/parser.mly" +# 2584 "parsing/parser.mly" ( unclosed "{<" _loc__3_ ">}" _loc__5_ ) -# 49547 "parsing/parser.ml" +# 56374 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -49551,15 +56378,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 49557 "parsing/parser.ml" +# 56384 "parsing/parser.ml" in ( -# 2531 "parsing/parser.mly" +# 2518 "parsing/parser.mly" ( _1 ) -# 49563 "parsing/parser.ml" +# 56390 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -49591,9 +56418,9 @@ module Tables = struct }; } = _menhir_stack in let _1_inlined1 : ( -# 797 "parsing/parser.mly" +# 785 "parsing/parser.mly" (string) -# 49597 "parsing/parser.ml" +# 56424 "parsing/parser.ml" ) = Obj.magic _1_inlined1 in let _2 : unit = Obj.magic _2 in let _1 : (Parsetree.expression) = Obj.magic _1 in @@ -49606,23 +56433,23 @@ module Tables = struct let _3 = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _1 = -# 3765 "parsing/parser.mly" +# 3936 "parsing/parser.mly" ( _1 ) -# 49612 "parsing/parser.ml" +# 56439 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 49620 "parsing/parser.ml" +# 56447 "parsing/parser.ml" in -# 2601 "parsing/parser.mly" +# 2586 "parsing/parser.mly" ( Pexp_send(_1, _3) ) -# 49626 "parsing/parser.ml" +# 56453 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined1_ in @@ -49630,15 +56457,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 49636 "parsing/parser.ml" +# 56463 "parsing/parser.ml" in ( -# 2531 "parsing/parser.mly" +# 2518 "parsing/parser.mly" ( _1 ) -# 49642 "parsing/parser.ml" +# 56469 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -49671,9 +56498,9 @@ module Tables = struct } = _menhir_stack in let _3 : (Parsetree.expression) = Obj.magic _3 in let _1_inlined1 : ( -# 832 "parsing/parser.mly" +# 820 "parsing/parser.mly" (string) -# 49677 "parsing/parser.ml" +# 56504 "parsing/parser.ml" ) = Obj.magic _1_inlined1 in let _1 : (Parsetree.expression) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -49688,15 +56515,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1011 "parsing/parser.mly" +# 999 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 49694 "parsing/parser.ml" +# 56521 "parsing/parser.ml" in -# 2603 "parsing/parser.mly" +# 2588 "parsing/parser.mly" ( mkinfix _1 _2 _3 ) -# 49700 "parsing/parser.ml" +# 56527 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -49704,15 +56531,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 49710 "parsing/parser.ml" +# 56537 "parsing/parser.ml" in ( -# 2531 "parsing/parser.mly" +# 2518 "parsing/parser.mly" ( _1 ) -# 49716 "parsing/parser.ml" +# 56543 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -49738,23 +56565,23 @@ module Tables = struct let _v = let _1 = let _1 = -# 2605 "parsing/parser.mly" +# 2590 "parsing/parser.mly" ( Pexp_extension _1 ) -# 49744 "parsing/parser.ml" +# 56571 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 49752 "parsing/parser.ml" +# 56579 "parsing/parser.ml" in ( -# 2531 "parsing/parser.mly" +# 2518 "parsing/parser.mly" ( _1 ) -# 49758 "parsing/parser.ml" +# 56585 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -49804,18 +56631,18 @@ module Tables = struct let _3 = let (_endpos__2_, _startpos__1_) = (_endpos__2_inlined1_, _startpos__1_inlined1_) in let _1 = -# 2606 "parsing/parser.mly" +# 2591 "parsing/parser.mly" (Lident "()") -# 49810 "parsing/parser.ml" +# 56637 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 49819 "parsing/parser.ml" +# 56646 "parsing/parser.ml" in let (_endpos__3_, _startpos__3_) = (_endpos__2_inlined1_, _startpos__1_inlined1_) in @@ -49825,25 +56652,25 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 49831 "parsing/parser.ml" +# 56658 "parsing/parser.ml" in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1704 "parsing/parser.mly" +# 1692 "parsing/parser.mly" ( let loc = make_loc _loc__1_ in let me = Mod.ident ~loc _1 in Opn.mk ~loc me ) -# 49840 "parsing/parser.ml" +# 56667 "parsing/parser.ml" in let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2607 "parsing/parser.mly" +# 2592 "parsing/parser.mly" ( Pexp_open(od, mkexp ~loc:(_loc__3_) (Pexp_construct(_3, None))) ) -# 49847 "parsing/parser.ml" +# 56674 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_inlined1_ in @@ -49851,15 +56678,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 49857 "parsing/parser.ml" +# 56684 "parsing/parser.ml" in ( -# 2531 "parsing/parser.mly" +# 2518 "parsing/parser.mly" ( _1 ) -# 49863 "parsing/parser.ml" +# 56690 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -49916,9 +56743,9 @@ module Tables = struct let _loc__5_ = (_startpos__5_, _endpos__5_) in let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2609 "parsing/parser.mly" +# 2594 "parsing/parser.mly" ( unclosed "(" _loc__3_ ")" _loc__5_ ) -# 49922 "parsing/parser.ml" +# 56749 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -49926,15 +56753,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 49932 "parsing/parser.ml" +# 56759 "parsing/parser.ml" in ( -# 2531 "parsing/parser.mly" +# 2518 "parsing/parser.mly" ( _1 ) -# 49938 "parsing/parser.ml" +# 56765 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -49975,25 +56802,25 @@ module Tables = struct let _v = let _1 = let _1 = -# 2611 "parsing/parser.mly" +# 2596 "parsing/parser.mly" ( let (exten, fields) = _2 in Pexp_record(fields, exten) ) -# 49982 "parsing/parser.ml" +# 56809 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 49991 "parsing/parser.ml" +# 56818 "parsing/parser.ml" in ( -# 2531 "parsing/parser.mly" +# 2518 "parsing/parser.mly" ( _1 ) -# 49997 "parsing/parser.ml" +# 56824 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -50037,9 +56864,9 @@ module Tables = struct let _loc__3_ = (_startpos__3_, _endpos__3_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2614 "parsing/parser.mly" +# 2599 "parsing/parser.mly" ( unclosed "{" _loc__1_ "}" _loc__3_ ) -# 50043 "parsing/parser.ml" +# 56870 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -50047,15 +56874,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 50053 "parsing/parser.ml" +# 56880 "parsing/parser.ml" in ( -# 2531 "parsing/parser.mly" +# 2518 "parsing/parser.mly" ( _1 ) -# 50059 "parsing/parser.ml" +# 56886 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -50116,27 +56943,27 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 50122 "parsing/parser.ml" +# 56949 "parsing/parser.ml" in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1704 "parsing/parser.mly" +# 1692 "parsing/parser.mly" ( let loc = make_loc _loc__1_ in let me = Mod.ident ~loc _1 in Opn.mk ~loc me ) -# 50131 "parsing/parser.ml" +# 56958 "parsing/parser.ml" in let _endpos = _endpos__5_ in -# 2616 "parsing/parser.mly" +# 2601 "parsing/parser.mly" ( let (exten, fields) = _4 in Pexp_open(od, mkexp ~loc:(_startpos__3_, _endpos) (Pexp_record(fields, exten))) ) -# 50140 "parsing/parser.ml" +# 56967 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -50144,15 +56971,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 50150 "parsing/parser.ml" +# 56977 "parsing/parser.ml" in ( -# 2531 "parsing/parser.mly" +# 2518 "parsing/parser.mly" ( _1 ) -# 50156 "parsing/parser.ml" +# 56983 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -50210,9 +57037,9 @@ module Tables = struct let _loc__5_ = (_startpos__5_, _endpos__5_) in let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2620 "parsing/parser.mly" +# 2605 "parsing/parser.mly" ( unclosed "{" _loc__3_ "}" _loc__5_ ) -# 50216 "parsing/parser.ml" +# 57043 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -50220,15 +57047,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 50226 "parsing/parser.ml" +# 57053 "parsing/parser.ml" in ( -# 2531 "parsing/parser.mly" +# 2518 "parsing/parser.mly" ( _1 ) -# 50232 "parsing/parser.ml" +# 57059 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -50269,14 +57096,14 @@ module Tables = struct let _1 = let _1 = let _2 = -# 2873 "parsing/parser.mly" +# 2933 "parsing/parser.mly" ( es ) -# 50275 "parsing/parser.ml" +# 57102 "parsing/parser.ml" in -# 2622 "parsing/parser.mly" +# 2607 "parsing/parser.mly" ( Pexp_array(_2) ) -# 50280 "parsing/parser.ml" +# 57107 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -50284,15 +57111,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 50290 "parsing/parser.ml" +# 57117 "parsing/parser.ml" in ( -# 2531 "parsing/parser.mly" +# 2518 "parsing/parser.mly" ( _1 ) -# 50296 "parsing/parser.ml" +# 57123 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -50333,16 +57160,16 @@ module Tables = struct let _1 = let _1 = let _2 = -# 2873 "parsing/parser.mly" +# 2933 "parsing/parser.mly" ( es ) -# 50339 "parsing/parser.ml" +# 57166 "parsing/parser.ml" in let _loc__3_ = (_startpos__3_, _endpos__3_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2624 "parsing/parser.mly" +# 2609 "parsing/parser.mly" ( unclosed "[|" _loc__1_ "|]" _loc__3_ ) -# 50346 "parsing/parser.ml" +# 57173 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -50350,15 +57177,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 50356 "parsing/parser.ml" +# 57183 "parsing/parser.ml" in ( -# 2531 "parsing/parser.mly" +# 2518 "parsing/parser.mly" ( _1 ) -# 50362 "parsing/parser.ml" +# 57189 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -50391,24 +57218,24 @@ module Tables = struct let _v = let _1 = let _1 = -# 2626 "parsing/parser.mly" +# 2611 "parsing/parser.mly" ( Pexp_array [] ) -# 50397 "parsing/parser.ml" +# 57224 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 50406 "parsing/parser.ml" +# 57233 "parsing/parser.ml" in ( -# 2531 "parsing/parser.mly" +# 2518 "parsing/parser.mly" ( _1 ) -# 50412 "parsing/parser.ml" +# 57239 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -50463,9 +57290,9 @@ module Tables = struct let _1 = let _1 = let _4 = -# 2873 "parsing/parser.mly" +# 2933 "parsing/parser.mly" ( es ) -# 50469 "parsing/parser.ml" +# 57296 "parsing/parser.ml" in let od = let _1 = @@ -50473,25 +57300,25 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 50479 "parsing/parser.ml" +# 57306 "parsing/parser.ml" in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1704 "parsing/parser.mly" +# 1692 "parsing/parser.mly" ( let loc = make_loc _loc__1_ in let me = Mod.ident ~loc _1 in Opn.mk ~loc me ) -# 50488 "parsing/parser.ml" +# 57315 "parsing/parser.ml" in let _endpos = _endpos__5_ in -# 2628 "parsing/parser.mly" +# 2613 "parsing/parser.mly" ( Pexp_open(od, mkexp ~loc:(_startpos__3_, _endpos) (Pexp_array(_4))) ) -# 50495 "parsing/parser.ml" +# 57322 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -50499,15 +57326,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 50505 "parsing/parser.ml" +# 57332 "parsing/parser.ml" in ( -# 2531 "parsing/parser.mly" +# 2518 "parsing/parser.mly" ( _1 ) -# 50511 "parsing/parser.ml" +# 57338 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -50560,26 +57387,26 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 50566 "parsing/parser.ml" +# 57393 "parsing/parser.ml" in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1704 "parsing/parser.mly" +# 1692 "parsing/parser.mly" ( let loc = make_loc _loc__1_ in let me = Mod.ident ~loc _1 in Opn.mk ~loc me ) -# 50575 "parsing/parser.ml" +# 57402 "parsing/parser.ml" in let _endpos = _endpos__4_ in -# 2630 "parsing/parser.mly" +# 2615 "parsing/parser.mly" ( (* TODO: review the location of Pexp_array *) Pexp_open(od, mkexp ~loc:(_startpos__3_, _endpos) (Pexp_array [])) ) -# 50583 "parsing/parser.ml" +# 57410 "parsing/parser.ml" in let _endpos__1_ = _endpos__4_ in @@ -50587,15 +57414,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 50593 "parsing/parser.ml" +# 57420 "parsing/parser.ml" in ( -# 2531 "parsing/parser.mly" +# 2518 "parsing/parser.mly" ( _1 ) -# 50599 "parsing/parser.ml" +# 57426 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -50650,16 +57477,16 @@ module Tables = struct let _1 = let _1 = let _4 = -# 2873 "parsing/parser.mly" +# 2933 "parsing/parser.mly" ( es ) -# 50656 "parsing/parser.ml" +# 57483 "parsing/parser.ml" in let _loc__5_ = (_startpos__5_, _endpos__5_) in let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2634 "parsing/parser.mly" +# 2619 "parsing/parser.mly" ( unclosed "[|" _loc__3_ "|]" _loc__5_ ) -# 50663 "parsing/parser.ml" +# 57490 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -50667,15 +57494,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 50673 "parsing/parser.ml" +# 57500 "parsing/parser.ml" in ( -# 2531 "parsing/parser.mly" +# 2518 "parsing/parser.mly" ( _1 ) -# 50679 "parsing/parser.ml" +# 57506 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -50716,15 +57543,15 @@ module Tables = struct let _1 = let _1 = let _2 = -# 2873 "parsing/parser.mly" +# 2933 "parsing/parser.mly" ( es ) -# 50722 "parsing/parser.ml" +# 57549 "parsing/parser.ml" in let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2636 "parsing/parser.mly" +# 2621 "parsing/parser.mly" ( fst (mktailexp _loc__3_ _2) ) -# 50728 "parsing/parser.ml" +# 57555 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -50732,15 +57559,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 50738 "parsing/parser.ml" +# 57565 "parsing/parser.ml" in ( -# 2531 "parsing/parser.mly" +# 2518 "parsing/parser.mly" ( _1 ) -# 50744 "parsing/parser.ml" +# 57571 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -50781,16 +57608,16 @@ module Tables = struct let _1 = let _1 = let _2 = -# 2873 "parsing/parser.mly" +# 2933 "parsing/parser.mly" ( es ) -# 50787 "parsing/parser.ml" +# 57614 "parsing/parser.ml" in let _loc__3_ = (_startpos__3_, _endpos__3_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2638 "parsing/parser.mly" +# 2623 "parsing/parser.mly" ( unclosed "[" _loc__1_ "]" _loc__3_ ) -# 50794 "parsing/parser.ml" +# 57621 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -50798,15 +57625,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 50804 "parsing/parser.ml" +# 57631 "parsing/parser.ml" in ( -# 2531 "parsing/parser.mly" +# 2518 "parsing/parser.mly" ( _1 ) -# 50810 "parsing/parser.ml" +# 57637 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -50861,9 +57688,9 @@ module Tables = struct let _1 = let _1 = let _4 = -# 2873 "parsing/parser.mly" +# 2933 "parsing/parser.mly" ( es ) -# 50867 "parsing/parser.ml" +# 57694 "parsing/parser.ml" in let od = let _1 = @@ -50871,30 +57698,30 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 50877 "parsing/parser.ml" +# 57704 "parsing/parser.ml" in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1704 "parsing/parser.mly" +# 1692 "parsing/parser.mly" ( let loc = make_loc _loc__1_ in let me = Mod.ident ~loc _1 in Opn.mk ~loc me ) -# 50886 "parsing/parser.ml" +# 57713 "parsing/parser.ml" in let _endpos = _endpos__5_ in let _loc__5_ = (_startpos__5_, _endpos__5_) in -# 2640 "parsing/parser.mly" +# 2625 "parsing/parser.mly" ( let list_exp = (* TODO: review the location of list_exp *) let tail_exp, _tail_loc = mktailexp _loc__5_ _4 in mkexp ~loc:(_startpos__3_, _endpos) tail_exp in Pexp_open(od, list_exp) ) -# 50898 "parsing/parser.ml" +# 57725 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -50902,15 +57729,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 50908 "parsing/parser.ml" +# 57735 "parsing/parser.ml" in ( -# 2531 "parsing/parser.mly" +# 2518 "parsing/parser.mly" ( _1 ) -# 50914 "parsing/parser.ml" +# 57741 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -50960,18 +57787,18 @@ module Tables = struct let _3 = let (_endpos__2_, _startpos__1_) = (_endpos__2_inlined1_, _startpos__1_inlined1_) in let _1 = -# 2645 "parsing/parser.mly" +# 2630 "parsing/parser.mly" (Lident "[]") -# 50966 "parsing/parser.ml" +# 57793 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 50975 "parsing/parser.ml" +# 57802 "parsing/parser.ml" in let (_endpos__3_, _startpos__3_) = (_endpos__2_inlined1_, _startpos__1_inlined1_) in @@ -50981,25 +57808,25 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 50987 "parsing/parser.ml" +# 57814 "parsing/parser.ml" in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1704 "parsing/parser.mly" +# 1692 "parsing/parser.mly" ( let loc = make_loc _loc__1_ in let me = Mod.ident ~loc _1 in Opn.mk ~loc me ) -# 50996 "parsing/parser.ml" +# 57823 "parsing/parser.ml" in let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2646 "parsing/parser.mly" +# 2631 "parsing/parser.mly" ( Pexp_open(od, mkexp ~loc:_loc__3_ (Pexp_construct(_3, None))) ) -# 51003 "parsing/parser.ml" +# 57830 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_inlined1_ in @@ -51007,15 +57834,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 51013 "parsing/parser.ml" +# 57840 "parsing/parser.ml" in ( -# 2531 "parsing/parser.mly" +# 2518 "parsing/parser.mly" ( _1 ) -# 51019 "parsing/parser.ml" +# 57846 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -51070,16 +57897,16 @@ module Tables = struct let _1 = let _1 = let _4 = -# 2873 "parsing/parser.mly" +# 2933 "parsing/parser.mly" ( es ) -# 51076 "parsing/parser.ml" +# 57903 "parsing/parser.ml" in let _loc__5_ = (_startpos__5_, _endpos__5_) in let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2649 "parsing/parser.mly" +# 2634 "parsing/parser.mly" ( unclosed "[" _loc__3_ "]" _loc__5_ ) -# 51083 "parsing/parser.ml" +# 57910 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -51087,15 +57914,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 51093 "parsing/parser.ml" +# 57920 "parsing/parser.ml" in ( -# 2531 "parsing/parser.mly" +# 2518 "parsing/parser.mly" ( _1 ) -# 51099 "parsing/parser.ml" +# 57926 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -51184,17 +58011,16 @@ module Tables = struct let _v = let _1 = let _1 = - let _8 = + let ptyp = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3691 "parsing/parser.mly" +# 3860 "parsing/parser.mly" ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in - let descr = Ptyp_package (lid, cstrs) in - mktyp ~loc:_sloc ~attrs descr ) -# 51198 "parsing/parser.ml" + Typ.package_type ~loc:(make_loc _sloc) ~attrs lid cstrs ) +# 58024 "parsing/parser.ml" in let _5 = @@ -51202,15 +58028,15 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 51208 "parsing/parser.ml" +# 58034 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 51214 "parsing/parser.ml" +# 58040 "parsing/parser.ml" in let od = @@ -51219,31 +58045,28 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 51225 "parsing/parser.ml" +# 58051 "parsing/parser.ml" in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1704 "parsing/parser.mly" +# 1692 "parsing/parser.mly" ( let loc = make_loc _loc__1_ in let me = Mod.ident ~loc _1 in Opn.mk ~loc me ) -# 51234 "parsing/parser.ml" +# 58060 "parsing/parser.ml" in - let _startpos_od_ = _startpos__1_ in let _endpos = _endpos__9_ in - let _symbolstartpos = _startpos_od_ in - let _sloc = (_symbolstartpos, _endpos) in -# 2652 "parsing/parser.mly" +# 2637 "parsing/parser.mly" ( let modexp = mkexp_attrs ~loc:(_startpos__3_, _endpos) - (Pexp_constraint (ghexp ~loc:_sloc (Pexp_pack _6), _8)) _5 in + (Pexp_pack (_6, Some ptyp)) _5 in Pexp_open(od, modexp) ) -# 51247 "parsing/parser.ml" +# 58070 "parsing/parser.ml" in let _endpos__1_ = _endpos__9_ in @@ -51251,15 +58074,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 51257 "parsing/parser.ml" +# 58080 "parsing/parser.ml" in ( -# 2531 "parsing/parser.mly" +# 2518 "parsing/parser.mly" ( _1 ) -# 51263 "parsing/parser.ml" +# 58086 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -51346,23 +58169,23 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 51352 "parsing/parser.ml" +# 58175 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 51358 "parsing/parser.ml" +# 58181 "parsing/parser.ml" in let _loc__8_ = (_startpos__8_, _endpos__8_) in let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2658 "parsing/parser.mly" +# 2643 "parsing/parser.mly" ( unclosed "(" _loc__3_ ")" _loc__8_ ) -# 51366 "parsing/parser.ml" +# 58189 "parsing/parser.ml" in let _endpos__1_ = _endpos__8_ in @@ -51370,15 +58193,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 51376 "parsing/parser.ml" +# 58199 "parsing/parser.ml" in ( -# 2531 "parsing/parser.mly" +# 2518 "parsing/parser.mly" ( _1 ) -# 51382 "parsing/parser.ml" +# 58205 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -51409,30 +58232,30 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 51415 "parsing/parser.ml" +# 58238 "parsing/parser.ml" in -# 2959 "parsing/parser.mly" +# 3020 "parsing/parser.mly" ( Ppat_var (_1) ) -# 51421 "parsing/parser.ml" +# 58244 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1019 "parsing/parser.mly" +# 1007 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 51430 "parsing/parser.ml" +# 58253 "parsing/parser.ml" in ( -# 2960 "parsing/parser.mly" +# 3021 "parsing/parser.mly" ( _1 ) -# 51436 "parsing/parser.ml" +# 58259 "parsing/parser.ml" : (Parsetree.pattern)) in { @@ -51456,9 +58279,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.pattern) = -# 2961 "parsing/parser.mly" +# 3022 "parsing/parser.mly" ( _1 ) -# 51462 "parsing/parser.ml" +# 58285 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -51499,9 +58322,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2966 "parsing/parser.mly" +# 3027 "parsing/parser.mly" ( reloc_pat ~loc:_sloc _2 ) -# 51505 "parsing/parser.ml" +# 58328 "parsing/parser.ml" : (Parsetree.pattern)) in { @@ -51525,9 +58348,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.pattern) = -# 2968 "parsing/parser.mly" +# 3029 "parsing/parser.mly" ( _1 ) -# 51531 "parsing/parser.ml" +# 58354 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -51591,9 +58414,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 51597 "parsing/parser.ml" +# 58420 "parsing/parser.ml" in let _3 = @@ -51601,24 +58424,24 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 51607 "parsing/parser.ml" +# 58430 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 51613 "parsing/parser.ml" +# 58436 "parsing/parser.ml" in let _endpos = _endpos__5_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2970 "parsing/parser.mly" +# 3031 "parsing/parser.mly" ( mkpat_attrs ~loc:_sloc (Ppat_unpack _4) _3 ) -# 51622 "parsing/parser.ml" +# 58445 "parsing/parser.ml" : (Parsetree.pattern)) in { @@ -51693,15 +58516,24 @@ module Tables = struct let _v = let _6 = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined4_, _startpos__1_inlined4_, _1_inlined4) in + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 3860 "parsing/parser.mly" + ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in + Typ.package_type ~loc:(make_loc _sloc) ~attrs lid cstrs ) +# 58528 "parsing/parser.ml" + + in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3691 "parsing/parser.mly" - ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in - let descr = Ptyp_package (lid, cstrs) in - mktyp ~loc:_sloc ~attrs descr ) -# 51705 "parsing/parser.ml" +# 3864 "parsing/parser.mly" + ( mktyp ~loc:_sloc (Ptyp_package _1) ) +# 58537 "parsing/parser.ml" in let _4 = @@ -51710,9 +58542,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 51716 "parsing/parser.ml" +# 58548 "parsing/parser.ml" in let (_endpos__4_, _startpos__4_) = (_endpos__1_inlined3_, _startpos__1_inlined3_) in @@ -51721,15 +58553,15 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 51727 "parsing/parser.ml" +# 58559 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 51733 "parsing/parser.ml" +# 58565 "parsing/parser.ml" in let _endpos = _endpos__7_ in @@ -51737,11 +58569,11 @@ module Tables = struct let _loc__4_ = (_startpos__4_, _endpos__4_) in let _sloc = (_symbolstartpos, _endpos) in ( -# 2972 "parsing/parser.mly" +# 3033 "parsing/parser.mly" ( mkpat_attrs ~loc:_sloc (Ppat_constraint(mkpat ~loc:_loc__4_ (Ppat_unpack _4), _6)) _3 ) -# 51745 "parsing/parser.ml" +# 58577 "parsing/parser.ml" : (Parsetree.pattern)) in { @@ -51767,23 +58599,23 @@ module Tables = struct let _v = let _1 = let _1 = -# 2980 "parsing/parser.mly" +# 3041 "parsing/parser.mly" ( Ppat_any ) -# 51773 "parsing/parser.ml" +# 58605 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1019 "parsing/parser.mly" +# 1007 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 51781 "parsing/parser.ml" +# 58613 "parsing/parser.ml" in ( -# 2976 "parsing/parser.mly" +# 3037 "parsing/parser.mly" ( _1 ) -# 51787 "parsing/parser.ml" +# 58619 "parsing/parser.ml" : (Parsetree.pattern)) in { @@ -51809,23 +58641,23 @@ module Tables = struct let _v = let _1 = let _1 = -# 2982 "parsing/parser.mly" +# 3043 "parsing/parser.mly" ( Ppat_constant _1 ) -# 51815 "parsing/parser.ml" +# 58647 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1019 "parsing/parser.mly" +# 1007 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 51823 "parsing/parser.ml" +# 58655 "parsing/parser.ml" in ( -# 2976 "parsing/parser.mly" +# 3037 "parsing/parser.mly" ( _1 ) -# 51829 "parsing/parser.ml" +# 58661 "parsing/parser.ml" : (Parsetree.pattern)) in { @@ -51865,24 +58697,24 @@ module Tables = struct let _v = let _1 = let _1 = -# 2984 "parsing/parser.mly" +# 3045 "parsing/parser.mly" ( Ppat_interval (_1, _3) ) -# 51871 "parsing/parser.ml" +# 58703 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1019 "parsing/parser.mly" +# 1007 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 51880 "parsing/parser.ml" +# 58712 "parsing/parser.ml" in ( -# 2976 "parsing/parser.mly" +# 3037 "parsing/parser.mly" ( _1 ) -# 51886 "parsing/parser.ml" +# 58718 "parsing/parser.ml" : (Parsetree.pattern)) in { @@ -51913,30 +58745,30 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 51919 "parsing/parser.ml" +# 58751 "parsing/parser.ml" in -# 2986 "parsing/parser.mly" +# 3047 "parsing/parser.mly" ( Ppat_construct(_1, None) ) -# 51925 "parsing/parser.ml" +# 58757 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1019 "parsing/parser.mly" +# 1007 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 51934 "parsing/parser.ml" +# 58766 "parsing/parser.ml" in ( -# 2976 "parsing/parser.mly" +# 3037 "parsing/parser.mly" ( _1 ) -# 51940 "parsing/parser.ml" +# 58772 "parsing/parser.ml" : (Parsetree.pattern)) in { @@ -51962,23 +58794,23 @@ module Tables = struct let _v = let _1 = let _1 = -# 2988 "parsing/parser.mly" +# 3049 "parsing/parser.mly" ( Ppat_variant(_1, None) ) -# 51968 "parsing/parser.ml" +# 58800 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1019 "parsing/parser.mly" +# 1007 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 51976 "parsing/parser.ml" +# 58808 "parsing/parser.ml" in ( -# 2976 "parsing/parser.mly" +# 3037 "parsing/parser.mly" ( _1 ) -# 51982 "parsing/parser.ml" +# 58814 "parsing/parser.ml" : (Parsetree.pattern)) in { @@ -52017,15 +58849,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 52023 "parsing/parser.ml" +# 58855 "parsing/parser.ml" in -# 2990 "parsing/parser.mly" +# 3051 "parsing/parser.mly" ( Ppat_type (_2) ) -# 52029 "parsing/parser.ml" +# 58861 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined1_ in @@ -52033,15 +58865,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1019 "parsing/parser.mly" +# 1007 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 52039 "parsing/parser.ml" +# 58871 "parsing/parser.ml" in ( -# 2976 "parsing/parser.mly" +# 3037 "parsing/parser.mly" ( _1 ) -# 52045 "parsing/parser.ml" +# 58877 "parsing/parser.ml" : (Parsetree.pattern)) in { @@ -52086,15 +58918,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 52092 "parsing/parser.ml" +# 58924 "parsing/parser.ml" in -# 2992 "parsing/parser.mly" +# 3053 "parsing/parser.mly" ( Ppat_open(_1, _3) ) -# 52098 "parsing/parser.ml" +# 58930 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -52102,15 +58934,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1019 "parsing/parser.mly" +# 1007 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 52108 "parsing/parser.ml" +# 58940 "parsing/parser.ml" in ( -# 2976 "parsing/parser.mly" +# 3037 "parsing/parser.mly" ( _1 ) -# 52114 "parsing/parser.ml" +# 58946 "parsing/parser.ml" : (Parsetree.pattern)) in { @@ -52160,18 +58992,18 @@ module Tables = struct let _3 = let (_endpos__2_, _startpos__1_) = (_endpos__2_inlined1_, _startpos__1_inlined1_) in let _1 = -# 2993 "parsing/parser.mly" +# 3054 "parsing/parser.mly" (Lident "[]") -# 52166 "parsing/parser.ml" +# 58998 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 52175 "parsing/parser.ml" +# 59007 "parsing/parser.ml" in let _endpos__3_ = _endpos__2_inlined1_ in @@ -52180,18 +59012,18 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 52186 "parsing/parser.ml" +# 59018 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2994 "parsing/parser.mly" +# 3055 "parsing/parser.mly" ( Ppat_open(_1, mkpat ~loc:_sloc (Ppat_construct(_3, None))) ) -# 52195 "parsing/parser.ml" +# 59027 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_inlined1_ in @@ -52199,15 +59031,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1019 "parsing/parser.mly" +# 1007 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 52205 "parsing/parser.ml" +# 59037 "parsing/parser.ml" in ( -# 2976 "parsing/parser.mly" +# 3037 "parsing/parser.mly" ( _1 ) -# 52211 "parsing/parser.ml" +# 59043 "parsing/parser.ml" : (Parsetree.pattern)) in { @@ -52257,18 +59089,18 @@ module Tables = struct let _3 = let (_endpos__2_, _startpos__1_) = (_endpos__2_inlined1_, _startpos__1_inlined1_) in let _1 = -# 2995 "parsing/parser.mly" +# 3056 "parsing/parser.mly" (Lident "()") -# 52263 "parsing/parser.ml" +# 59095 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 52272 "parsing/parser.ml" +# 59104 "parsing/parser.ml" in let _endpos__3_ = _endpos__2_inlined1_ in @@ -52277,18 +59109,18 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 52283 "parsing/parser.ml" +# 59115 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2996 "parsing/parser.mly" +# 3057 "parsing/parser.mly" ( Ppat_open(_1, mkpat ~loc:_sloc (Ppat_construct(_3, None))) ) -# 52292 "parsing/parser.ml" +# 59124 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_inlined1_ in @@ -52296,15 +59128,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1019 "parsing/parser.mly" +# 1007 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 52302 "parsing/parser.ml" +# 59134 "parsing/parser.ml" in ( -# 2976 "parsing/parser.mly" +# 3037 "parsing/parser.mly" ( _1 ) -# 52308 "parsing/parser.ml" +# 59140 "parsing/parser.ml" : (Parsetree.pattern)) in { @@ -52363,15 +59195,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 52369 "parsing/parser.ml" +# 59201 "parsing/parser.ml" in -# 2998 "parsing/parser.mly" +# 3059 "parsing/parser.mly" ( Ppat_open (_1, _4) ) -# 52375 "parsing/parser.ml" +# 59207 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -52379,15 +59211,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1019 "parsing/parser.mly" +# 1007 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 52385 "parsing/parser.ml" +# 59217 "parsing/parser.ml" in ( -# 2976 "parsing/parser.mly" +# 3037 "parsing/parser.mly" ( _1 ) -# 52391 "parsing/parser.ml" +# 59223 "parsing/parser.ml" : (Parsetree.pattern)) in { @@ -52444,9 +59276,9 @@ module Tables = struct let _loc__5_ = (_startpos__5_, _endpos__5_) in let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 3000 "parsing/parser.mly" +# 3061 "parsing/parser.mly" ( unclosed "(" _loc__3_ ")" _loc__5_ ) -# 52450 "parsing/parser.ml" +# 59282 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -52454,15 +59286,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1019 "parsing/parser.mly" +# 1007 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 52460 "parsing/parser.ml" +# 59292 "parsing/parser.ml" in ( -# 2976 "parsing/parser.mly" +# 3037 "parsing/parser.mly" ( _1 ) -# 52466 "parsing/parser.ml" +# 59298 "parsing/parser.ml" : (Parsetree.pattern)) in { @@ -52511,9 +59343,9 @@ module Tables = struct let _1 = let _loc__4_ = (_startpos__4_, _endpos__4_) in -# 3002 "parsing/parser.mly" +# 3063 "parsing/parser.mly" ( expecting _loc__4_ "pattern" ) -# 52517 "parsing/parser.ml" +# 59349 "parsing/parser.ml" in let _endpos__1_ = _endpos__4_ in @@ -52521,15 +59353,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1019 "parsing/parser.mly" +# 1007 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 52527 "parsing/parser.ml" +# 59359 "parsing/parser.ml" in ( -# 2976 "parsing/parser.mly" +# 3037 "parsing/parser.mly" ( _1 ) -# 52533 "parsing/parser.ml" +# 59365 "parsing/parser.ml" : (Parsetree.pattern)) in { @@ -52572,9 +59404,9 @@ module Tables = struct let _loc__3_ = (_startpos__3_, _endpos__3_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 3004 "parsing/parser.mly" +# 3065 "parsing/parser.mly" ( unclosed "(" _loc__1_ ")" _loc__3_ ) -# 52578 "parsing/parser.ml" +# 59410 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -52582,15 +59414,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1019 "parsing/parser.mly" +# 1007 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 52588 "parsing/parser.ml" +# 59420 "parsing/parser.ml" in ( -# 2976 "parsing/parser.mly" +# 3037 "parsing/parser.mly" ( _1 ) -# 52594 "parsing/parser.ml" +# 59426 "parsing/parser.ml" : (Parsetree.pattern)) in { @@ -52644,24 +59476,24 @@ module Tables = struct let _v = let _1 = let _1 = -# 3006 "parsing/parser.mly" +# 3067 "parsing/parser.mly" ( Ppat_constraint(_2, _4) ) -# 52650 "parsing/parser.ml" +# 59482 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1019 "parsing/parser.mly" +# 1007 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 52659 "parsing/parser.ml" +# 59491 "parsing/parser.ml" in ( -# 2976 "parsing/parser.mly" +# 3037 "parsing/parser.mly" ( _1 ) -# 52665 "parsing/parser.ml" +# 59497 "parsing/parser.ml" : (Parsetree.pattern)) in { @@ -52718,9 +59550,9 @@ module Tables = struct let _loc__5_ = (_startpos__5_, _endpos__5_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 3008 "parsing/parser.mly" +# 3069 "parsing/parser.mly" ( unclosed "(" _loc__1_ ")" _loc__5_ ) -# 52724 "parsing/parser.ml" +# 59556 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -52728,15 +59560,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1019 "parsing/parser.mly" +# 1007 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 52734 "parsing/parser.ml" +# 59566 "parsing/parser.ml" in ( -# 2976 "parsing/parser.mly" +# 3037 "parsing/parser.mly" ( _1 ) -# 52740 "parsing/parser.ml" +# 59572 "parsing/parser.ml" : (Parsetree.pattern)) in { @@ -52785,9 +59617,9 @@ module Tables = struct let _1 = let _loc__4_ = (_startpos__4_, _endpos__4_) in -# 3010 "parsing/parser.mly" +# 3071 "parsing/parser.mly" ( expecting _loc__4_ "type" ) -# 52791 "parsing/parser.ml" +# 59623 "parsing/parser.ml" in let _endpos__1_ = _endpos__4_ in @@ -52795,15 +59627,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1019 "parsing/parser.mly" +# 1007 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 52801 "parsing/parser.ml" +# 59633 "parsing/parser.ml" in ( -# 2976 "parsing/parser.mly" +# 3037 "parsing/parser.mly" ( _1 ) -# 52807 "parsing/parser.ml" +# 59639 "parsing/parser.ml" : (Parsetree.pattern)) in { @@ -52880,15 +59712,24 @@ module Tables = struct let _1 = let _6 = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in + let _1 = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 3860 "parsing/parser.mly" + ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in + Typ.package_type ~loc:(make_loc _sloc) ~attrs lid cstrs ) +# 59724 "parsing/parser.ml" + + in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3691 "parsing/parser.mly" - ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in - let descr = Ptyp_package (lid, cstrs) in - mktyp ~loc:_sloc ~attrs descr ) -# 52892 "parsing/parser.ml" +# 3864 "parsing/parser.mly" + ( mktyp ~loc:_sloc (Ptyp_package _1) ) +# 59733 "parsing/parser.ml" in let _3 = @@ -52896,23 +59737,23 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 52902 "parsing/parser.ml" +# 59743 "parsing/parser.ml" in -# 4127 "parsing/parser.mly" +# 4299 "parsing/parser.mly" ( _1, _2 ) -# 52908 "parsing/parser.ml" +# 59749 "parsing/parser.ml" in let _loc__7_ = (_startpos__7_, _endpos__7_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 3013 "parsing/parser.mly" +# 3074 "parsing/parser.mly" ( unclosed "(" _loc__1_ ")" _loc__7_ ) -# 52916 "parsing/parser.ml" +# 59757 "parsing/parser.ml" in let _endpos__1_ = _endpos__7_ in @@ -52920,15 +59761,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1019 "parsing/parser.mly" +# 1007 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 52926 "parsing/parser.ml" +# 59767 "parsing/parser.ml" in ( -# 2976 "parsing/parser.mly" +# 3037 "parsing/parser.mly" ( _1 ) -# 52932 "parsing/parser.ml" +# 59773 "parsing/parser.ml" : (Parsetree.pattern)) in { @@ -52954,23 +59795,23 @@ module Tables = struct let _v = let _1 = let _1 = -# 3015 "parsing/parser.mly" +# 3076 "parsing/parser.mly" ( Ppat_extension _1 ) -# 52960 "parsing/parser.ml" +# 59801 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1019 "parsing/parser.mly" +# 1007 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 52968 "parsing/parser.ml" +# 59809 "parsing/parser.ml" in ( -# 2976 "parsing/parser.mly" +# 3037 "parsing/parser.mly" ( _1 ) -# 52974 "parsing/parser.ml" +# 59815 "parsing/parser.ml" : (Parsetree.pattern)) in { @@ -52990,17 +59831,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 797 "parsing/parser.mly" +# 785 "parsing/parser.mly" (string) -# 52996 "parsing/parser.ml" +# 59837 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4035 "parsing/parser.mly" +# 4206 "parsing/parser.mly" ( _1 ) -# 53004 "parsing/parser.ml" +# 59845 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53019,17 +59860,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 848 "parsing/parser.mly" +# 836 "parsing/parser.mly" (string) -# 53025 "parsing/parser.ml" +# 59866 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4036 "parsing/parser.mly" +# 4207 "parsing/parser.mly" ( _1 ) -# 53033 "parsing/parser.ml" +# 59874 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53052,9 +59893,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4037 "parsing/parser.mly" +# 4208 "parsing/parser.mly" ( "and" ) -# 53058 "parsing/parser.ml" +# 59899 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53077,9 +59918,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4038 "parsing/parser.mly" +# 4209 "parsing/parser.mly" ( "as" ) -# 53083 "parsing/parser.ml" +# 59924 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53102,9 +59943,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4039 "parsing/parser.mly" +# 4210 "parsing/parser.mly" ( "assert" ) -# 53108 "parsing/parser.ml" +# 59949 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53127,9 +59968,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4040 "parsing/parser.mly" +# 4211 "parsing/parser.mly" ( "begin" ) -# 53133 "parsing/parser.ml" +# 59974 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53152,9 +59993,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4041 "parsing/parser.mly" +# 4212 "parsing/parser.mly" ( "class" ) -# 53158 "parsing/parser.ml" +# 59999 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53177,9 +60018,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4042 "parsing/parser.mly" +# 4213 "parsing/parser.mly" ( "constraint" ) -# 53183 "parsing/parser.ml" +# 60024 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53202,9 +60043,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4043 "parsing/parser.mly" +# 4214 "parsing/parser.mly" ( "do" ) -# 53208 "parsing/parser.ml" +# 60049 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53227,9 +60068,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4044 "parsing/parser.mly" +# 4215 "parsing/parser.mly" ( "done" ) -# 53233 "parsing/parser.ml" +# 60074 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53252,9 +60093,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4045 "parsing/parser.mly" +# 4216 "parsing/parser.mly" ( "downto" ) -# 53258 "parsing/parser.ml" +# 60099 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53277,9 +60118,34 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4046 "parsing/parser.mly" +# 4217 "parsing/parser.mly" + ( "effect" ) +# 60124 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (string) = +# 4218 "parsing/parser.mly" ( "else" ) -# 53283 "parsing/parser.ml" +# 60149 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53302,9 +60168,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4047 "parsing/parser.mly" +# 4219 "parsing/parser.mly" ( "end" ) -# 53308 "parsing/parser.ml" +# 60174 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53327,9 +60193,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4048 "parsing/parser.mly" +# 4220 "parsing/parser.mly" ( "exception" ) -# 53333 "parsing/parser.ml" +# 60199 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53352,9 +60218,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4049 "parsing/parser.mly" +# 4221 "parsing/parser.mly" ( "external" ) -# 53358 "parsing/parser.ml" +# 60224 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53377,9 +60243,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4050 "parsing/parser.mly" +# 4222 "parsing/parser.mly" ( "false" ) -# 53383 "parsing/parser.ml" +# 60249 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53402,9 +60268,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4051 "parsing/parser.mly" +# 4223 "parsing/parser.mly" ( "for" ) -# 53408 "parsing/parser.ml" +# 60274 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53427,9 +60293,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4052 "parsing/parser.mly" +# 4224 "parsing/parser.mly" ( "fun" ) -# 53433 "parsing/parser.ml" +# 60299 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53452,9 +60318,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4053 "parsing/parser.mly" +# 4225 "parsing/parser.mly" ( "function" ) -# 53458 "parsing/parser.ml" +# 60324 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53477,9 +60343,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4054 "parsing/parser.mly" +# 4226 "parsing/parser.mly" ( "functor" ) -# 53483 "parsing/parser.ml" +# 60349 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53502,9 +60368,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4055 "parsing/parser.mly" +# 4227 "parsing/parser.mly" ( "if" ) -# 53508 "parsing/parser.ml" +# 60374 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53527,9 +60393,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4056 "parsing/parser.mly" +# 4228 "parsing/parser.mly" ( "in" ) -# 53533 "parsing/parser.ml" +# 60399 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53552,9 +60418,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4057 "parsing/parser.mly" +# 4229 "parsing/parser.mly" ( "include" ) -# 53558 "parsing/parser.ml" +# 60424 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53577,9 +60443,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4058 "parsing/parser.mly" +# 4230 "parsing/parser.mly" ( "inherit" ) -# 53583 "parsing/parser.ml" +# 60449 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53602,9 +60468,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4059 "parsing/parser.mly" +# 4231 "parsing/parser.mly" ( "initializer" ) -# 53608 "parsing/parser.ml" +# 60474 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53627,9 +60493,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4060 "parsing/parser.mly" +# 4232 "parsing/parser.mly" ( "lazy" ) -# 53633 "parsing/parser.ml" +# 60499 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53652,9 +60518,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4061 "parsing/parser.mly" +# 4233 "parsing/parser.mly" ( "let" ) -# 53658 "parsing/parser.ml" +# 60524 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53677,9 +60543,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4062 "parsing/parser.mly" +# 4234 "parsing/parser.mly" ( "match" ) -# 53683 "parsing/parser.ml" +# 60549 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53702,9 +60568,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4063 "parsing/parser.mly" +# 4235 "parsing/parser.mly" ( "method" ) -# 53708 "parsing/parser.ml" +# 60574 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53727,9 +60593,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4064 "parsing/parser.mly" +# 4236 "parsing/parser.mly" ( "module" ) -# 53733 "parsing/parser.ml" +# 60599 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53752,9 +60618,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4065 "parsing/parser.mly" +# 4237 "parsing/parser.mly" ( "mutable" ) -# 53758 "parsing/parser.ml" +# 60624 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53777,9 +60643,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4066 "parsing/parser.mly" +# 4238 "parsing/parser.mly" ( "new" ) -# 53783 "parsing/parser.ml" +# 60649 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53802,9 +60668,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4067 "parsing/parser.mly" +# 4239 "parsing/parser.mly" ( "nonrec" ) -# 53808 "parsing/parser.ml" +# 60674 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53827,9 +60693,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4068 "parsing/parser.mly" +# 4240 "parsing/parser.mly" ( "object" ) -# 53833 "parsing/parser.ml" +# 60699 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53852,9 +60718,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4069 "parsing/parser.mly" +# 4241 "parsing/parser.mly" ( "of" ) -# 53858 "parsing/parser.ml" +# 60724 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53877,9 +60743,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4070 "parsing/parser.mly" +# 4242 "parsing/parser.mly" ( "open" ) -# 53883 "parsing/parser.ml" +# 60749 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53902,9 +60768,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4071 "parsing/parser.mly" +# 4243 "parsing/parser.mly" ( "or" ) -# 53908 "parsing/parser.ml" +# 60774 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53927,9 +60793,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4072 "parsing/parser.mly" +# 4244 "parsing/parser.mly" ( "private" ) -# 53933 "parsing/parser.ml" +# 60799 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53952,9 +60818,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4073 "parsing/parser.mly" +# 4245 "parsing/parser.mly" ( "rec" ) -# 53958 "parsing/parser.ml" +# 60824 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53977,9 +60843,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4074 "parsing/parser.mly" +# 4246 "parsing/parser.mly" ( "sig" ) -# 53983 "parsing/parser.ml" +# 60849 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -54002,9 +60868,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4075 "parsing/parser.mly" +# 4247 "parsing/parser.mly" ( "struct" ) -# 54008 "parsing/parser.ml" +# 60874 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -54027,9 +60893,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4076 "parsing/parser.mly" +# 4248 "parsing/parser.mly" ( "then" ) -# 54033 "parsing/parser.ml" +# 60899 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -54052,9 +60918,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4077 "parsing/parser.mly" +# 4249 "parsing/parser.mly" ( "to" ) -# 54058 "parsing/parser.ml" +# 60924 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -54077,9 +60943,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4078 "parsing/parser.mly" +# 4250 "parsing/parser.mly" ( "true" ) -# 54083 "parsing/parser.ml" +# 60949 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -54102,9 +60968,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4079 "parsing/parser.mly" +# 4251 "parsing/parser.mly" ( "try" ) -# 54108 "parsing/parser.ml" +# 60974 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -54127,9 +60993,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4080 "parsing/parser.mly" +# 4252 "parsing/parser.mly" ( "type" ) -# 54133 "parsing/parser.ml" +# 60999 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -54152,9 +61018,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4081 "parsing/parser.mly" +# 4253 "parsing/parser.mly" ( "val" ) -# 54158 "parsing/parser.ml" +# 61024 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -54177,9 +61043,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4082 "parsing/parser.mly" +# 4254 "parsing/parser.mly" ( "virtual" ) -# 54183 "parsing/parser.ml" +# 61049 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -54202,9 +61068,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4083 "parsing/parser.mly" +# 4255 "parsing/parser.mly" ( "when" ) -# 54208 "parsing/parser.ml" +# 61074 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -54227,9 +61093,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4084 "parsing/parser.mly" +# 4256 "parsing/parser.mly" ( "while" ) -# 54233 "parsing/parser.ml" +# 61099 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -54252,9 +61118,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4085 "parsing/parser.mly" +# 4257 "parsing/parser.mly" ( "with" ) -# 54258 "parsing/parser.ml" +# 61124 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -54277,9 +61143,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.type_exception * string Asttypes.loc option) = -# 3294 "parsing/parser.mly" +# 3417 "parsing/parser.mly" ( _1 ) -# 54283 "parsing/parser.ml" +# 61149 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -54354,18 +61220,18 @@ module Tables = struct let attrs = let _1 = _1_inlined5 in -# 4110 "parsing/parser.mly" +# 4282 "parsing/parser.mly" ( _1 ) -# 54360 "parsing/parser.ml" +# 61226 "parsing/parser.ml" in let _endpos_attrs_ = _endpos__1_inlined5_ in let attrs2 = let _1 = _1_inlined4 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 54369 "parsing/parser.ml" +# 61235 "parsing/parser.ml" in let lid = @@ -54374,9 +61240,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 54380 "parsing/parser.ml" +# 61246 "parsing/parser.ml" in let id = @@ -54385,30 +61251,30 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 54391 "parsing/parser.ml" +# 61257 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 54399 "parsing/parser.ml" +# 61265 "parsing/parser.ml" in let _endpos = _endpos_attrs_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 3303 "parsing/parser.mly" +# 3426 "parsing/parser.mly" ( let loc = make_loc _sloc in let docs = symbol_docs _sloc in - Te.mk_exception ~attrs + Te.mk_exception ~attrs ~loc (Te.rebind id lid ~attrs:(attrs1 @ attrs2) ~loc ~docs) , ext ) -# 54412 "parsing/parser.ml" +# 61278 "parsing/parser.ml" : (Parsetree.type_exception * string Asttypes.loc option)) in { @@ -54439,9 +61305,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.expression) = -# 2777 "parsing/parser.mly" +# 2762 "parsing/parser.mly" ( _2 ) -# 54445 "parsing/parser.ml" +# 61311 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -54489,10 +61355,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2779 "parsing/parser.mly" +# 2764 "parsing/parser.mly" ( ghexp ~loc:_sloc (mkfunction _1 _2 _4) ) -# 54496 "parsing/parser.ml" +# 61362 "parsing/parser.ml" : (Parsetree.expression)) in { @@ -54521,39 +61387,39 @@ module Tables = struct let ys = # 271 "" ( List.flatten xss ) -# 54525 "parsing/parser.ml" +# 61391 "parsing/parser.ml" in let xs = let items = -# 1054 "parsing/parser.mly" +# 1042 "parsing/parser.mly" ( [] ) -# 54531 "parsing/parser.ml" +# 61397 "parsing/parser.ml" in -# 1505 "parsing/parser.mly" +# 1493 "parsing/parser.mly" ( items ) -# 54536 "parsing/parser.ml" +# 61402 "parsing/parser.ml" in # 278 "" ( xs @ ys ) -# 54542 "parsing/parser.ml" +# 61408 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_xss_) in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 976 "parsing/parser.mly" +# 964 "parsing/parser.mly" ( extra_str _startpos _endpos _1 ) -# 54551 "parsing/parser.ml" +# 61417 "parsing/parser.ml" in ( -# 1498 "parsing/parser.mly" +# 1486 "parsing/parser.mly" ( _1 ) -# 54557 "parsing/parser.ml" +# 61423 "parsing/parser.ml" : (Parsetree.structure)) in { @@ -54596,7 +61462,7 @@ module Tables = struct let ys = # 271 "" ( List.flatten xss ) -# 54600 "parsing/parser.ml" +# 61466 "parsing/parser.ml" in let xs = let items = @@ -54604,65 +61470,65 @@ module Tables = struct let _1 = let _1 = let attrs = -# 4110 "parsing/parser.mly" +# 4282 "parsing/parser.mly" ( _1 ) -# 54610 "parsing/parser.ml" +# 61476 "parsing/parser.ml" in -# 1512 "parsing/parser.mly" +# 1500 "parsing/parser.mly" ( mkstrexp e attrs ) -# 54615 "parsing/parser.ml" +# 61481 "parsing/parser.ml" in let _startpos__1_ = _startpos_e_ in let _startpos = _startpos__1_ in -# 988 "parsing/parser.mly" +# 976 "parsing/parser.mly" ( text_str _startpos @ [_1] ) -# 54623 "parsing/parser.ml" +# 61489 "parsing/parser.ml" in let _startpos__1_ = _startpos_e_ in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 1007 "parsing/parser.mly" +# 995 "parsing/parser.mly" ( mark_rhs_docs _startpos _endpos; _1 ) -# 54633 "parsing/parser.ml" +# 61499 "parsing/parser.ml" in -# 1056 "parsing/parser.mly" +# 1044 "parsing/parser.mly" ( x ) -# 54639 "parsing/parser.ml" +# 61505 "parsing/parser.ml" in -# 1505 "parsing/parser.mly" +# 1493 "parsing/parser.mly" ( items ) -# 54645 "parsing/parser.ml" +# 61511 "parsing/parser.ml" in # 278 "" ( xs @ ys ) -# 54651 "parsing/parser.ml" +# 61517 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_e_) in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 976 "parsing/parser.mly" +# 964 "parsing/parser.mly" ( extra_str _startpos _endpos _1 ) -# 54660 "parsing/parser.ml" +# 61526 "parsing/parser.ml" in ( -# 1498 "parsing/parser.mly" +# 1486 "parsing/parser.mly" ( _1 ) -# 54666 "parsing/parser.ml" +# 61532 "parsing/parser.ml" : (Parsetree.structure)) in { @@ -54690,9 +61556,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 1527 "parsing/parser.mly" +# 1515 "parsing/parser.mly" ( val_of_let_bindings ~loc:_sloc _1 ) -# 54696 "parsing/parser.ml" +# 61562 "parsing/parser.ml" : (Parsetree.structure_item)) in { @@ -54728,9 +61594,9 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4110 "parsing/parser.mly" +# 4282 "parsing/parser.mly" ( _1 ) -# 54734 "parsing/parser.ml" +# 61600 "parsing/parser.ml" in let _endpos__2_ = _endpos__1_inlined1_ in @@ -54738,10 +61604,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1530 "parsing/parser.mly" +# 1518 "parsing/parser.mly" ( let docs = symbol_docs _sloc in Pstr_extension (_1, add_docs_attrs docs _2) ) -# 54745 "parsing/parser.ml" +# 61611 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined1_ in @@ -54749,15 +61615,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1023 "parsing/parser.mly" +# 1011 "parsing/parser.mly" ( mkstr ~loc:_sloc _1 ) -# 54755 "parsing/parser.ml" +# 61621 "parsing/parser.ml" in ( -# 1561 "parsing/parser.mly" +# 1549 "parsing/parser.mly" ( _1 ) -# 54761 "parsing/parser.ml" +# 61627 "parsing/parser.ml" : (Parsetree.structure_item)) in { @@ -54783,23 +61649,23 @@ module Tables = struct let _v = let _1 = let _1 = -# 1533 "parsing/parser.mly" +# 1521 "parsing/parser.mly" ( Pstr_attribute _1 ) -# 54789 "parsing/parser.ml" +# 61655 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1023 "parsing/parser.mly" +# 1011 "parsing/parser.mly" ( mkstr ~loc:_sloc _1 ) -# 54797 "parsing/parser.ml" +# 61663 "parsing/parser.ml" in ( -# 1561 "parsing/parser.mly" +# 1549 "parsing/parser.mly" ( _1 ) -# 54803 "parsing/parser.ml" +# 61669 "parsing/parser.ml" : (Parsetree.structure_item)) in { @@ -54825,23 +61691,23 @@ module Tables = struct let _v = let _1 = let _1 = -# 1537 "parsing/parser.mly" +# 1525 "parsing/parser.mly" ( pstr_primitive _1 ) -# 54831 "parsing/parser.ml" +# 61697 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1040 "parsing/parser.mly" +# 1028 "parsing/parser.mly" ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 54839 "parsing/parser.ml" +# 61705 "parsing/parser.ml" in ( -# 1561 "parsing/parser.mly" +# 1549 "parsing/parser.mly" ( _1 ) -# 54845 "parsing/parser.ml" +# 61711 "parsing/parser.ml" : (Parsetree.structure_item)) in { @@ -54867,23 +61733,23 @@ module Tables = struct let _v = let _1 = let _1 = -# 1539 "parsing/parser.mly" +# 1527 "parsing/parser.mly" ( pstr_primitive _1 ) -# 54873 "parsing/parser.ml" +# 61739 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1040 "parsing/parser.mly" +# 1028 "parsing/parser.mly" ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 54881 "parsing/parser.ml" +# 61747 "parsing/parser.ml" in ( -# 1561 "parsing/parser.mly" +# 1549 "parsing/parser.mly" ( _1 ) -# 54887 "parsing/parser.ml" +# 61753 "parsing/parser.ml" : (Parsetree.structure_item)) in { @@ -54920,26 +61786,26 @@ module Tables = struct let _1 = let _1 = let _1 = -# 1236 "parsing/parser.mly" +# 1224 "parsing/parser.mly" ( let (x, b) = a in x, b :: bs ) -# 54926 "parsing/parser.ml" +# 61792 "parsing/parser.ml" in -# 3138 "parsing/parser.mly" +# 3255 "parsing/parser.mly" ( _1 ) -# 54931 "parsing/parser.ml" +# 61797 "parsing/parser.ml" in -# 3121 "parsing/parser.mly" +# 3238 "parsing/parser.mly" ( _1 ) -# 54937 "parsing/parser.ml" +# 61803 "parsing/parser.ml" in -# 1541 "parsing/parser.mly" +# 1529 "parsing/parser.mly" ( pstr_type _1 ) -# 54943 "parsing/parser.ml" +# 61809 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_bs_, _startpos_a_) in @@ -54947,15 +61813,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1040 "parsing/parser.mly" +# 1028 "parsing/parser.mly" ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 54953 "parsing/parser.ml" +# 61819 "parsing/parser.ml" in ( -# 1561 "parsing/parser.mly" +# 1549 "parsing/parser.mly" ( _1 ) -# 54959 "parsing/parser.ml" +# 61825 "parsing/parser.ml" : (Parsetree.structure_item)) in { @@ -55042,16 +61908,16 @@ module Tables = struct let attrs2 = let _1 = _1_inlined3 in -# 4110 "parsing/parser.mly" +# 4282 "parsing/parser.mly" ( _1 ) -# 55048 "parsing/parser.ml" +# 61914 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in let cs = -# 1228 "parsing/parser.mly" +# 1216 "parsing/parser.mly" ( List.rev xs ) -# 55055 "parsing/parser.ml" +# 61921 "parsing/parser.ml" in let tid = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in @@ -55059,46 +61925,47 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 55065 "parsing/parser.ml" +# 61931 "parsing/parser.ml" in let _4 = -# 3955 "parsing/parser.mly" +# 4126 "parsing/parser.mly" ( Recursive ) -# 55071 "parsing/parser.ml" +# 61937 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 55078 "parsing/parser.ml" +# 61944 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3391 "parsing/parser.mly" +# 3514 "parsing/parser.mly" ( let docs = symbol_docs _sloc in let attrs = attrs1 @ attrs2 in - Te.mk tid cs ~params ~priv ~attrs ~docs, + let loc = make_loc _sloc in + Te.mk tid cs ~params ~priv ~attrs ~docs ~loc, ext ) -# 55090 "parsing/parser.ml" +# 61957 "parsing/parser.ml" in -# 3374 "parsing/parser.mly" +# 3497 "parsing/parser.mly" ( _1 ) -# 55096 "parsing/parser.ml" +# 61963 "parsing/parser.ml" in -# 1543 "parsing/parser.mly" +# 1531 "parsing/parser.mly" ( pstr_typext _1 ) -# 55102 "parsing/parser.ml" +# 61969 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined3_ in @@ -55106,15 +61973,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1040 "parsing/parser.mly" +# 1028 "parsing/parser.mly" ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 55112 "parsing/parser.ml" +# 61979 "parsing/parser.ml" in ( -# 1561 "parsing/parser.mly" +# 1549 "parsing/parser.mly" ( _1 ) -# 55118 "parsing/parser.ml" +# 61985 "parsing/parser.ml" : (Parsetree.structure_item)) in { @@ -55208,16 +62075,16 @@ module Tables = struct let attrs2 = let _1 = _1_inlined4 in -# 4110 "parsing/parser.mly" +# 4282 "parsing/parser.mly" ( _1 ) -# 55214 "parsing/parser.ml" +# 62081 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined4_ in let cs = -# 1228 "parsing/parser.mly" +# 1216 "parsing/parser.mly" ( List.rev xs ) -# 55221 "parsing/parser.ml" +# 62088 "parsing/parser.ml" in let tid = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in @@ -55225,9 +62092,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 55231 "parsing/parser.ml" +# 62098 "parsing/parser.ml" in let _4 = @@ -55236,41 +62103,42 @@ module Tables = struct let _startpos = _startpos__1_ in let _loc = (_startpos, _endpos) in -# 3957 "parsing/parser.mly" +# 4128 "parsing/parser.mly" ( not_expecting _loc "nonrec flag" ) -# 55242 "parsing/parser.ml" +# 62109 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 55250 "parsing/parser.ml" +# 62117 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3391 "parsing/parser.mly" +# 3514 "parsing/parser.mly" ( let docs = symbol_docs _sloc in let attrs = attrs1 @ attrs2 in - Te.mk tid cs ~params ~priv ~attrs ~docs, + let loc = make_loc _sloc in + Te.mk tid cs ~params ~priv ~attrs ~docs ~loc, ext ) -# 55262 "parsing/parser.ml" +# 62130 "parsing/parser.ml" in -# 3374 "parsing/parser.mly" +# 3497 "parsing/parser.mly" ( _1 ) -# 55268 "parsing/parser.ml" +# 62136 "parsing/parser.ml" in -# 1543 "parsing/parser.mly" +# 1531 "parsing/parser.mly" ( pstr_typext _1 ) -# 55274 "parsing/parser.ml" +# 62142 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined4_ in @@ -55278,15 +62146,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1040 "parsing/parser.mly" +# 1028 "parsing/parser.mly" ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 55284 "parsing/parser.ml" +# 62152 "parsing/parser.ml" in ( -# 1561 "parsing/parser.mly" +# 1549 "parsing/parser.mly" ( _1 ) -# 55290 "parsing/parser.ml" +# 62158 "parsing/parser.ml" : (Parsetree.structure_item)) in { @@ -55312,23 +62180,23 @@ module Tables = struct let _v = let _1 = let _1 = -# 1545 "parsing/parser.mly" +# 1533 "parsing/parser.mly" ( pstr_exception _1 ) -# 55318 "parsing/parser.ml" +# 62186 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1040 "parsing/parser.mly" +# 1028 "parsing/parser.mly" ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 55326 "parsing/parser.ml" +# 62194 "parsing/parser.ml" in ( -# 1561 "parsing/parser.mly" +# 1549 "parsing/parser.mly" ( _1 ) -# 55332 "parsing/parser.ml" +# 62200 "parsing/parser.ml" : (Parsetree.structure_item)) in { @@ -55393,9 +62261,9 @@ module Tables = struct let attrs2 = let _1 = _1_inlined3 in -# 4110 "parsing/parser.mly" +# 4282 "parsing/parser.mly" ( _1 ) -# 55399 "parsing/parser.ml" +# 62267 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -55405,36 +62273,36 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 55411 "parsing/parser.ml" +# 62279 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 55419 "parsing/parser.ml" +# 62287 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1571 "parsing/parser.mly" +# 1559 "parsing/parser.mly" ( let docs = symbol_docs _sloc in let loc = make_loc _sloc in let attrs = attrs1 @ attrs2 in let body = Mb.mk name body ~attrs ~loc ~docs in Pstr_module body, ext ) -# 55432 "parsing/parser.ml" +# 62300 "parsing/parser.ml" in -# 1547 "parsing/parser.mly" +# 1535 "parsing/parser.mly" ( _1 ) -# 55438 "parsing/parser.ml" +# 62306 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined3_ in @@ -55442,15 +62310,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1040 "parsing/parser.mly" +# 1028 "parsing/parser.mly" ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 55448 "parsing/parser.ml" +# 62316 "parsing/parser.ml" in ( -# 1561 "parsing/parser.mly" +# 1549 "parsing/parser.mly" ( _1 ) -# 55454 "parsing/parser.ml" +# 62322 "parsing/parser.ml" : (Parsetree.structure_item)) in { @@ -55531,9 +62399,9 @@ module Tables = struct let attrs2 = let _1 = _1_inlined3 in -# 4110 "parsing/parser.mly" +# 4282 "parsing/parser.mly" ( _1 ) -# 55537 "parsing/parser.ml" +# 62405 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -55543,24 +62411,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 55549 "parsing/parser.ml" +# 62417 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 55557 "parsing/parser.ml" +# 62425 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1608 "parsing/parser.mly" +# 1596 "parsing/parser.mly" ( let loc = make_loc _sloc in let attrs = attrs1 @ attrs2 in @@ -55568,25 +62436,25 @@ module Tables = struct ext, Mb.mk name body ~attrs ~loc ~docs ) -# 55572 "parsing/parser.ml" +# 62440 "parsing/parser.ml" in -# 1236 "parsing/parser.mly" +# 1224 "parsing/parser.mly" ( let (x, b) = a in x, b :: bs ) -# 55578 "parsing/parser.ml" +# 62446 "parsing/parser.ml" in -# 1596 "parsing/parser.mly" +# 1584 "parsing/parser.mly" ( _1 ) -# 55584 "parsing/parser.ml" +# 62452 "parsing/parser.ml" in -# 1549 "parsing/parser.mly" +# 1537 "parsing/parser.mly" ( pstr_recmodule _1 ) -# 55590 "parsing/parser.ml" +# 62458 "parsing/parser.ml" in let _endpos__1_ = _endpos_bs_ in @@ -55594,15 +62462,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1040 "parsing/parser.mly" +# 1028 "parsing/parser.mly" ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 55600 "parsing/parser.ml" +# 62468 "parsing/parser.ml" in ( -# 1561 "parsing/parser.mly" +# 1549 "parsing/parser.mly" ( _1 ) -# 55606 "parsing/parser.ml" +# 62474 "parsing/parser.ml" : (Parsetree.structure_item)) in { @@ -55628,23 +62496,23 @@ module Tables = struct let _v = let _1 = let _1 = -# 1551 "parsing/parser.mly" +# 1539 "parsing/parser.mly" ( let (body, ext) = _1 in (Pstr_modtype body, ext) ) -# 55634 "parsing/parser.ml" +# 62502 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1040 "parsing/parser.mly" +# 1028 "parsing/parser.mly" ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 55642 "parsing/parser.ml" +# 62510 "parsing/parser.ml" in ( -# 1561 "parsing/parser.mly" +# 1549 "parsing/parser.mly" ( _1 ) -# 55648 "parsing/parser.ml" +# 62516 "parsing/parser.ml" : (Parsetree.structure_item)) in { @@ -55670,23 +62538,23 @@ module Tables = struct let _v = let _1 = let _1 = -# 1553 "parsing/parser.mly" +# 1541 "parsing/parser.mly" ( let (body, ext) = _1 in (Pstr_open body, ext) ) -# 55676 "parsing/parser.ml" +# 62544 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1040 "parsing/parser.mly" +# 1028 "parsing/parser.mly" ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 55684 "parsing/parser.ml" +# 62552 "parsing/parser.ml" in ( -# 1561 "parsing/parser.mly" +# 1549 "parsing/parser.mly" ( _1 ) -# 55690 "parsing/parser.ml" +# 62558 "parsing/parser.ml" : (Parsetree.structure_item)) in { @@ -55757,9 +62625,9 @@ module Tables = struct let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in let body : (Parsetree.class_expr) = Obj.magic body in let _1_inlined2 : ( -# 797 "parsing/parser.mly" +# 785 "parsing/parser.mly" (string) -# 55763 "parsing/parser.ml" +# 62631 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in let virt : (Asttypes.virtual_flag) = Obj.magic virt in @@ -55778,9 +62646,9 @@ module Tables = struct let attrs2 = let _1 = _1_inlined3 in -# 4110 "parsing/parser.mly" +# 4282 "parsing/parser.mly" ( _1 ) -# 55784 "parsing/parser.ml" +# 62652 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -55790,24 +62658,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 55796 "parsing/parser.ml" +# 62664 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 55804 "parsing/parser.ml" +# 62672 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1950 "parsing/parser.mly" +# 1938 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in @@ -55815,25 +62683,25 @@ module Tables = struct ext, Ci.mk id body ~virt ~params ~attrs ~loc ~docs ) -# 55819 "parsing/parser.ml" +# 62687 "parsing/parser.ml" in -# 1236 "parsing/parser.mly" +# 1224 "parsing/parser.mly" ( let (x, b) = a in x, b :: bs ) -# 55825 "parsing/parser.ml" +# 62693 "parsing/parser.ml" in -# 1939 "parsing/parser.mly" +# 1927 "parsing/parser.mly" ( _1 ) -# 55831 "parsing/parser.ml" +# 62699 "parsing/parser.ml" in -# 1555 "parsing/parser.mly" +# 1543 "parsing/parser.mly" ( let (ext, l) = _1 in (Pstr_class l, ext) ) -# 55837 "parsing/parser.ml" +# 62705 "parsing/parser.ml" in let _endpos__1_ = _endpos_bs_ in @@ -55841,15 +62709,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1040 "parsing/parser.mly" +# 1028 "parsing/parser.mly" ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 55847 "parsing/parser.ml" +# 62715 "parsing/parser.ml" in ( -# 1561 "parsing/parser.mly" +# 1549 "parsing/parser.mly" ( _1 ) -# 55853 "parsing/parser.ml" +# 62721 "parsing/parser.ml" : (Parsetree.structure_item)) in { @@ -55875,23 +62743,23 @@ module Tables = struct let _v = let _1 = let _1 = -# 1557 "parsing/parser.mly" +# 1545 "parsing/parser.mly" ( let (ext, l) = _1 in (Pstr_class_type l, ext) ) -# 55881 "parsing/parser.ml" +# 62749 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1040 "parsing/parser.mly" +# 1028 "parsing/parser.mly" ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 55889 "parsing/parser.ml" +# 62757 "parsing/parser.ml" in ( -# 1561 "parsing/parser.mly" +# 1549 "parsing/parser.mly" ( _1 ) -# 55895 "parsing/parser.ml" +# 62763 "parsing/parser.ml" : (Parsetree.structure_item)) in { @@ -55949,38 +62817,38 @@ module Tables = struct let attrs2 = let _1 = _1_inlined2 in -# 4110 "parsing/parser.mly" +# 4282 "parsing/parser.mly" ( _1 ) -# 55955 "parsing/parser.ml" +# 62823 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined2_ in let attrs1 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 55964 "parsing/parser.ml" +# 62832 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1645 "parsing/parser.mly" +# 1633 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in let docs = symbol_docs _sloc in Incl.mk thing ~attrs ~loc ~docs, ext ) -# 55978 "parsing/parser.ml" +# 62846 "parsing/parser.ml" in -# 1559 "parsing/parser.mly" +# 1547 "parsing/parser.mly" ( pstr_include _1 ) -# 55984 "parsing/parser.ml" +# 62852 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined2_ in @@ -55988,15 +62856,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1040 "parsing/parser.mly" +# 1028 "parsing/parser.mly" ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 55994 "parsing/parser.ml" +# 62862 "parsing/parser.ml" in ( -# 1561 "parsing/parser.mly" +# 1549 "parsing/parser.mly" ( _1 ) -# 56000 "parsing/parser.ml" +# 62868 "parsing/parser.ml" : (Parsetree.structure_item)) in { @@ -56020,9 +62888,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4020 "parsing/parser.mly" +# 4191 "parsing/parser.mly" ( "-" ) -# 56026 "parsing/parser.ml" +# 62894 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -56045,9 +62913,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4021 "parsing/parser.mly" +# 4192 "parsing/parser.mly" ( "-." ) -# 56051 "parsing/parser.ml" +# 62919 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -56101,9 +62969,9 @@ module Tables = struct let _5 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 56107 "parsing/parser.ml" +# 62975 "parsing/parser.ml" in let _endpos__5_ = _endpos__1_inlined1_ in @@ -56112,18 +62980,18 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 56116 "parsing/parser.ml" +# 62984 "parsing/parser.ml" in -# 1139 "parsing/parser.mly" +# 1127 "parsing/parser.mly" ( xs ) -# 56121 "parsing/parser.ml" +# 62989 "parsing/parser.ml" in -# 3721 "parsing/parser.mly" +# 3892 "parsing/parser.mly" ( _1 ) -# 56127 "parsing/parser.ml" +# 62995 "parsing/parser.ml" in let _1 = @@ -56131,20 +62999,20 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 56137 "parsing/parser.ml" +# 63005 "parsing/parser.ml" in let _endpos = _endpos__5_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 3707 "parsing/parser.mly" +# 3878 "parsing/parser.mly" ( let info = symbol_info _endpos in let attrs = add_info_attrs info _5 in Rf.tag ~loc:(make_loc _sloc) ~attrs _1 _3 _4 ) -# 56148 "parsing/parser.ml" +# 63016 "parsing/parser.ml" : (Parsetree.row_field)) in { @@ -56178,9 +63046,9 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 56184 "parsing/parser.ml" +# 63052 "parsing/parser.ml" in let _endpos__2_ = _endpos__1_inlined1_ in @@ -56189,20 +63057,20 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 56195 "parsing/parser.ml" +# 63063 "parsing/parser.ml" in let _endpos = _endpos__2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 3711 "parsing/parser.mly" +# 3882 "parsing/parser.mly" ( let info = symbol_info _endpos in let attrs = add_info_attrs info _2 in Rf.tag ~loc:(make_loc _sloc) ~attrs _1 true [] ) -# 56206 "parsing/parser.ml" +# 63074 "parsing/parser.ml" : (Parsetree.row_field)) in { @@ -56236,7 +63104,7 @@ module Tables = struct let arg = # 123 "" ( None ) -# 56240 "parsing/parser.ml" +# 63108 "parsing/parser.ml" in let _endpos_arg_ = _endpos__1_inlined1_ in let dir = @@ -56245,18 +63113,18 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 56251 "parsing/parser.ml" +# 63119 "parsing/parser.ml" in let _endpos = _endpos_arg_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 3918 "parsing/parser.mly" +# 4089 "parsing/parser.mly" ( mk_directive ~loc:_sloc dir arg ) -# 56260 "parsing/parser.ml" +# 63128 "parsing/parser.ml" : (Parsetree.toplevel_phrase)) in { @@ -56288,9 +63156,9 @@ module Tables = struct }; } = _menhir_stack in let _1_inlined2 : ( -# 835 "parsing/parser.mly" +# 823 "parsing/parser.mly" (string * Location.t * string option) -# 56294 "parsing/parser.ml" +# 63162 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in @@ -56302,23 +63170,23 @@ module Tables = struct let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in let x = let _1 = -# 3922 "parsing/parser.mly" +# 4093 "parsing/parser.mly" ( let (s, _, _) = _1 in Pdir_string s ) -# 56308 "parsing/parser.ml" +# 63176 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1045 "parsing/parser.mly" +# 1033 "parsing/parser.mly" ( mk_directive_arg ~loc:_sloc _1 ) -# 56316 "parsing/parser.ml" +# 63184 "parsing/parser.ml" in # 126 "" ( Some x ) -# 56322 "parsing/parser.ml" +# 63190 "parsing/parser.ml" in let _endpos_arg_ = _endpos__1_inlined2_ in @@ -56328,18 +63196,18 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 56334 "parsing/parser.ml" +# 63202 "parsing/parser.ml" in let _endpos = _endpos_arg_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 3918 "parsing/parser.mly" +# 4089 "parsing/parser.mly" ( mk_directive ~loc:_sloc dir arg ) -# 56343 "parsing/parser.ml" +# 63211 "parsing/parser.ml" : (Parsetree.toplevel_phrase)) in { @@ -56371,9 +63239,9 @@ module Tables = struct }; } = _menhir_stack in let _1_inlined2 : ( -# 783 "parsing/parser.mly" +# 771 "parsing/parser.mly" (string * char option) -# 56377 "parsing/parser.ml" +# 63245 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in @@ -56385,23 +63253,23 @@ module Tables = struct let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in let x = let _1 = -# 3923 "parsing/parser.mly" +# 4094 "parsing/parser.mly" ( let (n, m) = _1 in Pdir_int (n ,m) ) -# 56391 "parsing/parser.ml" +# 63259 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1045 "parsing/parser.mly" +# 1033 "parsing/parser.mly" ( mk_directive_arg ~loc:_sloc _1 ) -# 56399 "parsing/parser.ml" +# 63267 "parsing/parser.ml" in # 126 "" ( Some x ) -# 56405 "parsing/parser.ml" +# 63273 "parsing/parser.ml" in let _endpos_arg_ = _endpos__1_inlined2_ in @@ -56411,18 +63279,18 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 56417 "parsing/parser.ml" +# 63285 "parsing/parser.ml" in let _endpos = _endpos_arg_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 3918 "parsing/parser.mly" +# 4089 "parsing/parser.mly" ( mk_directive ~loc:_sloc dir arg ) -# 56426 "parsing/parser.ml" +# 63294 "parsing/parser.ml" : (Parsetree.toplevel_phrase)) in { @@ -56464,23 +63332,23 @@ module Tables = struct let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in let x = let _1 = -# 3924 "parsing/parser.mly" +# 4095 "parsing/parser.mly" ( Pdir_ident _1 ) -# 56470 "parsing/parser.ml" +# 63338 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1045 "parsing/parser.mly" +# 1033 "parsing/parser.mly" ( mk_directive_arg ~loc:_sloc _1 ) -# 56478 "parsing/parser.ml" +# 63346 "parsing/parser.ml" in # 126 "" ( Some x ) -# 56484 "parsing/parser.ml" +# 63352 "parsing/parser.ml" in let _endpos_arg_ = _endpos__1_inlined2_ in @@ -56490,18 +63358,18 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 56496 "parsing/parser.ml" +# 63364 "parsing/parser.ml" in let _endpos = _endpos_arg_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 3918 "parsing/parser.mly" +# 4089 "parsing/parser.mly" ( mk_directive ~loc:_sloc dir arg ) -# 56505 "parsing/parser.ml" +# 63373 "parsing/parser.ml" : (Parsetree.toplevel_phrase)) in { @@ -56543,23 +63411,23 @@ module Tables = struct let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in let x = let _1 = -# 3925 "parsing/parser.mly" +# 4096 "parsing/parser.mly" ( Pdir_ident _1 ) -# 56549 "parsing/parser.ml" +# 63417 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1045 "parsing/parser.mly" +# 1033 "parsing/parser.mly" ( mk_directive_arg ~loc:_sloc _1 ) -# 56557 "parsing/parser.ml" +# 63425 "parsing/parser.ml" in # 126 "" ( Some x ) -# 56563 "parsing/parser.ml" +# 63431 "parsing/parser.ml" in let _endpos_arg_ = _endpos__1_inlined2_ in @@ -56569,18 +63437,18 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 56575 "parsing/parser.ml" +# 63443 "parsing/parser.ml" in let _endpos = _endpos_arg_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 3918 "parsing/parser.mly" +# 4089 "parsing/parser.mly" ( mk_directive ~loc:_sloc dir arg ) -# 56584 "parsing/parser.ml" +# 63452 "parsing/parser.ml" : (Parsetree.toplevel_phrase)) in { @@ -56622,23 +63490,23 @@ module Tables = struct let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined2_, _startpos__1_inlined2_) in let x = let _1 = -# 3926 "parsing/parser.mly" +# 4097 "parsing/parser.mly" ( Pdir_bool false ) -# 56628 "parsing/parser.ml" +# 63496 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1045 "parsing/parser.mly" +# 1033 "parsing/parser.mly" ( mk_directive_arg ~loc:_sloc _1 ) -# 56636 "parsing/parser.ml" +# 63504 "parsing/parser.ml" in # 126 "" ( Some x ) -# 56642 "parsing/parser.ml" +# 63510 "parsing/parser.ml" in let _endpos_arg_ = _endpos__1_inlined2_ in @@ -56648,18 +63516,18 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 56654 "parsing/parser.ml" +# 63522 "parsing/parser.ml" in let _endpos = _endpos_arg_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 3918 "parsing/parser.mly" +# 4089 "parsing/parser.mly" ( mk_directive ~loc:_sloc dir arg ) -# 56663 "parsing/parser.ml" +# 63531 "parsing/parser.ml" : (Parsetree.toplevel_phrase)) in { @@ -56701,23 +63569,23 @@ module Tables = struct let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined2_, _startpos__1_inlined2_) in let x = let _1 = -# 3927 "parsing/parser.mly" +# 4098 "parsing/parser.mly" ( Pdir_bool true ) -# 56707 "parsing/parser.ml" +# 63575 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1045 "parsing/parser.mly" +# 1033 "parsing/parser.mly" ( mk_directive_arg ~loc:_sloc _1 ) -# 56715 "parsing/parser.ml" +# 63583 "parsing/parser.ml" in # 126 "" ( Some x ) -# 56721 "parsing/parser.ml" +# 63589 "parsing/parser.ml" in let _endpos_arg_ = _endpos__1_inlined2_ in @@ -56727,18 +63595,18 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 56733 "parsing/parser.ml" +# 63601 "parsing/parser.ml" in let _endpos = _endpos_arg_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 3918 "parsing/parser.mly" +# 4089 "parsing/parser.mly" ( mk_directive ~loc:_sloc dir arg ) -# 56742 "parsing/parser.ml" +# 63610 "parsing/parser.ml" : (Parsetree.toplevel_phrase)) in { @@ -56780,37 +63648,37 @@ module Tables = struct let _1 = let _1 = let attrs = -# 4110 "parsing/parser.mly" +# 4282 "parsing/parser.mly" ( _1 ) -# 56786 "parsing/parser.ml" +# 63654 "parsing/parser.ml" in -# 1512 "parsing/parser.mly" +# 1500 "parsing/parser.mly" ( mkstrexp e attrs ) -# 56791 "parsing/parser.ml" +# 63659 "parsing/parser.ml" in let _startpos__1_ = _startpos_e_ in let _startpos = _startpos__1_ in -# 988 "parsing/parser.mly" +# 976 "parsing/parser.mly" ( text_str _startpos @ [_1] ) -# 56799 "parsing/parser.ml" +# 63667 "parsing/parser.ml" in let _startpos__1_ = _startpos_e_ in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 976 "parsing/parser.mly" +# 964 "parsing/parser.mly" ( extra_str _startpos _endpos _1 ) -# 56808 "parsing/parser.ml" +# 63676 "parsing/parser.ml" in ( -# 1276 "parsing/parser.mly" +# 1264 "parsing/parser.mly" ( Ptop_def _1 ) -# 56814 "parsing/parser.ml" +# 63682 "parsing/parser.ml" : (Parsetree.toplevel_phrase)) in { @@ -56845,21 +63713,21 @@ module Tables = struct let _1 = # 271 "" ( List.flatten xss ) -# 56849 "parsing/parser.ml" +# 63717 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_xss_) in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 976 "parsing/parser.mly" +# 964 "parsing/parser.mly" ( extra_str _startpos _endpos _1 ) -# 56857 "parsing/parser.ml" +# 63725 "parsing/parser.ml" in ( -# 1280 "parsing/parser.mly" +# 1268 "parsing/parser.mly" ( Ptop_def _1 ) -# 56863 "parsing/parser.ml" +# 63731 "parsing/parser.ml" : (Parsetree.toplevel_phrase)) in { @@ -56890,9 +63758,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.toplevel_phrase) = -# 1284 "parsing/parser.mly" +# 1272 "parsing/parser.mly" ( _1 ) -# 56896 "parsing/parser.ml" +# 63764 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -56915,9 +63783,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.toplevel_phrase) = -# 1287 "parsing/parser.mly" +# 1275 "parsing/parser.mly" ( raise End_of_file ) -# 56921 "parsing/parser.ml" +# 63789 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -56940,9 +63808,9 @@ module Tables = struct let _startpos = _startpos_ty_ in let _endpos = _endpos_ty_ in let _v : (Parsetree.core_type) = -# 3557 "parsing/parser.mly" +# 3716 "parsing/parser.mly" ( ty ) -# 56946 "parsing/parser.ml" +# 63814 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -56954,51 +63822,59 @@ module Tables = struct (fun _menhir_env -> let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { - MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = xs; MenhirLib.EngineTypes.startp = _startpos_xs_; MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = ty; + MenhirLib.EngineTypes.startp = _startpos_ty_; + MenhirLib.EngineTypes.endp = _endpos_ty_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; } = _menhir_stack in - let xs : (Parsetree.core_type list) = Obj.magic xs in + let xs : ((string option * Parsetree.core_type) list) = Obj.magic xs in + let _2 : unit = Obj.magic _2 in + let ty : (Parsetree.core_type) = Obj.magic ty in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_xs_ in + let _startpos = _startpos_ty_ in let _endpos = _endpos_xs_ in let _v = let _1 = - let _1 = - let tys = - let xs = + let ltys = + let xs = # 264 "" ( List.rev xs ) -# 56975 "parsing/parser.ml" - in - -# 1167 "parsing/parser.mly" - ( xs ) -# 56980 "parsing/parser.ml" - - in +# 63856 "parsing/parser.ml" + in -# 3560 "parsing/parser.mly" - ( Ptyp_tuple tys ) -# 56986 "parsing/parser.ml" +# 1127 "parsing/parser.mly" + ( xs ) +# 63861 "parsing/parser.ml" in - let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_xs_) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in -# 1021 "parsing/parser.mly" - ( mktyp ~loc:_sloc _1 ) -# 56996 "parsing/parser.ml" +# 3725 "parsing/parser.mly" + ( ty, ltys ) +# 63867 "parsing/parser.ml" in + let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_ty_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in ( -# 3562 "parsing/parser.mly" - ( _1 ) -# 57002 "parsing/parser.ml" +# 3718 "parsing/parser.mly" + ( let ty, ltys = _1 in + mktyp ~loc:_sloc (Ptyp_tuple ((None, ty) :: ltys)) ) +# 63878 "parsing/parser.ml" : (Parsetree.core_type)) in { @@ -57029,9 +63905,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.type_constraint) = -# 2876 "parsing/parser.mly" +# 2936 "parsing/parser.mly" ( Pconstraint _2 ) -# 57035 "parsing/parser.ml" +# 63911 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -57075,9 +63951,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__4_ in let _v : (Parsetree.type_constraint) = -# 2877 "parsing/parser.mly" +# 2937 "parsing/parser.mly" ( Pcoerce (Some _2, _4) ) -# 57081 "parsing/parser.ml" +# 63957 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -57107,9 +63983,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.type_constraint) = -# 2878 "parsing/parser.mly" +# 2938 "parsing/parser.mly" ( Pcoerce (None, _2) ) -# 57113 "parsing/parser.ml" +# 63989 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -57139,9 +64015,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.type_constraint) = -# 2879 "parsing/parser.mly" +# 2939 "parsing/parser.mly" ( syntax_error() ) -# 57145 "parsing/parser.ml" +# 64021 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -57171,9 +64047,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.type_constraint) = -# 2880 "parsing/parser.mly" +# 2940 "parsing/parser.mly" ( syntax_error() ) -# 57177 "parsing/parser.ml" +# 64053 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -57189,9 +64065,9 @@ module Tables = struct let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in let _endpos = _startpos in let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = -# 3212 "parsing/parser.mly" +# 3329 "parsing/parser.mly" ( (Ptype_abstract, Public, None) ) -# 57195 "parsing/parser.ml" +# 64071 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -57221,9 +64097,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = -# 3214 "parsing/parser.mly" +# 3331 "parsing/parser.mly" ( _2 ) -# 57227 "parsing/parser.ml" +# 64103 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -57246,9 +64122,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3879 "parsing/parser.mly" +# 4050 "parsing/parser.mly" ( _1 ) -# 57252 "parsing/parser.ml" +# 64128 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -57278,9 +64154,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) = -# 3229 "parsing/parser.mly" +# 3346 "parsing/parser.mly" ( _2, _1 ) -# 57284 "parsing/parser.ml" +# 64160 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -57296,9 +64172,9 @@ module Tables = struct let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in let _endpos = _startpos in let _v : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = -# 3222 "parsing/parser.mly" +# 3339 "parsing/parser.mly" ( [] ) -# 57302 "parsing/parser.ml" +# 64178 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -57321,9 +64197,9 @@ module Tables = struct let _startpos = _startpos_p_ in let _endpos = _endpos_p_ in let _v : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = -# 3224 "parsing/parser.mly" +# 3341 "parsing/parser.mly" ( [p] ) -# 57327 "parsing/parser.ml" +# 64203 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -57364,18 +64240,18 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 57368 "parsing/parser.ml" +# 64244 "parsing/parser.ml" in -# 1139 "parsing/parser.mly" +# 1127 "parsing/parser.mly" ( xs ) -# 57373 "parsing/parser.ml" +# 64249 "parsing/parser.ml" in ( -# 3226 "parsing/parser.mly" +# 3343 "parsing/parser.mly" ( ps ) -# 57379 "parsing/parser.ml" +# 64255 "parsing/parser.ml" : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list)) in { @@ -57408,24 +64284,24 @@ module Tables = struct let _v = let _1 = let _1 = -# 3234 "parsing/parser.mly" +# 3351 "parsing/parser.mly" ( Ptyp_var tyvar ) -# 57414 "parsing/parser.ml" +# 64290 "parsing/parser.ml" in let _endpos__1_ = _endpos_tyvar_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1021 "parsing/parser.mly" +# 1009 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 57423 "parsing/parser.ml" +# 64299 "parsing/parser.ml" in ( -# 3237 "parsing/parser.mly" +# 3354 "parsing/parser.mly" ( _1 ) -# 57429 "parsing/parser.ml" +# 64305 "parsing/parser.ml" : (Parsetree.core_type)) in { @@ -57451,23 +64327,23 @@ module Tables = struct let _v = let _1 = let _1 = -# 3236 "parsing/parser.mly" +# 3353 "parsing/parser.mly" ( Ptyp_any ) -# 57457 "parsing/parser.ml" +# 64333 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1021 "parsing/parser.mly" +# 1009 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 57465 "parsing/parser.ml" +# 64341 "parsing/parser.ml" in ( -# 3237 "parsing/parser.mly" +# 3354 "parsing/parser.mly" ( _1 ) -# 57471 "parsing/parser.ml" +# 64347 "parsing/parser.ml" : (Parsetree.core_type)) in { @@ -57484,9 +64360,9 @@ module Tables = struct let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in let _endpos = _startpos in let _v : (Asttypes.variance * Asttypes.injectivity) = -# 3241 "parsing/parser.mly" +# 3358 "parsing/parser.mly" ( NoVariance, NoInjectivity ) -# 57490 "parsing/parser.ml" +# 64366 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -57509,9 +64385,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.variance * Asttypes.injectivity) = -# 3242 "parsing/parser.mly" +# 3359 "parsing/parser.mly" ( Covariant, NoInjectivity ) -# 57515 "parsing/parser.ml" +# 64391 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -57534,9 +64410,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.variance * Asttypes.injectivity) = -# 3243 "parsing/parser.mly" +# 3360 "parsing/parser.mly" ( Contravariant, NoInjectivity ) -# 57540 "parsing/parser.ml" +# 64416 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -57559,9 +64435,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.variance * Asttypes.injectivity) = -# 3244 "parsing/parser.mly" +# 3361 "parsing/parser.mly" ( NoVariance, Injective ) -# 57565 "parsing/parser.ml" +# 64441 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -57591,9 +64467,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.variance * Asttypes.injectivity) = -# 3245 "parsing/parser.mly" +# 3362 "parsing/parser.mly" ( Covariant, Injective ) -# 57597 "parsing/parser.ml" +# 64473 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -57623,9 +64499,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.variance * Asttypes.injectivity) = -# 3245 "parsing/parser.mly" +# 3362 "parsing/parser.mly" ( Covariant, Injective ) -# 57629 "parsing/parser.ml" +# 64505 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -57655,9 +64531,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.variance * Asttypes.injectivity) = -# 3246 "parsing/parser.mly" +# 3363 "parsing/parser.mly" ( Contravariant, Injective ) -# 57661 "parsing/parser.ml" +# 64537 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -57687,9 +64563,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.variance * Asttypes.injectivity) = -# 3246 "parsing/parser.mly" +# 3363 "parsing/parser.mly" ( Contravariant, Injective ) -# 57693 "parsing/parser.ml" +# 64569 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -57708,9 +64584,9 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 775 "parsing/parser.mly" +# 763 "parsing/parser.mly" (string) -# 57714 "parsing/parser.ml" +# 64590 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -57718,11 +64594,15 @@ module Tables = struct let _v = let _loc__1_ = (_startpos__1_, _endpos__1_) in ( -# 3248 "parsing/parser.mly" +# 3365 "parsing/parser.mly" ( if _1 = "+!" then Covariant, Injective else if _1 = "-!" then Contravariant, Injective else + if _1 = "+-" then Bivariant, NoInjectivity else + if _1 = "-+" then Bivariant, NoInjectivity else + if _1 = "+-!" then Bivariant, Injective else + if _1 = "-+!" then Bivariant, Injective else expecting _loc__1_ "type_variance" ) -# 57726 "parsing/parser.ml" +# 64606 "parsing/parser.ml" : (Asttypes.variance * Asttypes.injectivity)) in { @@ -57742,9 +64622,9 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 821 "parsing/parser.mly" +# 809 "parsing/parser.mly" (string) -# 57748 "parsing/parser.ml" +# 64628 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -57752,11 +64632,13 @@ module Tables = struct let _v = let _loc__1_ = (_startpos__1_, _endpos__1_) in ( -# 3252 "parsing/parser.mly" +# 3373 "parsing/parser.mly" ( if _1 = "!+" then Covariant, Injective else if _1 = "!-" then Contravariant, Injective else + if _1 = "!+-" then Bivariant, Injective else + if _1 = "!-+" then Bivariant, Injective else expecting _loc__1_ "type_variance" ) -# 57760 "parsing/parser.ml" +# 64642 "parsing/parser.ml" : (Asttypes.variance * Asttypes.injectivity)) in { @@ -57792,39 +64674,39 @@ module Tables = struct let ys = # 271 "" ( List.flatten xss ) -# 57796 "parsing/parser.ml" +# 64678 "parsing/parser.ml" in let xs = let _1 = -# 1054 "parsing/parser.mly" +# 1042 "parsing/parser.mly" ( [] ) -# 57802 "parsing/parser.ml" +# 64684 "parsing/parser.ml" in -# 1307 "parsing/parser.mly" +# 1295 "parsing/parser.mly" ( _1 ) -# 57807 "parsing/parser.ml" +# 64689 "parsing/parser.ml" in # 278 "" ( xs @ ys ) -# 57813 "parsing/parser.ml" +# 64695 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_xss_) in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 980 "parsing/parser.mly" +# 968 "parsing/parser.mly" ( extra_def _startpos _endpos _1 ) -# 57822 "parsing/parser.ml" +# 64704 "parsing/parser.ml" in ( -# 1300 "parsing/parser.mly" +# 1288 "parsing/parser.mly" ( _1 ) -# 57828 "parsing/parser.ml" +# 64710 "parsing/parser.ml" : (Parsetree.toplevel_phrase list)) in { @@ -57874,7 +64756,7 @@ module Tables = struct let ys = # 271 "" ( List.flatten xss ) -# 57878 "parsing/parser.ml" +# 64760 "parsing/parser.ml" in let xs = let _1 = @@ -57882,61 +64764,61 @@ module Tables = struct let _1 = let _1 = let attrs = -# 4110 "parsing/parser.mly" +# 4282 "parsing/parser.mly" ( _1 ) -# 57888 "parsing/parser.ml" +# 64770 "parsing/parser.ml" in -# 1512 "parsing/parser.mly" +# 1500 "parsing/parser.mly" ( mkstrexp e attrs ) -# 57893 "parsing/parser.ml" +# 64775 "parsing/parser.ml" in -# 998 "parsing/parser.mly" +# 986 "parsing/parser.mly" ( Ptop_def [_1] ) -# 57899 "parsing/parser.ml" +# 64781 "parsing/parser.ml" in let _startpos__1_ = _startpos_e_ in let _startpos = _startpos__1_ in -# 996 "parsing/parser.mly" +# 984 "parsing/parser.mly" ( text_def _startpos @ [_1] ) -# 57907 "parsing/parser.ml" +# 64789 "parsing/parser.ml" in -# 1056 "parsing/parser.mly" +# 1044 "parsing/parser.mly" ( x ) -# 57913 "parsing/parser.ml" +# 64795 "parsing/parser.ml" in -# 1307 "parsing/parser.mly" +# 1295 "parsing/parser.mly" ( _1 ) -# 57919 "parsing/parser.ml" +# 64801 "parsing/parser.ml" in # 278 "" ( xs @ ys ) -# 57925 "parsing/parser.ml" +# 64807 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_e_) in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 980 "parsing/parser.mly" +# 968 "parsing/parser.mly" ( extra_def _startpos _endpos _1 ) -# 57934 "parsing/parser.ml" +# 64816 "parsing/parser.ml" in ( -# 1300 "parsing/parser.mly" +# 1288 "parsing/parser.mly" ( _1 ) -# 57940 "parsing/parser.ml" +# 64822 "parsing/parser.ml" : (Parsetree.toplevel_phrase list)) in { @@ -57974,9 +64856,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Asttypes.label) = -# 3798 "parsing/parser.mly" +# 3969 "parsing/parser.mly" ( _2 ) -# 57980 "parsing/parser.ml" +# 64862 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -58016,9 +64898,9 @@ module Tables = struct let _loc__3_ = (_startpos__3_, _endpos__3_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in ( -# 3799 "parsing/parser.mly" +# 3970 "parsing/parser.mly" ( unclosed "(" _loc__1_ ")" _loc__3_ ) -# 58022 "parsing/parser.ml" +# 64904 "parsing/parser.ml" : (Asttypes.label)) in { @@ -58051,9 +64933,9 @@ module Tables = struct let _v = let _loc__2_ = (_startpos__2_, _endpos__2_) in ( -# 3800 "parsing/parser.mly" +# 3971 "parsing/parser.mly" ( expecting _loc__2_ "operator" ) -# 58057 "parsing/parser.ml" +# 64939 "parsing/parser.ml" : (Asttypes.label)) in { @@ -58093,9 +64975,9 @@ module Tables = struct let _v = let _loc__3_ = (_startpos__3_, _endpos__3_) in ( -# 3801 "parsing/parser.mly" +# 3972 "parsing/parser.mly" ( expecting _loc__3_ "module-expr" ) -# 58099 "parsing/parser.ml" +# 64981 "parsing/parser.ml" : (Asttypes.label)) in { @@ -58115,17 +64997,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 797 "parsing/parser.mly" +# 785 "parsing/parser.mly" (string) -# 58121 "parsing/parser.ml" +# 65003 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = -# 3804 "parsing/parser.mly" +# 3975 "parsing/parser.mly" ( _1 ) -# 58129 "parsing/parser.ml" +# 65011 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -58148,9 +65030,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = -# 3805 "parsing/parser.mly" +# 3976 "parsing/parser.mly" ( _1 ) -# 58154 "parsing/parser.ml" +# 65036 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -58173,9 +65055,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3873 "parsing/parser.mly" +# 4044 "parsing/parser.mly" ( _1 ) -# 58179 "parsing/parser.ml" +# 65061 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -58220,9 +65102,9 @@ module Tables = struct let ty : (Parsetree.core_type) = Obj.magic ty in let _5 : unit = Obj.magic _5 in let _1_inlined1 : ( -# 797 "parsing/parser.mly" +# 785 "parsing/parser.mly" (string) -# 58226 "parsing/parser.ml" +# 65108 "parsing/parser.ml" ) = Obj.magic _1_inlined1 in let mutable_ : (Asttypes.mutable_flag) = Obj.magic mutable_ in let _1 : (Parsetree.attributes) = Obj.magic _1 in @@ -58233,33 +65115,33 @@ module Tables = struct let label = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _1 = -# 3765 "parsing/parser.mly" +# 3936 "parsing/parser.mly" ( _1 ) -# 58239 "parsing/parser.ml" +# 65121 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 58247 "parsing/parser.ml" +# 65129 "parsing/parser.ml" in let attrs = -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 58253 "parsing/parser.ml" +# 65135 "parsing/parser.ml" in let _1 = -# 4013 "parsing/parser.mly" +# 4184 "parsing/parser.mly" ( Fresh ) -# 58258 "parsing/parser.ml" +# 65140 "parsing/parser.ml" in ( -# 2090 "parsing/parser.mly" +# 2078 "parsing/parser.mly" ( (label, mutable_, Cfk_virtual ty), attrs ) -# 58263 "parsing/parser.ml" +# 65145 "parsing/parser.ml" : ((Asttypes.label Asttypes.loc * Asttypes.mutable_flag * Parsetree.class_field_kind) * Parsetree.attributes)) @@ -58307,9 +65189,9 @@ module Tables = struct let _6 : (Parsetree.expression) = Obj.magic _6 in let _5 : unit = Obj.magic _5 in let _1_inlined1 : ( -# 797 "parsing/parser.mly" +# 785 "parsing/parser.mly" (string) -# 58313 "parsing/parser.ml" +# 65195 "parsing/parser.ml" ) = Obj.magic _1_inlined1 in let _3 : (Asttypes.mutable_flag) = Obj.magic _3 in let _1 : (Parsetree.attributes) = Obj.magic _1 in @@ -58320,33 +65202,33 @@ module Tables = struct let _4 = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _1 = -# 3765 "parsing/parser.mly" +# 3936 "parsing/parser.mly" ( _1 ) -# 58326 "parsing/parser.ml" +# 65208 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 58334 "parsing/parser.ml" +# 65216 "parsing/parser.ml" in let _2 = -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 58340 "parsing/parser.ml" +# 65222 "parsing/parser.ml" in let _1 = -# 4016 "parsing/parser.mly" +# 4187 "parsing/parser.mly" ( Fresh ) -# 58345 "parsing/parser.ml" +# 65227 "parsing/parser.ml" in ( -# 2092 "parsing/parser.mly" +# 2080 "parsing/parser.mly" ( (_4, _3, Cfk_concrete (_1, _6)), _2 ) -# 58350 "parsing/parser.ml" +# 65232 "parsing/parser.ml" : ((Asttypes.label Asttypes.loc * Asttypes.mutable_flag * Parsetree.class_field_kind) * Parsetree.attributes)) @@ -58400,9 +65282,9 @@ module Tables = struct let _6 : (Parsetree.expression) = Obj.magic _6 in let _5 : unit = Obj.magic _5 in let _1_inlined2 : ( -# 797 "parsing/parser.mly" +# 785 "parsing/parser.mly" (string) -# 58406 "parsing/parser.ml" +# 65288 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let _3 : (Asttypes.mutable_flag) = Obj.magic _3 in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in @@ -58414,36 +65296,36 @@ module Tables = struct let _4 = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in let _1 = -# 3765 "parsing/parser.mly" +# 3936 "parsing/parser.mly" ( _1 ) -# 58420 "parsing/parser.ml" +# 65302 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 58428 "parsing/parser.ml" +# 65310 "parsing/parser.ml" in let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 58436 "parsing/parser.ml" +# 65318 "parsing/parser.ml" in let _1 = -# 4017 "parsing/parser.mly" +# 4188 "parsing/parser.mly" ( Override ) -# 58442 "parsing/parser.ml" +# 65324 "parsing/parser.ml" in ( -# 2092 "parsing/parser.mly" +# 2080 "parsing/parser.mly" ( (_4, _3, Cfk_concrete (_1, _6)), _2 ) -# 58447 "parsing/parser.ml" +# 65329 "parsing/parser.ml" : ((Asttypes.label Asttypes.loc * Asttypes.mutable_flag * Parsetree.class_field_kind) * Parsetree.attributes)) @@ -58498,9 +65380,9 @@ module Tables = struct let _6 : unit = Obj.magic _6 in let _5 : (Parsetree.type_constraint) = Obj.magic _5 in let _1_inlined1 : ( -# 797 "parsing/parser.mly" +# 785 "parsing/parser.mly" (string) -# 58504 "parsing/parser.ml" +# 65386 "parsing/parser.ml" ) = Obj.magic _1_inlined1 in let _3 : (Asttypes.mutable_flag) = Obj.magic _3 in let _1 : (Parsetree.attributes) = Obj.magic _1 in @@ -58511,30 +65393,30 @@ module Tables = struct let _4 = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _1 = -# 3765 "parsing/parser.mly" +# 3936 "parsing/parser.mly" ( _1 ) -# 58517 "parsing/parser.ml" +# 65399 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 58525 "parsing/parser.ml" +# 65407 "parsing/parser.ml" in let _startpos__4_ = _startpos__1_inlined1_ in let _2 = -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 58532 "parsing/parser.ml" +# 65414 "parsing/parser.ml" in let (_endpos__2_, _startpos__2_) = (_endpos__1_, _startpos__1_) in let _1 = -# 4016 "parsing/parser.mly" +# 4187 "parsing/parser.mly" ( Fresh ) -# 58538 "parsing/parser.ml" +# 65420 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__0_, _endpos__0_) in let _endpos = _endpos__7_ in @@ -58550,11 +65432,11 @@ module Tables = struct _startpos__4_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2095 "parsing/parser.mly" +# 2083 "parsing/parser.mly" ( let e = mkexp_constraint ~loc:_sloc _7 _5 in (_4, _3, Cfk_concrete (_1, e)), _2 ) -# 58558 "parsing/parser.ml" +# 65440 "parsing/parser.ml" : ((Asttypes.label Asttypes.loc * Asttypes.mutable_flag * Parsetree.class_field_kind) * Parsetree.attributes)) @@ -58615,9 +65497,9 @@ module Tables = struct let _6 : unit = Obj.magic _6 in let _5 : (Parsetree.type_constraint) = Obj.magic _5 in let _1_inlined2 : ( -# 797 "parsing/parser.mly" +# 785 "parsing/parser.mly" (string) -# 58621 "parsing/parser.ml" +# 65503 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let _3 : (Asttypes.mutable_flag) = Obj.magic _3 in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in @@ -58629,33 +65511,33 @@ module Tables = struct let _4 = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in let _1 = -# 3765 "parsing/parser.mly" +# 3936 "parsing/parser.mly" ( _1 ) -# 58635 "parsing/parser.ml" +# 65517 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 58643 "parsing/parser.ml" +# 65525 "parsing/parser.ml" in let _startpos__4_ = _startpos__1_inlined2_ in let _2 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 58652 "parsing/parser.ml" +# 65534 "parsing/parser.ml" in let (_endpos__2_, _startpos__2_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in let _1 = -# 4017 "parsing/parser.mly" +# 4188 "parsing/parser.mly" ( Override ) -# 58659 "parsing/parser.ml" +# 65541 "parsing/parser.ml" in let _endpos = _endpos__7_ in let _symbolstartpos = if _startpos__1_ != _endpos__1_ then @@ -58670,11 +65552,11 @@ module Tables = struct _startpos__4_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 2095 "parsing/parser.mly" +# 2083 "parsing/parser.mly" ( let e = mkexp_constraint ~loc:_sloc _7 _5 in (_4, _3, Cfk_concrete (_1, e)), _2 ) -# 58678 "parsing/parser.ml" +# 65560 "parsing/parser.ml" : ((Asttypes.label Asttypes.loc * Asttypes.mutable_flag * Parsetree.class_field_kind) * Parsetree.attributes)) @@ -58745,9 +65627,9 @@ module Tables = struct let attrs2 = let _1 = _1_inlined3 in -# 4110 "parsing/parser.mly" +# 4282 "parsing/parser.mly" ( _1 ) -# 58751 "parsing/parser.ml" +# 65633 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -58757,30 +65639,30 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 58763 "parsing/parser.ml" +# 65645 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 4114 "parsing/parser.mly" +# 4286 "parsing/parser.mly" ( _1 ) -# 58771 "parsing/parser.ml" +# 65653 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 3083 "parsing/parser.mly" +# 3200 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in let docs = symbol_docs _sloc in Val.mk id ty ~attrs ~loc ~docs, ext ) -# 58784 "parsing/parser.ml" +# 65666 "parsing/parser.ml" : (Parsetree.value_description * string Asttypes.loc option)) in { @@ -58797,9 +65679,9 @@ module Tables = struct let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in let _endpos = _startpos in let _v : (Asttypes.virtual_flag) = -# 3977 "parsing/parser.mly" +# 4148 "parsing/parser.mly" ( Concrete ) -# 58803 "parsing/parser.ml" +# 65685 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -58822,9 +65704,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.virtual_flag) = -# 3978 "parsing/parser.mly" +# 4149 "parsing/parser.mly" ( Virtual ) -# 58828 "parsing/parser.ml" +# 65710 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -58847,9 +65729,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.mutable_flag) = -# 4001 "parsing/parser.mly" +# 4172 "parsing/parser.mly" ( Immutable ) -# 58853 "parsing/parser.ml" +# 65735 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -58879,9 +65761,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.mutable_flag) = -# 4002 "parsing/parser.mly" +# 4173 "parsing/parser.mly" ( Mutable ) -# 58885 "parsing/parser.ml" +# 65767 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -58911,9 +65793,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.mutable_flag) = -# 4003 "parsing/parser.mly" +# 4174 "parsing/parser.mly" ( Mutable ) -# 58917 "parsing/parser.ml" +# 65799 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -58936,9 +65818,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.private_flag) = -# 4008 "parsing/parser.mly" +# 4179 "parsing/parser.mly" ( Public ) -# 58942 "parsing/parser.ml" +# 65824 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -58968,9 +65850,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.private_flag) = -# 4009 "parsing/parser.mly" +# 4180 "parsing/parser.mly" ( Private ) -# 58974 "parsing/parser.ml" +# 65856 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -59000,9 +65882,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.private_flag) = -# 4010 "parsing/parser.mly" +# 4181 "parsing/parser.mly" ( Private ) -# 59006 "parsing/parser.ml" +# 65888 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -59065,27 +65947,27 @@ module Tables = struct let xs = # 264 "" ( List.rev xs ) -# 59069 "parsing/parser.ml" +# 65951 "parsing/parser.ml" in -# 1068 "parsing/parser.mly" +# 1056 "parsing/parser.mly" ( xs ) -# 59074 "parsing/parser.ml" +# 65956 "parsing/parser.ml" in -# 3183 "parsing/parser.mly" +# 3300 "parsing/parser.mly" ( _1 ) -# 59080 "parsing/parser.ml" +# 65962 "parsing/parser.ml" in let _endpos__6_ = _endpos_xs_ in let _5 = let _1 = _1_inlined2 in -# 3505 "parsing/parser.mly" +# 3629 "parsing/parser.mly" ( _1 ) -# 59089 "parsing/parser.ml" +# 65971 "parsing/parser.ml" in let _3 = @@ -59094,16 +65976,16 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 59100 "parsing/parser.ml" +# 65982 "parsing/parser.ml" in let _endpos = _endpos__6_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 3424 "parsing/parser.mly" +# 3548 "parsing/parser.mly" ( let lident = loc_last _3 in Pwith_type (_3, @@ -59113,7 +65995,7 @@ module Tables = struct ~manifest:_5 ~priv:_4 ~loc:(make_loc _sloc))) ) -# 59117 "parsing/parser.ml" +# 65999 "parsing/parser.ml" : (Parsetree.with_constraint)) in { @@ -59168,9 +66050,9 @@ module Tables = struct let _5 = let _1 = _1_inlined2 in -# 3505 "parsing/parser.mly" +# 3629 "parsing/parser.mly" ( _1 ) -# 59174 "parsing/parser.ml" +# 66056 "parsing/parser.ml" in let _endpos__5_ = _endpos__1_inlined2_ in @@ -59180,16 +66062,16 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 59186 "parsing/parser.ml" +# 66068 "parsing/parser.ml" in let _endpos = _endpos__5_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in ( -# 3437 "parsing/parser.mly" +# 3561 "parsing/parser.mly" ( let lident = loc_last _3 in Pwith_typesubst (_3, @@ -59197,7 +66079,7 @@ module Tables = struct ~params:_2 ~manifest:_5 ~loc:(make_loc _sloc))) ) -# 59201 "parsing/parser.ml" +# 66083 "parsing/parser.ml" : (Parsetree.with_constraint)) in { @@ -59248,9 +66130,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 59254 "parsing/parser.ml" +# 66136 "parsing/parser.ml" in let _2 = @@ -59259,15 +66141,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 59265 "parsing/parser.ml" +# 66147 "parsing/parser.ml" in ( -# 3445 "parsing/parser.mly" +# 3569 "parsing/parser.mly" ( Pwith_module (_2, _4) ) -# 59271 "parsing/parser.ml" +# 66153 "parsing/parser.ml" : (Parsetree.with_constraint)) in { @@ -59318,9 +66200,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 59324 "parsing/parser.ml" +# 66206 "parsing/parser.ml" in let _2 = @@ -59329,15 +66211,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 59335 "parsing/parser.ml" +# 66217 "parsing/parser.ml" in ( -# 3447 "parsing/parser.mly" +# 3571 "parsing/parser.mly" ( Pwith_modsubst (_2, _4) ) -# 59341 "parsing/parser.ml" +# 66223 "parsing/parser.ml" : (Parsetree.with_constraint)) in { @@ -59395,15 +66277,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 59401 "parsing/parser.ml" +# 66283 "parsing/parser.ml" in ( -# 3449 "parsing/parser.mly" +# 3573 "parsing/parser.mly" ( Pwith_modtype (l, rhs) ) -# 59407 "parsing/parser.ml" +# 66289 "parsing/parser.ml" : (Parsetree.with_constraint)) in { @@ -59461,15 +66343,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 984 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 59467 "parsing/parser.ml" +# 66349 "parsing/parser.ml" in ( -# 3451 "parsing/parser.mly" +# 3575 "parsing/parser.mly" ( Pwith_modtypesubst (l, rhs) ) -# 59473 "parsing/parser.ml" +# 66355 "parsing/parser.ml" : (Parsetree.with_constraint)) in { @@ -59493,9 +66375,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.private_flag) = -# 3454 "parsing/parser.mly" +# 3578 "parsing/parser.mly" ( Public ) -# 59499 "parsing/parser.ml" +# 66381 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -59525,9 +66407,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.private_flag) = -# 3455 "parsing/parser.mly" +# 3579 "parsing/parser.mly" ( Private ) -# 59531 "parsing/parser.ml" +# 66413 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -59555,59 +66437,59 @@ end let use_file = fun lexer lexbuf : (Parsetree.toplevel_phrase list) -> - Obj.magic (MenhirInterpreter.entry `Simplified 2062 lexer lexbuf) + Obj.magic (MenhirInterpreter.entry `Simplified 2282 lexer lexbuf) and toplevel_phrase = fun lexer lexbuf : (Parsetree.toplevel_phrase) -> - Obj.magic (MenhirInterpreter.entry `Simplified 2042 lexer lexbuf) + Obj.magic (MenhirInterpreter.entry `Simplified 2262 lexer lexbuf) and parse_val_longident = fun lexer lexbuf : (Longident.t) -> - Obj.magic (MenhirInterpreter.entry `Simplified 2036 lexer lexbuf) + Obj.magic (MenhirInterpreter.entry `Simplified 2256 lexer lexbuf) and parse_pattern = fun lexer lexbuf : (Parsetree.pattern) -> - Obj.magic (MenhirInterpreter.entry `Simplified 2032 lexer lexbuf) + Obj.magic (MenhirInterpreter.entry `Simplified 2252 lexer lexbuf) and parse_mty_longident = fun lexer lexbuf : (Longident.t) -> - Obj.magic (MenhirInterpreter.entry `Simplified 2028 lexer lexbuf) + Obj.magic (MenhirInterpreter.entry `Simplified 2248 lexer lexbuf) and parse_module_type = fun lexer lexbuf : (Parsetree.module_type) -> - Obj.magic (MenhirInterpreter.entry `Simplified 2024 lexer lexbuf) + Obj.magic (MenhirInterpreter.entry `Simplified 2244 lexer lexbuf) and parse_module_expr = fun lexer lexbuf : (Parsetree.module_expr) -> - Obj.magic (MenhirInterpreter.entry `Simplified 2020 lexer lexbuf) + Obj.magic (MenhirInterpreter.entry `Simplified 2240 lexer lexbuf) and parse_mod_longident = fun lexer lexbuf : (Longident.t) -> - Obj.magic (MenhirInterpreter.entry `Simplified 2016 lexer lexbuf) + Obj.magic (MenhirInterpreter.entry `Simplified 2236 lexer lexbuf) and parse_mod_ext_longident = fun lexer lexbuf : (Longident.t) -> - Obj.magic (MenhirInterpreter.entry `Simplified 2012 lexer lexbuf) + Obj.magic (MenhirInterpreter.entry `Simplified 2232 lexer lexbuf) and parse_expression = fun lexer lexbuf : (Parsetree.expression) -> - Obj.magic (MenhirInterpreter.entry `Simplified 2008 lexer lexbuf) + Obj.magic (MenhirInterpreter.entry `Simplified 2228 lexer lexbuf) and parse_core_type = fun lexer lexbuf : (Parsetree.core_type) -> - Obj.magic (MenhirInterpreter.entry `Simplified 2004 lexer lexbuf) + Obj.magic (MenhirInterpreter.entry `Simplified 2224 lexer lexbuf) and parse_constr_longident = fun lexer lexbuf : (Longident.t) -> - Obj.magic (MenhirInterpreter.entry `Simplified 2000 lexer lexbuf) + Obj.magic (MenhirInterpreter.entry `Simplified 2220 lexer lexbuf) and parse_any_longident = fun lexer lexbuf : (Longident.t) -> - Obj.magic (MenhirInterpreter.entry `Simplified 1982 lexer lexbuf) + Obj.magic (MenhirInterpreter.entry `Simplified 2202 lexer lexbuf) and interface = fun lexer lexbuf : (Parsetree.signature) -> - Obj.magic (MenhirInterpreter.entry `Simplified 1978 lexer lexbuf) + Obj.magic (MenhirInterpreter.entry `Simplified 2198 lexer lexbuf) and implementation = fun lexer lexbuf : (Parsetree.structure) -> @@ -59617,59 +66499,59 @@ module Incremental = struct let use_file = fun initial_position : (Parsetree.toplevel_phrase list) MenhirInterpreter.checkpoint -> - Obj.magic (MenhirInterpreter.start 2062 initial_position) + Obj.magic (MenhirInterpreter.start 2282 initial_position) and toplevel_phrase = fun initial_position : (Parsetree.toplevel_phrase) MenhirInterpreter.checkpoint -> - Obj.magic (MenhirInterpreter.start 2042 initial_position) + Obj.magic (MenhirInterpreter.start 2262 initial_position) and parse_val_longident = fun initial_position : (Longident.t) MenhirInterpreter.checkpoint -> - Obj.magic (MenhirInterpreter.start 2036 initial_position) + Obj.magic (MenhirInterpreter.start 2256 initial_position) and parse_pattern = fun initial_position : (Parsetree.pattern) MenhirInterpreter.checkpoint -> - Obj.magic (MenhirInterpreter.start 2032 initial_position) + Obj.magic (MenhirInterpreter.start 2252 initial_position) and parse_mty_longident = fun initial_position : (Longident.t) MenhirInterpreter.checkpoint -> - Obj.magic (MenhirInterpreter.start 2028 initial_position) + Obj.magic (MenhirInterpreter.start 2248 initial_position) and parse_module_type = fun initial_position : (Parsetree.module_type) MenhirInterpreter.checkpoint -> - Obj.magic (MenhirInterpreter.start 2024 initial_position) + Obj.magic (MenhirInterpreter.start 2244 initial_position) and parse_module_expr = fun initial_position : (Parsetree.module_expr) MenhirInterpreter.checkpoint -> - Obj.magic (MenhirInterpreter.start 2020 initial_position) + Obj.magic (MenhirInterpreter.start 2240 initial_position) and parse_mod_longident = fun initial_position : (Longident.t) MenhirInterpreter.checkpoint -> - Obj.magic (MenhirInterpreter.start 2016 initial_position) + Obj.magic (MenhirInterpreter.start 2236 initial_position) and parse_mod_ext_longident = fun initial_position : (Longident.t) MenhirInterpreter.checkpoint -> - Obj.magic (MenhirInterpreter.start 2012 initial_position) + Obj.magic (MenhirInterpreter.start 2232 initial_position) and parse_expression = fun initial_position : (Parsetree.expression) MenhirInterpreter.checkpoint -> - Obj.magic (MenhirInterpreter.start 2008 initial_position) + Obj.magic (MenhirInterpreter.start 2228 initial_position) and parse_core_type = fun initial_position : (Parsetree.core_type) MenhirInterpreter.checkpoint -> - Obj.magic (MenhirInterpreter.start 2004 initial_position) + Obj.magic (MenhirInterpreter.start 2224 initial_position) and parse_constr_longident = fun initial_position : (Longident.t) MenhirInterpreter.checkpoint -> - Obj.magic (MenhirInterpreter.start 2000 initial_position) + Obj.magic (MenhirInterpreter.start 2220 initial_position) and parse_any_longident = fun initial_position : (Longident.t) MenhirInterpreter.checkpoint -> - Obj.magic (MenhirInterpreter.start 1982 initial_position) + Obj.magic (MenhirInterpreter.start 2202 initial_position) and interface = fun initial_position : (Parsetree.signature) MenhirInterpreter.checkpoint -> - Obj.magic (MenhirInterpreter.start 1978 initial_position) + Obj.magic (MenhirInterpreter.start 2198 initial_position) and implementation = fun initial_position : (Parsetree.structure) MenhirInterpreter.checkpoint -> @@ -59677,7 +66559,7 @@ module Incremental = struct end -# 4152 "parsing/parser.mly" +# 4324 "parsing/parser.mly" -# 59684 "parsing/parser.ml" +# 66566 "parsing/parser.ml" diff --git a/boot/ocamlc b/boot/ocamlc index 852a0ec901686d8fb07b5da30307c4a7bc5454d7..14f2d511611689166cf256127922f87108a32496 100755 GIT binary patch delta 816808 zcmcG%3tUvy7C-Jj=M2o?49+k!&fxGGK>^W(eCG@Dfu$DYv($t%U-^Kv)O-MGH!Dl% zBr6jO%+g8=F4lM}Z_w4st`^+vZ3R7U*42V;4}1Fmu5;$#IC;DG^ZWmP=fmQh{aX9A z_S$Q&z4o3Hr;mw^FTEuqCU@%8X`xaVaZ6{4i*UNA!D=$A_n9&;ej5QN0cQYa(Wz4m zAP$fY7zoG)#l6sO0_R^cTrJpic4LKuxfI6 zscCGAU9E-d)Yz0HDr$2pR3N9@)wYN@s@>&LD6e;qB;6}JGLDL_?h@)%4zHHjlu)l0 zcunZtBSlY>X^x|&sB|FBO-T_JYX7C1Pb&}AJ|>yfqsz=>pW|>*`PdYzdoe26UUlej zHs1V114fZZwfHFMpI(<1{{5Zz_s-@(JbJj}jxNbmJtoDgW?Sr(G&ZGo<=7NOErlcd znhYxyM4QZ1uoJoMwODD`G^gGm!cJn2BUx_%a}+|JPD`T}G)LvH-H-|`D4Zm|ai>z- z7_?Y*l%0lsgT6ug^*)F6-p*FaoQ_7(s==)(JXE*ONLAE1Zot-`&z|j#;-Y)BXW%dA zyT1%`FZk{3*-n%**X1L-D-sP9nV>{jk(8R?QX=hHC%LEz|HNO_{I?R-mM)5$i8DO; zKu#`VwEr&7R>Pvc(k0G4>H^V+Xt`NSK+ePLUU$v~q6|70<*36Y9#dN#iCUXzl}CxY zQ~n`~M@@>UrB~Jqt9l|PE%rP3bJ2jWlLx>xOMs)R+8*sxGo5x@e|8xm>O^No^m#sl zMwBRBskC#XqE((cQNLt0zw0Q(Z2mJkupy$WLYWyp zMXl{>7xUD{u0D{{2VIwmZB+bfBuLLL6!;7S%*69<`ub?{j78E&8#qQ*G&H6}hV4=M-70 z@Fk+b@GbQdbnQp(o>Xpkn|QDak69gia&4=u)ssGS~E^HZHBu7gBb6F{D8Q`5vo`rx29 zQ7og=c*V{{5=$@%UY+vb9)Wj+n$y=QvQVcym-w@el7ij(Y@ zDwrSAyy6S>FKMabZM8Km(SPK}^RsOTbMIIE=^oc3VZQgnO-+|$loX_UO&j2fAz@XV zVr6|rx>K?}&XvZ)?e-KiK6S0#B}Rggdeov;MQzF0O!lTYQ1+oX#jyslrUJ}>0f39t z_FH{a8>1+u-9VJ4<`nuw-wsdl9Ery<>8<)wwqq6Bkp> z-({!TaI001)2|~=ezfeP>bn(1^rzP8ksdm=)nvDE_6C29rJOHipM@z)N1HQW_ULE_ zk^gCzlctY^M8f&l1{;y^j-}%H=|0<#^SqjuI`tyiE;-LXXOZO5ieVcX>aSL83q~In z>b+IO>9HNdL%s2Br{XVVkBuqjT=}yuPtmbBMuz(1J4TD{$PV*%>R56@y(#DGu0br9 zhWg{%tz#J#=G|4tGCI_oDwfE>8jU&6zoV}lV?+J%jdnzp9Ly&=s)X-uI`(m)-jx4D zqR(=f;YDTpyXrmVxZLo=I~EYHrB)ZLwwl$tCjCx(%2k@+23F7y}v+%zT9F!BWb6z)b)iAIkv-kJ$rqUl8=) zt2+8P#Y1XVAJ6bdL;Pz(zITOuKN9l&aLD&gb#(ZI=nxo#@(27?Ov&A4708Tz|X&)&mcaBo7uX-+WrBzQRJQQ=i!nM$OfFDn(xid z0Y-EgUQZ!9N4W~X+?2m30b&4|00XT`;?mw8viFn~HM_6NRTfr^Rd5H|u8-(1)K?bS zEmMOiW>Z~W%$5RpwD2(H#|an&U^h#!45QIl{LG@( z7Qa(XxC>p>54jG;29I+wbfrX=po6?rDEsJ0Dc&E zGBrLI0g2(m7)2dC$x3-koeH%@Ctx9zW>#qPofb1qe+yk%YZHoTHc})}&N4ZXY7@L> zQvuv@Fs+^aN^c$5ddySyE_Kcg0EzD%0Xr`>jeWDE=%DX=YMP zpUlJb3|i-6Ay+*;QlVGgNU#TUExb1^l`?k=g*JXCbk79JxgXqkSTC%7YO~_)_oXRn z=1?pl=a}u3HZLZQ8V-7~URy2M9ks|Uln8fH`zxq;(PT*(66(Ja@$4vxF$xyJ?FeyS z8^mLVpP3v5aVXR?LQ(He#qzGrub7y!?Ns-b*-69NBFz@A61RFiRjf06+$@tY7#+*g z*0rk0!CE56EUu-pd1$S+&8Vj9MJy3NqncZR>BQ3}bERN%zAM>Ynbkva{0_&~RtOli zu5|OgS1DRoyMURwoe99hO2@5c4zr7E)tq6o#ZPL@uo-TS#@vH}MR6{#TXhUiw7K!c ztdfiRGi6PJ(3Cga^&b+f9-g5kh%geUb;AdxhoblqA^hA6Fu1M3t_oDgi1{|A2BY1x z)SC59DwyU%cfOlsrmC7- zD#z^S@x^)YdmgYdCT>+GZmm_R@n3#$j2y*X2rq8ho&e^_oJk>znX0|WPSur?UHv6z zMbvfhX4-kmtVT~6SYLbTaiJz%>7`#14||nw7d1*tIfhjIX5TxsA{a;Of5GmcFKHCG1r%mZgGh@^~F~^O&Y!OA`*+?zHX0+ zn`XB9*tL`NHucejD|}`(X?B{4>mW#Mi2>`IohRn1b+cEB>nW!|cgWPG~L5p~+${9K@+^nP=+L6qe>~xXp-@d@i2WCm%8{s<;Mgp8_s? ztmc78%!$(hTv;A$mvgA&CuF%a8*m1|WA8dDd<2=) z)x))NC3Ny+@h##IvRckl}(g9YT81psU1qnD76)&TpFg%d_?sx zbWS;raBhs85G)7b$3u<%S^DEQuTeM`F2SRW6L0qCMVe6)?$xKcL|dT^8S_@KY#fW% z51g7~Yz|4y!Ul(54luAU4~A=XqSmJ!PBD@SbA?l#`wzSH)6eR)i*5n)e|OO|F`rJq z=k-`d1+grqvfG><+IyvBw{XWX=BvoRxK}EfTfAOM%ITF&<>PvJE$f1z>uA;itaP&< zHkrk6YF%P>YMK;g@?TI*&&WivK&>lwiUsv$i#yBe{z~WzmdzB)sr@EsCR=i>^+`nq zB5D!hbDHM`eYGi~C)pP#StLjiZ7t4!c^kLQxN_*i1za$6!);7V}2=DVLd^?-dh8SKRK1sJzXBnYbhl zO!_g1as|(tT$C3tL*w?SLe}|CD>V$UDfEsNitnU~c)OZ?({U==<4w^@L`6*zirV`% zGi@5-j8>y>jutm)+Jwv}EI@H{CfR#oANhqy-T!?36?(mCw2{uX&|vI-2ElxtZXX0JuL{bl_(?FJvh1>6qSX?ZsBC zcFf`?s@NIfp@uUVn10J#SUa-zJn1d|%GrfEc(vKaE2=aA=RSanvrUjwmMT>JPK4P} z6dH!_Vq>i&{!N9+;27mQ(E}_?S3VqJS4-bkRQoNZ>Mw8GH6fWkrC7T=R8lU&{51lI zI#b~l!WnxbKDi177;-!oSRCmLxRGjB%T5tRzs4zvZY~{Ay#w zrbTX_5$B|$kxZdgU6OjF!jm874~&uD+zusxhfqWj|PTu;sV6+zyjjFFULAAM~ zi;L_(C7WY8d6SWx6XF>NSWb=)JA;6#AnzA!Fexfi>bN*aFrQ90l~Y42_;k_rSi0Dc zJI%CfwQRR=sWJgeN$lv7Y~zOE4q|L8!m*uDv5c6YC}tyntz4B;urpLQU_C^viq^OG4rBcc9BPpBRmBsn-#agAF_hY%x*#Xe}ih>L9IuG zQ`6?aQ=`Qa$~l?jw1tkEkLdKT$%+1bVf>>s%)Njf`z<+~_+gNB!0T z4#eYGhIJ)c-gviz&xB^t66UU_!ggrI=H8HQ_veR&4G8imFYqv4FZuI&JyiLr*=1ss zg0hODobkMWnhW4ud7kEP7l0`wm)eWK-A;71SS^f!lVN}1Ae6HWiyR7_OzC08vZJO5 zEapU#GMd^RFe$Mdld-TcZPbU|Cd#ks?j+Y&wlq4`VzCN0i75^rl{aAfwCy7^rmVI| z#kLkvnc478b|=buFw%#vSJb!?yI7|dU+tkh6SNmaFFK$EDalqRf0m?$m4t4HrvTk?lqsm)9p+D`zOZY18r;EA<~@u`6w$5wc$?^{2I~%x220#bkQu!B~5Y zAKCHjwF$tz@r{GlUm-51g5ntT)0go|efI6AEHu|9T=m%%EkfK0#nw~eF0~o|H$#o} zoVZ(4W|h9=rM&Gngvbo4*gkn1GMO&=(<&O+DtB0P7Q>*LD6!&p2ti|`GQ05uf3bZ|E zRWqM7t0$iVn_d&As4exb`k7CfO?2|#*i5b7Z$6i3Siq|$al8v9tZ%7La*Eq1%LOZd zrUg*3_P;KU@+6ocWFNQK>*v1QU(l|hkQf>!L-EnnIl)?g^p$S~Z5pb#Nqx(!X@X`B zgGMoFg0Rvr*TWDb^XLKk1zu`Vp>prBO=7F+f6b{@9ZMna2*cN^etK+}AcPFX&Y}M` z4^3E#nTmCOl@G_Gb)Q5Z7u^CWuAduM;v!#B_7I<*&}3%?2N3bM&3_ztgM}3vGxbuMj2j$dwAQqRdXe$ zDtQ_{p}5}-bBp%#!+VFhbHdzH!`$n`+>f5`F6s2w^F2Df5$0|Sb4P!3eu2`%++)Jr zv%}mspXct`sndPud0=NF%>6RlbZT`*ob7#lahvn=i7Ni#%=!vGo`36o$WumW|BitF z(qNd;Q+qj8$~O4E1mM^_v-9(BxGmqFJ=+6tIe^-JOZL*tOw8P8)WUx_htGtk84;OP z8R#Csnvdrl-U>AQ<^=tCg=zSuXc!8BA+)PY!rYGpbI3+Y#(G&00~63Qs(8agtGe~H zim_CjDxC3$!cu<(H|NJs3*}TO&H-n`q9lKJF3M4Shqu^e@LOHK3VoYl@`?x9(?jF##a@)QGx!kIWSWwBVu3PM30NlyOcFLKoGeDNpfXwb zAj=(`EQZ4M<76=iuB<6y4PN`Ei18*?zC@E_6YpwFMN$Vf-Y!Nlf|1x@&Ylfxk%p;a zKkdqfAy~^M!O~B~H1P(_U4as;m@XQGP0e}%ilaM)-ND!xcyYp&bx_@%A_GWUk2sPm zVWHCz!`BhRf0vjcsx?_A>6!>LRow;iDjUtZMkH&oxuMSCtGGt1f@8B*ud+Q6{itBG z*vnbWhuKWh-RQMl-@?i*ZzlGWY_#KUk&BmqGip<-d;NMhG!P+i0>fvC@!V$3Tf_z$ zotT6z1uFYN!uoqQa5!jPx!8bUQ6ZdeuH8Za4-D>Ry_T)Bg$EIH5QD4*qQ9tN&GFD4 z-1!RtOaKNkWaFD3t{3}tp_&3QNZU3uXhMrhes6Cl{Zb(E#H}>3P)u{Mu*&(Lmok~& zDHOxpOjbM(ah!8x)ws*jm!@Bbesxh4a;&>;;&4VtYz=Pe4y|4LUQ&b+Kh_@-rf!ZT|e{EBR z8;85?T+-Hp1P`^$Lw$Bq)_k!>tMYl#=-_;DgLs%jbE#+nh9JuO2xJO-e#C^zg(4g7 zoQ2|byc~;G-wnb=o7xlOSJ?Qy(0weYGT=(?(7upG3`hjZ^8 z_{yFPa}F!jl|!vCVYihwUY`gdp(S3SVb*SDD!&d2{UnDBJH&&@SpOc8m3VIBnE-BQ zLutmWSnsZ~xgKYhQCseU?f|YH^G{Av8hmquau+g+HL6(Vbn`lxpO3K)o1=fi0<`t9 zbbTvymRh_N_A57{=y5SA*ilJF%m3m+B{DzHP{frmZL>IIL$hEU9a&J#tI^KkOc+M# zjG$0ICQ&Z&6u=iD<~-xu|&=)}q=7Nu~)8 z2rm-&i-gm}nK-C$Cqms+@c;&NLy>UBvo{yms0@EIGL7+KX$QXNqUH@ur^OiBZpzw@ z=4)FbQW)`SEic=RS}6-xV@M;yVlkBLRiLa#An1E&W|bJ+F;+v$887-$b{V>)U^^BR zEmdM1FxD*>FNjBZtG+LcfNNHO(e0+()23-@ zSiJ1$fvKuMp_vbfak^LB%`oKL1@3l~iNB>7soPfZzlVVF%#v8h%DW-&z8|eru0pJ| z1^AbQFEnA+D%ASu&0;in*Ge!vtVNxuTkTGyuU;vN#N*^xB@*?h<7w5!klw+4(x`To zm`+DQeJqGm(rV#C9Q0)}C2hhM_XrLYVsvDDy+Zi7M6zXBIPL z9*m5WheA?Vw6C!z5}NEq%J1JRam<`B?*U=%!`LedO?DI9OrpGk*a_f8>RzgQQg|%9 zowgWG6V-ej?WCr!qm`1&zSk94p(s9uIK)aVqofbQ9U5L9=3WRl*N(ZVktRJ1$8Rh) zBAiA%LCebnip^R}1+5X%GI)GZtxH+om<%!D= zhUDQLTBd5?r>47Oq4WI|8~MGdY@Os3`_vup+<h z+x&^ihLV@6h0v^K!~|BoC5wsr>k78!NM=hCwdn(|T5yS7OvSMFYF=X6xzFkK%^#Eq z*vIC7)EEEDKI%ssZ^DSmOvF08=_5sKQpMMa;wflTlIy)K{e`Gy0YxqU#)=(XYcPo! zgstXnh4!QMq!fxw{8=~8IftqK9H#vj!t_88Q`+YXB7v#ms~K(wsJH|z2VQ)Z`5Et@ z>BV}c-v9M9SpsTiK4$B22#By1fM3|tVSvbqYtoc!vEQbF73f2wOCQywclEX_o0oib!$LXb= z@VnApFhW*nX~FN$l@_SD2JFY;4FiidQ0pWpxU(a~QLL0~k-+SriIL#nm+B<7y(h@%(8c<<{7^UN&12rsY3>U);q<^KF;n?VI@_pps8Y5Q0!+#bUfg&fGcOK=tAcARu`<-IN?*m^D zjsOslFlp7LGBp|X=n5fv9=+RDTR$`YfZZcj$y%HRB#y|=Ky^29NKjIVq*$ySjTCa= zVyt%H0uy&*oYo`lap=`~)OZo}A(`4s(Kjd+Or!5US6hh4VG z38+yn1QJaYfZ*v94Z5fdPd^r^Fm~lbE};<`^$26hkpv|LXk|Q7y{L=So2ceZG)O}d zSRYrIH4NQJ)IiFeN3BU>i&n*D+F+s0e$m^+x+Ga!X3+^h7K(p^iIl=Uf0+p3ZwfsG|G0!ExLHp2-dy?0L~qhse$VG1y9qQ-a7`I}P^b-C(TiPb|2 z=zLz_V2a2viA{ko(#7XW6iS52J01S_@0o2lu+6h$D~6S2^^Bw$x0(`%-@OS>x$t|ZHJ>j0Yc zL^=7wIgx3I=MxU%serTOqFo6vL_sd%b^xOo3E+pDm}!u!HygmReIzyB2GY0c^u9+@ ztT?k+(}HnTKFSIf{k>f=EknG8R5J-SPo1gm3fXDe3ZI#j^Fsy%mQ=+>!vFmvE|Kk(pTpW^@=v|&^!!&n&9jVZaIrBMJBEi*4K5;guMux4 zzIntZ12~L(U=x7Tay7XJ4EIpVPl#|@xYk;7Y8{l|T*#?9yztEp#VNSd-2vRrJpqg< zv=pIfj8btpwqUenS7^9~lgc)joF*<k5wtf_0ej7rFu>lj zW4+RjRr#e*)HZzzT5tF)7F&!FaeR!|@u3?heN8ydT=f;`kuyX`w~qzK863f8s`quZ zLUmF&Ga|9_A+uuA=!%-7B~R>a$egRleIEfZTHzilK9uaC=VM`n!`veSz|Y@NcpQ~% zi*%})SHq@fDkjAIc-EdWd6BZf;)>_ zUWKlsW;^EKmXC3GbJrM8nu&9crn*5kRPSh#*~Ek&LpfK0$D~#Ht+aoTErkjmNA&W( zkcJu(lDH(TpLa>6{iA$#|3Y*wk74d-t|e0&*VJ%dOYN89pve?eiVJLbbD{SE_+gSV zc)k(NgwTb=fG7xi0cZ_NyF-_}kn(G7$s&pJzqUEmli#EN(s9VTD`gF{Ic+=%@X1D< zvg)>gb`*!~J*Rc-lY|&E0sM>ta8K|^;R0~EwUl_f0Dj7;kv+rl)#1(59zwG9V(2GjZ4!PU8;`x~$bMdr@cyoK*2QZ4| zp`5ee$W4==v+TVs-dx#JQMga_0#WOAPS{q$8CnL33QvLq-G4;3)2W%5Nb>4o182WG z*)9%Kq1~UTeVcfygRIaG(#K(H?~RivNo!!ycfDk0_q{NqFx*arg3D=()vr9 zgriC8xw^Fe@;PZe80Qs33d%$(O7=q@5UKNW1d~#Fj)tHx2Pr{FIgn6ub(vd}P}^R^9>BOuarmyh z+Di8B%t9;NN<5RQF>aZZ69GJ&m`_5A`4^;%&D&sya{N-{GLMSWFu(e!c|A_|RNdDF zT>B+3#$&qCSV0ZeC$DMd8ql7)>~5|ukIRmJMsBOsLa@KQhzN7##caj!8*ZMM1BU4Z3_8TNDPHo_9Pg9 z9@`%i;RFR1-(h#Up9nh=(9FjLsJ%7L1NGXm(Zc8Ii*%uyLkrwg`znisV<6amOU=V# zeBvX@8iU=mW8lNway&C|@wjE5Bga^mv&ZAXAm&R(&^Gvm;x49&F&LgBsBR3#Q!*Pe zIF50NLefNQMiHNe`JRCl5OYKW^ILE;H#gk-HA`^+w_(X1M6}K!(Mt4a3KRnH?MS^a zEZXIilkRl-yTF?{wvmYhcWBLE_Mss`{|x#K3-Nn1 z=*Lr_f#MJ~0>#AoV9>~rpq)X#>=3_-pkGdiUn%@TTm3R}d;dEvZTD3C5 z?kEUGG~RP*M;{ykYq`Pf7#|E;5qwWY!FqXUI?lnm^5GYn{m0nopz=PL#MaRV3F#TJ zBM{+I06#p2F9&ePHc|d~%zDeH%mucn-I_w#QCJ-xrn>Q(=0{u9H)Aahoz_vacKkF7 zw;W)0((mG+(xF%a|HGJU^cXMbCr9&UfxS+^WEotszi~bqOtmm-IHj0r^u%+^`s2D* zp@{x6Q9Kv*CJH$jFsZZpRhMq!Zt~wBiN)r6kt8ZR_7_4+%a0$xgsPRAcW-e(_g0a|h&zm0g5NM|Sw#&SMA`se9drh; zu+5TgC4i+pW?{1dRRDgNhCBS&vZZfe!ba>bqWKEhDy34lO4+7crBv!xDcf|blx@0I ziiSGGDrK8)l>!9kS)~9~^Cqy$N;XOP8`WZ8A5B+0UHlElhdYc?7#WX1mQ=Z%IAqL5 zDcjB&r5G_-tkz>_Mk#NF8KqR}MkySd>v#^IW|XpxG^3Plbj~ORSr|qsC}Yk{aMeoP zBBe6KBBhepBBdij&>RI-gE@+uGvnou!5p-PM=t@@Hr+6#Qa4QDhzo-extH{MXoe}< z*f3=zI=75XK(>dNfNa-IKo9~G5F2+eHv#8SMp>0O2-PqL)byWiLbMeB#U><`k_JOr zn>PoYgS^i(=h&{Bb8KgGjyX7eu22EN%40iQY&;y#*twyZ$hrr=dG(_a8x`IU?QC$M zaO1e`1=bV~1M3IcZ3)>A3$sn-q5-%?bo&hx&+2n1 zYpF}G zEK`C5?3|@XRnXF7mpE{q$)*1Tm`&!DumW6<}iHB5tCrJ>XlLDCbcz z=|9BCe@u&U@KLemk7E?>7SH{M82@uFjeGuEE+_|Z z#~i*m$OFy=>jc|jRMY6LGOD@8?8DVnI7wLWxG+yCL||I5DY)la033NBpcTM<%xs?D zWq{DQAH&UYd5mhK1Guz!bP&16E{8Xx`~<-0J`KJLaPRuA@s&Gr69` zM%OoVcv^a*qYiR8PoN!gI5ocKbSnAqChQ)>4fr>N^w8`Ng}E!?=I-H!+zH@zKB-y# zj5!Xudoi56gyu%!e0%_I90@S_0v15ugjx7}O3eq{&Jm#{*c4{qGb=2KH_UzV-+^nN z61`+P^GL5GSTR5LXVKTj3JESxG9Xtwdae8nOLZzQ^WmVyVjm0$PvXMMRl_Y-+ouTV zC;(MF>vl@7enY?Ql@l!c5i|lQ`cUC(kQCcC_fi6-^m&7K+m`_Qf3D4lhu;&p#wZ+)ED0)WhvU~wtEX&)d>=4Fl z$SG4Q4uD(#o%}DNMhjko66P#52gIa4Zy-94u9t)FX1sai@d#x9zX#p?eVpe(Wz~bR*JJII4FzrhOhI@ zdDD7)8N_k~?@-?GFSw189iaSYg~$CHyru%o0DhQe-%?v|hKcsG!fSd9&gGi3;aQ=i zpMujs@HW0fk)I9;1M>N@kFP9p91V;16*r*u2+1shwjPl!{|*L1Rn#rjqghN?sQEc88o$#7a{KdGsk{~_d>+P?;(PM{ z6(Qk0Yh$Kr)a#Vi^hO7BlW~W95PUO@gmy5eG&=9p1v;2pEVP5!9n!(S3;taPw`~vY z;Lr6A{vn9vBfLZV;0)YGJ^rABzcM-)=L&IOV)~CE$+)pYQT`MXcCK58@H7(|?dOna zT&d8oUqZs(xj;Yvig4~{rbT|Ay+A)l@!Z0JLePURitggmK;w%dAS6l9Er&$U-}h-g z5*TeUgB*uNa#ZN%o3?B+N#a2@6gV(R&$b_ODZb}G9=I`wzK z)clf|Bux~w-lBBX2I^GGc^Ly$4ko-3@6Z-g;5JI5_hVOXoT&gafFB;Hvw-ng7}aQ< z$a{=Nn%QCaB0|E>bz;m_VbLN{*~djU8(*Sqpt_vyenoh?8FGUKLEH^d!FOluKD;6Z z4rIQ`JeVi75&-nL+D&U##N(#nHs*AEJAi>2ZTr`c61!6N5s0#r0~3#6h)U5S5dC*i ziP=K8+JuC76#RC)nsuX(vOo3URNyzg%=9gXvh|Q=6g})1|^ui0d(EvuoQ5WH@n_E%S9oSYa`Uix; zE|hbV_fxcAz>W1E8KIat_f<@>;Wz%+9;Y{Od9dANXRn$m>}l@E>z_6!l>qBtbcIe zA^6JmIn|jn%z>tlVJ#QyL6+RT^HBZycwY?QB4P`_o8$@X`c&+RgymK7SjibEI0cdt zvCw$>Dtk!QK*MQak2ZA!hBOQ(=s}Vc*b~?jx+-b|)H4O+V$1>iFQOm{W`V^KQoXh^ zzBG^?Dg8^PrawvE%Kb2M%j_)0iEV+2ou%;#$e44Yy3ihD5m8wS)^9xuSZrY_PM zFtT$oa2KW#Bk+q|8ZAIFIWbbCIW{R+tvkZ26+pFS*o0q88E8tC;yR1&tiye#pY*AK zu~+k-AU!0lal_zXi4w36kcvzqB~W&WRDx?`NQ{(bTX=!r4UkHX2nkpvaYO+$n2t+t z+FJbR@O&vna$kr>d(pa?C=!ZspAZ@J^puVgT|ucCfLC+G{8_liBq6Q zua`1I>}59_-?j6kRpKI@e6(}y`3nPx7)z^q*)73jW`5a;yI$%Cls25A@chB=F+Y4F;%SQ?MlXN#qW z;d#drX(&!0VLW)$Hn#s=B9&^!(9E@Ms(9HcG6Udo1e3)48E&PHG>P?zDN3IdA&uUZ$I*#EzMjspYa@P$b^0!RW^mX(HP@-h{jl)3%$W@tP?o zM;=2p?G|U{&C>n2LWBn;)!rIXSv z$DgDOO8S$O27K7tf$8R-Fsd~FemKAen(qsjxE=Z8*yrMI7^Jr&f|QlT^j^ ze>B-CW(U&mKnXP*oygx?I0KvS1WUo8D#vDN4K6^tdoxNhLVu0aU)lOAM}J+azeee= z(e%OHAf+)>d=DCXERLc=Qf$E4O3J$j^atZx_8)h?zr8XaMkx*VNQ$^jM+0%5^Bu3h zCg`t;{7Obc%gVj4DS_H8Qc@RjMWFdX>FX$QWuWmf>0c7A0uuW$?DO^4Rr+g^{+g`6 zrs%J!`fHm0ny$aD)?e4?uNnGlrv92m$ihcOh4`I_6UDeh=?mDsWR64K){aT^28wXG zn@h|Ml)VV56mto0U!eAHlB)|GS*af9?sxtnaR9!dG=D=H9Q+PsAD1@CmTN)YEKAh{ zn%|Z>o6$wg`L-6wW)q8M1p(0_kr0KNcc8Xa`XxeKr%ESz#Gk(3ml33Z4ffC5Ly{gG9PcV=z`aQB6!jX-nGagW@ zJqp!jd|jwL&k6goXcIVbq&)ZhymIOtscPOtOu%>f6-w(YufkZb=`8P-mSC}YcS=_( zu*xeiOTB58lLe-fA8qm$p0uLnzLH~0uspok$xXX7aKtVz6WG5W5+lz+v>h=r4$l|S z7f$(gQA{;nxi6Kwb!ya{uJStEc zE8~*Y6||$9e5JT4aJrkED8$VHTbwKlv639|$aEEz#mgCDHSLR+9}>5)X9lfGkTczD zfQY%J4B(lBe;EO1yW?djgFi~ebeJF?vaEwA3)`7`K(!tBIW;B9gB|OGsd+1fQ|*(LIJ5f6AhRumcYsO<$lqGHO3Ybf zuy>f~43rO)*9uWaw!!iYDEMlIpmpvaEN8;HM*BX)-y8Ms=|f~MF3~9-B70)z0u2jO zOhkzQUhic==^i@w4&rd@lRMiSpm^ioF7@Q4y%PLat|09Fxby zwS}(FhxZoxARiQ|&-Qs&$!1NMWwD8+js!q=0F(Z`RD6||;EStxfN(mWcFQw5LyLgz zlu7ap;y#VTRK5cH?EaH62Ab%m$?_m1*f$xWTPb!5#@QAcK1E)m)d07lzks>ax(&w_ zTBc|}vvPV0N(wuPsq%8fbWcMsQouA_{y~WQb^cX5AWjJ+T_YdhOVj-YXwB??U6sn& zXuAg}e>R3Dwz%25Xax>EotTZ*sbY^*Tq~k6Kt@17V5SuX@?h~`U|)d@edZ&*#ww%X+y4FZ{^N^7Kc8`Sk=cW7O}4A9os$gnRJK1IR?hH{%C8s_bTo&1zqV zu$8w^o{nlgwotyo(S#^G#*zUnyM0IT3CYk(Et1!kJO&gT#^~-3qT{l2wI07fSl?jS z6Bh{MG0f@qULedJ4BK~pSU0WwTpv#OWN08wxdCHr5VhVQ_p|T}z>lBAKVZ$9xmYg3 z3ACEUvJ>`$I>$?;9KN*@dbGuIa>ozl=<=~xg6^3~u}eT2Pf^Yi+1H1E(}DYvE6zGd ztsU{r<*0+3IV}sG?EW*B9vX2sE|CL}S;`K|SjH@s(@gbj1t{W@AK->;cOFGbO~KVf})BREtrcFT?Or)Y)4%fZq1lVycA zN|vmUx6pkn<;65%m0Uot+$85=BV1lQg{yZYSY5od>b@H0{(G4FXqfw0nEN$4c#}MX zHde?puV?&khK0Ws=6*ZO{Z5$s-7xoiVea>}{7O!Qd4CY*{xHn_QJA|W%-tI1{y5D2 z$@%U}JAHb-N2kxi-2V)7e;(#ONe)o3n}@3x;0LfylDjyUhOEZCc0uB9oPyuVYWq8m zDLor$roFho)WKtdCul=cxFv9GHOK*c#j%E`N9waiPE9|I82m8rUkKpsZ5|Fhy|bI= z2VP7}p>=Dt>9KJQhS6bqcMWI?rv}yn)fBpVZD`ojYh~Rsy%RYOc$}5%o9j)n7cj9{Y{wr-(l`=wdE?=ACFF>ri56< z%?yz1&5tq3e;4R;uRKGRzQo_s<+C$F_j+MDzCI`M?B`oei&ThXKe~9<(UXN zSP9`~E!|DBPdgjjiE7s25N!j=RtviFST$yQ=vk`4?V2d7MxJAt!WrTjMa3`)q}m!e z33`m?8hI$~nWR`X8zh~1`FEnZw0(ho&^$Cxg4Uym?>8)e4lAjqhnz}a?@qZ~5iB^b1~EKdW?b}1K-u75|*EW8CTNqr{TU;t$QC^LQl)X96uw3mnYnv9IF$FFI-Ry zFTk?i`ivZB+6O<}TK0AZR{c2lM&;?4OeQ=7p<@tDc?Ru;wb?V6lLpc0XCT!MqB{au zZ49Cx19GlrOvbFn58xbdHTMAwb)2O=fEg3wF~1<<9)L7q=$cuY&?HFxFyOeqKvv~2 zTwB!{_wbg&?f3;HHG~zGF0j(RDi%bw7gsJf`~~x6F7Y29<6nqSHB3hNV|lQ$x2qijJpL|MGF_IY{w0A_+b zMH^*Bt<@IiLw!=cBSWz;iRdcC;+L`D>3=ykUrRsC(05mQQ1Rzp41<@^+UB33 zSU-WU9u{Q4TrDd2?u<9HkR$+W0XPh|Z1Bm|>P)OqGFx%BTb=Ls zzcf(j!>DL@RZg)mYvl$5k@j~xEB`K6V^0@9kvPf{jV5LOhM(p=EJG7GHXa%){QM0~ zIIb~X|4}(NhItD&9`i01hr390%Tc*kx;>bf8_rmIF*1(h2o0lSN993|7M- zb+|>|05CaS4R{<7N$pGdmjYgwl^)z`%&nP9y~v%b#eA0ix&x*HDgxVHhq3~>I+{T$ zd#O*eoME~J2k5N0y9+087E*CD7-a8WsrbDYB;brKfQj^Gv;2c86=j;E-;Kfd+EdbT zS+T?hGy94BA1SyeoEPuhorVOE#TS5h_^$HfT7}mg$8xh95}j-OeaGe0pu+#%oAL-LAs8p|0&$YGIK9aJ7SyzUM8Ne9JyHiz>02^S zOt-xy&$o4lw;lNO?*H*Ext}8$UYtcr@ZE!kzb$(lJ>fi`kgk7Q*0;jDk-*%onQf=i z@ONaNwisdl*B!vbsV_#ByaT4+MB5MpujX4|2Hf-x&T5w8R=ik_a-lulG-}7)9v#9~ zy5@}9iP&7oUJ^a{X>vELjK{nyt5nrrvfn#6g&KMZC5LBg{t+GS`wReg<4PP$;{q{F zu^%ecX-4p<8q<#9H-i0C$6y$lbc;8e+F%ZAr5Zo)Pi|4nrk!wuYZc?VAp5JreAyVd znL;=@Kfl5#HZ_Xm&x*J!(F+1g32{ld5_r59NNgzJ?RnB=UQ()0p`Y z)b*LP^&?1Z`>E~_PQAbLkv!Ozbzam$6VE0s5S?RbOp82-%BO)DAAc$WKP%G$5Vuw9J2 zIwO|GY^m%C9Pz832g7yygm@)z>SK8va}nXeA^x?uDslAuXPAzPJ_QrUS?AB>3|l{> zKR3MUK9%RB8}fe-pyla-`DA}Y<2K}Oode)D+>e7kk;zo>8FW@UHpc)&eprknpMdt(QMpy%uc8*aM$pRy-rh~Y#K2VWx5h$W(1<>zvq zWhlaQBDwl=Im5!nQ@Zo+&oM_0hck4J8X?h>Ya+YSFP~%n8`%*z{UjvT><(wyNw9%J zw(Xo$`Gs6y$>|7zn3_nNzL2vmmv;Cye*t~oD4O-9oFR>tXuT-{E6*>XeH}v|d5~t)1_(8kdPN92osjn*@7PY6)|1Q*%JJp3lEb`}|@V}gv zCt1dIvdeK9{0#c$*14SWzmgMe@s z3O{N*!H7xCUqMg9xiY6=vf_SbN?c8aHMq59;_qX!lJ)$U`L>=o@BX#y8gNChWGo@f z2V4dS<)T~$R>bh*2Qa_9GO+Dyd6HzwLt2izfWB*&$&n8y7mPQDnCF;DIIu-i`wdh0 zRrKS(!8WdNwVC9s9HZ!#fK4z_>BhsDeO!;jQKx=e#`zmeo>_92aIX# z2>u}FQo|<@_a;p1=Dm0-@-qe>ckr|@_w+FL)e>EFM(z%p$v-0}TZW;SCM1LAqq~G< z_ZcvnJ1OgU3bYqzuw}wMz&&JW2Tj`}7(VkS7v-V9rAF0W(6qfP$Z7{iXdH3rFXqGehIiJ|s<_73vj| zl$+*Sgq@RD+JD4u+-!Jh86zrJvpaz6f%EM@L8VrJ;Pa)1{GU+k!V7u(;>RE%j}0!` zb-#7XG{>if0nI|>w_4%x%IYc{2Baa0f)`I zU|2kh5JrLKUnok3W5I>I6DjT&U|o3Ou<0DO==Wi$-+&w7%{dws!l%}z@YZ_Hj5jyW zVt6of&?|EA7j*iPP_K}lGm=IGlP(R7N48(Fkv5FVe#K~Ni^lKiPUr#C*L75f-}#{O zxn?`81>1jx#D-tsE&@#-^v1b{gx-!p~ESL2GIVLwBBU;7*8!WHXXc9%UY zw#>0>hvOhh!*8<7vJA!1Mgdh!gh5=}Z`jFzA@Nyogzf=c>gSO}PfhZu*W`(&cc2Y; zJ}U~>DHcF<6p+T){CFAVe1W^fb_r!PG$JF)2Q%G0Tp1_s|NH;zh1(9UZ7PDfbBzbAV-3JQN4& zZlwH3@y)G3Y1K7;L3wl^&_!U~R%O4VlECDa`a!)X=DzYMocH<*>)5^8Wd3Yjer zSURIVxY~M%6_qXIpWVo*$Jw*D0miBaX*>N2Hy6AQfLRg`p9}y$eEcoc?W9(#@`n4S zV3)4fV`+`rlWn)$V}d0@1nuGGPVMMjOl)7_SMS1Vbo03yiHid@(TXhMd6Ho1iMcAb zEYE*D6d2#~Kw}r>N{LM)Vw7au3XWU&+-#c9O%a-LE-i^cORS=1#8d6q46cnqs~KB^ zb}Bs4%L$tb1h0WjI?T(UgmmJzxSME+Q^^Gp@O=!GSAdd@>&ZoD^}O2=q217T@gPV0vAEvM|l@^w60bpkw#N@U_tq7k)^OOLGe%F%22?vQ{fGCAk&r1;f`- z4zwF6=DTim@hGYr3JEo?E3P%muE4s~x&S}+UGPmZwhiHjXcN0C;~`Jw4~xKF`%uX1 z&v#Y4ut@}qp>`7%Ic;50$H|xS&j37x3D@hvz2;*mYj{Lzh(>;vM|oLq6DKu!VbHgp za&UMTg2As|;8^QbvLTqEJ%YidTCk-I+3*}+NcmSo8(8WT%6Tos-0oJI6^revxJ%4K zj7=(TCJx$QB**t?0CzH)OdD4lgJDdzm*T>KNT+rbVL9!HRYt;|1Rd*fk3t}m4yy@_ zsi7%g>88vO*t@9P?Zsu68*nS24>j6CclZ?EHhRpbd_oON(JHXt&DQo+c?Q?;(CIh~ zsI`<6uOw^Tvj`z9#1#Q_{-WJaS{090#D-72vKzzw>IB7S;RUcZwy5=NcL);+N|o)r za#8+g5zfGbMCGIubvtUuT*Mcl-Nw;FJ0mA9`1=27dl$GUi?$Egh5NqQRnT1)1mw5^ zf`ADgGE)=O(((jlS*Zn2npPg5?5qKqsig_6a&@pCDC^PkfE`>dEvW2lK}WR{l$Dj5 zcC>@_{r~sQjmt{!`##_A`}X&no%@<=j@QgwGjq)~Gq`xG#^YxSP{PG!pcznZ=6mu| zk%|lR8v23d_obgyafU*MSD%W)_NPZ|Ko5%zH*Xs0Z$1Doh0j2WQIV~M$Mr|zR-ZZ@ z-z+0Z-QQgP^@B1YXtfkqbi(QLaw+MBe%Mvk_d+{cK`2J{_tFN){)=$|W@d&q0Q#+Y z|FZS>Rb^-`HruJbvfixMQ*rPkZIB%KIV?>omZqaw^J{9h27OS;tLg!|pn&+szI*@$ zPUAJ{?O?p%>Q2u>##naNZEqMhO@5O$oU8CVSBi4b$$Clidr)YpzZ$)0T)LL2N}G30 zQcO)BjVryfJ}B5-Qr!myi;%s2z%~Z@Y^P}dwn3A(uCMl;-nwvUJ=4)CZ^)nHEzMiL0Gib*Bl56~SCsIm(rV1GFK?1rGUxD6c>l zcFexcP-7Z^o&jC7Cqw;Lvk#KIff$1Oddreypi2gx)k`XOMM0Z&Jm|P#pq7JW_}+nt z^(df_}318Agps6OHBj%i5M(4N@mz7uDpiU(<ly$wJs+BNU8|we6y$75a*C;^b@`MKh!ok{`=ETAw1*dENYsei^ayod*HNK}$ z*PaZETd8_}7MBJ1Q98)l$24w)md)AR2r}H>ao7&s)fL+!Bha0d>yZ&!REWoczh)GOti0!r(lV{@(g63`0QZ&vcjuWW{1={i zBA$u>_l5xXBLUwjXPwCAxU)2;rwYX2Kv1phyOr&Q&2i;SDJ#L*`qJ(g`D)L?_|Efz z?2?CN<5}AE>13gt`OQ-{>)YzJC%m3LS}QMl7bw;(y|CV2hhfsIkd!rP{{^rehWPiC z{Q_(&+Cca15;sO09%rTUJ-h`*|2Ho9(r`_0|4pBESN@=tjfbUv}ORRk6hm=PvigM=-&>F{>}+(=hW za7E!r_Cqkth_$p070(fDL*<^MO^UuJz#r41zrV#+h{tU!N+DJ|neHd_DJ10Ek5x+5QIe_A^w61OaeC)O~6vb z_@6U^OG%g!Hbo}<3rt`}2=iyv+({XE!Jm-_{)db_XlA6XUwto)>25q}I{|zeI+KwQ znpaHFo-%n_XBj+E`w+Tqu0m}yo&swu)P_V@?f)?HagCHM3US+fl31k8#EQtADdnH9 zMVVVWtmyqPY=fjU`zdEtR_EI#twq|U5$D5+KNfh2j6YY)K9f$U1HTi>LRp0e#)^sM zr+3b_3Se0MvtUU4Hh0;1t`?IR?1cm62`@*_#hNiqiq6BpHdCu8<=jWqVjf~M(Y zEg@nZypW5q=12Rkn5<=o;MBC#T%?Vlz0Ys^k}lT%!f_K{;#4hFv#pncVr_`o;IQN> z)_%ln;Mx+bP9nW!wP>0D!kx>E@HUuEIIE>ihKKc6YuA_)74wN%^zsXEPig)&+J(x| zd~CL13C<_xPuC^|g!jzXE~}Y=K08f3GcdcvGwqLJgZXWnQ#Q=NEE2-y8CY%%#a$5K zKL!Fj2vT_i~)x zX?i9cTHv!V--(nJvotT0yh6Jl*3K(59%L@N0oP<;S27CUTdo9mP>JRdD$DN;D^vAQNHL&DLlgoo!CRE9Ynv zW&T)*Se@@6;vKJH;do>Y{F`~ZRGgbr{Eu|anyZb9eio#@1||~*b!s-C$E0yCDD$k? z=3%1otW@HbMfy-{ zPlo(gg!3)D4h_OjD-hYY{ss+)HoD5uuhMXu^(L*5!2hLeJPm4>*$dDkuko#4pgkXA zo`y^mTXZr;pygpH3NCspC0X7q*D7pXy|yJ7ODeQU5$s^)Fl0(yWc}UP>!~^e2XCsb zjML;u1=`L1a=b$8tDAFC$*Tk-=_cbVwN%q3!gp;YNQeACeJhv%?4yfND-xT52|{gR z8dSL!Ydi49Lfu?SEp7)d?j~ioYcHa3c}qZAsC{4wvP8@AAGpui0o}R6pF$9BiCKmB zF42bjANJh#Ep$T;E-_mMu4n7ZyRfj6cN^+_!BP}nMVN9S=Hg9DwN+;Ra4T1JBqr<2 zQ0fgn+Z_}&!R=0MvWX6p)+119$8lr4Iq2^s@85|wAJ|FyB0$k{Ej5w6g-s@1+0$Wj zh$hp$RH~P2SAk_5U#|6aY=k#<>`gLog*K@3CJVI5rn017Qt@r5J!Er;{PkmZ+#}Hh zC5}BSG^fdRQUA{;xohsyw2(_X$t}<6-6i2JEjD^RqM!hK6b$(%(;VtM`!4NqEwLUr zva|Q8*n;0^7;7rtM_gWX^H+b3#zy48R46z-3)<#;wF~=@^;2fm&O4fcH7t|eT>!)4 zYSP*nvyUb(>O_;hUMyAyEbj{HZ^Ck+uo%jEABW^%HuPeqmdN-xjBz}g3&U(vpfMf> zPc0luceh>PwnaSIn8@rI8JXs-D%O0nS82F`;y2&%2f(2uWw$=Sw?VW?8cvzm)@Xky z)Jg+G8Q?|Yd_>C?=iU^YUAzG8X3`^Cin)>~@- zwj2(PuYo-It{kkO*5Rhqp|WcohEys^8e+SsM@)N{qP^%073;NGrjIab?5<<#m($&8 zUjGfH%g4}`e#0CQ&c*$7yKlo|+EiP}AiPYIgMH1E4Op>r1K04@Z9}ixfL=OC=4`;o zP1jH<*u|^Oes>%4*W1a4uVI6hV3VdRz$PkA(KK)I!5<_z>m6947@=CtPUs;V`KXJ=KL2G8NcDSR{HeOtsd>{b!L6Bp zV`chrI1~lzCx?ei;Z;!@&KQ<`o#Bp~huFEtZS8Y&vc;05N>O$uv@IkWmxI`P*!3hh zLPh$GC>)krl^X6^4j6S{W{>lXtHiS^JsTI|MraY7u(0!z6ycJ$C(RwfPWS}+ZvpI1 zQt)zEhKoe_1l)s3=fiZ7f-%@apSmc*Uh{qgD7Vg~)tnn+uXzd0uP`Rte)nk*K77VS z_Bd#(ZPatN%iQLBU&8o?G@v;&6AQhyT&+zYUa(naJ#o^1$JXc zx|}lLji{9W*Y)z`|5h)pm&C;2Z0_;p7-tJ#jL;HE6jmE6m^Np!BwQMdT}sM2V$y_YGM^r7X%{%%UMU5bS&rs^lqy zaDm1zcifZHU0k!1-7ZGMk%7NOFe%>VaCZc!?U^td3|Q9;y!KnW9TUV1hh_=`*<KtCsMc596wC#0$@3lQ8`l5pVb2Fg<*5J+_B{G2eV=D(s(M z!|g%r08T|2?u23AWSh-~A+4T(8{Wb?x2rpji4)xuhDBhrCTEZImQ0B8RxQVP`j|(P zmW|qNruO$N$&13K<sX*kN*xJkotOk8!6*%>EQH*4ecjR=pYtT$thj*E`}2uH80 z*FMGwQLr6S*8j$8-Db{JAZA0e;r5r06{TA1pgGq4mA}1-;)T6h626z>HHs{ z|1u7E$JDj4JGPXzVLTivbGDhQosHYD{1__#Wo#Yh4{>DIZ0G?&?lYL4H~Cth(aLQ~ zo3~&t4kF*MLo4+U%u=*D&Rw%p(-JL3D-UX&v&B@HSQxeH8ZSt@LmypqEp9u zphUV;yAYXvZKoC=N6ij4yHPNV#G2X-mE$|LvF802@L{4X>A@hG_8bHA(7hr6d>1Un9u@stm6^~$S_kj)N~qm7uc`)A`OCCQD* zX4s86F^Pd8C5KAU3s{nngvic1EZf5?ux>6r7b9Zr3)r0Z6Sr(T=+W?kwqJIjm~x>H z1ulIBD~Kxot$iMAx@gGxFv3rLFe*))FM%p+5>o9R&QvZ_Y4t%O7RAY&$c3Jkqn~2N zS^rUz7EL@^2>FE-CR?gs()y-n2cS4xXAwARPEa;!guTvVVW~B{uz+fMI2n5deK8c& zzn+Q}x2D@`qA>Gfid$viE^M%`sl{$+#V*V_=XvvPcRQFN5+qydc3~3T&T=t%E9ab+ zCrjN@NQ9QZhU*S1av)M@7=pCSPE?x;f}EBIS#PO^oYdci$;QWLN89^wyv>3Mi@OUdzo-)HzWmp)tg$^OMXzh$ zUB2$%>3WG{qxPr0@S=8&lVhBve-^Q4ljJx_D`X1}RDrS*Oh z0a!w|x0mo;0GmI;y8>`8%h}Bk7^TblX05;cGz%)gc*DnD(nHuWB_*szK`uS-0>YQ)7Lw3{zmO$VX1Q!c*)QSn5Z{oVdc|sO1dTu@1xoq zeuwAM_q9@~@^LTYjjrL6e~KQy^#clBvZd%lZBQJ$3VSCL!X7bBcE=iCd4T#OX$0|5pk+ER2z9b;blC-e70517pt9(L~4hRBY+ zn%xx*5B!}4<1dVBA2gKq?{YxjY9DwVeaQ{`Fq6oZ75lUp7jtBhfH{frJ-ttx7owYt zOt!4#xsmHUc6i_N4OnaOC)z=Ldp_s)r_g~q@r@q&sg@EQNLMmPHl9@aGw4C#u0|{ZvAE zQsHcR`M9|o^jF?N`z`$(#JVRx9#6kM9t*ay3oLTzuw+OZKF5ZC7iso~0*SG$bVF~j zzmKu-ES#t5q-30UzJO?}>NbR${slNr@dXfn7EeUQZuk=gt^Wc8pg&C;uB|xY!iIkh zYkj{KWj@_h~gS~7UMvzFNU&8>6uB8 z$sdILJX((Kv!zP-Aq<>D@dxonAyRhxl%3IK5pBmD==6kfh4LDFNuWn6rdh>5_Lbz_bCob7D3PZKEC}M}n22387 z4MR9W8h7A+`ya55V(oCr$T}vP>~526xeIOorw{Oo!$SDMMMB#X+&I_F=fiNdi0z0r z2m=qaAUJ`M{G@pQ>keI@>em@ptwBdE2hlJkMpyeKUo!Lbf{q}i!|;56k#c*eHw}>`62p)9o@5|dgZ;$~G zf$c5^u+`AmI&{De6(Ounf8dM~GZR?Rhm;#fG%I1eardk49>yo~=$*X5LcOTm5(C_x zQf`4=;vw1cBPzB^p>U5&ipyPIra)4PF%MUTf>>x_9byFbHk|%#5F{;$k|xf0k2z*1DIk2QH8ZcL#;N z9dH-;C)=^|JVwPgAt1h#pm@3l#S;pc&C#k>((K?*e@o~uTD1Atqt*0?Scg{~@PzeL zC@xVR`S{XgPwcn83en6U>o4sh%g0)b|DP;c9SgpMT-xayI=16Me8x= z+N)X%^Fm`9kxQKl**6x|7;tqrTINpK? ztcV)Gka?dL4!^&6H1k35k{~~$=qDh5eWmhOjO@v9o`p?SoT97$74os6^3AVMIJIOP zXG-%ji0M;~Y4+$J@K6K?KN7{lkHppB$rMZ!9n)g+nuFe)cnB~XlSKzMrkcQ5{;{Ov2m2PkluEf{(%7`@i$YnGVC|3zQ;sp&YJr=YtnMH zuElXOX@%K+Bp~-@m@BP9&|6O!X3wh9b?_cYt_J|KC`{h+Q?1+rt75ToJ3qkRoFkI- zyOxB5Ov8TH;x8WpFM&b+{JwolITQr%4}$jsW_V64m=*SdH-h}^_+Fm-UF+_+9q!C_ zH>sSjyB!4zbo#+u1-krTvH~OhU{?j=0a%1BKYrLB6<58CvJA#b{-DBfJrj)kNa3sj zDKOmY3dbn}!(AQ_=T?Q|+!46$?T~8~G7h^Kn!Efi1#&E5JTn90xlZ9YnFvl}y25dw z3C5kLa2#-gaU&FtGY{Y-=1(o6AWu0as{nzSNKv>Hh2wI_B3`({;Zg{c#qs+gKb?C@ z^KpRRC@@t@2<}l}npFO&McEaUZj!;VRe`;TbeBJ(zzmh>r2&bqQn<_xaElbKcL%t6 z3YVpDoQ7KknWk`rNtKze$3{5DDaRaX3_%MVqQE}>HkPHpQ~YI*Q(#{cEVqi6s}i$1 z62ek0t-G3mElxuXq@=yWC!T@<3?1fo+0+{s=UpfbSS zp(4Lk;g&%D8S9==|808?K0OHj>+AOTPlMo>05d688|@V^7Nx5cZkcyWR`U7xDj%Da zy+!#9gWVfGt#N^|R4G4Jm^uZoRW`%Y-_y9{tEW3X2cIMsqj;$GZ{9Ctu7T;L8iw|L zQhiodO!*TE+^Xz%mHj^Kz-X@i!XFLG!sx#Ksy!Wc2f^C`TcaBNuLI1v9+RF7qi9mz zsR{_r4ucS#u7r`RszDK!}@%;Sd zS^h}603eb%qkV<4XT!E4c?(NqW`Ov8%AJus33thzlor+XLFLL-M$MPRwkU9C1bWML;Dy}o^-aS`kdJD7c<;#I*BG)RLO^EOf%3h%C zrOIaaAl~w4)v(pF?^5{1%C_(o3cg3#WBqnyrxxYFi9RE4_1dyy$}IwKQLYy%`zd8x zw0ly)7c1LpSsbz$+Y`#R{Qsa}tH=DT;HkdBT%Kli{w<&vnI~dI7OXaXc*C#?7+%^SGijW98$0-+afWUD=A@-_<AR?LqJ}3XW0!)0EvnX3vN+mBWk5V{Zk&tYC^B z>F+fK=PG!&f(I)29R&|oaFc?$mC5k$Dfn~+f5^dxh%=PKXUf9>1zS~PMPRiRD}n>c z|1jm>!cSIkAfCfCtA;-}%%?De$;aOIMLYC2bZGIlcGdf8E^10d!QBIM8q9A#k6X`% zN}r66(KAAtL*%*cdN1Fa7=4xoowvFKJzH`U^iu!#{g%_LM9V4LrzPoWA+~p< z+e0;9Q@Xw(1RfS<>SJvm2$W8t#k~Rd*neoog1u(!Kh++_UQTRpJ=3; zqAdMwyk`rY$avdF0$1!}$7WztAX|4vd<;I$`Q9h6Bg~Ca8y*bh{bwmT*y*m%)^j61 zBTki|Ne*QrgDq`-pr+{Cn4@nFb+y7<61*J88L;dwTZH_N3kG{%*`VxoZt2Wp*9OQ6(ZNZY55*F_(%-3HsWX<73XpGNtXug!u z`kNsX+lTv(ovm-M*$&7fWA!g=-}sh|(}#xy_36N##c ztG1iFW~x5Gao7qc!=~z2*}nE~&6$^VHBHs|a%2e}=%SuH)Kuw!M;xZ`0 zjKsSGbp2V1rs?O|zL$bakm`&8n^_jrQl61_iq zh|3-4_O;N1?MJgcnlI4A7VBw!enKAE=r4h>_BRL*g!wrLcfJ(;guM*s8`#0Enx|c4|vQ1X&b5|bob}j2@fBa8ueF8PLVd1nzt(UQ6pPmJ%#b$YQ)cOVMf z$~eNFEc0&wZyPEP+@Rka-5JiDKVJ&NTRX`)9%N+yhL7DhLTk=cPl_>XGWRB33lIoa z*5L{yKKmjqKSw%ircq zF;EoWtlLAvL%o-j^hjjmu(()<-uw2U(ymoo@NE)^F$M-Zk;3ttQQ0eTtF+k(s~6}K z0ktkb!y7F#7V0BUWlJKB1A{Y@%!$d0VRH$R0i(mP8+HwqPZ#Q0xNYBYi=N6mn){UN z{_|h-nhHbK+rF$N<$9{#4VlmP9<6kH^Kq+0ZMj~7z@7?|H5B-*k_rsM&QQ6dLhl)Q zE26mo#!A^0D$iBuNz~3*0dMY5F)Hwb*4^(r27xQ} z?r~fXastp3hRrG#!OWt{p-MeDBra6C-m3SC>k$wey~VeAE7+ZeQTtYm|G2I1R*cF` za{N{d!A;U<5r&2YCWnqX0GA2RUWD|Uq;ioSlb47HNa}nT{upUeP$J1zBEaF*p@-2o z>Th=1Yo_Aqh69VpF9(UfSWk}Ql!=kC5d4vKu@Hk~*kV1#Y;PO}Sx(a#-aAR zI>3%97VGwC&fgMYtT_DPA6Se@3=V)J6||M#7K33Al0LVi$$)9xj?&^8i`#WCpt2?U zWW{t`^RWHxoQN~!H@NY#Bh-$T>TXj(4)L2Ec(zK2nf51CuvGUyZezoJw>@#NAi<`Y zH%7Ge0(p9=-ghvwX|=1imJPQaFdi5yM*6ed$YJl2#ARrnO;WH-A3Z*}q2B@@Y+6Y$ zB#zYq+7gFj;5WM?VdfoEJfH4P4@~f%GZAqIng+)8m3qwJ6jbj?T>}wX#WM#6B+QHr zf#J{0m_NAZzX;9_%b!1ZB~$N-;8($^UB?96QR$8!Bs>|U}T5A{_iOIn# zG+@5D7Ss&K-(~jhg?H&Ow!l^eZJ7ynd(BF4e_X9yjy!_IH${)n+}p?miLb z&0nGGRC>2Qn;~unKRYrCCv|c$vuTk~dyQAm0iusrpB&K_QLzd6qpJ3rQEl;pQ~22c zIK@#f_~IamSfvkVm9H|PD^}_L=LoD$ZSpiRS;?QP!*H?jxfo>ktkT2HnGAbadrtKm z5@7yyt>c@wVX2YCj{@zu!YsghWuznd^f`8`e9 zgOz`9nI>C*8*bOYV`>8e{p7oeIY*?eO^AvzwGl9PYhIM}p49Q5= zPf|C@(Hk>ke9pO9v7xejCT`wj8-<`0tFZNwv=SuY{SEyj&afu7cwr6 z{hq`a3^M`=vM#CSb(wfBw!2Mz{!^v$VRYX6rS)NbiEAW0aY;ZT_@6Jxi-orT^0k-( zb9RHrt92+sHm%i9ix>sJRtNiC3LepuBhEb8>8y56a~{!Ou?-g6KS3I=(N&zgXKM?8H7C%=C9@AqS zLshir`9ac&sZ8>NE(Ml#@+YDK6{gj}kAmBFdV_b-V2%KPrXa7n|RX z7!`PmAC*tkR6mL%EmNK52TxZZ-l1j|Sv$mD>Id0U2o{@!aAYa4#1G~u@L#59agI#( z=j}2)Zip;T_xtLte9iEKnF_@H1)!}=-H5Esl*)|=Fw5_Qi&7?fg$dR?mFkc6N`ET# zXGHnotNd`&PzBHSXBnN$3_ZsWdK5SpcXcC)c~XaBwq3Z%WJ=K*@Zj2d-EBIvv(mZD zbS`)l+n7np>1y$?D)8Ka|EKH|CP#Lm9ndqeYdi`%3c+UnHBpLIVl6K zR)`v93v4UWd+<%aZ1Yya_bPw)Df@oqr@O4*1kq^ICQ#@KY2KvA_gIZ`kMhu~8->ss$Rg?mWZ4=a1EvL8|QqcVQ89^)Zz><`1zTm)l>Aw&KTy!i)s z^Mw043sfiE3nO~iZ9}B!D`>5o2i!|z!?YReRoss$`*CG&Q1(V;Z&LPVW!Ecvi?W|k z_LH!$KxSwxl0GHX^?LtuQvPY6S^QowfnzgU63ejlAMjli-q!*CeBi=hNEgzC@oa-X z!gMFRJrv2(0q&;5Gx)%B&6{mYWXu#TU!1spQA%%gPx7W@Ws0*Umd~TMo|!coPs3&9 zauY7<47OWx>zjgRJ2}*ig}XIybF_8C&4O)!U-?7McvA0S-Va6sq`=U|C{ho-pWDjXbbc^XUad!@*Y*Ik`kb-Ovr;-tg3;C;c)S<)N>-S`Dt^|YX6 z#Kx`Qvs{O=ZEz-{)*o0)VlMs7Rz0~lvBa<`^Lrj_j@}kbj@lM#Y{U-an61NXO;U6x zG{%Zukkz()n~v3tPcLk{OM0g`wwa5V!P_8*F-0I!vJH<(J|{=F=@}<2kDf=&DxvMB zgk#!vtPL9E-tCxe;^Lm|m;{WLz1z(N_VMld_m0N45Y3&z$Wzwi2pFD{c-CA840~3O zH$??_VS0C0oKC(B*G8?B%4Z=0cmV<9WyLyhgqCOZG3Jp~+_f?u!p{61m6=U{as89-f>br- zdHq1dtB9JtbT=v-2W+}y_{mRjLWmq11#x^oL-XY~U}1@84vQM~nK+uTy-^?3*2EY) zZboTD>~A2Vu40=A(Rkqtkn^y%DHutGv6|hzGUo;TI~*^#=tX_3`3e}l{0pBMt>Ug_$mK^#@AEa-DzX;!!UHbhtR}(xk18<}EuZEq9 z@gJK^{_{bnU{9o>I!yCby`txG9}0I}CvW5J7yUAGgA9sxqfzMkcY8+p za^KWv>E;b2oupAmx2tc4yiFZUWimI);CGbFyY1EqNP*wMXf#N+zk^mf$k+Og{%-@f zK2`1oy_#g$K1>hyK}g)>!{@t5+voZiT>z-MPmraRzM@a{a%QRdv$iZ99T^hub>52| zIt|Z^PHlmRLEc=H>GW2;sA0zI`78vd!9IfYp`jr$O^V-$)4-q_8xnCkq6lXfOP|J@ zZnuIY7r=x`Q8g~BO1U1JP4#s+2sYr45U2Om7sI_3PeXj+g&4afJO= z(r!+0%7yQyp-Ig_Y-!~^aB%345Uni-<37#6M&P*+nK;Meuj!sx&Ag9?5tGMv6VJ_f zQ6|@x0Uxc{Y)Zj3ND{sRCypvsI-Z543lWfptSb$sh(?MW zX}FR!O^@nhu{JVA4jNWFnuBk)Sh|tNG5lO9+V29JIFFY?;^G)@(;mFhSb|Pc(VYV2 zhfxnmxloE911mBx*mvJbx z*5z?}3;zX){?^!VZ|Sqx>deG#2S=(i?B0qgczLNZBT8~#aNE846LHF>$-tXS1-PkY z&$i4cDI9^o^**~`o#-0D4M0zc-+8)^DYi}GWESvU~|GbQrR4O7(){bZUUK_ z0l7pGYP!BEOv5F|)z^d16;I8uC$eQQ;8`$Ml5B=#tA;eL!zEA7131!Hx|pZPF2fDX zYahcI;g&PI;0WH|2{>%?J}y!!y)7N@znzT}lezCE;b`wgad@JjABbO-m##U`;X8eV z8FN?hbiu1POy)`$T;_Z>j_a;{InwFiB!StOD`ltPwi#UB1;VCw#zDg0ap6ws1njNF zuG2Cl{G|k_RFA{eU@6b(8AVXvXzlfa4A#Q@2FbjXz^$ zonIBD`7-xIIA)Gk@p5#KE5=v4d{*B%rFHWNA7JiGjAqrQcCmwkWlCa{GxCCz@UVm%C znnEhR(`&)0JO?2Ids~LV(#aOjl7fSJjQM$v`3YpTh3s_#nJFdrqX(v}blc(M&_PJ@ z85}F^PzSW=_p-hYf!ok=f;3)`hPMD;=?Xepj;S3v;*#abX}Fp#4O$x*J6qu1ihQ{g}mZpZg}amb!yzN901NJz-mW76{n{ko6?$K<{r z^w&fFJ|>s{sGnor-SJ+)IL4tkU#j=HV_ZuhnPUk!iu2bfN25bxAuz(#w)f6&O<4A;Lk02pE}&-;1>Z?#A3l)0J9fyO$E2EW*Ht-jt;5&Npqh`dRzW) z0E%l4!u-uuUajJi1XGn88G;q=931AuW2i&F4YQXA=C3FGb_wto4LC3^yNZi>wBq_j zov-2S#d6!P+@b>9-cfGR0d5UH|9z@i;O+sA8wHF&?m6q5DqM`xrbe?ymD@3 zc`a6MoMT#U6Ov7^jyB?iUdX(k zWbTI0q?%)Trgk%A2+~k&BuMV%xQA)nG2K4!61W9smB(HJX_y^^cLK&krx)V_jNfpo z1b5c`thtN!;WMyip99QTnUPGDRW{~z$~`c}`{33^`C$uK4!D~%uQ1$^H!1HH5sHsW z)^B=JNcK@V2X@cnI2jTc^gFG&ex(8f zo5@t=7T8QCD7V07!m}j|M{%c>%caWA>gg<0sd5_};O|_xfoSq#y5^E&*LHV07z1O= zlInZoa6jO62Hr@VqB-M+DMUYIv-8vAsbZUgGuW}$y79c{wlJrIvqmB=5YHTY4A!<- z1SdNRlxu-3oNbSBP|8eC*lwwZF4MXxTC8_WR(LtxnL*;NCLV@`AbgF2$&?AtS8#@c zuT?O4EAiJUm@_!S*DIJaG{QG1*rVVZsfNV_dn$*Ul!p`r->l$d1usxAdjca|s96`s4>jGrBi{wrVzvojK|q#76<;*`U!unEU1c#(qH(HY=21(O*NUaVkp48pf7 znBO!@6wKyBc&UQf#0W35a!3|ShdW@H0kUAicPf}HknnN^a|9v0LcwI6gzr)?dj#Q? z3TBTXT&3XN3NEi!4pz^-Tfywv4B%DpDGFYt;JymxN{$)MRd9`h^As$w&r;v_C>+NQ z#(gh3!n@0}TsoUJ-VQjDj@48CT0Pub zxE8mroS6__b1@VWG1taYqpwX{ebAT=-9=2Q@3&nkhit}^w&_wAV*DFQj0K^_RS|pC z&}}OANuAyutLI8imO_nO*Itz}EOULkPh6Uj9Pv@RFs_l99T#dwrn#}tT1kcBWa4L- zi($z6$o5W!`PiJ`OKAzFIy*EYx17==wl#Vpiy#Z38yjS>8yjt~8ykAC8+%i*8#`36 zTMDQ>SvMkdCYWqK2o}vxb{3|^CUXhQt=I7M&E#2_6o}QvTT^4nF1H9+F07VP{d3rnBed~Z-O^g!i-c?rqE4VlW?a} zuHCR>;tlZ?_Acy3CNvvwv>WqGX%5Q?X~!%F?yFmd^?GSD-Uv=`7*2Br+Eelz#x;FD zMV3i0rbcDO^BD+cAk1gLv9-f8VJN;jjF`c#${D`Rprj?+)8}w!>92$dgGq&<`xnX` z52$uFMwjmgXw^Pb`7#LpDhU2M2tE)5e-i|M8w7tB03$gW+slY{9E794rV94s%G{Je zxbNXeXCvHk=p+Od;JqMgNO{-LT!&R$>_W`@_cEu8F|zzfKoWF58U+6k1pgQW{}crO z90dOo1pnF|j_h=-y+bElry7oY{T}4}M-cpH5PUoc{woOnI|$}}ePC7E0$`H*qbZIE zaYh*7ks%6W5e_TDQzDFBeY7BVJqR`cTg`KYR7Myvcg_6UOGgW!Z9I8pQdRn}dOT=3<@mh7>9KA__M=y$?~tn@%HK=inVHC8ybwakk*N(@0IE3%O)Z7;-8P zqTy)5Xx^8SC)~;2;x};<*tO}9CAf@)yaEK^Y{>&-c?@)8Bs~#{$y$(8ynrz#F5Vk{ zEjD0WhGq_KVP03Y+uIbc)kGRYO;#K)1(C)`M=Anx9NQ!-B8|y9h3QaIyfCK5ZH&^> zfQ*;MpSs6OZ5HH0v)o3k8Qpl?&5{I1w=v0t$4SAHc-}nsg{*LI&Tt4y2S6N~6J_LJ z`{AM}gYRorM;YaST+zl=uogxe$#lFA15-k`p13wJ+PKhmzPI@xt`LsK(rnF9-1$7a zyOC*1>N(;vmzPUjcVlGYE_{;NXTWe)HWQ{0h7>R#(B&qJD;o2oHy1(Dny=wnpQchg z9K<6Jvms{2R!4D+5$+;vku*S!D*rZU#+y$cK!z0qdE_RDl}e{#88S5_(e5H|ATwYe z$b|{<*1dqSbVpj0%_FV*Qr)uZt59b;?^6gI$$9~1d*M8fQTQvo?$tQ=No^tnUQINr z0}n$_>=9G*F7(QdEQOq}^dNNQDjvq}!17Ssl3BkLudh`d>jf3~0*J;kw76vI|CzH2 zC=OMIQj7m%)Y>O;#%8m9j*#jeM*jfeZP9O0G2TM2-DOR?NJH~mj`x5xbKQBk^8qh0 zM9H|9aRXO=yfMkPQJSf{+pr5os*lHHiBq&oVIpN`yfG*MEK4wk$Y}{iZhNK9gx2Syqj=40^NDFvl?CC@!H2`c)G?LBh z%`XvG26pcfl8kVF631Z zJZZamAkeI|CRvtlOw> zJorZ_>Y#?4smWif^`zcs!I_O9u#(BjS+>!EIBCs5cY0EeXBb}F7#vG7vTbM6!amGB zxS0FnOe5TO4jtU)7Svd=^)^!Dnh;Ma42NkBKV+kRZZiyMEPqORBU+qfxCw`3%;P<^ zz0pj;!nR}?)X;9tGCl&dGaHcUE#8~|F<#5e!Q#op-YK;?#u(sSS78PHXO6KZWVB5V z_c6M|ZA%{`*<^l9J6(2XMdR7bK1Ni#)fyX%KTmO|7~HC@JOx=Za{!&eCouN=vAa(( z2E~y{u@E%m9Slt3L8ZK}u_T%^3et~_)9R@Ovb`^O5R|n0nq}QG2Wv)WuA%jzZ*mR# zW=~*9uH5O)AICUWAQQMt3UZAMov2W;eT_%&op(k-Oq*+D>f=~b(pYB1B#y_Y*_IK+ zfZ;5Wv9UrYh%L`ZjhNW3Ui0#d$0G{cIen97JdbVa_5F;;@zA)bR1Xngc}Rv-4KQMD zpPMg9el4zn#t@S$ z44!TBI}L|3f0lQr6u6`DoaX7q4Yp@w+3ChLm^mFk9c>GzOokZQ=E)WYV4So0fy7w* zm*b&d<1+vFVm{J3ZXT3eYH!DW;*lZ7Dx8@snvRK5?NDQf`t~;9+S`UR@%&EJFeAZM zFP?7H^gpi`1P;S6hVq>f{(6e-c4!zJ8HNUZuQU(tjfy?P$c;E3MPPd{d#2K^IRjmz zNy^T^{Ff4wrDgre|z^inpGDhwaUl1gBo!=1b8Y zha>JM#53G*<6_~Wmkn$KK7&htD~20sW;S7(6{Wq3p^-+6iww?+s4Wt=j5`-w%ekYB zNn}QwTEluu?M!U=w>U7vtRH1)y#vFMbY@uC6ySPbEatIPJ{e_vk4)`86TE4u6r2N& zJMJvwC$y-7(S|!>a=Sd0j5cE06|OB_DY+v$UJ{035??>s*keUiJH{BGvmu2^-K`#Q z$1&jJ^>Ta+78okEinBZP^2yo8WqvP{5#W=t7$rUPe9*TD#|LkJq6TSfzvnj;%ZI8X}>q9NbqO0{e&OaL`+%P(UDcCC2e^G3Pyz! z4ZCi-N!?~VftlcgieJtO%(bDM0haO=G}k<`r6|+wb>0Wb)^Oxw)J`m#j)g*NV8g`@ zyZ6W%@Q|U9!xS%p{I_tvrs?dF@#5Nr-ZlRq^c(7rK_{eTULuw~G8hS}rgyG?zb}<>=gO$oHQHLzy}ml{ro3OvXa`UU_6P#;SXz zt|A@9dKZLuUXiVNH_XAJ?Lwq+2@`%E9=1G-W|@1D@g9^?5fthL7o&st1A33Vgv%5z zFmh}9LRX^VLr1K)_zhfL+<N_Q;i|8Jk!vR%H?doRW{8Sq@RoS z)x}#f4hyttC}FuYPXqrgmZQ_a_evz<5+mO8FVL3c?gLW-L$+s;|9X7KOWqK>JCC(- z4?yxfHd#sp$f!61a?g%~48I?O;e7fsS#gQ6$d)0lOO50ar{M~u9Js3dcN!lAmj%JM z2El8-_Fa9cG1q2_*BQP4e9P7npDL16jD`$oyOnH}+%9oJ@~&n;aAo4&+>6xLuz?r-Cy)#>d}_()xCsyZ1UcGgd1b zmnu~ZuGi_t7>B^EtGK3xxY7K!%Pe_D1jbq^)2=k)3u1$ucL!ZT z`Y2%1m+N9Se%8U|ilF{U*!C-pL9%8?g7fStL1706!G8zcC;9|nPEoBA^#^QD?#(-u z%eyJ>fxTzz{=fgW=<+%ABmztHdJz0X5L^`mUl9bK(HAKOF({qgzg0E z)XG0qGy)q+<55YPZH#b@f;+sm`Kyw$*=VO(a1PA>lTdyLgl7f8lK}^2r*jbA=T~+x zlVNh*g5Y0qsbfI=<(&?-cj&Y~2v*4=$vuj!KY{0l0;}PU-!CWIY@(jcq*cb*LlDW^scF)^|I|>7dwhnM$ z-tP^gT5x5Ej1!LHK8p{(lUuTI@xq=blfxYk;nqO%V94_ev&yBZ74M0y8x^`}n*;@Ru0=0?GF>VD(s5 z;i=JDSB`A#Z(P`veJx$fjP5fyqy~lw4}y8eA1T7U@}aP;^)H*j98@dqxv*J|zE2)-@|o&h+JrU^3mY6vyH z1h4BNtsh~c*sv4Y$ffgiE$3=D(yzs5Q1P8|;YONUY1;6e05_=^38nS?&3LJ=2G<^T z7SHQOjCL(PrF5GM+R>B4v|gtG46MLkKKCaOSa~}?m**@1x*6|Cc#fvjX(XK9`hkM-US_V5TRPExazR3DDOjP@71R`WQnYA*hF zEXeaqbf)BX$w|Og7oGzuz1JCq8F1NF9FJO8j|V=+)MGIad%Y2!&J@vp%;JoJ&8S(l zvtiCu-{(l#Up+B3UqGejYu<+$=0^La{xS{}c{LOpvl>NY;Pa$5%og(lg7iLpa96 z>@ogPFsvtjGftA5-y>m2T7Hj!VYTp^WMdWZJ0FJi$#0UIgD$^GQs$G?Bh0EIjH>Z# zim@)~U}b`JP1wo^+X7)LGlLauWr)3wcq>yB;}Nzp#-2ym${fWBgk8)Ib2LCX(2;O| z1)K9neD_l@7gfaPDL7iexw7|5TXOj+$~jg!_ffFbigFZ8#UMtLtzhmL6V6hw)x3Hu z*lJ#x3QmGe{}~ES_QO3*fg{V1;&(8`@Ps`IPLtMu8Oh~60n#~5ITKAdUBM{|?xkSH zPdw9Ox=f!i^Fx^VBh35~X8sAYJcL<3!YnV~@-|gH5`-Q|AbKFd2$O(>Nl?NV#7(%b zg1aj?SHY|Y`e(h+KkJEbKLxWM3A0{Db5%fqh852MF1g}AS;^+ZS&`Cu4OVSzTlB%U zMjvc@ge|@Vk#B9*L@9hQ&S}%dQ-^on_Frctxafx+haH9u|13QCVRy%I*tGiS4ftk1 zqt_e7vB0>~Hrwl(jbr;WjZ8`T9bI?oo9LkVx^7QjsXWqVeC+J}u}J5@Fn^`uS_lc> zHB!ZQnt((Pm}su?6(iN0~EXlzSxsb_$s*r zDtq$-0{<>6?!Y4RS~!tM(C6>6^A4kL#C7eQe!Bz9NE`^LG2(+(q$S_*ZF9kny%he- zXpq8d++%!CtuWpUH4763391Jo-5&A&O=R+cHgcl3F8t(#8`n=jmNW3Y~9Z{shkR8%*sr0Tf9ybp? zkaJ|fFfTJLENXlPL3u^e~%mfvS=2yxwvn8>HCJXPb&od>%?OB|U} z^#G(g5Jx^>jE-0k;O}=|(Sr~#I~Kxi62d<1t?U+Ws}$F*Hg`yUh&O3?l9WCWrnzo` z2lg9A?!T>~;5OXG*V0XcEU5aSw%gQ3#M(nbZ1O~{(UbNEwMLSo9AW*1Z+tK;#&%fp zW@ZdRaq)*0g*m4V2su)pDXJT~521z}&+Lq?A0 z*5G_0f267o!?ELjDf$w^yoP-^E7sH}3z}>XV?OpVWOx>txH8 z4*@pICmSDum~Np&R774Sg^wC*Y>Rw{9yQ8C;wbLoj{^n=)!P)Ef0xDUA<}D-_t!&9 zceIo}W(*2hjHS_?wjOfeHBhkWF>JBiE_;E1H`n9F&3+5}yN?^QZ1+gz>3C`?cLPKS zO^BEybx)PZ5*fe2h&Ovt4xSb_hWpu#Z_5T_Y)IQN=cPV4Xu6eM&>+0zh7vM+^7Yyp*s?bXx_8So6$LavlK&nU@jmQ>D7N|lypjFj}itwgq8Q+XFQxObvpvu z?v`oKVqc~J$HT#1{S@4}1GPQ}LApxg$9UW^VW*MeYFAF+Mv7|zxJdC%BenzFvYke1 z2hO&&&~SOL;~>X(Vo`l^J$O|O&wmaoX#OU#^EqQl$UQdsbZ26BnfkmD9!={(N0QHWO{0JgR9e9$n z6%@9`wDIX5EZCXw?UAz2p}y^W5#7MwCW;p0*xtAov0v{m#{(~-;`{^%_-ur0y6K8Y zSa!}Z)BvF_g@X?lQ6m){spgJ*yX9 zfNukaxnwWpk6eX0hgWlS+Q$9r^UOp|%EOt#Z7vs&x_GSGmMt&d8SUJhzGNMB=z}>2pyQJt?t-MT@*0J2JZ*Ce_Uanmz{Zux?l)A2#QgGk zY+Ld~_0~6`!qE915Qn7g8zv9#HhSpUh{!G_Z*|29@ZHc@xEFZFiz5=djs7Rq@d)v} zg)Nr*+I$tfWw_Jtw?MEMW~?VnEDVS4H5N{8e9KtWL44XHJfLF4lbdg2a{eGdPX5fsguMmqoi*XjEX+I;nhcFsF92BN_&2fPhJ|X09HOiqG8Es;cP;$0SN4*!bX+DKh`vyHsiPO!vJ6^H4Oe4R zeCjT2xE3d4GS@JOhk_4q_&OA=xftI=@N5zmG{VKvEg*QY6TLbiI@#_b@8Hh^Lr-(0 zat~^=>P~EF=6)WkP2(z&6D(49FXnOFk&YWNO=p#RM*0tVd+jh=Q~zB8xRk> zQUY%2LhEwkpfq@H>22NY5n*s9u{f^_m1$Ri1#O7HT@%j7qV4H-A{;43zD*BYy)$n9 zmcZ~^lgiRwQ1Yn39q_mvd3$KGi_Q!})1AiKnv|UW2r_65P863s8UO<{pZcM!V zE%%|2a0i#gXTXe*#hbzgN$KXWSrS_x=9E2~!}2AwKCDV!tq;qUZS`T{<&5w@h_DN6 zHjfpcJ-OoTF#LI8=w}`LFnb;O8Lj-RhaXasek@H%wiSkdtOHyg-`XPb@eYtA8F3pr zz_I#>+t>k))koZ>K%A*5S^kScZ3fD0=L)V5g0}?0PXxhF2Ek7Sz=*OPNQ2S!MTifV0ZJtpl7@_U#?u^iI-wT4YygS{bdGwf+n|1ybSJAb3X* zyfX-XE(m@;01l*r)q)y;S1qXgq-JI{p+lsQA)Jxc+_)z-F@R zB&44M5chH*&TK-`)FaGKy;pz>q~5DR@M}Tv>p}1vLGYUaa3J-pHnbafMVRuo&SjPU ztrN&LoK^a_JHT0OsHp>-)rOioz;RLT?j&8OMRu0b?aA8Zq|!U^7)XhCgW&gq;P->z z4}#zigWx?pL6Z~_hoopI;PlAClCYTa!T1~oQvgGO-q|qYVTxeRhq(xbtM(F@88BDC z%z-I`xfbR|7?xnKN)fEjg!cu(9|gf5`{8nPxxffM3G(o15d2vX+!6%02Em^P!CwTy z`%Spqzg}Smz6|p4RS^7j5PTpA{w4_iHVFPM2tG)791^xjb|}ch;UM_?AoxfSd{nCU zLfQC7|JxTIkBWnsqS?qbr=&R&w-0KVr@f=(1?f`xDE4Ga-!YyF`2nl`hV)+E+>KBG zdl$0Q9}zL92b_I&lIBXRXcoK+z33mkt%6;(bMX+ny{xy>l;GvSi$@ube++joOpdtT zQ>&~fU+?!Y9WMU~(OE;JHMI4CR}%l{4se`I5cf+5xEO`|wF4X(B*PtRkDFk&=V*oe z4M_Gli}=3>!G8q7e+I$FF?E8#CHDg(WyD`WxW9v73gQCOvIW5*x=bjEg8=0NOeCQz z{sE{3{qzq^&GDZN5BZ8(^8AiJltrVty~<96YOrch*sp*V@tq;UY$igTaork$h1J-Dtcx*9>a^AVOg zAkD*qie}g4xz^Ag-junT)b26t<&Gc^orB;mL6Kj8NUh2a?*M0IDk2ESOp(_!Q(aG_ z5o0=ZJKE}YxI*F`i13qZ^(;<{LZxtD%eeXabA$EIbB-!8vRf7BtLD_rTJ1! zS!*c^jFPfbLA?5X>RdH05IUg8`&#xHV?s@dN{Ez{;Qp)pPa%%l)-NpFWli-t*JiIN zkg`vWY?)ea3->0RZnynxYQmfUo}YoYTF^{|RvryMEG)4Z{I+zF~pI;cEHsFu$H#Udbmig)qKu=kmE?gL2`W+Su2fi_yBD;e? z-16j)O(O;^^q_H;IKMMiN&R;?nNoVt*z+I!+04S7ft_H;G`aN0^_JhE!L2=HIMb#h zXf_Nx+5f}Yd%#CkbpONL&2H{o*iCk`>2)`~0SQIABy^-D3IYNWq=*zr1Rp>_5}GJ2 zVIfC~nqXJJ#PTc_G*MAd#6&^yF=}FY9(hDf>;?7xp1b#k%Nl(C?=K&QyXVZAnKLtI z&h#^(Fr~?3^0@|FC*WY>5yr<_zX~+>=HNUz<`g5rfxiIi^%-UKqrxc6*z&#(beW

qzT1|gsrKu@34rsjW3|ntLBY>xK0n90=sXGUB|nxGnJIlsI@XTL~I_F74~q zzKQr=OOgX~tcE>o=jz+QVL?ei&PN~)m~5e!z70GSouUOu)xK%kH{C*aei!&e*ljrQ z$2GvE&U~?)!ra~Wfms^LzdL%jx(J zfieAxf!3$9EXOkebJZAw4$*L2TzYifDEF*9fn0Z*VtLQROj~}$qTqv|&ki9p*e_ehRwr|ub}BuJ^^cmRF}T?sW3oH+%yH&< zGNjN~F{T8pj*Q!%7~zNmW+)tIKOSxv)%JEem1!Dk8r458byp%a@HT3D9H&7`ci^`2 zibf?8MycE)YP06cMa1!p(7soa<379rafJrz-_f4Jg%OThHSAjL>!I3@BO|2sY~Hs! z6>oIfqi)x{W@+EW+V?uj&Cl%anUd+EoDrG!sGBu>nf6_xePK|1qcb75Tmx^@zB;=s zb|w$NpCr#G8;EJ=9pxc znkwT{;ka@1W`_V>s3bcifvP^?HAItal`82?lbnUmFD6-C*9?&PMng$}e7l;t5Nhm> z4Tx60v*9w!k*e`$Zv3%uTr5FU%?~C{HzP7^^i9ES;(|RmUD0rd3nLPF8$HpQC%&4D4P_5NukA9Bm(eoYa2OaIl+g084R?@SW|B9ic^L~M{#T8SOF~SxE@Bf`wF=@YA>?M zWi$*<|8mlMsb0v_a1tR-!RI@2cTdLEj13qC<&AU;dR~zu)k{4vl=o*O3SE(Xaxs{4 zkD)B;4xmBi?Fm7C5Lq8BPxGnpu~4Utx!exN>CB?ho#hD@bzjcYvIfiZo#hrkZV}2<2Mkw7LBOGAU<~1=J14 zv2a(y!8ynP(6B!{_T#}5f4K|fsPBf;!?2)od>n2d!f}=3G>lc|yS?vQ<)Qe*+2j~y zP`hV7z;Qfw<35sCCUkc7+UE4qfyYN}1eYTy^T+(M2(wUfnD(N>GmEOsmxj;>b^-Q%*7u1tHo02#EFW zbfPAshiMTE*S;gP??{XHqfj|WGL5p(*I{yWZ`L%td&Ak};^kCFgP4o90gja+`!W6s z4gV_*3YU|TjX~LajF!e&?K=)%Pjep^-d;uTeIQ)UR>lLxm9d&;os%MX_^g)s1P#q~ z&Wfl2a2F~|#gU;pGcKTIN5}(hg+Q_x`YOFX0#mBu;qg|SbwRU?kRxqZ`V%BbuTV>b zJV3b$K3s>smyt{pE$XfGL6bNcpjo{1RR?{2?&=QwScF(iII1V9Hd4ONG}%H|N6DE{ zJZoU?xg4e#gVOFOImt8?bKNNUGSfBqHc6?t``5)z+0k-eOeg0?%UKybRp)AO!*K>V zJ_o)W-!#OhW*TW@baYh&_T-}F?85HA$HRXp9Q$*9a20YK9B#T6&RC5s*-XouaNIrW zv@<|^1LeLXJ5#RJq7@pcKWm)qAUwn?XTeH`oIZ$IWd+Oi$~}rcdF9`Xo-NY>gS* zs0WzA`Rs)tEHP@Vs1B?V{`D1Ja>vUF)N7z@SG(JZ@p7nz%NwRs&cf)3t2d59x8`C~ zs^G~~+>(u#eGeL8nV@$z4&tp05MeyF<}&5#;Xkf2y#J6OXI&&|bHQP|0Mn!d3=QUK zO#ez{337~snT|kUonc%)UarJQ*Za!7IYG8}Ws)mEqANQtRZdS2%B4HMJytvfJo2&| z0CK&sWA6o;HwVGLiz;F`V6J|QnD)5j)VPJ98#CQ7=uCM#i

|Io)?c<5YC&}TLE!PN)b)+jjc&W{C1%7bz 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

VA&s;W(QRb>pLl)S}pv9VCN?bE(jGXT|X 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

jFlyrT?r|DcoyZ(~xDmOo9p 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࿺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 jSOWngwttbSbLU8-h+bu<_^nrQ_=_Sw)WuX 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 delta 742789 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 diff --git a/build-aux/ax_prog_cc_for_build.m4 b/build-aux/ax_prog_cc_for_build.m4 new file mode 100644 index 00000000..4d1de993 --- /dev/null +++ b/build-aux/ax_prog_cc_for_build.m4 @@ -0,0 +1,175 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_prog_cc_for_build.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_PROG_CC_FOR_BUILD +# +# DESCRIPTION +# +# This macro searches for a C compiler that generates native executables, +# that is a C compiler that surely is not a cross-compiler. This can be +# useful if you have to generate source code at compile-time like for +# example GCC does. +# +# The macro sets the CC_FOR_BUILD and CPP_FOR_BUILD macros to anything +# needed to compile or link (CC_FOR_BUILD) and preprocess (CPP_FOR_BUILD). +# The value of these variables can be overridden by the user by specifying +# a compiler with an environment variable (like you do for standard CC). +# +# It also sets BUILD_EXEEXT and BUILD_OBJEXT to the executable and object +# file extensions for the build platform, and GCC_FOR_BUILD to `yes' if +# the compiler we found is GCC. All these variables but GCC_FOR_BUILD are +# substituted in the Makefile. +# +# LICENSE +# +# Copyright (c) 2008 Paolo Bonzini +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 26 + +AU_ALIAS([AC_PROG_CC_FOR_BUILD], [AX_PROG_CC_FOR_BUILD]) +AC_DEFUN([AX_PROG_CC_FOR_BUILD], [dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PROG_CPP])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl + +dnl Use the standard macros, but make them use other variable names +dnl +pushdef([ac_cv_prog_CPP], ac_cv_build_prog_CPP)dnl +pushdef([ac_cv_prog_gcc], ac_cv_build_prog_gcc)dnl +pushdef([ac_cv_prog_cc_c89], ac_cv_build_prog_cc_c89)dnl +pushdef([ac_cv_prog_cc_c99], ac_cv_build_prog_cc_c99)dnl +pushdef([ac_cv_prog_cc_c11], ac_cv_build_prog_cc_c11)dnl +pushdef([ac_cv_prog_cc_c23], ac_cv_build_prog_cc_c23)dnl +pushdef([ac_cv_prog_cc_stdc], ac_cv_build_prog_cc_stdc)dnl +pushdef([ac_cv_prog_cc_works], ac_cv_build_prog_cc_works)dnl +pushdef([ac_cv_prog_cc_cross], ac_cv_build_prog_cc_cross)dnl +pushdef([ac_cv_prog_cc_g], ac_cv_build_prog_cc_g)dnl +pushdef([ac_prog_cc_stdc], ac_build_prog_cc_stdc)dnl +pushdef([ac_exeext], ac_build_exeext)dnl +pushdef([ac_objext], ac_build_objext)dnl +pushdef([CC], CC_FOR_BUILD)dnl +pushdef([CPP], CPP_FOR_BUILD)dnl +pushdef([GCC], GCC_FOR_BUILD)dnl +pushdef([CFLAGS], CFLAGS_FOR_BUILD)dnl +pushdef([CPPFLAGS], CPPFLAGS_FOR_BUILD)dnl +pushdef([LDFLAGS], LDFLAGS_FOR_BUILD)dnl +pushdef([host], build)dnl +pushdef([host_alias], build_alias)dnl +pushdef([host_cpu], build_cpu)dnl +pushdef([host_vendor], build_vendor)dnl +pushdef([host_os], build_os)dnl +pushdef([ac_cv_host], ac_cv_build)dnl +pushdef([ac_cv_host_alias], ac_cv_build_alias)dnl +pushdef([ac_cv_host_cpu], ac_cv_build_cpu)dnl +pushdef([ac_cv_host_vendor], ac_cv_build_vendor)dnl +pushdef([ac_cv_host_os], ac_cv_build_os)dnl +pushdef([ac_tool_prefix], ac_build_tool_prefix)dnl +pushdef([am_cv_CC_dependencies_compiler_type], am_cv_build_CC_dependencies_compiler_type)dnl +pushdef([am_cv_prog_cc_c_o], am_cv_build_prog_cc_c_o)dnl +pushdef([cross_compiling], cross_compiling_build)dnl +dnl +dnl These variables are problematic to rename by M4 macros, so we save +dnl their values in alternative names, and restore the values later. +dnl +dnl _AC_COMPILER_EXEEXT and _AC_COMPILER_OBJEXT internally call +dnl AC_SUBST which prevents the renaming of EXEEXT and OBJEXT +dnl variables. It's not a good idea to rename ac_cv_exeext and +dnl ac_cv_objext either as they're related. +dnl Renaming ac_exeext and ac_objext is safe though. +dnl +ac_cv_host_exeext=$ac_cv_exeext +AS_VAR_SET_IF([ac_cv_build_exeext], + [ac_cv_exeext=$ac_cv_build_exeext], + [AS_UNSET([ac_cv_exeext])]) +ac_cv_host_objext=$ac_cv_objext +AS_VAR_SET_IF([ac_cv_build_objext], + [ac_cv_objext=$ac_cv_build_objext], + [AS_UNSET([ac_cv_objext])]) +dnl +dnl ac_cv_c_compiler_gnu is used in _AC_LANG_COMPILER_GNU (called by +dnl AC_PROG_CC) indirectly. +dnl +ac_cv_host_c_compiler_gnu=$ac_cv_c_compiler_gnu +AS_VAR_SET_IF([ac_cv_build_c_compiler_gnu], + [ac_cv_c_compiler_gnu=$ac_cv_build_c_compiler_gnu], + [AS_UNSET([ac_cv_c_compiler_gnu])]) + +cross_compiling_build=no + +ac_build_tool_prefix= +AS_IF([test -n "$build"], [ac_build_tool_prefix="$build-"], + [test -n "$build_alias"],[ac_build_tool_prefix="$build_alias-"]) + +AC_LANG_PUSH([C]) +AC_PROG_CC +_AC_COMPILER_EXEEXT +_AC_COMPILER_OBJEXT +AC_PROG_CPP + +BUILD_EXEEXT=$ac_cv_exeext +BUILD_OBJEXT=$ac_cv_objext + +dnl Restore the old definitions +dnl +popdef([cross_compiling])dnl +popdef([am_cv_prog_cc_c_o])dnl +popdef([am_cv_CC_dependencies_compiler_type])dnl +popdef([ac_tool_prefix])dnl +popdef([ac_cv_host_os])dnl +popdef([ac_cv_host_vendor])dnl +popdef([ac_cv_host_cpu])dnl +popdef([ac_cv_host_alias])dnl +popdef([ac_cv_host])dnl +popdef([host_os])dnl +popdef([host_vendor])dnl +popdef([host_cpu])dnl +popdef([host_alias])dnl +popdef([host])dnl +popdef([LDFLAGS])dnl +popdef([CPPFLAGS])dnl +popdef([CFLAGS])dnl +popdef([GCC])dnl +popdef([CPP])dnl +popdef([CC])dnl +popdef([ac_objext])dnl +popdef([ac_exeext])dnl +popdef([ac_prog_cc_stdc])dnl +popdef([ac_cv_prog_cc_g])dnl +popdef([ac_cv_prog_cc_cross])dnl +popdef([ac_cv_prog_cc_works])dnl +popdef([ac_cv_prog_cc_stdc])dnl +popdef([ac_cv_prog_cc_c23])dnl +popdef([ac_cv_prog_cc_c11])dnl +popdef([ac_cv_prog_cc_c99])dnl +popdef([ac_cv_prog_cc_c89])dnl +popdef([ac_cv_prog_gcc])dnl +popdef([ac_cv_prog_CPP])dnl +dnl +ac_cv_exeext=$ac_cv_host_exeext +EXEEXT=$ac_cv_host_exeext +ac_cv_objext=$ac_cv_host_objext +OBJEXT=$ac_cv_host_objext +ac_cv_c_compiler_gnu=$ac_cv_host_c_compiler_gnu +ac_compiler_gnu=$ac_cv_host_c_compiler_gnu + +dnl restore global variables ac_ext, ac_cpp, ac_compile, +dnl ac_link, ac_compiler_gnu (dependent on the current +dnl language after popping): +AC_LANG_POP([C]) + +dnl Finally, set Makefile variables +dnl +AC_SUBST([BUILD_EXEEXT])dnl +AC_SUBST([BUILD_OBJEXT])dnl +AC_SUBST([CFLAGS_FOR_BUILD])dnl +AC_SUBST([CPPFLAGS_FOR_BUILD])dnl +AC_SUBST([LDFLAGS_FOR_BUILD])dnl +]) diff --git a/build-aux/compile b/build-aux/compile deleted file mode 100755 index a85b723c..00000000 --- a/build-aux/compile +++ /dev/null @@ -1,347 +0,0 @@ -#! /bin/sh -# Wrapper for compilers which do not understand '-c -o'. - -scriptversion=2012-10-14.11; # UTC - -# Copyright (C) 1999-2014 Free Software Foundation, Inc. -# Written by Tom Tromey . -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -# This file is maintained in Automake, please report -# bugs to or send patches to -# . - -nl=' -' - -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent tools from complaining about whitespace usage. -IFS=" "" $nl" - -file_conv= - -# func_file_conv build_file lazy -# Convert a $build file to $host form and store it in $file -# Currently only supports Windows hosts. If the determined conversion -# type is listed in (the comma separated) LAZY, no conversion will -# take place. -func_file_conv () -{ - file=$1 - case $file in - / | /[!/]*) # absolute file, and not a UNC file - if test -z "$file_conv"; then - # lazily determine how to convert abs files - case `uname -s` in - MINGW*) - file_conv=mingw - ;; - CYGWIN*) - file_conv=cygwin - ;; - *) - file_conv=wine - ;; - esac - fi - case $file_conv/,$2, in - *,$file_conv,*) - ;; - mingw/*) - file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` - ;; - cygwin/*) - file=`cygpath -m "$file" || echo "$file"` - ;; - wine/*) - file=`winepath -w "$file" || echo "$file"` - ;; - esac - ;; - esac -} - -# func_cl_dashL linkdir -# Make cl look for libraries in LINKDIR -func_cl_dashL () -{ - func_file_conv "$1" - if test -z "$lib_path"; then - lib_path=$file - else - lib_path="$lib_path;$file" - fi - linker_opts="$linker_opts -LIBPATH:$file" -} - -# func_cl_dashl library -# Do a library search-path lookup for cl -func_cl_dashl () -{ - lib=$1 - found=no - save_IFS=$IFS - IFS=';' - for dir in $lib_path $LIB - do - IFS=$save_IFS - if $shared && test -f "$dir/$lib.dll.lib"; then - found=yes - lib=$dir/$lib.dll.lib - break - fi - if test -f "$dir/$lib.lib"; then - found=yes - lib=$dir/$lib.lib - break - fi - if test -f "$dir/lib$lib.a"; then - found=yes - lib=$dir/lib$lib.a - break - fi - done - IFS=$save_IFS - - if test "$found" != yes; then - lib=$lib.lib - fi -} - -# func_cl_wrapper cl arg... -# Adjust compile command to suit cl -func_cl_wrapper () -{ - # Assume a capable shell - lib_path= - shared=: - linker_opts= - for arg - do - if test -n "$eat"; then - eat= - else - case $1 in - -o) - # configure might choose to run compile as 'compile cc -o foo foo.c'. - eat=1 - case $2 in - *.o | *.[oO][bB][jJ]) - func_file_conv "$2" - set x "$@" -Fo"$file" - shift - ;; - *) - func_file_conv "$2" - set x "$@" -Fe"$file" - shift - ;; - esac - ;; - -I) - eat=1 - func_file_conv "$2" mingw - set x "$@" -I"$file" - shift - ;; - -I*) - func_file_conv "${1#-I}" mingw - set x "$@" -I"$file" - shift - ;; - -l) - eat=1 - func_cl_dashl "$2" - set x "$@" "$lib" - shift - ;; - -l*) - func_cl_dashl "${1#-l}" - set x "$@" "$lib" - shift - ;; - -L) - eat=1 - func_cl_dashL "$2" - ;; - -L*) - func_cl_dashL "${1#-L}" - ;; - -static) - shared=false - ;; - -Wl,*) - arg=${1#-Wl,} - save_ifs="$IFS"; IFS=',' - for flag in $arg; do - IFS="$save_ifs" - linker_opts="$linker_opts $flag" - done - IFS="$save_ifs" - ;; - -Xlinker) - eat=1 - linker_opts="$linker_opts $2" - ;; - -*) - set x "$@" "$1" - shift - ;; - *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) - func_file_conv "$1" - set x "$@" -Tp"$file" - shift - ;; - *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) - func_file_conv "$1" mingw - set x "$@" "$file" - shift - ;; - *) - set x "$@" "$1" - shift - ;; - esac - fi - shift - done - if test -n "$linker_opts"; then - linker_opts="-link$linker_opts" - fi - exec "$@" $linker_opts - exit 1 -} - -eat= - -case $1 in - '') - echo "$0: No command. Try '$0 --help' for more information." 1>&2 - exit 1; - ;; - -h | --h*) - cat <<\EOF -Usage: compile [--help] [--version] PROGRAM [ARGS] - -Wrapper for compilers which do not understand '-c -o'. -Remove '-o dest.o' from ARGS, run PROGRAM with the remaining -arguments, and rename the output as expected. - -If you are trying to build a whole package this is not the -right script to run: please start by reading the file 'INSTALL'. - -Report bugs to . -EOF - exit $? - ;; - -v | --v*) - echo "compile $scriptversion" - exit $? - ;; - cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) - func_cl_wrapper "$@" # Doesn't return... - ;; -esac - -ofile= -cfile= - -for arg -do - if test -n "$eat"; then - eat= - else - case $1 in - -o) - # configure might choose to run compile as 'compile cc -o foo foo.c'. - # So we strip '-o arg' only if arg is an object. - eat=1 - case $2 in - *.o | *.obj) - ofile=$2 - ;; - *) - set x "$@" -o "$2" - shift - ;; - esac - ;; - *.c) - cfile=$1 - set x "$@" "$1" - shift - ;; - *) - set x "$@" "$1" - shift - ;; - esac - fi - shift -done - -if test -z "$ofile" || test -z "$cfile"; then - # If no '-o' option was seen then we might have been invoked from a - # pattern rule where we don't need one. That is ok -- this is a - # normal compilation that the losing compiler can handle. If no - # '.c' file was seen then we are probably linking. That is also - # ok. - exec "$@" -fi - -# Name of file we expect compiler to create. -cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` - -# Create the lock directory. -# Note: use '[/\\:.-]' here to ensure that we don't use the same name -# that we are using for the .o file. Also, base the name on the expected -# object file name, since that is what matters with a parallel build. -lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d -while true; do - if mkdir "$lockdir" >/dev/null 2>&1; then - break - fi - sleep 1 -done -# FIXME: race condition here if user kills between mkdir and trap. -trap "rmdir '$lockdir'; exit 1" 1 2 15 - -# Run the compile. -"$@" -ret=$? - -if test -f "$cofile"; then - test "$cofile" = "$ofile" || mv "$cofile" "$ofile" -elif test -f "${cofile}bj"; then - test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" -fi - -rmdir "$lockdir" -exit $ret - -# Local Variables: -# mode: shell-script -# sh-indentation: 2 -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "scriptversion=" -# time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC" -# time-stamp-end: "; # UTC" -# End: diff --git a/build-aux/config.guess b/build-aux/config.guess index b1872139..48a68460 100755 --- a/build-aux/config.guess +++ b/build-aux/config.guess @@ -1,10 +1,10 @@ #! /bin/sh # Attempt to guess a canonical system name. -# Copyright 1992-2023 Free Software Foundation, Inc. +# Copyright 1992-2024 Free Software Foundation, Inc. # shellcheck disable=SC2006,SC2268 # see below for rationale -timestamp='2023-07-20' +timestamp='2024-07-27' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by @@ -60,7 +60,7 @@ version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. -Copyright 1992-2023 Free Software Foundation, Inc. +Copyright 1992-2024 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -123,7 +123,7 @@ set_cc_for_build() { dummy=$tmp/dummy case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in ,,) echo "int x;" > "$dummy.c" - for driver in cc gcc c89 c99 ; do + for driver in cc gcc c17 c99 c89 ; do if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then CC_FOR_BUILD=$driver break @@ -155,6 +155,9 @@ Linux|GNU|GNU/*) set_cc_for_build cat <<-EOF > "$dummy.c" + #if defined(__ANDROID__) + LIBC=android + #else #include #if defined(__UCLIBC__) LIBC=uclibc @@ -162,6 +165,8 @@ Linux|GNU|GNU/*) LIBC=dietlibc #elif defined(__GLIBC__) LIBC=gnu + #elif defined(__LLVM_LIBC__) + LIBC=llvm #else #include /* First heuristic to detect musl libc. */ @@ -169,6 +174,7 @@ Linux|GNU|GNU/*) LIBC=musl #endif #endif + #endif EOF cc_set_libc=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` eval "$cc_set_libc" @@ -628,7 +634,8 @@ EOF sed 's/^ //' << EOF > "$dummy.c" #include - main() + int + main () { if (!__power_pc()) exit(1); @@ -712,7 +719,8 @@ EOF #include #include - int main () + int + main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); @@ -904,7 +912,7 @@ EOF fi ;; *:FreeBSD:*:*) - UNAME_PROCESSOR=`/usr/bin/uname -p` + UNAME_PROCESSOR=`uname -p` case $UNAME_PROCESSOR in amd64) UNAME_PROCESSOR=x86_64 ;; @@ -1589,6 +1597,9 @@ EOF *:Unleashed:*:*) GUESS=$UNAME_MACHINE-unknown-unleashed$UNAME_RELEASE ;; + *:Ironclad:*:*) + GUESS=$UNAME_MACHINE-unknown-ironclad + ;; esac # Do we have a guess based on uname results? @@ -1612,6 +1623,7 @@ cat > "$dummy.c" <." version="\ GNU config.sub ($timestamp) -Copyright 1992-2023 Free Software Foundation, Inc. +Copyright 1992-2024 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -120,7 +120,6 @@ case $# in esac # Split fields of configuration type -# shellcheck disable=SC2162 saved_IFS=$IFS IFS="-" read field1 field2 field3 field4 <&2 + fi + ;; *) echo "Invalid configuration '$1': OS '$os' not recognized" 1>&2 exit 1 ;; esac +case $obj in + aout* | coff* | elf* | pe*) + ;; + '') + # empty is fine + ;; + *) + echo "Invalid configuration '$1': Machine code format '$obj' not recognized" 1>&2 + exit 1 + ;; +esac + +# Here we handle the constraint that a (synthetic) cpu and os are +# valid only in combination with each other and nowhere else. +case $cpu-$os in + # The "javascript-unknown-ghcjs" triple is used by GHC; we + # accept it here in order to tolerate that, but reject any + # variations. + javascript-ghcjs) + ;; + javascript-* | *-ghcjs) + echo "Invalid configuration '$1': cpu '$cpu' is not valid with os '$os$obj'" 1>&2 + exit 1 + ;; +esac + # As a final step for OS-related things, validate the OS-kernel combination # (given a valid OS), if there is a kernel. -case $kernel-$os in - linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* \ - | linux-musl* | linux-relibc* | linux-uclibc* | linux-mlibc* ) +case $kernel-$os-$obj in + linux-gnu*- | linux-android*- | linux-dietlibc*- | linux-llvm*- \ + | linux-mlibc*- | linux-musl*- | linux-newlib*- \ + | linux-relibc*- | linux-uclibc*- | linux-ohos*- ) ;; - uclinux-uclibc* ) + uclinux-uclibc*- | uclinux-gnu*- ) ;; - managarm-mlibc* | managarm-kernel* ) + managarm-mlibc*- | managarm-kernel*- ) ;; - windows*-gnu* | windows*-msvc*) + windows*-msvc*-) ;; - -dietlibc* | -newlib* | -musl* | -relibc* | -uclibc* | -mlibc* ) + -dietlibc*- | -llvm*- | -mlibc*- | -musl*- | -newlib*- | -relibc*- \ + | -uclibc*- ) # These are just libc implementations, not actual OSes, and thus # require a kernel. echo "Invalid configuration '$1': libc '$os' needs explicit kernel." 1>&2 exit 1 ;; - -kernel* ) + -kernel*- ) echo "Invalid configuration '$1': '$os' needs explicit kernel." 1>&2 exit 1 ;; - *-kernel* ) + *-kernel*- ) echo "Invalid configuration '$1': '$kernel' does not support '$os'." 1>&2 exit 1 ;; - *-msvc* ) + *-msvc*- ) echo "Invalid configuration '$1': '$os' needs 'windows'." 1>&2 exit 1 ;; - kfreebsd*-gnu* | kopensolaris*-gnu*) + kfreebsd*-gnu*- | knetbsd*-gnu*- | netbsd*-gnu*- | kopensolaris*-gnu*-) ;; - vxworks-simlinux | vxworks-simwindows | vxworks-spe) + vxworks-simlinux- | vxworks-simwindows- | vxworks-spe-) ;; - nto-qnx*) + nto-qnx*-) ;; - os2-emx) + os2-emx-) + ;; + rtmk-nova-) ;; - *-eabi* | *-gnueabi*) + *-eabi*- | *-gnueabi*-) ;; - none-coff* | none-elf*) + none--*) # None (no kernel, i.e. freestanding / bare metal), - # can be paired with an output format "OS" + # can be paired with an machine code file format ;; - -*) + -*-) # Blank kernel with real OS is always fine. ;; - *-*) + --*) + # Blank kernel and OS with real machine code file format is always fine. + ;; + *-*-*) echo "Invalid configuration '$1': Kernel '$kernel' not known to work with OS '$os'." 1>&2 exit 1 ;; @@ -1814,7 +2273,7 @@ case $vendor in *-riscix*) vendor=acorn ;; - *-sunos*) + *-sunos* | *-solaris*) vendor=sun ;; *-cnk* | *-aix*) @@ -1884,7 +2343,7 @@ case $vendor in ;; esac -echo "$cpu-$vendor-${kernel:+$kernel-}$os" +echo "$cpu-$vendor${kernel:+-$kernel}${os:+-$os}${obj:+-$obj}" exit # Local variables: diff --git a/build-aux/install-sh b/build-aux/install-sh index 59990a10..b1d7a6f6 100755 --- a/build-aux/install-sh +++ b/build-aux/install-sh @@ -1,7 +1,7 @@ #!/bin/sh # install - install a program, script, or datafile -scriptversion=2014-09-12.12; # UTC +scriptversion=2024-06-19.01; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the @@ -69,6 +69,11 @@ posix_mkdir= # Desired mode of installed file. mode=0755 +# Create dirs (including intermediate dirs) using mode 755. +# This is like GNU 'install' as of coreutils 8.32 (2020). +mkdir_umask=22 + +backupsuffix= chgrpcmd= chmodcmd=$chmodprog chowncmd= @@ -99,19 +104,29 @@ Options: --version display version info and exit. -c (ignored) - -C install only if different (preserve the last data modification time) + -C install only if different (preserve data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. + -p pass -p to $cpprog. -s $stripprog installed files. + -S SUFFIX attempt to back up existing files, with suffix SUFFIX. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG -" + +By default, rm is invoked with -f; when overridden with RMPROG, +it's up to you to specify -f if you want it. + +If -S is not specified, no backups are attempted. + +Report bugs to . +GNU Automake home page: . +General help using GNU software: ." while test $# -ne 0; do case $1 in @@ -137,8 +152,13 @@ while test $# -ne 0; do -o) chowncmd="$chownprog $2" shift;; + -p) cpprog="$cpprog -p";; + -s) stripcmd=$stripprog;; + -S) backupsuffix="$2" + shift;; + -t) is_target_a_directory=always dst_arg=$2 @@ -150,7 +170,7 @@ while test $# -ne 0; do -T) is_target_a_directory=never;; - --version) echo "$0 $scriptversion"; exit $?;; + --version) echo "$0 (GNU Automake) $scriptversion"; exit $?;; --) shift break;; @@ -255,6 +275,10 @@ do dstdir=$dst test -d "$dstdir" dstdir_status=$? + # Don't chown directories that already exist. + if test $dstdir_status = 0; then + chowncmd="" + fi else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command @@ -271,15 +295,18 @@ do fi dst=$dst_arg - # If destination is a directory, append the input filename; won't work - # if double slashes aren't ignored. + # If destination is a directory, append the input filename. if test -d "$dst"; then if test "$is_target_a_directory" = never; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst - dst=$dstdir/`basename "$src"` + dstbase=`basename "$src"` + case $dst in + */) dst=$dst$dstbase;; + *) dst=$dst/$dstbase;; + esac dstdir_status=0 else dstdir=`dirname "$dst"` @@ -288,27 +315,16 @@ do fi fi + case $dstdir in + */) dstdirslash=$dstdir;; + *) dstdirslash=$dstdir/;; + esac + obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') - # Create intermediate dirs using mode 755 as modified by the umask. - # This is like FreeBSD 'install' as of 1997-10-28. - umask=`umask` - case $stripcmd.$umask in - # Optimize common cases. - *[2367][2367]) mkdir_umask=$umask;; - .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; - - *[0-7]) - mkdir_umask=`expr $umask + 22 \ - - $umask % 100 % 40 + $umask % 20 \ - - $umask % 10 % 4 + $umask % 2 - `;; - *) mkdir_umask=$umask,go-w;; - esac - # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then @@ -318,50 +334,49 @@ do fi posix_mkdir=false - case $umask in - *[123567][0-7][0-7]) - # POSIX mkdir -p sets u+wx bits regardless of umask, which - # is incompatible with FreeBSD 'install' when (umask & 300) != 0. - ;; - *) - # $RANDOM is not portable (e.g. dash); use it when possible to - # lower collision chance - tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ - trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0 - - # As "mkdir -p" follows symlinks and we work in /tmp possibly; so - # create the $tmpdir first (and fail if unsuccessful) to make sure - # that nobody tries to guess the $tmpdir name. - if (umask $mkdir_umask && - $mkdirprog $mkdir_mode "$tmpdir" && - exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 - then - if test -z "$dir_arg" || { - # Check for POSIX incompatibilities with -m. - # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or - # other-writable bit of parent directory when it shouldn't. - # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. - test_tmpdir="$tmpdir/a" - ls_ld_tmpdir=`ls -ld "$test_tmpdir"` - case $ls_ld_tmpdir in - d????-?r-*) different_mode=700;; - d????-?--*) different_mode=755;; - *) false;; - esac && - $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { - ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` - test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" - } - } - then posix_mkdir=: - fi - rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" - else - # Remove any dirs left behind by ancient mkdir implementations. - rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null - fi - trap '' 0;; - esac;; + # The $RANDOM variable is not portable (e.g., dash). Use it + # here however when possible just to lower collision chance. + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + + trap ' + ret=$? + rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null + exit $ret + ' 0 + + # Because "mkdir -p" follows existing symlinks and we likely work + # directly in world-writable /tmp, make sure that the '$tmpdir' + # directory is successfully created first before we actually test + # 'mkdir -p'. + if (umask $mkdir_umask && + $mkdirprog $mkdir_mode "$tmpdir" && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 + then + if test -z "$dir_arg" || { + # Check for POSIX incompatibility with -m. + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or + # other-writable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + test_tmpdir="$tmpdir/a" + ls_ld_tmpdir=`ls -ld "$test_tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null + fi + trap '' 0;; esac if @@ -372,7 +387,7 @@ do then : else - # The umask is ridiculous, or mkdir does not conform to POSIX, + # mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. @@ -401,7 +416,7 @@ do prefixes= else if $posix_mkdir; then - (umask=$mkdir_umask && + (umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 @@ -434,14 +449,25 @@ do else # Make a couple of temp file names in the proper directory. - dsttmp=$dstdir/_inst.$$_ - rmtmp=$dstdir/_rm.$$_ + dsttmp=${dstdirslash}_inst.$$_ + rmtmp=${dstdirslash}_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. - (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && + (umask $cp_umask && + { test -z "$stripcmd" || { + # Create $dsttmp read-write so that cp doesn't create it read-only, + # which would cause strip to fail. + if test -z "$doit"; then + : >"$dsttmp" # No need to fork-exec 'touch'. + else + $doit touch "$dsttmp" + fi + } + } && + $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # @@ -467,6 +493,13 @@ do then rm -f "$dsttmp" else + # If $backupsuffix is set, and the file being installed + # already exists, attempt a backup. Don't worry if it fails, + # e.g., if mv doesn't support -f. + if test -n "$backupsuffix" && test -f "$dst"; then + $doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null + fi + # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || @@ -481,9 +514,9 @@ do # file should still install successfully. { test ! -f "$dst" || - $doit $rmcmd -f "$dst" 2>/dev/null || + $doit $rmcmd "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && - { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } + { $doit $rmcmd "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 @@ -500,9 +533,9 @@ do done # Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) +# eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC" +# time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: diff --git a/build-aux/libtool.m4 b/build-aux/libtool.m4 index ab2fd56b..8d323b3e 100644 --- a/build-aux/libtool.m4 +++ b/build-aux/libtool.m4 @@ -1,6 +1,7 @@ # libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # -# Copyright (C) 1996-2001, 2003-2015 Free Software Foundation, Inc. +# Copyright (C) 1996-2001, 2003-2019, 2021-2024 Free Software +# Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is free software; the Free Software Foundation gives @@ -8,13 +9,13 @@ # modifications, as long as this notice is preserved. m4_define([_LT_COPYING], [dnl -# Copyright (C) 2014 Free Software Foundation, Inc. +# Copyright (C) 2024 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # GNU Libtool is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of of the License, or +# the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, if you @@ -31,7 +32,7 @@ m4_define([_LT_COPYING], [dnl # along with this program. If not, see . ]) -# serial 58 LT_INIT +# serial 63 LT_INIT # LT_PREREQ(VERSION) @@ -59,7 +60,7 @@ esac # LT_INIT([OPTIONS]) # ------------------ AC_DEFUN([LT_INIT], -[AC_PREREQ([2.62])dnl We use AC_PATH_PROGS_FEATURE_CHECK +[AC_PREREQ([2.64])dnl We use AC_PATH_PROGS_FEATURE_CHECK AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl AC_BEFORE([$0], [LT_LANG])dnl AC_BEFORE([$0], [LT_OUTPUT])dnl @@ -181,6 +182,7 @@ m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl m4_require([_LT_CMD_RELOAD])dnl +m4_require([_LT_DECL_FILECMD])dnl m4_require([_LT_CHECK_MAGIC_METHOD])dnl m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl m4_require([_LT_CMD_OLD_ARCHIVE])dnl @@ -219,8 +221,8 @@ esac ofile=libtool can_build_shared=yes -# All known linkers require a '.a' archive for static linking (except MSVC, -# which needs '.lib'). +# All known linkers require a '.a' archive for static linking (except MSVC and +# ICC, which need '.lib'). libext=a with_gnu_ld=$lt_cv_prog_gnu_ld @@ -649,7 +651,7 @@ m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) configured by $[0], generated by m4_PACKAGE_STRING. -Copyright (C) 2011 Free Software Foundation, Inc. +Copyright (C) 2024 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." @@ -777,7 +779,7 @@ _LT_EOF # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? - sed '$q' "$ltmain" >> "$cfgfile" \ + $SED '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) mv -f "$cfgfile" "$ofile" || @@ -972,6 +974,7 @@ _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ])# _LT_LINKER_BOILERPLATE + # _LT_REQUIRED_DARWIN_CHECKS # ------------------------- m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ @@ -1022,6 +1025,21 @@ m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ rm -f conftest.* fi]) + # Feature test to disable chained fixups since it is not + # compatible with '-undefined dynamic_lookup' + AC_CACHE_CHECK([for -no_fixup_chains linker flag], + [lt_cv_support_no_fixup_chains], + [ save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -Wl,-no_fixup_chains" + AC_LINK_IFELSE( + [AC_LANG_PROGRAM([],[])], + lt_cv_support_no_fixup_chains=yes, + lt_cv_support_no_fixup_chains=no + ) + LDFLAGS=$save_LDFLAGS + ] + ) + AC_CACHE_CHECK([for -exported_symbols_list linker flag], [lt_cv_ld_exported_symbols_list], [lt_cv_ld_exported_symbols_list=no @@ -1041,12 +1059,12 @@ int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD - echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD - $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD + echo "$AR $AR_FLAGS libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD + $AR $AR_FLAGS libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD cat > conftest.c << _LT_EOF -int main() { return 0;} +int main(void) { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err @@ -1066,23 +1084,37 @@ _LT_EOF _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; - darwin*) # darwin 5.x on - # if running on 10.5 or later, the deployment target defaults - # to the OS version, if on x86, and 10.4, the deployment - # target defaults to 10.4. Don't you love it? - case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in - 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) - _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; - 10.[[012]][[,.]]*) - _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; - 10.*) - _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + darwin*) + case $MACOSX_DEPLOYMENT_TARGET,$host in + 10.[[012]],*|,*powerpc*-darwin[[5-8]]*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + *) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' + if test yes = "$lt_cv_support_no_fixup_chains"; then + AS_VAR_APPEND([_lt_dar_allow_undefined], [' $wl-no_fixup_chains']) + fi + ;; esac ;; esac if test yes = "$lt_cv_apple_cc_single_mod"; then _lt_dar_single_mod='$single_module' fi + _lt_dar_needs_single_mod=no + case $host_os in + rhapsody* | darwin1.*) + _lt_dar_needs_single_mod=yes ;; + darwin*) + # When targeting Mac OS X 10.4 (darwin 8) or later, + # -single_module is the default and -multi_module is unsupported. + # The toolchain on macOS 10.14 (darwin 18) and later cannot + # target any OS version that needs -single_module. + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*-darwin[[567]].*|10.[[0-3]],*-darwin[[5-9]].*|10.[[0-3]],*-darwin1[[0-7]].*) + _lt_dar_needs_single_mod=yes ;; + esac + ;; + esac if test yes = "$lt_cv_ld_exported_symbols_list"; then _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' else @@ -1125,12 +1157,12 @@ m4_defun([_LT_DARWIN_LINKER_FEATURES], output_verbose_link_cmd=func_echo_all _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" - _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" - _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" + _LT_TAGVAR(archive_expsym_cmds, $1)="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" + _LT_TAGVAR(module_expsym_cmds, $1)="$SED -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" m4_if([$1], [CXX], -[ if test yes != "$lt_cv_apple_cc_single_mod"; then +[ if test yes = "$_lt_dar_needs_single_mod" -a yes != "$lt_cv_apple_cc_single_mod"; then _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil" - _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil" + _LT_TAGVAR(archive_expsym_cmds, $1)="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil" fi ],[]) else @@ -1244,7 +1276,8 @@ _LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) # _LT_WITH_SYSROOT # ---------------- AC_DEFUN([_LT_WITH_SYSROOT], -[AC_MSG_CHECKING([for sysroot]) +[m4_require([_LT_DECL_SED])dnl +AC_MSG_CHECKING([for sysroot]) AC_ARG_WITH([sysroot], [AS_HELP_STRING([--with-sysroot@<:@=DIR@:>@], [Search for dependent libraries within DIR (or the compiler's sysroot @@ -1257,11 +1290,13 @@ lt_sysroot= case $with_sysroot in #( yes) if test yes = "$GCC"; then - lt_sysroot=`$CC --print-sysroot 2>/dev/null` + # Trim trailing / since we'll always append absolute paths and we want + # to avoid //, if only for less confusing output for the user. + lt_sysroot=`$CC --print-sysroot 2>/dev/null | $SED 's:/\+$::'` fi ;; #( /*) - lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + lt_sysroot=`echo "$with_sysroot" | $SED -e "$sed_quote_subst"` ;; #( no|'') ;; #( @@ -1291,7 +1326,7 @@ ia64-*-hpux*) # options accordingly. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then - case `/usr/bin/file conftest.$ac_objext` in + case `$FILECMD conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE=32 ;; @@ -1308,7 +1343,7 @@ ia64-*-hpux*) echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test yes = "$lt_cv_prog_gnu_ld"; then - case `/usr/bin/file conftest.$ac_objext` in + case `$FILECMD conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; @@ -1320,7 +1355,7 @@ ia64-*-hpux*) ;; esac else - case `/usr/bin/file conftest.$ac_objext` in + case `$FILECMD conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; @@ -1342,7 +1377,7 @@ mips64*-*linux*) echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then emul=elf - case `/usr/bin/file conftest.$ac_objext` in + case `$FILECMD conftest.$ac_objext` in *32-bit*) emul="${emul}32" ;; @@ -1350,7 +1385,7 @@ mips64*-*linux*) emul="${emul}64" ;; esac - case `/usr/bin/file conftest.$ac_objext` in + case `$FILECMD conftest.$ac_objext` in *MSB*) emul="${emul}btsmip" ;; @@ -1358,7 +1393,7 @@ mips64*-*linux*) emul="${emul}ltsmip" ;; esac - case `/usr/bin/file conftest.$ac_objext` in + case `$FILECMD conftest.$ac_objext` in *N32*) emul="${emul}n32" ;; @@ -1369,7 +1404,7 @@ mips64*-*linux*) ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ -s390*-*linux*|s390*-*tpf*|sparc*-*linux*) +s390*-*linux*|s390*-*tpf*|sparc*-*linux*|x86_64-gnu*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. Note that the listed cases only cover the # situations where additional linker options are needed (such as when @@ -1378,14 +1413,14 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # not appear in the list. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then - case `/usr/bin/file conftest.o` in + case `$FILECMD conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; - x86_64-*linux*) - case `/usr/bin/file conftest.o` in + x86_64-*linux*|x86_64-gnu*) + case `$FILECMD conftest.o` in *x86-64*) LD="${LD-ld} -m elf32_x86_64" ;; @@ -1413,7 +1448,7 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; - x86_64-*linux*) + x86_64-*linux*|x86_64-gnu*) LD="${LD-ld} -m elf_x86_64" ;; powerpcle-*linux*) @@ -1453,7 +1488,7 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # options accordingly. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then - case `/usr/bin/file conftest.o` in + case `$FILECMD conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) @@ -1492,9 +1527,22 @@ need_locks=$enable_libtool_lock m4_defun([_LT_PROG_AR], [AC_CHECK_TOOLS(AR, [ar], false) : ${AR=ar} -: ${AR_FLAGS=cru} _LT_DECL([], [AR], [1], [The archiver]) -_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) + +# Use ARFLAGS variable as AR's operation code to sync the variable naming with +# Automake. If both AR_FLAGS and ARFLAGS are specified, AR_FLAGS should have +# higher priority because that's what people were doing historically (setting +# ARFLAGS for automake and AR_FLAGS for libtool). FIXME: Make the AR_FLAGS +# variable obsoleted/removed. + +test ${AR_FLAGS+y} || AR_FLAGS=${ARFLAGS-cr} +lt_ar_flags=$AR_FLAGS +_LT_DECL([], [lt_ar_flags], [0], [Flags to create an archive (by configure)]) + +# Make AR_FLAGS overridable by 'make ARFLAGS='. Don't try to run-time override +# by AR_FLAGS because that was never working and AR_FLAGS is about to die. +_LT_DECL([], [AR_FLAGS], [\@S|@{ARFLAGS-"\@S|@lt_ar_flags"}], + [Flags to create an archive]) AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], [lt_cv_ar_at_file=no @@ -1533,7 +1581,7 @@ AC_CHECK_TOOL(STRIP, strip, :) test -z "$STRIP" && STRIP=: _LT_DECL([], [STRIP], [1], [A symbol stripping program]) -AC_CHECK_TOOL(RANLIB, ranlib, :) +AC_REQUIRE([AC_PROG_RANLIB]) test -z "$RANLIB" && RANLIB=: _LT_DECL([], [RANLIB], [1], [Commands used to install an old-style archive]) @@ -1544,15 +1592,8 @@ old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then - case $host_os in - bitrig* | openbsd*) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" - ;; - *) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" - ;; - esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in @@ -1684,14 +1725,14 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; - gnu*) - # Under GNU Hurd, this test is not required because there is - # no limit to the length of command line arguments. + gnu* | ironclad*) + # Under GNU Hurd and Ironclad, this test is not required because there + # is no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; - cygwin* | mingw* | cegcc*) + cygwin* | mingw* | windows* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, @@ -1713,7 +1754,7 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl lt_cv_sys_max_cmd_len=8192; ;; - bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) + darwin* | dragonfly* | freebsd* | midnightbsd* | netbsd* | openbsd*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` @@ -1756,7 +1797,7 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then - lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` + lt_cv_sys_max_cmd_len=`echo $kargmax | $SED 's/.*[[ ]]//'` else lt_cv_sys_max_cmd_len=32768 fi @@ -1873,11 +1914,11 @@ else /* When -fvisibility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) -int fnord () __attribute__((visibility("default"))); +int fnord (void) __attribute__((visibility("default"))); #endif -int fnord () { return 42; } -int main () +int fnord (void) { return 42; } +int main (void) { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; @@ -1934,7 +1975,7 @@ else lt_cv_dlopen_self=yes ;; - mingw* | pw32* | cegcc*) + mingw* | windows* | pw32* | cegcc*) lt_cv_dlopen=LoadLibrary lt_cv_dlopen_libs= ;; @@ -2206,26 +2247,35 @@ m4_defun([_LT_CMD_STRIPLIB], striplib= old_striplib= AC_MSG_CHECKING([whether stripping libraries is possible]) -if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then - test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" - test -z "$striplib" && striplib="$STRIP --strip-unneeded" - AC_MSG_RESULT([yes]) +if test -z "$STRIP"; then + AC_MSG_RESULT([no]) else -# FIXME - insert some real tests, host_os isn't really good enough - case $host_os in - darwin*) - if test -n "$STRIP"; then + if $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + old_striplib="$STRIP --strip-debug" + striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) + else + case $host_os in + darwin*) + # FIXME - insert some real tests, host_os isn't really good enough striplib="$STRIP -x" old_striplib="$STRIP -S" AC_MSG_RESULT([yes]) - else + ;; + freebsd*) + if $STRIP -V 2>&1 | $GREP "elftoolchain" >/dev/null; then + old_striplib="$STRIP --strip-debug" + striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + fi + ;; + *) AC_MSG_RESULT([no]) - fi - ;; - *) - AC_MSG_RESULT([no]) - ;; - esac + ;; + esac + fi fi _LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) _LT_DECL([], [striplib], [1]) @@ -2293,7 +2343,7 @@ if test yes = "$GCC"; then *) lt_awk_arg='/^libraries:/' ;; esac case $host_os in - mingw* | cegcc*) lt_sed_strip_eq='s|=\([[A-Za-z]]:\)|\1|g' ;; + mingw* | windows* | cegcc*) lt_sed_strip_eq='s|=\([[A-Za-z]]:\)|\1|g' ;; *) lt_sed_strip_eq='s|=/|/|g' ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` @@ -2351,7 +2401,7 @@ BEGIN {RS = " "; FS = "/|\n";} { # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in - mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + mingw* | windows* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's|/\([[A-Za-z]]:\)|\1|g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` @@ -2426,7 +2476,7 @@ aix[[4-9]]*) # Unfortunately, runtime linking may impact performance, so we do # not want this to be the default eventually. Also, we use the # versioned .so libs for executables only if there is the -brtl - # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. + # linker flag in LDFLAGS as well, or --enable-aix-soname=svr4 only. # To allow for filename-based versioning support, we need to create # libNAME.so.V as an archive file, containing: # *) an Import File, referring to the versioned filename of the @@ -2520,7 +2570,7 @@ bsdi[[45]]*) # libtool to hard-code these into programs ;; -cygwin* | mingw* | pw32* | cegcc*) +cygwin* | mingw* | windows* | pw32* | cegcc*) version_type=windows shrext_cmds=.dll need_version=no @@ -2531,15 +2581,29 @@ cygwin* | mingw* | pw32* | cegcc*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \$file`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname~ - chmod a+x \$dldir/$dlname~ - if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then - eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; - fi' + # If user builds GCC with multilib enabled, + # it should just install on $(libdir) + # not on $(libdir)/../bin or 32 bits dlls would override 64 bit ones. + if test xyes = x"$multilib"; then + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + $install_prog $dir/$dlname $destdir/$dlname~ + chmod a+x $destdir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib $destdir/$dlname'\'' || exit \$?; + fi' + else + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + fi postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' @@ -2548,30 +2612,30 @@ cygwin* | mingw* | pw32* | cegcc*) case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' - soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' + soname_spec='`echo $libname | $SED -e 's/^lib/cyg/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) ;; - mingw* | cegcc*) + mingw* | windows* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' - library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' + library_names_spec='`echo $libname | $SED -e 's/^lib/pw/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' ;; esac dynamic_linker='Win32 ld.exe' ;; - *,cl*) - # Native MSVC + *,cl* | *,icl*) + # Native MSVC or ICC libname_spec='$name' soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' library_names_spec='$libname.dll.lib' case $build_os in - mingw*) + mingw* | windows*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' @@ -2584,7 +2648,7 @@ m4_if([$1], [],[ done IFS=$lt_save_ifs # Convert to MSYS style. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form @@ -2621,7 +2685,7 @@ m4_if([$1], [],[ ;; *) - # Assume MSVC wrapper + # Assume MSVC and ICC wrapper library_names_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext $libname.lib' dynamic_linker='Win32 ld.exe' ;; @@ -2654,7 +2718,7 @@ dgux*) shlibpath_var=LD_LIBRARY_PATH ;; -freebsd* | dragonfly*) +freebsd* | dragonfly* | midnightbsd*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then @@ -2678,7 +2742,21 @@ freebsd* | dragonfly*) need_version=yes ;; esac - shlibpath_var=LD_LIBRARY_PATH + case $host_cpu in + powerpc64) + # On FreeBSD bi-arch platforms, a different variable is used for 32-bit + # binaries. See . + AC_COMPILE_IFELSE( + [AC_LANG_SOURCE( + [[int test_pointer_size[sizeof (void *) - 5]; + ]])], + [shlibpath_var=LD_LIBRARY_PATH], + [shlibpath_var=LD_32_LIBRARY_PATH]) + ;; + *) + shlibpath_var=LD_LIBRARY_PATH + ;; + esac case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes @@ -2708,8 +2786,9 @@ haiku*) soname_spec='$libname$release$shared_ext$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=no - sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' - hardcode_into_libs=yes + sys_lib_search_path_spec='/boot/system/non-packaged/develop/lib /boot/system/develop/lib' + sys_lib_dlsearch_path_spec='/boot/home/config/non-packaged/lib /boot/home/config/lib /boot/system/non-packaged/lib /boot/system/lib' + hardcode_into_libs=no ;; hpux9* | hpux10* | hpux11*) @@ -2819,7 +2898,7 @@ linux*android*) version_type=none # Android doesn't support versioned libraries. need_lib_prefix=no need_version=no - library_names_spec='$libname$release$shared_ext' + library_names_spec='$libname$release$shared_ext $libname$shared_ext' soname_spec='$libname$release$shared_ext' finish_cmds= shlibpath_var=LD_LIBRARY_PATH @@ -2831,8 +2910,9 @@ linux*android*) hardcode_into_libs=yes dynamic_linker='Android linker' - # Don't embed -rpath directories since the linker doesn't support them. - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + # -rpath works at least for libraries that are not overridden by + # libraries installed in system locations. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' ;; # This must be glibc/ELF. @@ -2890,8 +2970,8 @@ netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes @@ -2916,6 +2996,18 @@ netbsd*) hardcode_into_libs=yes ;; +*-mlibc) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='mlibc ld.so' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' @@ -2935,7 +3027,7 @@ newsos6) dynamic_linker='ldqnx.so' ;; -openbsd* | bitrig*) +openbsd*) version_type=sunos sys_lib_dlsearch_path_spec=/usr/lib need_lib_prefix=no @@ -2995,6 +3087,17 @@ rdos*) dynamic_linker=no ;; +serenity*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + dynamic_linker='SerenityOS LibELF' + ;; + solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no @@ -3092,6 +3195,21 @@ uts4*) shlibpath_var=LD_LIBRARY_PATH ;; +emscripten*) + version_type=none + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + dynamic_linker="Emscripten linker" + _LT_COMPILER_PIC($1)='-fPIC' + _LT_TAGVAR(archive_cmds, $1)='$CC -sSIDE_MODULE=2 -shared $libobjs $deplibs $compiler_flags -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$SED "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -sSIDE_MODULE=2 -shared $libobjs $deplibs $compiler_flags -o $lib -s EXPORTED_FUNCTIONS=@$output_objdir/$soname.expsym' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(no_undefined_flag, $1)= + ;; + *) dynamic_linker=no ;; @@ -3267,7 +3385,7 @@ if test yes = "$GCC"; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in - *-*-mingw*) + *-*-mingw* | *-*-windows*) # gcc leaves a trailing carriage return, which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) @@ -3376,7 +3494,7 @@ case $reload_flag in esac reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in - cygwin* | mingw* | pw32* | cegcc*) + cygwin* | mingw* | windows* | pw32* | cegcc*) if test yes != "$GCC"; then reload_cmds=false fi @@ -3448,7 +3566,6 @@ lt_cv_deplibs_check_method='unknown' # 'none' -- dependencies not supported. # 'unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. -# 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # that responds to the $file_magic_cmd with a given extended regex. # If you have 'file' or equivalent on your system and you're not sure @@ -3465,7 +3582,7 @@ beos*) bsdi[[45]]*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)' - lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_cmd='$FILECMD -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; @@ -3475,7 +3592,7 @@ cygwin*) lt_cv_file_magic_cmd='func_win32_libid' ;; -mingw* | pw32*) +mingw* | windows* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. @@ -3484,7 +3601,7 @@ mingw* | pw32*) lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. - lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64|pe-aarch64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; @@ -3499,14 +3616,14 @@ darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; -freebsd* | dragonfly*) +freebsd* | dragonfly* | midnightbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' - lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_cmd=$FILECMD lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac @@ -3520,7 +3637,7 @@ haiku*) ;; hpux10.20* | hpux11*) - lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_cmd=$FILECMD case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' @@ -3557,6 +3674,10 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; +*-mlibc) + lt_cv_deplibs_check_method=pass_all + ;; + netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' @@ -3567,7 +3688,7 @@ netbsd* | netbsdelf*-gnu) newos6*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' - lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_cmd=$FILECMD lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; @@ -3575,7 +3696,7 @@ newos6*) lt_cv_deplibs_check_method=pass_all ;; -openbsd* | bitrig*) +openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else @@ -3591,6 +3712,10 @@ rdos*) lt_cv_deplibs_check_method=pass_all ;; +serenity*) + lt_cv_deplibs_check_method=pass_all + ;; + solaris*) lt_cv_deplibs_check_method=pass_all ;; @@ -3639,7 +3764,7 @@ file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in - mingw* | pw32*) + mingw* | windows* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else @@ -3691,16 +3816,16 @@ else # Tru64's nm complains that /dev/null is an invalid object file # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty case $build_os in - mingw*) lt_bad_file=conftest.nm/nofile ;; + mingw* | windows*) lt_bad_file=conftest.nm/nofile ;; *) lt_bad_file=/dev/null ;; esac - case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in + case `"$tmp_nm" -B $lt_bad_file 2>&1 | $SED '1q'` in *$lt_bad_file* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break 2 ;; *) - case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + case `"$tmp_nm" -p /dev/null 2>&1 | $SED '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break 2 @@ -3726,7 +3851,7 @@ else # Let the user override the test. else AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) - case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in + case `$DUMPBIN -symbols -headers /dev/null 2>&1 | $SED '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols -headers" ;; @@ -3782,7 +3907,7 @@ lt_cv_sharedlib_from_linklib_cmd, [lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in -cygwin* | mingw* | pw32* | cegcc*) +cygwin* | mingw* | windows* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh; # decide which one to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in @@ -3814,16 +3939,16 @@ _LT_DECL([], [sharedlib_from_linklib_cmd], [1], m4_defun([_LT_PATH_MANIFEST_TOOL], [AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt -AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], - [lt_cv_path_mainfest_tool=no +AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_manifest_tool], + [lt_cv_path_manifest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&AS_MESSAGE_LOG_FD if $GREP 'Manifest Tool' conftest.out > /dev/null; then - lt_cv_path_mainfest_tool=yes + lt_cv_path_manifest_tool=yes fi rm -f conftest*]) -if test yes != "$lt_cv_path_mainfest_tool"; then +if test yes != "$lt_cv_path_manifest_tool"; then MANIFEST_TOOL=: fi _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl @@ -3852,7 +3977,7 @@ AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in -*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) +*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-mingw* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) @@ -3927,7 +4052,7 @@ case $host_os in aix*) symcode='[[BCDT]]' ;; -cygwin* | mingw* | pw32* | cegcc*) +cygwin* | mingw* | windows* | pw32* | cegcc*) symcode='[[ABCDGISTW]]' ;; hpux*) @@ -3942,7 +4067,7 @@ osf*) symcode='[[BCDEGQRST]]' ;; solaris*) - symcode='[[BDRT]]' + symcode='[[BCDRT]]' ;; sco3.2v5*) symcode='[[DT]]' @@ -3966,7 +4091,7 @@ esac if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Gets list of data symbols to import. - lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" + lt_cv_sys_global_symbol_to_import="$SED -n -e 's/^I .* \(.*\)$/\1/p'" # Adjust the below global symbol transforms to fixup imported variables. lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" @@ -3984,20 +4109,20 @@ fi # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. -lt_cv_sys_global_symbol_to_cdecl="sed -n"\ +lt_cv_sys_global_symbol_to_cdecl="$SED -n"\ $lt_cdecl_hook\ " -e 's/^T .* \(.*\)$/extern int \1();/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address -lt_cv_sys_global_symbol_to_c_name_address="sed -n"\ +lt_cv_sys_global_symbol_to_c_name_address="$SED -n"\ $lt_c_name_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" # Transform an extracted symbol line into symbol name with lib prefix and # symbol address. -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="$SED -n"\ $lt_c_name_lib_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ @@ -4006,7 +4131,7 @@ $lt_c_name_lib_hook\ # Handle CRLF in mingw tool chain opt_cr= case $build_os in -mingw*) +mingw* | windows*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac @@ -4021,7 +4146,7 @@ for ac_symprfx in "" "_"; do if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function, # D for any global variable and I for any imported variable. - # Also find C++ and __fastcall symbols from MSVC++, + # Also find C++ and __fastcall symbols from MSVC++ or ICC, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK ['"\ " {last_section=section; section=\$ 3};"\ @@ -4039,9 +4164,9 @@ for ac_symprfx in "" "_"; do " s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx]" else - lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + lt_cv_sys_global_symbol_pipe="$SED -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi - lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | $SED '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no @@ -4057,13 +4182,14 @@ void nm_test_func(void){} #ifdef __cplusplus } #endif -int main(){nm_test_var='a';nm_test_func();return(0);} +int main(void){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if AC_TRY_EVAL(ac_compile); then # Now try to grab the symbols. nlist=conftest.nm - if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then + $ECHO "$as_me:$LINENO: $NM conftest.$ac_objext | $lt_cv_sys_global_symbol_pipe > $nlist" >&AS_MESSAGE_LOG_FD + if eval "$NM" conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist 2>&AS_MESSAGE_LOG_FD && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" @@ -4233,7 +4359,7 @@ m4_if([$1], [CXX], [ beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; - mingw* | cygwin* | os2* | pw32* | cegcc*) + mingw* | windows* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style @@ -4309,7 +4435,7 @@ m4_if([$1], [CXX], [ ;; esac ;; - mingw* | cygwin* | os2* | pw32* | cegcc*) + mingw* | windows* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], @@ -4328,7 +4454,7 @@ m4_if([$1], [CXX], [ ;; esac ;; - freebsd* | dragonfly*) + freebsd* | dragonfly* | midnightbsd*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) @@ -4411,7 +4537,7 @@ m4_if([$1], [CXX], [ _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) - case `$CC -V 2>&1 | sed 5q` in + case `$CC -V 2>&1 | $SED 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' @@ -4437,6 +4563,8 @@ m4_if([$1], [CXX], [ ;; netbsd* | netbsdelf*-gnu) ;; + *-mlibc) + ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. @@ -4465,6 +4593,8 @@ m4_if([$1], [CXX], [ ;; psos*) ;; + serenity*) + ;; solaris*) case $cc_basename in CC* | sunCC*) @@ -4557,7 +4687,7 @@ m4_if([$1], [CXX], [ # PIC is the default for these OSes. ;; - mingw* | cygwin* | pw32* | os2* | cegcc*) + mingw* | windows* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style @@ -4661,7 +4791,7 @@ m4_if([$1], [CXX], [ esac ;; - mingw* | cygwin* | pw32* | os2* | cegcc*) + mingw* | windows* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], @@ -4703,6 +4833,12 @@ m4_if([$1], [CXX], [ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; + *flang* | ftn | f18* | f95*) + # Flang compiler. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) @@ -4747,7 +4883,7 @@ m4_if([$1], [CXX], [ _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) - case `$CC -V 2>&1 | sed 5q` in + case `$CC -V 2>&1 | $SED 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' @@ -4785,6 +4921,12 @@ m4_if([$1], [CXX], [ _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; + *-mlibc) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. @@ -4801,6 +4943,9 @@ m4_if([$1], [CXX], [ _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; + serenity*) + ;; + solaris*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' @@ -4930,15 +5075,15 @@ m4_if([$1], [CXX], [ if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else - _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi ;; pw32*) _LT_TAGVAR(export_symbols_cmds, $1)=$ltdll_cmds ;; - cygwin* | mingw* | cegcc*) + cygwin* | mingw* | windows* | cegcc*) case $cc_basename in - cl*) + cl* | icl*) _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) @@ -4947,9 +5092,6 @@ m4_if([$1], [CXX], [ ;; esac ;; - linux* | k*bsd*-gnu | gnu*) - _LT_TAGVAR(link_all_deplibs, $1)=no - ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; @@ -4997,24 +5139,18 @@ dnl Note also adjust exclude_expsyms for C++ above. extract_expsyms_cmds= case $host_os in - cygwin* | mingw* | pw32* | cegcc*) - # FIXME: the MSVC++ port hasn't been tested in a loooong time + cygwin* | mingw* | windows* | pw32* | cegcc*) + # FIXME: the MSVC++ and ICC port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. + # Microsoft Visual C++ or Intel C++ Compiler. if test yes != "$GCC"; then with_gnu_ld=no fi ;; interix*) - # we just hope/assume this is gcc and not c89 (= MSVC++) + # we just hope/assume this is gcc and not c89 (= MSVC++ or ICC) with_gnu_ld=yes ;; - openbsd* | bitrig*) - with_gnu_ld=no - ;; - linux* | k*bsd*-gnu | gnu*) - _LT_TAGVAR(link_all_deplibs, $1)=no - ;; esac _LT_TAGVAR(ld_shlibs, $1)=yes @@ -5061,7 +5197,7 @@ dnl Note also adjust exclude_expsyms for C++ above. _LT_TAGVAR(whole_archive_flag_spec, $1)= fi supports_anon_versioning=no - case `$LD -v | $SED -e 's/([^)]\+)\s\+//' 2>&1` in + case `$LD -v | $SED -e 's/([[^)]]\+)\s\+//' 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... @@ -5115,7 +5251,7 @@ _LT_EOF fi ;; - cygwin* | mingw* | pw32* | cegcc*) + cygwin* | mingw* | windows* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' @@ -5125,6 +5261,7 @@ _LT_EOF _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] + _LT_TAGVAR(file_list_spec, $1)='@' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' @@ -5144,7 +5281,7 @@ _LT_EOF haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' - _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(link_all_deplibs, $1)=no ;; os2*) @@ -5171,8 +5308,9 @@ _LT_EOF cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' - _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' ;; interix[[3-9]]*) @@ -5187,7 +5325,7 @@ _LT_EOF # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$SED "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) @@ -5230,7 +5368,7 @@ _LT_EOF _LT_TAGVAR(compiler_needs_object, $1)=yes ;; esac - case `$CC -V 2>&1 | sed 5q` in + case `$CC -V 2>&1 | $SED 5q` in *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes @@ -5242,13 +5380,14 @@ _LT_EOF if test yes = "$supports_anon_versioning"; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi case $cc_basename in tcc*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='-rdynamic' ;; xlf* | bgf* | bgxlf* | mpixlf*) @@ -5258,7 +5397,7 @@ _LT_EOF _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test yes = "$supports_anon_versioning"; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi @@ -5269,6 +5408,11 @@ _LT_EOF fi ;; + *-mlibc) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' @@ -5390,7 +5534,7 @@ _LT_EOF if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else - _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no @@ -5571,14 +5715,14 @@ _LT_EOF _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; - cygwin* | mingw* | pw32* | cegcc*) + cygwin* | mingw* | windows* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. + # Microsoft Visual C++ or Intel C++ Compiler. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in - cl*) - # Native MSVC + cl* | icl*) + # Native MSVC or ICC _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes @@ -5588,14 +5732,14 @@ _LT_EOF # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. - _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + _LT_TAGVAR(archive_cmds, $1)='$CC -Fe$output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; fi~ - $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + $CC -Fe$tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' @@ -5619,7 +5763,7 @@ _LT_EOF fi' ;; *) - # Assume MSVC wrapper + # Assume MSVC and ICC wrapper _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Tell ltmain to make .lib files, not .a files. @@ -5667,7 +5811,7 @@ _LT_EOF ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. - freebsd* | dragonfly*) + freebsd* | dragonfly* | midnightbsd*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes @@ -5790,7 +5934,6 @@ _LT_EOF if test yes = "$lt_cv_irix_exported_symbol"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' fi - _LT_TAGVAR(link_all_deplibs, $1)=no else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' @@ -5808,10 +5951,14 @@ _LT_EOF # Fabrice Bellard et al's Tiny C Compiler _LT_TAGVAR(ld_shlibs, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' ;; esac ;; + *-mlibc) + ;; + netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out @@ -5834,7 +5981,7 @@ _LT_EOF *nto* | *qnx*) ;; - openbsd* | bitrig*) + openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no @@ -5877,8 +6024,9 @@ _LT_EOF cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' - _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' ;; osf3*) @@ -5912,6 +6060,9 @@ _LT_EOF _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; + serenity*) + ;; + solaris*) _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' if test yes = "$GCC"; then @@ -6170,7 +6321,7 @@ _LT_TAGDECL([], [hardcode_direct], [0], _LT_TAGDECL([], [hardcode_direct_absolute], [0], [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes DIR into the resulting binary and the resulting library dependency is - "absolute", i.e impossible to change by setting $shlibpath_var if the + "absolute", i.e. impossible to change by setting $shlibpath_var if the library is relocated]) _LT_TAGDECL([], [hardcode_minus_L], [0], [Set to "yes" if using the -LDIR flag during linking hardcodes DIR @@ -6228,7 +6379,7 @@ _LT_TAGVAR(objext, $1)=$objext lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests -lt_simple_link_test_code='int main(){return(0);}' +lt_simple_link_test_code='int main(void){return(0);}' _LT_TAG_COMPILER # Save the default compiler, since it gets overwritten when the other @@ -6417,8 +6568,7 @@ if test yes != "$_lt_caught_CXX_error"; then wlarc='$wl' # ancient GNU ld didn't support --whole-archive et. al. - if eval "`$CC -print-prog-name=ld` --help 2>&1" | - $GREP 'no-whole-archive' > /dev/null; then + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= @@ -6438,7 +6588,7 @@ if test yes != "$_lt_caught_CXX_error"; then # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " [[-]]L"' else GXX=no @@ -6647,10 +6797,10 @@ if test yes != "$_lt_caught_CXX_error"; then esac ;; - cygwin* | mingw* | pw32* | cegcc*) + cygwin* | mingw* | windows* | pw32* | cegcc*) case $GXX,$cc_basename in - ,cl* | no,cl*) - # Native MSVC + ,cl* | no,cl* | ,icl* | no,icl*) + # Native MSVC or ICC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' @@ -6700,6 +6850,7 @@ if test yes != "$_lt_caught_CXX_error"; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' @@ -6746,8 +6897,9 @@ if test yes != "$_lt_caught_CXX_error"; then cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' - _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' ;; dgux*) @@ -6778,7 +6930,7 @@ if test yes != "$_lt_caught_CXX_error"; then _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; - freebsd* | dragonfly*) + freebsd* | dragonfly* | midnightbsd*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_TAGVAR(ld_shlibs, $1)=yes @@ -6786,7 +6938,7 @@ if test yes != "$_lt_caught_CXX_error"; then haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' - _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(link_all_deplibs, $1)=no ;; hpux9*) @@ -6813,7 +6965,7 @@ if test yes != "$_lt_caught_CXX_error"; then # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "[[-]]L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes = "$GXX"; then @@ -6878,7 +7030,7 @@ if test yes != "$_lt_caught_CXX_error"; then # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP " [[-]]L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes = "$GXX"; then @@ -6915,7 +7067,7 @@ if test yes != "$_lt_caught_CXX_error"; then # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$SED "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in @@ -7055,13 +7207,13 @@ if test yes != "$_lt_caught_CXX_error"; then _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' if test yes = "$supports_anon_versioning"; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi ;; *) - case `$CC -V 2>&1 | sed 5q` in + case `$CC -V 2>&1 | $SED 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' @@ -7110,6 +7262,10 @@ if test yes != "$_lt_caught_CXX_error"; then esac ;; + *-mlibc) + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' @@ -7126,7 +7282,7 @@ if test yes != "$_lt_caught_CXX_error"; then _LT_TAGVAR(ld_shlibs, $1)=yes ;; - openbsd* | bitrig*) + openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no @@ -7217,7 +7373,7 @@ if test yes != "$_lt_caught_CXX_error"; then # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " [[-]]L"' else # FIXME: insert proper C++ library support @@ -7232,6 +7388,9 @@ if test yes != "$_lt_caught_CXX_error"; then _LT_TAGVAR(ld_shlibs, $1)=no ;; + serenity*) + ;; + sunos4*) case $cc_basename in CC*) @@ -7301,7 +7460,7 @@ if test yes != "$_lt_caught_CXX_error"; then # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " [[-]]L"' else # g++ 2.7 appears to require '-G' NOT '-shared' on this # platform. @@ -7312,7 +7471,7 @@ if test yes != "$_lt_caught_CXX_error"; then # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. - output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " [[-]]L"' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $wl$libdir' @@ -7550,10 +7709,11 @@ if AC_TRY_EVAL(ac_compile); then case $prev$p in -L* | -R* | -l*) - # Some compilers place space between "-{L,R}" and the path. + # Some compilers place space between "-{L,R,l}" and the path. # Remove the space. - if test x-L = "$p" || - test x-R = "$p"; then + if test x-L = x"$p" || + test x-R = x"$p" || + test x-l = x"$p"; then prev=$p continue fi @@ -8207,6 +8367,14 @@ _LT_DECL([], [DLLTOOL], [1], [DLL creation program]) AC_SUBST([DLLTOOL]) ]) +# _LT_DECL_FILECMD +# ---------------- +# Check for a file(cmd) program that can be used to detect file type and magic +m4_defun([_LT_DECL_FILECMD], +[AC_CHECK_PROG([FILECMD], [file], [file], [:]) +_LT_DECL([], [FILECMD], [1], [A file(cmd) program that detects file types]) +])# _LD_DECL_FILECMD + # _LT_DECL_SED # ------------ # Check for a fully-functional sed program, that truncates @@ -8219,73 +8387,6 @@ _LT_DECL([], [SED], [1], [A sed program that does not truncate output]) _LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], [Sed that helps us avoid accidentally triggering echo(1) options like -n]) ])# _LT_DECL_SED - -m4_ifndef([AC_PROG_SED], [ -############################################################ -# NOTE: This macro has been submitted for inclusion into # -# GNU Autoconf as AC_PROG_SED. When it is available in # -# a released version of Autoconf we should remove this # -# macro and use it instead. # -############################################################ - -m4_defun([AC_PROG_SED], -[AC_MSG_CHECKING([for a sed that does not truncate output]) -AC_CACHE_VAL(lt_cv_path_SED, -[# Loop through the user's path and test for sed and gsed. -# Then use that list of sed's as ones to test for truncation. -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for lt_ac_prog in sed gsed; do - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then - lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" - fi - done - done -done -IFS=$as_save_IFS -lt_ac_max=0 -lt_ac_count=0 -# Add /usr/xpg4/bin/sed as it is typically found on Solaris -# along with /bin/sed that truncates output. -for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do - test ! -f "$lt_ac_sed" && continue - cat /dev/null > conftest.in - lt_ac_count=0 - echo $ECHO_N "0123456789$ECHO_C" >conftest.in - # Check for GNU sed and select it if it is found. - if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then - lt_cv_path_SED=$lt_ac_sed - break - fi - while true; do - cat conftest.in conftest.in >conftest.tmp - mv conftest.tmp conftest.in - cp conftest.in conftest.nl - echo >>conftest.nl - $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break - cmp -s conftest.out conftest.nl || break - # 10000 chars as input seems more than enough - test 10 -lt "$lt_ac_count" && break - lt_ac_count=`expr $lt_ac_count + 1` - if test "$lt_ac_count" -gt "$lt_ac_max"; then - lt_ac_max=$lt_ac_count - lt_cv_path_SED=$lt_ac_sed - fi - done -done -]) -SED=$lt_cv_path_SED -AC_SUBST([SED]) -AC_MSG_RESULT([$SED]) -])#AC_PROG_SED -])#m4_ifndef - -# Old name: -AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_SED], []) @@ -8332,7 +8433,7 @@ AC_CACHE_VAL(lt_cv_to_host_file_cmd, [case $host in *-*-mingw* ) case $build in - *-*-mingw* ) # actually msys + *-*-mingw* | *-*-windows* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) @@ -8345,7 +8446,7 @@ AC_CACHE_VAL(lt_cv_to_host_file_cmd, ;; *-*-cygwin* ) case $build in - *-*-mingw* ) # actually msys + *-*-mingw* | *-*-windows* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) @@ -8371,9 +8472,9 @@ AC_CACHE_VAL(lt_cv_to_tool_file_cmd, [#assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in - *-*-mingw* ) + *-*-mingw* | *-*-windows* ) case $build in - *-*-mingw* ) # actually msys + *-*-mingw* | *-*-windows* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac diff --git a/build-aux/ltmain.sh b/build-aux/ltmain.sh index 22589375..939e672e 100644 --- a/build-aux/ltmain.sh +++ b/build-aux/ltmain.sh @@ -1,12 +1,12 @@ -#! /bin/sh +#! /usr/bin/env sh ## DO NOT EDIT - This file generated from ./build-aux/ltmain.in -## by inline-source v2014-01-03.01 +## by inline-source v2019-02-19.15 -# libtool (GNU libtool) 2.4.6 +# libtool (GNU libtool) 2.5.4 # Provide generalized library-building support services. # Written by Gordon Matzigkeit , 1996 -# Copyright (C) 1996-2015 Free Software Foundation, Inc. +# Copyright (C) 1996-2019, 2021-2024 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. @@ -31,8 +31,8 @@ PROGRAM=libtool PACKAGE=libtool -VERSION="2.4.6 Debian-2.4.6-2.1" -package_revision=2.4.6 +VERSION=2.5.4 +package_revision=2.5.4 ## ------ ## @@ -64,34 +64,25 @@ package_revision=2.4.6 # libraries, which are installed to $pkgauxdir. # Set a version string for this script. -scriptversion=2015-10-12.13; # UTC +scriptversion=2019-02-19.15; # UTC # General shell script boiler plate, and helper functions. # Written by Gary V. Vaughan, 2004 -# Copyright (C) 2004-2015 Free Software Foundation, Inc. -# This is free software; see the source for copying conditions. There is NO -# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. - -# As a special exception to the GNU General Public License, if you distribute -# this file as part of a program or library that is built using GNU Libtool, -# you may include this file under the same distribution terms that you use -# for the rest of that program. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNES FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . +# This is free software. There is NO warranty; not even for +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# +# Copyright (C) 2004-2019, 2021, 2023-2024 Bootstrap Authors +# +# This file is dual licensed under the terms of the MIT license +# , and GPL version 2 or later +# . You must apply one of +# these licenses when using or redistributing this software or any of +# the files within it. See the URLs above, or the file `LICENSE` +# included in the Bootstrap distribution for the full license texts. -# Please report bugs or propose patches to gary@gnu.org. +# Please report bugs or propose patches to: +# ## ------ ## @@ -139,9 +130,12 @@ do _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\" fi" done - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH +# These NLS vars are set unconditionally (bootstrap issue #24). Unset those +# in case the environment reset is needed later and the $save_* variant is not +# defined (see the code above). +LC_ALL=C +LANGUAGE=C +export LANGUAGE LC_ALL # Make sure IFS has a sensible default sp=' ' @@ -149,7 +143,7 @@ nl=' ' IFS="$sp $nl" -# There are apparently some retarded systems that use ';' as a PATH separator! +# There are apparently some systems that use ';' as a PATH separator! if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { @@ -159,6 +153,26 @@ if test "${PATH_SEPARATOR+set}" != set; then fi +# func_unset VAR +# -------------- +# Portably unset VAR. +# In some shells, an 'unset VAR' statement leaves a non-zero return +# status if VAR is already unset, which might be problematic if the +# statement is used at the end of a function (thus poisoning its return +# value) or when 'set -e' is active (causing even a spurious abort of +# the script in this case). +func_unset () +{ + { eval $1=; (eval unset $1) >/dev/null 2>&1 && eval unset $1 || : ; } +} + + +# Make sure CDPATH doesn't cause `cd` commands to output the target dir. +func_unset CDPATH + +# Make sure ${,E,F}GREP behave sanely. +func_unset GREP_OPTIONS + ## ------------------------- ## ## Locate command utilities. ## @@ -259,7 +273,7 @@ test -z "$SED" && { rm -f conftest.in conftest.tmp conftest.nl conftest.out } - func_path_progs "sed gsed" func_check_prog_sed $PATH:/usr/xpg4/bin + func_path_progs "sed gsed" func_check_prog_sed "$PATH:/usr/xpg4/bin" rm -f conftest.sed SED=$func_path_progs_result } @@ -295,7 +309,7 @@ test -z "$GREP" && { rm -f conftest.in conftest.tmp conftest.nl conftest.out } - func_path_progs "grep ggrep" func_check_prog_grep $PATH:/usr/xpg4/bin + func_path_progs "grep ggrep" func_check_prog_grep "$PATH:/usr/xpg4/bin" GREP=$func_path_progs_result } @@ -360,6 +374,35 @@ sed_double_backslash="\ s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g s/\n//g" +# require_check_ifs_backslash +# --------------------------- +# Check if we can use backslash as IFS='\' separator, and set +# $check_ifs_backshlash_broken to ':' or 'false'. +require_check_ifs_backslash=func_require_check_ifs_backslash +func_require_check_ifs_backslash () +{ + _G_save_IFS=$IFS + IFS='\' + _G_check_ifs_backshlash='a\\b' + for _G_i in $_G_check_ifs_backshlash + do + case $_G_i in + a) + check_ifs_backshlash_broken=false + ;; + '') + break + ;; + *) + check_ifs_backshlash_broken=: + break + ;; + esac + done + IFS=$_G_save_IFS + require_check_ifs_backslash=: +} + ## ----------------- ## ## Global variables. ## @@ -1100,6 +1143,8 @@ func_quote_portable () { $debug_cmd + $require_check_ifs_backslash + func_quote_portable_result=$2 # one-time-loop (easy break) @@ -1114,9 +1159,12 @@ func_quote_portable () # Quote for eval. case $func_quote_portable_result in *[\\\`\"\$]*) - case $func_quote_portable_result in - *[\[\*\?]*) - func_quote_portable_result=`$ECHO "$func_quote_portable_result" | $SED "$sed_quote_subst"` + # Fallback to sed for $func_check_bs_ifs_broken=:, or when the string + # contains the shell wildcard characters. + case $check_ifs_backshlash_broken$func_quote_portable_result in + :*|*[\[\*\?]*) + func_quote_portable_result=`$ECHO "$func_quote_portable_result" \ + | $SED "$sed_quote_subst"` break ;; esac @@ -1171,10 +1219,27 @@ func_quote_portable () # Quote one ARG (internal). This is equivalent to 'func_quote_arg eval ARG', # but optimized for speed. Result is stored in $func_quotefast_eval. if test xyes = `(x=; printf -v x %q yes; echo x"$x") 2>/dev/null`; then - func_quotefast_eval () - { - printf -v func_quotefast_eval_result %q "$1" - } + printf -v _GL_test_printf_tilde %q '~' + if test '\~' = "$_GL_test_printf_tilde"; then + func_quotefast_eval () + { + printf -v func_quotefast_eval_result %q "$1" + } + else + # Broken older Bash implementations. Make those faster too if possible. + func_quotefast_eval () + { + case $1 in + '~'*) + func_quote_portable false "$1" + func_quotefast_eval_result=$func_quote_portable_result + ;; + *) + printf -v func_quotefast_eval_result %q "$1" + ;; + esac + } + fi else func_quotefast_eval () { @@ -1186,7 +1251,7 @@ fi # func_quote_arg MODEs ARG # ------------------------ -# Quote one ARG to be evaled later. MODEs argument may contain zero ore more +# Quote one ARG to be evaled later. MODEs argument may contain zero or more # specifiers listed below separated by ',' character. This function returns two # values: # i) func_quote_arg_result @@ -1203,8 +1268,8 @@ fi # - the same as 'eval'; but do not quote variable references # 'pretty' # - request aesthetic output, i.e. '"a b"' instead of 'a\ b'. This might -# later used in func_quote to get output like: 'echo "a b"' instead of -# 'echo a\ b'. This is slower than default on some shells. +# be used later in func_quote to get output like: 'echo "a b"' instead +# of 'echo a\ b'. This is slower than default on some shells. # 'unquoted' # - produce also $func_quote_arg_unquoted_result which does not contain # wrapping double-quotes. @@ -1465,30 +1530,26 @@ func_lt_ver () # End: #! /bin/sh -# Set a version string for this script. -scriptversion=2015-10-12.13; # UTC - # A portable, pluggable option parser for Bourne shell. # Written by Gary V. Vaughan, 2010 -# Copyright (C) 2010-2015 Free Software Foundation, Inc. -# This is free software; see the source for copying conditions. There is NO -# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. +# This is free software. There is NO warranty; not even for +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# +# Copyright (C) 2010-2019, 2021, 2023-2024 Bootstrap Authors +# +# This file is dual licensed under the terms of the MIT license +# , and GPL version 2 or later +# . You must apply one of +# these licenses when using or redistributing this software or any of +# the files within it. See the URLs above, or the file `LICENSE` +# included in the Bootstrap distribution for the full license texts. -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . +# Please report bugs or propose patches to: +# -# Please report bugs or propose patches to gary@gnu.org. +# Set a version string for this script. +scriptversion=2019-02-19.15; # UTC ## ------ ## @@ -1511,7 +1572,7 @@ scriptversion=2015-10-12.13; # UTC # # In order for the '--version' option to work, you will need to have a # suitably formatted comment like the one at the top of this file -# starting with '# Written by ' and ending with '# warranty; '. +# starting with '# Written by ' and ending with '# Copyright'. # # For '-h' and '--help' to work, you will also need a one line # description of your script's purpose in a comment directly above the @@ -1523,7 +1584,7 @@ scriptversion=2015-10-12.13; # UTC # to display verbose messages only when your user has specified # '--verbose'. # -# After sourcing this file, you can plug processing for additional +# After sourcing this file, you can plug in processing for additional # options by amending the variables from the 'Configuration' section # below, and following the instructions in the 'Option parsing' # section further down. @@ -1572,8 +1633,8 @@ fatal_help="Try '\$progname --help' for more information." ## ------------------------- ## # This section contains functions for adding, removing, and running hooks -# to the main code. A hook is just a named list of of function, that can -# be run in order later on. +# in the main code. A hook is just a list of function names that can be +# run in order later on. # func_hookable FUNC_NAME # ----------------------- @@ -1606,7 +1667,8 @@ func_add_hook () # func_remove_hook FUNC_NAME HOOK_FUNC # ------------------------------------ -# Remove HOOK_FUNC from the list of functions called by FUNC_NAME. +# Remove HOOK_FUNC from the list of hook functions to be called by +# FUNC_NAME. func_remove_hook () { $debug_cmd @@ -1615,10 +1677,28 @@ func_remove_hook () } +# func_propagate_result FUNC_NAME_A FUNC_NAME_B +# --------------------------------------------- +# If the *_result variable of FUNC_NAME_A _is set_, assign its value to +# *_result variable of FUNC_NAME_B. +func_propagate_result () +{ + $debug_cmd + + func_propagate_result_result=: + if eval "test \"\${${1}_result+set}\" = set" + then + eval "${2}_result=\$${1}_result" + else + func_propagate_result_result=false + fi +} + + # func_run_hooks FUNC_NAME [ARG]... # --------------------------------- # Run all hook functions registered to FUNC_NAME. -# It is assumed that the list of hook functions contains nothing more +# It's assumed that the list of hook functions contains nothing more # than a whitespace-delimited list of legal shell function names, and # no effort is wasted trying to catch shell meta-characters or preserve # whitespace. @@ -1626,26 +1706,21 @@ func_run_hooks () { $debug_cmd - _G_rc_run_hooks=false - case " $hookable_fns " in *" $1 "*) ;; - *) func_fatal_error "'$1' does not support hook functions.n" ;; + *) func_fatal_error "'$1' does not support hook functions." ;; esac eval _G_hook_fns=\$$1_hooks; shift for _G_hook in $_G_hook_fns; do - if eval $_G_hook '"$@"'; then - # store returned options list back into positional - # parameters for next 'cmd' execution. - eval _G_hook_result=\$${_G_hook}_result - eval set dummy "$_G_hook_result"; shift - _G_rc_run_hooks=: + func_unset "${_G_hook}_result" + eval $_G_hook '${1+"$@"}' + func_propagate_result $_G_hook func_run_hooks + if $func_propagate_result_result; then + eval set dummy "$func_run_hooks_result"; shift fi done - - $_G_rc_run_hooks && func_run_hooks_result=$_G_hook_result } @@ -1655,14 +1730,16 @@ func_run_hooks () ## --------------- ## # In order to add your own option parsing hooks, you must accept the -# full positional parameter list in your hook function, you may remove/edit -# any options that you action, and then pass back the remaining unprocessed -# options in '_result', escaped suitably for -# 'eval'. In this case you also must return $EXIT_SUCCESS to let the -# hook's caller know that it should pay attention to -# '_result'. Returning $EXIT_FAILURE signalizes that -# arguments are left untouched by the hook and therefore caller will ignore the -# result variable. +# full positional parameter list from your hook function. You may remove +# or edit any options that you action, and then pass back the remaining +# unprocessed options in '_result', escaped +# suitably for 'eval'. +# +# The '_result' variable is automatically unset +# before your hook gets called; for best performance, only set the +# *_result variable when necessary (i.e. don't call the 'func_quote' +# function unnecessarily because it can be an expensive operation on some +# machines). # # Like this: # @@ -1674,11 +1751,8 @@ func_run_hooks () # usage_message=$usage_message' # -s, --silent don'\''t print informational messages # ' -# # No change in '$@' (ignored completely by this hook). There is -# # no need to do the equivalent (but slower) action: -# # func_quote eval ${1+"$@"} -# # my_options_prep_result=$func_quote_result -# false +# # No change in '$@' (ignored completely by this hook). Leave +# # my_options_prep_result variable intact. # } # func_add_hook func_options_prep my_options_prep # @@ -1689,7 +1763,7 @@ func_run_hooks () # # args_changed=false # -# # Note that for efficiency, we parse as many options as we can +# # Note that, for efficiency, we parse as many options as we can # # recognise in a loop before passing the remainder back to the # # caller on the first unrecognised argument we encounter. # while test $# -gt 0; do @@ -1706,18 +1780,17 @@ func_run_hooks () # args_changed=: # ;; # *) # Make sure the first unrecognised option "$_G_opt" -# # is added back to "$@", we could need that later -# # if $args_changed is true. +# # is added back to "$@" in case we need it later, +# # if $args_changed was set to 'true'. # set dummy "$_G_opt" ${1+"$@"}; shift; break ;; # esac # done # +# # Only call 'func_quote' here if we processed at least one argument. # if $args_changed; then # func_quote eval ${1+"$@"} # my_silent_option_result=$func_quote_result # fi -# -# $args_changed # } # func_add_hook func_parse_options my_silent_option # @@ -1728,8 +1801,6 @@ func_run_hooks () # # $opt_silent && $opt_verbose && func_fatal_help "\ # '--silent' and '--verbose' options are mutually exclusive." -# -# false # } # func_add_hook func_validate_options my_option_validation # @@ -1745,13 +1816,8 @@ func_options_finish () { $debug_cmd - _G_func_options_finish_exit=false - if func_run_hooks func_options ${1+"$@"}; then - func_options_finish_result=$func_run_hooks_result - _G_func_options_finish_exit=: - fi - - $_G_func_options_finish_exit + func_run_hooks func_options ${1+"$@"} + func_propagate_result func_run_hooks func_options_finish } @@ -1764,28 +1830,27 @@ func_options () { $debug_cmd - _G_rc_options=false + _G_options_quoted=false for my_func in options_prep parse_options validate_options options_finish do - if eval func_$my_func '${1+"$@"}'; then - eval _G_res_var='$'"func_${my_func}_result" - eval set dummy "$_G_res_var" ; shift - _G_rc_options=: + func_unset func_${my_func}_result + func_unset func_run_hooks_result + eval func_$my_func '${1+"$@"}' + func_propagate_result func_$my_func func_options + if $func_propagate_result_result; then + eval set dummy "$func_options_result"; shift + _G_options_quoted=: fi done - # Save modified positional parameters for caller. As a top-level - # options-parser function we always need to set the 'func_options_result' - # variable (regardless the $_G_rc_options value). - if $_G_rc_options; then - func_options_result=$_G_res_var - else + $_G_options_quoted || { + # As we (func_options) are top-level options-parser function and + # nobody quoted "$@" for us yet, we need to do it explicitly for + # caller. func_quote eval ${1+"$@"} func_options_result=$func_quote_result - fi - - $_G_rc_options + } } @@ -1795,8 +1860,7 @@ func_options () # Note that when calling hook functions, we pass through the list of # positional parameters. If a hook function modifies that list, and # needs to propagate that back to rest of this script, then the complete -# modified list must be put in 'func_run_hooks_result' before -# returning $EXIT_SUCCESS (otherwise $EXIT_FAILURE is returned). +# modified list must be put in 'func_run_hooks_result' before returning. func_hookable func_options_prep func_options_prep () { @@ -1806,14 +1870,8 @@ func_options_prep () opt_verbose=false opt_warning_types= - _G_rc_options_prep=false - if func_run_hooks func_options_prep ${1+"$@"}; then - _G_rc_options_prep=: - # save modified positional parameters for caller - func_options_prep_result=$func_run_hooks_result - fi - - $_G_rc_options_prep + func_run_hooks func_options_prep ${1+"$@"} + func_propagate_result func_run_hooks func_options_prep } @@ -1825,27 +1883,32 @@ func_parse_options () { $debug_cmd - func_parse_options_result= - - _G_rc_parse_options=false + _G_parse_options_requote=false # this just eases exit handling while test $# -gt 0; do # Defer to hook functions for initial option parsing, so they # get priority in the event of reusing an option name. - if func_run_hooks func_parse_options ${1+"$@"}; then - eval set dummy "$func_run_hooks_result"; shift - _G_rc_parse_options=: + func_run_hooks func_parse_options ${1+"$@"} + func_propagate_result func_run_hooks func_parse_options + if $func_propagate_result_result; then + eval set dummy "$func_parse_options_result"; shift + # Even though we may have changed "$@", we passed the "$@" array + # down into the hook and it quoted it for us (because we are in + # this if-branch). No need to quote it again. + _G_parse_options_requote=false fi # Break out of the loop if we already parsed every option. test $# -gt 0 || break + # We expect that one of the options parsed in this function matches + # and thus we remove _G_opt from "$@" and need to re-quote. _G_match_parse_options=: _G_opt=$1 shift case $_G_opt in --debug|-x) debug_cmd='set -x' - func_echo "enabling shell trace mode" + func_echo "enabling shell trace mode" >&2 $debug_cmd ;; @@ -1856,7 +1919,7 @@ func_parse_options () --warnings|--warning|-W) if test $# = 0 && func_missing_arg $_G_opt; then - _G_rc_parse_options=: + _G_parse_options_requote=: break fi case " $warning_categories $1" in @@ -1911,7 +1974,7 @@ func_parse_options () shift ;; - --) _G_rc_parse_options=: ; break ;; + --) _G_parse_options_requote=: ; break ;; -*) func_fatal_help "unrecognised option: '$_G_opt'" ;; *) set dummy "$_G_opt" ${1+"$@"}; shift _G_match_parse_options=false @@ -1919,17 +1982,16 @@ func_parse_options () ;; esac - $_G_match_parse_options && _G_rc_parse_options=: + if $_G_match_parse_options; then + _G_parse_options_requote=: + fi done - - if $_G_rc_parse_options; then + if $_G_parse_options_requote; then # save modified positional parameters for caller func_quote eval ${1+"$@"} func_parse_options_result=$func_quote_result fi - - $_G_rc_parse_options } @@ -1942,21 +2004,14 @@ func_validate_options () { $debug_cmd - _G_rc_validate_options=false - # Display all warnings if -W was not given. test -n "$opt_warning_types" || opt_warning_types=" $warning_categories" - if func_run_hooks func_validate_options ${1+"$@"}; then - # save modified positional parameters for caller - func_validate_options_result=$func_run_hooks_result - _G_rc_validate_options=: - fi + func_run_hooks func_validate_options ${1+"$@"} + func_propagate_result func_run_hooks func_validate_options # Bail if the options were screwed! $exit_cmd $EXIT_FAILURE - - $_G_rc_validate_options } @@ -2012,8 +2067,8 @@ func_missing_arg () # func_split_equals STRING # ------------------------ -# Set func_split_equals_lhs and func_split_equals_rhs shell variables after -# splitting STRING at the '=' sign. +# Set func_split_equals_lhs and func_split_equals_rhs shell variables +# after splitting STRING at the '=' sign. test -z "$_G_HAVE_XSI_OPS" \ && (eval 'x=a/b/c; test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ @@ -2028,8 +2083,9 @@ then func_split_equals_lhs=${1%%=*} func_split_equals_rhs=${1#*=} - test "x$func_split_equals_lhs" = "x$1" \ - && func_split_equals_rhs= + if test "x$func_split_equals_lhs" = "x$1"; then + func_split_equals_rhs= + fi }' else # ...otherwise fall back to using expr, which is often a shell builtin. @@ -2039,7 +2095,7 @@ else func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'` func_split_equals_rhs= - test "x$func_split_equals_lhs" = "x$1" \ + test "x$func_split_equals_lhs=" = "x$1" \ || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'` } fi #func_split_equals @@ -2065,7 +2121,7 @@ else { $debug_cmd - func_split_short_opt_name=`expr "x$1" : 'x-\(.\)'` + func_split_short_opt_name=`expr "x$1" : 'x\(-.\)'` func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'` } fi #func_split_short_opt @@ -2107,31 +2163,44 @@ func_usage_message () # func_version # ------------ # Echo version message to standard output and exit. +# The version message is extracted from the calling file's header +# comments, with leading '# ' stripped: +# 1. First display the progname and version +# 2. Followed by the header comment line matching /^# Written by / +# 3. Then a blank line followed by the first following line matching +# /^# Copyright / +# 4. Immediately followed by any lines between the previous matches, +# except lines preceding the intervening completely blank line. +# For example, see the header comments of this file. func_version () { $debug_cmd printf '%s\n' "$progname $scriptversion" $SED -n ' - /(C)/!b go - :more - /\./!{ - N - s|\n# | | - b more - } - :go - /^# Written by /,/# warranty; / { - s|^# || - s|^# *$|| - s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2| - p + /^# Written by /!b + s|^# ||; p; n + + :fwd2blnk + /./ { + n + b fwd2blnk } - /^# Written by / { - s|^# || - p + p; n + + :holdwrnt + s|^# || + s|^# *$|| + /^Copyright /!{ + /./H + n + b holdwrnt } - /^warranty; /q' < "$progpath" + + s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2| + G + s|\(\n\)\n*|\1|g + p; q' < "$progpath" exit $? } @@ -2141,12 +2210,35 @@ func_version () # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) -# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" +# time-stamp-pattern: "30/scriptversion=%:y-%02m-%02d.%02H; # UTC" # time-stamp-time-zone: "UTC" # End: # Set a version string. -scriptversion='(GNU libtool) 2.4.6' +scriptversion='(GNU libtool) 2.5.4' + +# func_version +# ------------ +# Echo version message to standard output and exit. +func_version () +{ + $debug_cmd + + year=`date +%Y` + + cat < +This is free software: you are free to change and redistribute it. +There is NO WARRANTY, to the extent permitted by law. + +Originally written by Gordon Matzigkeit, 1996 +(See AUTHORS for complete contributor listing) +EOF + + exit $? +} # func_echo ARG... @@ -2169,18 +2261,6 @@ func_echo () } -# func_warning ARG... -# ------------------- -# Libtool warnings are not categorized, so override funclib.sh -# func_warning with this simpler definition. -func_warning () -{ - $debug_cmd - - $warning_func ${1+"$@"} -} - - ## ---------------- ## ## Options parsing. ## ## ---------------- ## @@ -2192,19 +2272,23 @@ usage='$progpath [OPTION]... [MODE-ARG]...' # Short help message in response to '-h'. usage_message="Options: - --config show all configuration variables - --debug enable verbose shell tracing - -n, --dry-run display commands without modifying any files - --features display basic configuration information and exit - --mode=MODE use operation mode MODE - --no-warnings equivalent to '-Wnone' - --preserve-dup-deps don't remove duplicate dependency libraries - --quiet, --silent don't print informational messages - --tag=TAG use configuration variables from tag TAG - -v, --verbose print more informational messages than default - --version print version information - -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] - -h, --help, --help-all print short, long, or detailed help message + --config show all configuration variables + --debug enable verbose shell tracing + -n, --dry-run display commands without modifying any files + --features display basic configuration information + --finish use operation '--mode=finish' + --mode=MODE use operation mode MODE + --no-finish don't update shared library cache + --no-quiet, --no-silent print default informational messages + --no-warnings equivalent to '-Wnone' + --preserve-dup-deps don't remove duplicate dependency libraries + --quiet, --silent don't print informational messages + --reorder-cache=DIRS reorder shared library cache for preferred DIRS + --tag=TAG use configuration variables from tag TAG + -v, --verbose print more informational messages than default + --version print version information + -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] + -h, --help, --help-all print short, long, or detailed help message " # Additional text appended to 'usage_message' in response to '--help'. @@ -2237,13 +2321,13 @@ include the following information: compiler: $LTCC compiler flags: $LTCFLAGS linker: $LD (gnu? $with_gnu_ld) - version: $progname $scriptversion Debian-2.4.6-2.1 + version: $progname $scriptversion automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` Report bugs to . -GNU libtool home page: . -General help using GNU software: ." +GNU libtool home page: . +General help using GNU software: ." exit 0 } @@ -2293,7 +2377,7 @@ fi # a configuration failure hint, and exit. func_fatal_configuration () { - func__fatal_error ${1+"$@"} \ + func_fatal_error ${1+"$@"} \ "See the $PACKAGE documentation for more information." \ "Fatal configuration error." } @@ -2433,8 +2517,11 @@ libtool_options_prep () opt_dry_run=false opt_help=false opt_mode= + opt_reorder_cache=false opt_preserve_dup_deps=false opt_quiet=false + opt_finishing=true + opt_warning= nonopt= preserve_args= @@ -2474,8 +2561,6 @@ libtool_options_prep () func_quote eval ${1+"$@"} libtool_options_prep_result=$func_quote_result fi - - $_G_rc_lt_options_prep } func_add_hook func_options_prep libtool_options_prep @@ -2526,14 +2611,18 @@ libtool_parse_options () clean|compile|execute|finish|install|link|relink|uninstall) ;; # Catch anything else as an error - *) func_error "invalid argument for $_G_opt" + *) func_error "invalid argument '$1' for $_G_opt" exit_cmd=exit - break ;; esac shift ;; + --no-finish) + opt_finishing=false + func_append preserve_args " $_G_opt" + ;; + --no-silent|--no-quiet) opt_quiet=false func_append preserve_args " $_G_opt" @@ -2549,6 +2638,24 @@ libtool_parse_options () func_append preserve_args " $_G_opt" ;; + --reorder-cache) + opt_reorder_cache=true + shared_lib_dirs=$1 + if test -n "$shared_lib_dirs"; then + case $1 in + # Must begin with /: + /*) ;; + + # Catch anything else as an error (relative paths) + *) func_error "invalid argument '$1' for $_G_opt" + func_error "absolute paths are required for $_G_opt" + exit_cmd=exit + ;; + esac + fi + shift + ;; + --silent|--quiet) opt_quiet=: opt_verbose=false @@ -2581,12 +2688,22 @@ libtool_parse_options () func_quote eval ${1+"$@"} libtool_parse_options_result=$func_quote_result fi - - $_G_rc_lt_parse_options } func_add_hook func_parse_options libtool_parse_options +# func_warning ARG... +# ------------------- +# Libtool warnings are not categorized, so override funclib.sh +# func_warning with this simpler definition. +func_warning () +{ + if $opt_warning; then + $debug_cmd + $warning_func ${1+"$@"} + fi +} + # libtool_validate_options [ARG]... # --------------------------------- @@ -2603,10 +2720,10 @@ libtool_validate_options () # preserve --debug test : = "$debug_cmd" || func_append preserve_args " --debug" - case $host in + case $host_os in # Solaris2 added to fix http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16452 # see also: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59788 - *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2* | *os2*) + cygwin* | mingw* | windows* | pw32* | cegcc* | solaris2* | os2*) # don't eliminate duplications in $postdeps and $predeps opt_duplicate_compiler_generated_deps=: ;; @@ -2938,7 +3055,7 @@ EOF # func_convert_core_file_wine_to_w32 ARG # Helper function used by file name conversion functions when $build is *nix, -# and $host is mingw, cygwin, or some other w32 environment. Relies on a +# and $host is mingw, windows, cygwin, or some other w32 environment. Relies on a # correctly configured wine environment available, with the winepath program # in $build's $PATH. # @@ -2970,9 +3087,10 @@ func_convert_core_file_wine_to_w32 () # func_convert_core_path_wine_to_w32 ARG # Helper function used by path conversion functions when $build is *nix, and -# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly -# configured wine environment available, with the winepath program in $build's -# $PATH. Assumes ARG has no leading or trailing path separator characters. +# $host is mingw, windows, cygwin, or some other w32 environment. Relies on a +# correctly configured wine environment available, with the winepath program +# in $build's $PATH. Assumes ARG has no leading or trailing path separator +# characters. # # ARG is path to be converted from $build format to win32. # Result is available in $func_convert_core_path_wine_to_w32_result. @@ -3115,6 +3233,15 @@ func_convert_path_front_back_pathsep () # end func_convert_path_front_back_pathsep +# func_convert_delimited_path PATH ORIG_DELIMITER NEW_DELIMITER +# Replaces a delimiter for a given path. +func_convert_delimited_path () +{ + converted_path=`$ECHO "$1" | $SED "s#$2#$3#g"` +} +# end func_convert_delimited_path + + ################################################## # $build to $host FILE NAME CONVERSION FUNCTIONS # ################################################## @@ -3449,6 +3576,65 @@ func_dll_def_p () } +# func_reorder_shared_lib_cache DIRS +# Reorder the shared library cache by unconfiguring previous shared library cache +# and configuring preferred search directories before previous search directories. +# Previous shared library cache: /usr/lib /usr/local/lib +# Preferred search directories: /tmp/testing +# Reordered shared library cache: /tmp/testing /usr/lib /usr/local/lib +func_reorder_shared_lib_cache () +{ + $debug_cmd + + case $host_os in + openbsd*) + get_search_directories=`PATH="$PATH:/sbin" ldconfig -r | $GREP "search directories" | $SED "s#.*search directories:\ ##g"` + func_convert_delimited_path "$get_search_directories" ':' '\ ' + save_search_directories=$converted_path + func_convert_delimited_path "$1" ':' '\ ' + + # Ensure directories exist + for dir in $converted_path; do + # Ensure each directory is an absolute path + case $dir in + /*) ;; + *) func_error "Directory '$dir' is not an absolute path" + exit $EXIT_FAILURE ;; + esac + # Ensure no trailing slashes + func_stripname '' '/' "$dir" + dir=$func_stripname_result + if test -d "$dir"; then + if test -n "$preferred_search_directories"; then + preferred_search_directories="$preferred_search_directories $dir" + else + preferred_search_directories=$dir + fi + else + func_error "Directory '$dir' does not exist" + exit $EXIT_FAILURE + fi + done + + PATH="$PATH:/sbin" ldconfig -U $save_search_directories + PATH="$PATH:/sbin" ldconfig -m $preferred_search_directories $save_search_directories + get_search_directories=`PATH="$PATH:/sbin" ldconfig -r | $GREP "search directories" | $SED "s#.*search directories:\ ##g"` + func_convert_delimited_path "$get_search_directories" ':' '\ ' + reordered_search_directories=$converted_path + + $ECHO "Original: $save_search_directories" + $ECHO "Reordered: $reordered_search_directories" + exit $EXIT_SUCCESS + ;; + *) + func_error "--reorder-cache is not supported for host_os=$host_os." + exit $EXIT_FAILURE + ;; + esac +} +# end func_reorder_shared_lib_cache + + # func_mode_compile arg... func_mode_compile () { @@ -3627,7 +3813,7 @@ func_mode_compile () # On Cygwin there's no "real" PIC flag so we must build both object types case $host_os in - cygwin* | mingw* | pw32* | os2* | cegcc*) + cygwin* | mingw* | windows* | pw32* | os2* | cegcc*) pic_mode=default ;; esac @@ -3836,7 +4022,8 @@ This mode accepts the following additional options: -prefer-non-pic try to build non-PIC objects only -shared do not build a '.o' file suitable for static linking -static only build a '.o' file suitable for static linking - -Wc,FLAG pass FLAG directly to the compiler + -Wc,FLAG + -Xcompiler FLAG pass FLAG directly to the compiler COMPILE-COMMAND is a command to be used in creating a 'standard' object file from the given SOURCEFILE. @@ -3942,6 +4129,8 @@ The following components of LINK-COMMAND are treated specially: -weak LIBNAME declare that the target provides the LIBNAME interface -Wc,FLAG -Xcompiler FLAG pass linker-specific FLAG directly to the compiler + -Wa,FLAG + -Xassembler FLAG pass linker-specific FLAG directly to the assembler -Wl,FLAG -Xlinker FLAG pass linker-specific FLAG directly to the linker -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) @@ -4018,6 +4207,12 @@ if $opt_help; then fi +# If option '--reorder-cache', reorder the shared library cache and exit. +if $opt_reorder_cache; then + func_reorder_shared_lib_cache $shared_lib_dirs +fi + + # func_mode_execute arg... func_mode_execute () { @@ -4202,7 +4397,7 @@ func_mode_finish () fi fi - if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs" && $opt_finishing; then for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. @@ -4227,6 +4422,12 @@ func_mode_finish () for libdir in $libdirs; do $ECHO " $libdir" done + if test "false" = "$opt_finishing"; then + echo + echo "NOTE: finish_cmds were not executed during testing, so you must" + echo "manually run ldconfig to add a given test directory, LIBDIR, to" + echo "the search path for generated executables." + fi echo echo "If you ever happen to want to link against installed libraries" echo "in a given directory, LIBDIR, you must either use libtool, and" @@ -4463,8 +4664,15 @@ func_mode_install () func_append dir "$objdir" if test -n "$relink_command"; then + # Strip any trailing slash from the destination. + func_stripname '' '/' "$libdir" + destlibdir=$func_stripname_result + + func_stripname '' '/' "$destdir" + s_destdir=$func_stripname_result + # Determine the prefix the user has applied to our future dir. - inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` + inst_prefix_dir=`$ECHO "X$s_destdir" | $Xsed -e "s%$destlibdir\$%%"` # Don't allow the user to place us outside of our expected # location b/c this prevents finding dependent libraries that @@ -4501,7 +4709,7 @@ func_mode_install () 'exit $?' tstripme=$stripme case $host_os in - cygwin* | mingw* | pw32* | cegcc*) + cygwin* | mingw* | windows* | pw32* | cegcc*) case $realname in *.dll.a) tstripme= @@ -4614,7 +4822,7 @@ func_mode_install () # Do a test to see if this is really a libtool program. case $host in - *cygwin* | *mingw*) + *cygwin* | *mingw* | *windows*) if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" wrapper=$func_ltwrapper_scriptname_result @@ -4842,7 +5050,7 @@ extern \"C\" { $RM $export_symbols eval "$SED -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' case $host in - *cygwin* | *mingw* | *cegcc* ) + *cygwin* | *mingw* | *windows* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' ;; @@ -4854,7 +5062,7 @@ extern \"C\" { eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' case $host in - *cygwin* | *mingw* | *cegcc* ) + *cygwin* | *mingw* | *windows* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' ;; @@ -4868,7 +5076,7 @@ extern \"C\" { func_basename "$dlprefile" name=$func_basename_result case $host in - *cygwin* | *mingw* | *cegcc* ) + *cygwin* | *mingw* | *windows* | *cegcc* ) # if an import library, we need to obtain dlname if func_win32_import_lib_p "$dlprefile"; then func_tr_sh "$dlprefile" @@ -4894,8 +5102,16 @@ extern \"C\" { eval '$ECHO ": $name " >> "$nlist"' fi func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 - eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | - $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" + case $host in + i[3456]86-*-mingw32*) + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | + $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" + ;; + *) + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | + $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/__nm_//' >> '$nlist'" + ;; + esac } else # not an import lib $opt_dry_run || { @@ -5043,7 +5259,7 @@ static const void *lt_preloaded_setup() { # Transform the symbol file into the correct name. symfileobj=$output_objdir/${my_outputname}S.$objext case $host in - *cygwin* | *mingw* | *cegcc* ) + *cygwin* | *mingw* | *windows* | *cegcc* ) if test -f "$output_objdir/$my_outputname.def"; then compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` @@ -5119,7 +5335,7 @@ func_win32_libid () *ar\ archive*) # could be an import, or static # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | - $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then + $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64|pe-aarch64)' >/dev/null; then case $nm_interface in "MS dumpbin") if func_cygming_ms_implib_p "$1" || @@ -5386,7 +5602,7 @@ func_extract_archives () # # Emit a libtool wrapper script on stdout. # Don't directly open a file because we may want to -# incorporate the script contents within a cygwin/mingw +# incorporate the script contents within a cygwin/mingw/windows # wrapper executable. Must ONLY be called from within # func_mode_link because it depends on a number of variables # set therein. @@ -5394,7 +5610,7 @@ func_extract_archives () # ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR # variable will take. If 'yes', then the emitted script # will assume that the directory where it is stored is -# the $objdir directory. This is a cygwin/mingw-specific +# the $objdir directory. This is a cygwin/mingw/windows-specific # behavior. func_emit_wrapper () { @@ -5519,7 +5735,7 @@ func_exec_program_core () " case $host in # Backslashes separate directories on plain windows - *-*-mingw | *-*-os2* | *-cegcc*) + *-*-mingw* | *-*-windows* | *-*-os2* | *-cegcc*) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir\\\\\$program\" 1>&2 @@ -5587,7 +5803,7 @@ func_exec_program () file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` done - # Usually 'no', except on cygwin/mingw when embedded into + # Usually 'no', except on cygwin/mingw/windows when embedded into # the cwrapper. WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then @@ -5719,7 +5935,7 @@ EOF #endif #include #include -#ifdef _MSC_VER +#if defined _WIN32 && !defined __GNUC__ # include # include # include @@ -5744,7 +5960,7 @@ EOF /* declarations of non-ANSI functions */ #if defined __MINGW32__ # ifdef __STRICT_ANSI__ -int _putenv (const char *); +_CRTIMP int __cdecl _putenv (const char *); # endif #elif defined __CYGWIN__ # ifdef __STRICT_ANSI__ @@ -5942,7 +6158,7 @@ main (int argc, char *argv[]) { EOF case $host in - *mingw* | *cygwin* ) + *mingw* | *windows* | *cygwin* ) # make stdout use "unix" line endings echo " setmode(1,_O_BINARY);" ;; @@ -6045,7 +6261,7 @@ EOF EOF case $host_os in - mingw*) + mingw* | windows*) cat <<"EOF" { char* p; @@ -6087,7 +6303,7 @@ EOF EOF case $host_os in - mingw*) + mingw* | windows*) cat <<"EOF" /* execv doesn't actually work on mingw as expected on unix */ newargz = prepare_spawn (newargz); @@ -6506,7 +6722,7 @@ lt_update_lib_path (const char *name, const char *value) EOF case $host_os in - mingw*) + mingw* | windows*) cat <<"EOF" /* Prepares an argument vector before calling spawn(). @@ -6681,7 +6897,7 @@ func_mode_link () $debug_cmd case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + *-*-cygwin* | *-*-mingw* | *-*-windows* | *-*-pw32* | *-*-os2* | *-cegcc*) # It is impossible to link a dll without this setting, and # we shouldn't force the makefile maintainer to figure out # what system we are compiling for in order to pass an extra @@ -6705,6 +6921,7 @@ func_mode_link () finalize_command=$nonopt compile_rpath= + compile_rpath_tail= finalize_rpath= compile_shlibpath= finalize_shlibpath= @@ -6745,10 +6962,12 @@ func_mode_link () xrpath= perm_rpath= temp_rpath= + temp_rpath_tail= thread_safe=no vinfo= vinfo_number=no weak_libs= + rpath_arg= single_module=$wl-single_module func_infer_tag $base_compile @@ -7011,7 +7230,7 @@ func_mode_link () case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) - func_fatal_error "only absolute run-paths are allowed" + func_fatal_error "argument to -rpath is not absolute: $arg" ;; esac if test rpath = "$prev"; then @@ -7038,6 +7257,13 @@ func_mode_link () prev= continue ;; + xassembler) + func_append compiler_flags " -Xassembler $qarg" + prev= + func_append compile_command " -Xassembler $qarg" + func_append finalize_command " -Xassembler $qarg" + continue + ;; xcclinker) func_append linker_flags " $qarg" func_append compiler_flags " $qarg" @@ -7180,7 +7406,7 @@ func_mode_link () ;; esac case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + *-*-cygwin* | *-*-mingw* | *-*-windows* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` case :$dllsearchpath: in *":$dir:"*) ;; @@ -7200,7 +7426,7 @@ func_mode_link () -l*) if test X-lc = "X$arg" || test X-lm = "X$arg"; then case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) + *-*-cygwin* | *-*-mingw* | *-*-windows* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) # These systems don't actually have a C or math library (as such) continue ;; @@ -7208,7 +7434,7 @@ func_mode_link () # These systems don't actually have a C library (as such) test X-lc = "X$arg" && continue ;; - *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-midnightbsd*) # Do not include libc due to us having libc/libc_r. test X-lc = "X$arg" && continue ;; @@ -7228,7 +7454,7 @@ func_mode_link () esac elif test X-lc_r = "X$arg"; then case $host in - *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-midnightbsd*) # Do not include libc_r directly, use -pthread flag. continue ;; @@ -7251,16 +7477,29 @@ func_mode_link () # Tru64 UNIX uses -model [arg] to determine the layout of C++ # classes, name mangling, and exception handling. # Darwin uses the -arch flag to determine output architecture. - -model|-arch|-isysroot|--sysroot) + # -q

Add to the list of include directories" @@ -628,6 +631,9 @@ let mk_dtypedtree f = let mk_dshape f = "-dshape", Arg.Unit f, " (undocumented)" +let mk_dmatchcomp f = + "-dmatchcomp", Arg.Unit f, " (undocumented)" + let mk_drawlambda f = "-drawlambda", Arg.Unit f, " (undocumented)" @@ -637,6 +643,12 @@ let mk_dno_unique_ids f = let mk_dunique_ids f = "-dunique-ids", Arg.Unit f, " (undocumented)" +let mk_dno_canonical_ids f = + "-dno-canonical-ids", Arg.Unit f, " (undocumented)" + +let mk_dcanonical_ids f = + "-dcanonical-ids", Arg.Unit f, " (undocumented)" + let mk_dno_locations f = "-dno-locations", Arg.Unit f, " (undocumented)" @@ -728,6 +740,9 @@ let mk_dlinear f = let mk_dinterval f = "-dinterval", Arg.Unit f, " (undocumented)" +let mk_dparsetree_loc_ghost_invariants f = + "-dparsetree-loc-ghost-invariants", Arg.Unit f, " (undocumented)" + let mk_dstartup f = "-dstartup", Arg.Unit f, " (undocumented)" @@ -778,6 +793,7 @@ module type Common_options = sig val _absname : unit -> unit val _no_absname : unit -> unit val _alert : string -> unit + val _i_variance : unit -> unit val _I : string -> unit val _H : string -> unit val _labels : unit -> unit @@ -821,13 +837,17 @@ module type Core_options = sig val _dno_unique_ids : unit -> unit val _dunique_ids : unit -> unit + val _dno_canonical_ids : unit -> unit + val _dcanonical_ids : unit -> unit val _dno_locations : unit -> unit val _dlocations : unit -> unit val _dsource : unit -> unit val _dparsetree : unit -> unit + val _dparsetree_loc_ghost_invariants : unit -> unit val _dtypedtree : unit -> unit val _dshape : unit -> unit + val _dmatchcomp : unit -> unit val _drawlambda : unit -> unit val _dlambda : unit -> unit @@ -850,6 +870,7 @@ module type Compiler_options = sig val _no_g : unit -> unit val _stop_after : string -> unit val _i : unit -> unit + val _i_variance : unit -> unit val _impl : string -> unit val _intf : string -> unit val _intf_suffix : string -> unit @@ -1053,6 +1074,7 @@ struct mk_no_g F._no_g; mk_stop_after ~native:false F._stop_after; mk_i F._i; + mk_i_variance F._i_variance; mk_I F._I; mk_H F._H; mk_impl F._impl; @@ -1127,12 +1149,16 @@ struct mk_use_prims F._use_prims; mk_dno_unique_ids F._dno_unique_ids; mk_dunique_ids F._dunique_ids; + mk_dno_canonical_ids F._dno_canonical_ids; + mk_dcanonical_ids F._dcanonical_ids; mk_dno_locations F._dno_locations; mk_dlocations F._dlocations; mk_dsource F._dsource; mk_dparsetree F._dparsetree; + mk_dparsetree_loc_ghost_invariants F._dparsetree_loc_ghost_invariants; mk_dtypedtree F._dtypedtree; mk_dshape F._dshape; + mk_dmatchcomp F._dmatchcomp; mk_drawlambda F._drawlambda; mk_dlambda F._dlambda; mk_dinstr F._dinstr; @@ -1153,6 +1179,7 @@ struct mk_absname F._absname; mk_no_absname F._no_absname; mk_alert F._alert; + mk_i_variance F._i_variance; mk_I F._I; mk_H F._H; mk_init F._init; @@ -1202,12 +1229,16 @@ struct mk_dno_unique_ids F._dno_unique_ids; mk_dunique_ids F._dunique_ids; + mk_dno_canonical_ids F._dno_canonical_ids; + mk_dcanonical_ids F._dcanonical_ids; mk_dno_locations F._dno_locations; mk_dlocations F._dlocations; mk_dsource F._dsource; mk_dparsetree F._dparsetree; + mk_dparsetree_loc_ghost_invariants F._dparsetree_loc_ghost_invariants; mk_dtypedtree F._dtypedtree; mk_dshape F._dshape; + mk_dmatchcomp F._dmatchcomp; mk_drawlambda F._drawlambda; mk_dlambda F._dlambda; mk_dinstr F._dinstr; @@ -1251,6 +1282,7 @@ struct mk_stop_after ~native:true F._stop_after; mk_save_ir_after ~native:true F._save_ir_after; mk_i F._i; + mk_i_variance F._i_variance; mk_I F._I; mk_H F._H; mk_impl F._impl; @@ -1342,12 +1374,16 @@ struct mk_match_context_rows F._match_context_rows; mk_dno_unique_ids F._dno_unique_ids; mk_dunique_ids F._dunique_ids; + mk_dno_canonical_ids F._dno_canonical_ids; + mk_dcanonical_ids F._dcanonical_ids; mk_dno_locations F._dno_locations; mk_dlocations F._dlocations; mk_dsource F._dsource; mk_dparsetree F._dparsetree; + mk_dparsetree_loc_ghost_invariants F._dparsetree_loc_ghost_invariants; mk_dtypedtree F._dtypedtree; mk_dshape F._dshape; + mk_dmatchcomp F._dmatchcomp; mk_drawlambda F._drawlambda; mk_dlambda F._dlambda; mk_drawclambda F._drawclambda; @@ -1391,6 +1427,7 @@ module Make_opttop_options (F : Opttop_options) = struct mk_no_absname F._no_absname; mk_alert F._alert; mk_compact F._compact; + mk_i_variance F._i_variance; mk_I F._I; mk_H F._H; mk_init F._init; @@ -1464,8 +1501,10 @@ module Make_opttop_options (F : Opttop_options) = struct mk_dsource F._dsource; mk_dparsetree F._dparsetree; + mk_dparsetree_loc_ghost_invariants F._dparsetree_loc_ghost_invariants; mk_dtypedtree F._dtypedtree; mk_dshape F._dshape; + mk_dmatchcomp F._dmatchcomp; mk_drawlambda F._drawlambda; mk_dlambda F._dlambda; mk_drawclambda F._drawclambda; @@ -1499,6 +1538,7 @@ struct mk_absname F._absname; mk_no_absname F._no_absname; mk_alert F._alert; + mk_i_variance F._i_variance; mk_I F._I; mk_H F._H; mk_impl F._impl; @@ -1597,11 +1637,12 @@ module Default = struct module Common = struct let _absname = set Clflags.absname let _alert = Warnings.parse_alert_option - let _alias_deps = clear transparent_modules + let _alias_deps = clear no_alias_deps let _app_funct = set applicative_functors + let _i_variance = set print_variance let _labels = clear classic let _no_absname = clear Clflags.absname - let _no_alias_deps = set transparent_modules + let _no_alias_deps = set no_alias_deps let _no_app_funct = clear applicative_functors let _no_principal = clear principal let _no_rectypes = clear recursive_types @@ -1634,12 +1675,16 @@ module Default = struct let _color = Misc.set_or_ignore color_reader.parse color let _dlambda = set dump_lambda let _dparsetree = set dump_parsetree + let _dparsetree_loc_ghost_invariants = set parsetree_ghost_loc_invariant let _drawlambda = set dump_rawlambda let _dsource = set dump_source let _dtypedtree = set dump_typedtree let _dshape = set dump_shape + let _dmatchcomp = set dump_matchcomp let _dunique_ids = set unique_ids let _dno_unique_ids = clear unique_ids + let _dcanonical_ids = set canonical_ids + let _dno_canonical_ids = clear canonical_ids let _dlocations = set locations let _dno_locations = clear locations let _error_style = diff --git a/driver/main_args.mli b/driver/main_args.mli index 554b1fa3..96cce1ca 100644 --- a/driver/main_args.mli +++ b/driver/main_args.mli @@ -20,6 +20,7 @@ module type Common_options = sig val _absname : unit -> unit val _no_absname : unit -> unit val _alert : string -> unit + val _i_variance : unit -> unit val _I : string -> unit val _H : string -> unit val _labels : unit -> unit @@ -63,12 +64,16 @@ module type Core_options = sig val _dno_unique_ids : unit -> unit val _dunique_ids : unit -> unit + val _dno_canonical_ids : unit -> unit + val _dcanonical_ids : unit -> unit val _dno_locations : unit -> unit val _dlocations : unit -> unit val _dsource : unit -> unit val _dparsetree : unit -> unit + val _dparsetree_loc_ghost_invariants : unit -> unit val _dtypedtree : unit -> unit val _dshape : unit -> unit + val _dmatchcomp : unit -> unit val _drawlambda : unit -> unit val _dlambda : unit -> unit @@ -91,6 +96,7 @@ module type Compiler_options = sig val _no_g : unit -> unit val _stop_after : string -> unit val _i : unit -> unit + val _i_variance : unit -> unit val _impl : string -> unit val _intf : string -> unit val _intf_suffix : string -> unit diff --git a/driver/makedepend.ml b/driver/makedepend.ml index ecd74183..6460a199 100644 --- a/driver/makedepend.ml +++ b/driver/makedepend.ml @@ -518,14 +518,14 @@ let process_mli_map = String.Map.empty Pparse.Signature let parse_map fname = - let old_transp = !Clflags.transparent_modules in - Clflags.transparent_modules := true; + let old_no_alias_deps = !Clflags.no_alias_deps in + Clflags.no_alias_deps := true; let (deps, m) = process_file fname ~def:(String.Set.empty, String.Map.empty) ~ml_file:process_ml_map ~mli_file:process_mli_map in - Clflags.transparent_modules := old_transp; + Clflags.no_alias_deps := old_no_alias_deps; let modname = Unit_info.lax_modname_from_source fname in if String.Map.is_empty m then report_err (Failure (fname ^ " : empty map file or parse error")); @@ -578,7 +578,7 @@ let run_main argv = " Generate dependencies on all files"; "-allow-approx", Arg.Set allow_approximation, " Fallback to a lexer-based approximation on unparsable files"; - "-as-map", Arg.Set Clflags.transparent_modules, + "-as-map", Arg.Set Clflags.no_alias_deps, " Omit delayed dependencies for module aliases (-no-alias-deps -w -49)"; (* "compiler uses -no-alias-deps, and no module is coerced"; *) "-debug-map", Arg.Set debug, @@ -594,6 +594,9 @@ let run_main argv = " Process as a .ml file"; "-intf", Arg.String (add_dep_arg (fun f -> Src (f, Some MLI))), " Process as a .mli file"; + "-keywords", Arg.String (fun s -> Clflags.keyword_edition := Some s ), + " set keywords following the spec \ + (see ocamlc)"; "-map", Arg.String (add_dep_arg (fun f -> Map f)), " Read and propagate delayed dependencies to following files"; "-ml-synonym", Arg.String(add_to_synonym_list ml_synonyms), diff --git a/driver/pparse.ml b/driver/pparse.ml index 736dda7c..7f1dd0e9 100644 --- a/driver/pparse.ml +++ b/driver/pparse.ml @@ -177,6 +177,18 @@ let set_input_lexbuf ic = Location.input_lexbuf := Some lexbuf; lexbuf +let check_loc_ghost (type a) (kind : a ast_kind) (ast : a) ~inputfile = + if !Clflags.parsetree_ghost_loc_invariant then + let meth : (Ast_iterator.iterator -> Ast_iterator.iterator -> a -> unit) = + match kind with + | Structure -> (fun i -> i.structure) + | Signature -> (fun i -> i.signature) + in + let source_contents = + In_channel.with_open_bin inputfile In_channel.input_all + in + Ast_invariants.check_loc_ghost meth ast ~source_contents + let file_aux ~tool_name ~sourcefile inputfile (type a) parse_fun invariant_fun (kind : a ast_kind) : a = let ast = @@ -211,6 +223,7 @@ let file_aux ~tool_name ~sourcefile inputfile (type a) parse_fun invariant_fun Profile.record_call "parser" (fun () -> parse_fun lexbuf) end in + check_loc_ghost kind ast ~inputfile; Profile.record_call "-ppx" (fun () -> apply_rewriters ~restore:false ~tool_name kind ast ) diff --git a/dune b/dune index 6b2ca4c0..dbe8af9e 100644 --- a/dune +++ b/dune @@ -58,13 +58,13 @@ ;; TYPING ident path primitive shape shape_reduce types btype oprint subst predef datarepr cmi_format persistent_env env type_immediacy errortrace - typedtree printtyped ctype printtyp includeclass mtype envaux includecore - tast_iterator tast_mapper signature_group cmt_format untypeast - includemod includemod_errorprinter + typedtree printtyped ctype printtyp rawprinttyp includeclass mtype envaux + includecore tast_iterator tast_mapper signature_group cmt_format untypeast + includemod includemod_errorprinter errortrace_report typetexp patterns printpat parmatch stypes typeopt typedecl value_rec_check typecore typeclass typemod typedecl_variance typedecl_properties typedecl_immediacy - typedecl_unboxed typedecl_separability cmt2annot + typedecl_unboxed typedecl_separability cmt2annot out_type data_types ; manual update: mli only files annot outcometree value_rec_types diff --git a/file_formats/cmt_format.ml b/file_formats/cmt_format.ml index c9efa3c0..7c6452ce 100644 --- a/file_formats/cmt_format.ml +++ b/file_formats/cmt_format.ml @@ -153,21 +153,21 @@ let iter_on_occurrences let path_in_type typ name = match Types.get_desc typ with | Tconstr (type_path, _, _) -> - Some (Path.Pdot (type_path, name)) + Some (Path.Pextra_ty(type_path, Pcstr_ty name)) | _ -> None in let add_constructor_description env lid = function - | { Types.cstr_tag = Cstr_extension (path, _); _ } -> + | { Data_types.cstr_tag = Cstr_extension (path, _); _ } -> f ~namespace:Extension_constructor env path lid - | { Types.cstr_uid = Predef name; _} -> + | { Data_types.cstr_uid = Predef name; _} -> let id = List.assoc name Predef.builtin_idents in f ~namespace:Constructor env (Pident id) lid - | { Types.cstr_res; cstr_name; _ } -> + | { Data_types.cstr_res; cstr_name; _ } -> let path = path_in_type cstr_res cstr_name in Option.iter (fun path -> f ~namespace:Constructor env path lid) path in - let add_label env lid { Types.lbl_name; lbl_res; _ } = + let add_label env lid { Data_types.lbl_name; lbl_res; _ } = let path = path_in_type lbl_res lbl_name in Option.iter (fun path -> f ~namespace:Label env path lid) path in @@ -186,7 +186,8 @@ let iter_on_occurrences | Texp_construct (lid, constr_desc, _) -> add_constructor_description exp_env lid constr_desc | Texp_field (_, lid, label_desc) - | Texp_setfield (_, lid, label_desc, _) -> + | Texp_setfield (_, lid, label_desc, _) + | Texp_atomic_loc (_, lid, label_desc) -> add_label exp_env lid label_desc | Texp_new (path, lid, _) -> f ~namespace:Class exp_env path lid @@ -235,8 +236,8 @@ let iter_on_occurrences (match ctyp_desc with | Ttyp_constr (path, lid, _ctyps) -> f ~namespace:Type ctyp_env path lid - | Ttyp_package {pack_path; pack_txt} -> - f ~namespace:Module_type ctyp_env pack_path pack_txt + | Ttyp_package {tpt_path; tpt_txt} -> + f ~namespace:Module_type ctyp_env tpt_path tpt_txt | Ttyp_class (path, lid, _typs) -> (* Deprecated syntax to extend a polymorphic variant *) f ~namespace:Type ctyp_env path lid @@ -367,13 +368,31 @@ let index_occurrences binary_annots = in let f ~namespace env path lid = let not_ghost { Location.loc = { loc_ghost; _ }; _ } = not loc_ghost in - if not_ghost lid then + let reduce_and_store ~namespace lid path = if not_ghost lid then match Env.shape_of_path ~namespace env path with | exception Not_found -> () | { uid = Some (Predef _); _ } -> () | path_shape -> let result = Shape_reduce.local_reduce_for_uid env path_shape in index := (lid, result) :: !index + in + (* Shape reduction can be expensive, but the persistent memoization tables + should make these successive reductions fast. *) + let rec index_components namespace lid path = + let module_ = Shape.Sig_component_kind.Module in + let scraped_path = Path.scrape_extra_ty path in + match lid.Location.txt, scraped_path with + | Longident.Ldot (lid', _), Path.Pdot (path', _) -> + reduce_and_store ~namespace lid path; + index_components module_ lid' path' + | Longident.Lapply (lid', lid''), Path.Papply (path', path'') -> + index_components module_ lid'' path''; + index_components module_ lid' path' + | Longident.Lident _, _ -> + reduce_and_store ~namespace lid path; + | _, _ -> () + in + index_components namespace lid path in iter_on_annots (iter_on_occurrences ~f) binary_annots; !index @@ -459,12 +478,16 @@ let save_cmt target binary_annots initial_env cmi shape = let cmt_annots = clear_env binary_annots in let cmt_uid_to_decl = index_declarations cmt_annots in let source_digest = Option.map Digest.file sourcefile in + let cmt_args = + let cmt_args = Array.copy Sys.argv in + cmt_args.(0) <- Location.rewrite_absolute_path Sys.argv.(0); + cmt_args in let cmt = { cmt_modname = Unit_info.Artifact.modname target; cmt_annots; cmt_declaration_dependencies = !uids_deps; cmt_comments = Lexer.comments (); - cmt_args = Sys.argv; + cmt_args; cmt_sourcefile = sourcefile; cmt_builddir = Location.rewrite_absolute_path (Sys.getcwd ()); cmt_loadpath = Load_path.get_paths (); diff --git a/file_formats/cmt_format.mli b/file_formats/cmt_format.mli index 524283bc..d3b81a6b 100644 --- a/file_formats/cmt_format.mli +++ b/file_formats/cmt_format.mli @@ -57,6 +57,8 @@ type cmt_infos = { cmt_declaration_dependencies : (dependency_kind * Uid.t * Uid.t) list; cmt_comments : (string * Location.t) list; cmt_args : string array; + (** {!Sys.argv} from the compiler invocation which created the file. + [Sys.argv.(0)] is rewritten using [BUILD_PATH_PREFIX_MAP]. *) cmt_sourcefile : string option; cmt_builddir : string; cmt_loadpath : Load_path.paths; diff --git a/lambda/lambda.ml b/lambda/lambda.ml index 9fdbc814..45c16b09 100644 --- a/lambda/lambda.ml +++ b/lambda/lambda.ml @@ -39,6 +39,14 @@ type is_safe = | Safe | Unsafe +type lazy_block_tag = + | Lazy_tag + | Forward_tag + +let tag_of_lazy_tag = function + | Lazy_tag -> Config.lazy_tag + | Forward_tag -> Obj.forward_tag + type primitive = | Pbytes_to_string | Pbytes_of_string @@ -48,6 +56,7 @@ type primitive = | Psetglobal of Ident.t (* Operations on heap blocks *) | Pmakeblock of int * mutable_flag * block_shape + | Pmakelazyblock of lazy_block_tag | Pfield of int * immediate_or_pointer * mutable_flag | Pfield_computed | Psetfield of int * immediate_or_pointer * initialization_or_assignment @@ -143,10 +152,7 @@ type primitive = (* Integer to external pointer *) | Pint_as_pointer (* Atomic operations *) - | Patomic_load of {immediate_or_pointer : immediate_or_pointer} - | Patomic_exchange - | Patomic_cas - | Patomic_fetch_add + | Patomic_load (* Inhibition of optimisation *) | Popaque (* Fetching domain-local state *) @@ -721,14 +727,18 @@ let transl_extension_path loc env path = let transl_class_path loc env path = transl_path Env.find_class_address loc env path -let transl_prim mod_name name = - let pers = Ident.create_persistent mod_name in - let env = Env.add_persistent_structure pers Env.empty in - let lid = Longident.Ldot (Longident.Lident mod_name, name) in - match Env.find_value_by_name lid env with - | path, _ -> transl_value_path Loc_unknown env path - | exception Not_found -> - fatal_error ("Primitive " ^ name ^ " not found.") +let transl_prim modname field = + let mod_ident = Ident.create_persistent modname in + let env = Env.add_persistent_structure mod_ident Env.initial in + match Env.open_pers_signature modname env with + | Error `Not_found -> + fatal_errorf "Module %s unavailable." modname + | Ok env -> ( + match Env.find_value_by_name (Longident.Lident field) env with + | exception Not_found -> + fatal_errorf "Primitive %s.%s not found." modname field + | path, _ -> transl_value_path Loc_unknown env path + ) (* Compile a sequence of expressions *) diff --git a/lambda/lambda.mli b/lambda/lambda.mli index 6f5d9717..0a17deea 100644 --- a/lambda/lambda.mli +++ b/lambda/lambda.mli @@ -29,7 +29,9 @@ type compile_time_constant = type immediate_or_pointer = | Immediate + (* The value must be immediate. *) | Pointer + (* The value may be a pointer or an immediate. *) type initialization_or_assignment = | Assignment @@ -45,6 +47,10 @@ type is_safe = | Safe | Unsafe +type lazy_block_tag = + | Lazy_tag + | Forward_tag + type primitive = | Pbytes_to_string | Pbytes_of_string @@ -54,6 +60,7 @@ type primitive = | Psetglobal of Ident.t (* Operations on heap blocks *) | Pmakeblock of int * mutable_flag * block_shape + | Pmakelazyblock of lazy_block_tag | Pfield of int * immediate_or_pointer * mutable_flag | Pfield_computed | Psetfield of int * immediate_or_pointer * initialization_or_assignment @@ -153,10 +160,7 @@ type primitive = (* Integer to external pointer *) | Pint_as_pointer (* Atomic operations *) - | Patomic_load of {immediate_or_pointer : immediate_or_pointer} - | Patomic_exchange - | Patomic_cas - | Patomic_fetch_add + | Patomic_load (* Inhibition of optimisation *) | Popaque (* Fetching domain-local state *) @@ -424,7 +428,7 @@ val transl_prim: string -> string -> lambda (** Translate a value from a persistent module. For instance: {[ - transl_internal_value "CamlinternalLazy" "force" + transl_prim "CamlinternalLazy" "force" ]} *) @@ -498,6 +502,8 @@ val max_arity : unit -> int This is unlimited ([max_int]) for bytecode, but limited (currently to 126) for native code. *) +val tag_of_lazy_tag : lazy_block_tag -> int + (***********************) (* For static failures *) (***********************) diff --git a/lambda/matching.ml b/lambda/matching.ml index 337c9d2f..4d36848e 100644 --- a/lambda/matching.ml +++ b/lambda/matching.ml @@ -90,6 +90,7 @@ open Misc open Asttypes open Types +open Data_types open Typedtree open Lambda open Parmatch @@ -97,10 +98,10 @@ open Printpat.Compat module Scoped_location = Debuginfo.Scoped_location -let dbg = false +let dbg () = !Clflags.dump_matchcomp let debugf fmt = - if dbg + if dbg () then Format.eprintf fmt else Format.ifprintf Format.err_formatter fmt @@ -117,7 +118,7 @@ let pp_partial ppf = function *) module MayCompat = Parmatch.Compat (struct - let equal = Types.may_equal_constr + let equal = Data_types.may_equal_constr end) let may_compat = MayCompat.compat @@ -212,8 +213,8 @@ end = struct | Tpat_any | Tpat_var _ -> p - | Tpat_alias (q, id, s, uid) -> - { p with pat_desc = Tpat_alias (simpl_under_orpat q, id, s, uid) } + | Tpat_alias (q, id, s, uid, ty) -> + { p with pat_desc = Tpat_alias (simpl_under_orpat q, id, s, uid, ty) } | Tpat_or (p1, p2, o) -> let p1, p2 = (simpl_under_orpat p1, simpl_under_orpat p2) in if le_pat p1 p2 then @@ -236,8 +237,9 @@ end = struct in match p.pat_desc with | `Any -> stop p `Any - | `Var (id, s, uid) -> continue p (`Alias (Patterns.omega, id, s, uid)) - | `Alias (p, id, _, _) -> + | `Var (id, s, uid) -> + continue p (`Alias (Patterns.omega, id, s, uid, p.pat_type)) + | `Alias (p, id, _, _, _) -> aux ( (General.view p, patl), bind_alias p id ~arg ~action ) @@ -286,7 +288,8 @@ end = struct match p.pat_desc with | `Any -> `Any | `Constant cst -> `Constant cst - | `Tuple ps -> `Tuple (List.map (alpha_pat env) ps) + | `Tuple ps -> + `Tuple (List.map (fun (label, p) -> label, alpha_pat env p) ps) | `Construct (cstr, cst_descr, args) -> `Construct (cstr, cst_descr, List.map (alpha_pat env) args) | `Variant (cstr, argo, row_desc) -> @@ -294,7 +297,7 @@ end = struct | `Record (fields, closed) -> let alpha_field env (lid, l, p) = (lid, l, alpha_pat env p) in `Record (List.map (alpha_field env) fields, closed) - | `Array ps -> `Array (List.map (alpha_pat env) ps) + | `Array (am, ps) -> `Array (am, List.map (alpha_pat env) ps) | `Lazy p -> `Lazy (alpha_pat env p) in { p with pat_desc } @@ -331,10 +334,11 @@ end = struct match p.pat_desc with | `Or (p1, p2, _) -> split_explode p1 aliases (split_explode p2 aliases rem) - | `Alias (p, id, _, _) -> split_explode p (id :: aliases) rem + | `Alias (p, id, _, _, _) -> split_explode p (id :: aliases) rem | `Var (id, str, uid) -> explode - { p with pat_desc = `Alias (Patterns.omega, id, str, uid) } + { p with pat_desc = + `Alias (Patterns.omega, id, str, uid, p.pat_type) } aliases rem | #view as view -> (* We are doing two things here: @@ -436,7 +440,7 @@ let matcher discr (p : Simple.pattern) rem = (* NB: may_equal_constr considers (potential) constructor rebinding; Types.may_equal_constr does check that the arities are the same, preserving row-size coherence. *) - yesif (Types.may_equal_constr cstr cstr') + yesif (Data_types.may_equal_constr cstr cstr') | Construct _, (Constant _ | Variant _ | Lazy | Array _ | Record _ | Tuple _) -> no () @@ -445,7 +449,7 @@ let matcher discr (p : Simple.pattern) rem = | Variant _, (Constant _ | Construct _ | Lazy | Array _ | Record _ | Tuple _) -> no () - | Array n1, Array n2 -> yesif (n1 = n2) + | Array (am1, n1), Array (am2, n2) -> yesif (am1 = am2 && n1 = n2) | Array _, (Constant _ | Construct _ | Variant _ | Lazy | Record _ | Tuple _) -> no () @@ -593,7 +597,7 @@ end = struct match p.pat_desc with | `Or (p1, p2, _) -> filter_rec ((left, p1, right) :: (left, p2, right) :: rem) - | `Alias (p, _, _, _) -> filter_rec ((left, p, right) :: rem) + | `Alias (p, _, _, _, _) -> filter_rec ((left, p, right) :: rem) | `Var _ -> filter_rec ((left, Patterns.omega, right) :: rem) | #Simple.view as view -> ( let p = { p with pat_desc = view } in @@ -640,10 +644,10 @@ end let rec flatten_pat_line size p k = match p.pat_desc with | Tpat_any | Tpat_var _ -> Patterns.omegas size :: k - | Tpat_tuple args -> args :: k + | Tpat_tuple args -> (List.map snd args) :: k | Tpat_or (p1, p2, _) -> flatten_pat_line size p1 (flatten_pat_line size p2 k) - | Tpat_alias (p, _, _, _) -> + | Tpat_alias (p, _, _, _, _) -> (* Note: we are only called from flatten_matrix, which is itself only ever used in places where variables do not matter (default environments, @@ -735,7 +739,7 @@ end = struct | (p, ps) :: rem -> ( let p = General.view p in match p.pat_desc with - | `Alias (p, _, _, _) -> filter_rec ((p, ps) :: rem) + | `Alias (p, _, _, _, _) -> filter_rec ((p, ps) :: rem) | `Var _ -> filter_rec ((Patterns.omega, ps) :: rem) | `Or (p1, p2, _) -> filter_rec_or p1 p2 ps rem | #Simple.view as view -> ( @@ -1396,14 +1400,15 @@ let can_group discr pat = | Constant (Const_int64 _), Constant (Const_int64 _) | Constant (Const_nativeint _), Constant (Const_nativeint _) -> true - | Construct { cstr_tag = Cstr_extension _ as discr_tag }, Construct pat_cstr + | Construct { cstr_tag = Cstr_extension (p1, _) }, + Construct { cstr_tag = Cstr_extension (p2, _) } -> (* Extension constructors with distinct names may be equal thanks to constructor rebinding. So we need to produce a specialized submatrix for each syntactically-distinct constructor (with a threading of exits such that each submatrix falls back to the potentially-compatible submatrices below it). *) - Types.equal_tag discr_tag pat_cstr.cstr_tag + Path.same p1 p2 | Construct _, Construct _ | Tuple _, (Tuple _ | Any) | Record _, (Record _ | Any) @@ -1429,7 +1434,7 @@ let rec omega_like p = | Tpat_any | Tpat_var _ -> true - | Tpat_alias (p, _, _, _) -> omega_like p + | Tpat_alias (p, _, _, _, _) -> omega_like p | Tpat_or (p1, p2, _) -> omega_like p1 || omega_like p2 | _ -> false @@ -1880,7 +1885,7 @@ let separate_debug_output () = let dbg_split_and_precompile pm next nexts = if - dbg + dbg () && (nexts <> [] || match next with @@ -2058,7 +2063,7 @@ let get_expr_args_constr ~scopes head { arg; mut; _ } rem = let divide_constructor ~scopes ctx pm = divide (get_expr_args_constr ~scopes) - (fun cstr1 cstr2 -> Types.equal_tag cstr1.cstr_tag cstr2.cstr_tag) + Data_types.equal_constr get_key_constr get_pat_args_constr ctx pm @@ -2137,25 +2142,11 @@ let get_pat_args_lazy p rem = let prim_obj_tag = Primitive.simple ~name:"caml_obj_tag" ~arity:1 ~alloc:false -let get_mod_field modname field = - lazy - (let mod_ident = Ident.create_persistent modname in - let env = - Env.add_persistent_structure mod_ident Env.initial - in - match Env.open_pers_signature modname env with - | Error `Not_found -> - fatal_errorf "Module %s unavailable." modname - | Ok env -> ( - match Env.find_value_by_name (Longident.Lident field) env with - | exception Not_found -> - fatal_errorf "Primitive %s.%s not found." modname field - | path, _ -> transl_value_path Loc_unknown env path - )) - -let code_force_lazy_block = get_mod_field "CamlinternalLazy" "force_lazy_block" +let code_force_lazy_block = + lazy (transl_prim "CamlinternalLazy" "force_lazy_block") -let code_force_lazy = get_mod_field "CamlinternalLazy" "force_gen" +let code_force_lazy = + lazy (transl_prim "CamlinternalLazy" "force_gen") (* inline_lazy_force inlines the beginning of the code of Lazy.force. When the value argument is tagged as: @@ -2286,7 +2277,7 @@ let divide_lazy ~scopes head ctx pm = let get_pat_args_tuple arity p rem = match p with | { pat_desc = Tpat_any } -> Patterns.omegas arity @ rem - | { pat_desc = Tpat_tuple args } -> args @ rem + | { pat_desc = Tpat_tuple args } -> (List.map snd args) @ rem | _ -> assert false let get_expr_args_tuple ~scopes head { arg; mut; _ } rem = @@ -2379,19 +2370,19 @@ let divide_record all_labels ~scopes head ctx pm = (* Matching against an array pattern *) let get_key_array = function - | { pat_desc = Tpat_array patl } -> List.length patl + | { pat_desc = Tpat_array (_, patl) } -> List.length patl | _ -> assert false let get_pat_args_array p rem = match p with - | { pat_desc = Tpat_array patl } -> patl @ rem + | { pat_desc = Tpat_array (_, patl) } -> patl @ rem | _ -> assert false -let get_expr_args_array ~scopes kind head { arg; mut; _ } rem = - let len = +let get_expr_args_array ~scopes kind head { arg; mut } rem = + let am, len = let open Patterns.Head in match head.pat_desc with - | Array len -> len + | Array (am, len) -> am, len | _ -> assert false in let loc = head_loc ~scopes head in @@ -2406,8 +2397,11 @@ let get_expr_args_array ~scopes kind head { arg; mut; _ } rem = in { arg; - binding_kind = StrictOpt; - mut = compose_mut mut Mutable; + binding_kind = + (match am with + | Mutable -> StrictOpt + | Immutable -> Alias); + mut = compose_mut mut am; } :: make_args (pos + 1) in make_args 0 @@ -2757,15 +2751,21 @@ let reintroduce_fail sw = in List.iter seen sw.sw_consts; List.iter seen sw.sw_blocks; - let i_max = ref (-1) and max = ref (-1) in + let c_max = ref (-1) in + let i_max = ref max_int in Hashtbl.iter (fun i c -> - if c > !max then ( + if c > !c_max then ( i_max := i; - max := c + c_max := c + ) else if c = !c_max then ( + (* Pick the miminal [i] which has maximal [c], and not just + the first [i], as the Hashtbl iteration order is not + deterministic: see #14088. *) + i_max := min i !i_max; )) t; - if !max >= 3 then + if !c_max >= 3 then let default = !i_max in let remove = List.filter (fun (_, lam) -> @@ -2790,12 +2790,12 @@ let rec last def = function | [ (x, _) ] -> x | _ :: rem -> last def rem -let get_edges low high l = +let get_edges ~low ~high l = match l with | [] -> (low, high) | (x, _) :: _ -> (x, last high l) -let as_interval_canfail fail low high l = +let as_interval_canfail fail ~low ~high l = let store = StoreExp.mk_store () in let do_store _tag act = let i = store.act_store () act in @@ -2899,15 +2899,15 @@ let sort_int_lambda_list l = 0) l -let as_interval fail low high l = +let as_interval fail ?(low = min_int) ?(high = max_int) l = let l = sort_int_lambda_list l in - ( get_edges low high l, + ( get_edges ~low ~high l, match fail with | None -> as_interval_nofail l - | Some act -> as_interval_canfail act low high l ) + | Some act -> as_interval_canfail act ~low ~high l ) -let call_switcher loc fail arg low high int_lambda_list = - let edges, (cases, actions) = as_interval fail low high int_lambda_list in +let call_switcher loc fail arg ?low ?high int_lambda_list = + let edges, (cases, actions) = as_interval fail ?low ?high int_lambda_list in Switcher.zyva loc edges arg cases actions let rec list_as_pat = function @@ -3114,7 +3114,7 @@ let combine_constant loc arg cst partial ctx def | _ -> assert false) const_lambda_list in - call_switcher loc fail arg min_int max_int int_lambda_list + call_switcher loc fail arg int_lambda_list | Const_char _ -> let int_lambda_list = List.map @@ -3123,7 +3123,7 @@ let combine_constant loc arg cst partial ctx def | _ -> assert false) const_lambda_list in - call_switcher loc fail arg 0 255 int_lambda_list + call_switcher loc fail arg ~low:0 ~high:255 int_lambda_list | Const_string _ -> (* Note as the bytecode compiler may resort to dichotomic search, the clauses of stringswitch are sorted with duplicates removed. @@ -3198,163 +3198,171 @@ let transl_match_on_option arg loc ~if_some ~if_none = else Lifthenelse(arg, if_some, if_none) -let combine_constructor loc arg pat_env cstr partial ctx def +let combine_extension_constructor loc arg pat_env partial ctx def + (descr_lambda_list, total1, _pats) = + let tag_lambda (cstr, act) = (cstr.cstr_tag, act) in + let fail, local_jumps = mk_failaction_neg partial ctx def in + let lambda1 = + let consts, nonconsts = + split_extension_cases (List.map tag_lambda descr_lambda_list) in + let default, consts, nonconsts = + match fail with + | None -> ( + match (consts, nonconsts) with + | _, (_, act) :: rem -> (act, consts, rem) + | (_, act) :: rem, _ -> (act, rem, nonconsts) + | _ -> assert false + ) + | Some fail -> (fail, consts, nonconsts) + in + let nonconst_lambda = + match nonconsts with + | [] -> default + | _ -> + let tag = Ident.create_local "tag" in + let tests = + List.fold_right + (fun (path, act) rem -> + let ext = transl_extension_path loc pat_env path in + Lifthenelse + (Lprim (Pintcomp Ceq, [ Lvar tag; ext ], loc), act, rem)) + nonconsts default + in + Llet (Alias, Pgenval, tag, + Lprim (Pfield (0, Pointer, Immutable), [ arg ], loc), tests) + in + List.fold_right + (fun (path, act) rem -> + let ext = transl_extension_path loc pat_env path in + Lifthenelse (Lprim (Pintcomp Ceq, [ arg; ext ], loc), act, rem)) + consts nonconst_lambda + in + (lambda1, Jumps.union local_jumps total1) + +let combine_regular_constructor loc arg cstr partial ctx def (descr_lambda_list, total1, pats) = let tag_lambda (cstr, act) = (cstr.cstr_tag, act) in + (* Regular concrete type *) + let ncases = List.length descr_lambda_list + and nconstrs = cstr.cstr_consts + cstr.cstr_nonconsts in + let sig_complete = ncases = nconstrs in + let fail_opt, fails, local_jumps = + if sig_complete then + (None, [], Jumps.empty Total) + else + let constrs = + List.map2 (fun (constr, _act) p -> { p with pat_desc = constr }) + descr_lambda_list pats in + mk_failaction_pos partial constrs ctx def + in + let descr_lambda_list = fails @ descr_lambda_list in + let consts, nonconsts = + split_cases (List.map tag_lambda descr_lambda_list) in + (* Our duty below is to generate code, for matching on a list of + constructor+action cases, that is good for both bytecode and + native-code compilation. (Optimizations that only work well + for one backend should be done in the backend.) + + The [Lswitch] construct is generally an excellent choice, as + it generates a single instruction in bytecode, and can be + turned into efficient, simpler control-flow constructs in + native-code. (The lambda/switch.ml module is precisely + responsible for efficiently compiling switches to simpler + tests.) + + Some additional optimizations make sense here when they let + us generate better code, including in bytecode: the generated + code should still fit in one bytecode instruction or less. + + [Lswitch] has the downside of always needing a byte per + constructor in the generated bytecode, even when many actions + are shared. For types with a lot of constructors, calling the + switcher directly can result in more compact code. This is + a reason to deviate from the one-instruction policy. + *) + let lambda1 = + match (fail_opt, same_actions descr_lambda_list) with + | None, Some act -> + (* Identical actions, no failure: 0 control-flow instructions. *) + act + | _ -> ( + match + (cstr.cstr_consts, cstr.cstr_nonconsts, consts, nonconsts) + with + | 1, 1, [ (0, act1) ], [ (0, act2) ] -> + (* This case is very frequent, it corresponds to + options and lists. *) + transl_match_on_option arg loc ~if_none:act1 ~if_some:act2 + | n, 0, _, [] -> + (* The matched type defines constant constructors only. + (typically the constant cases are dense, so + call_switcher will generate a Lswitch, still one + instruction.) *) + call_switcher loc fail_opt arg ~low:0 ~high:(n - 1) consts + | n, _, _, _ -> ( + let act0 = + (* = Some act when all non-const constructors match to act *) + match (fail_opt, nonconsts) with + | Some a, [] -> Some a + | Some _, _ -> + if List.length nonconsts = cstr.cstr_nonconsts then + same_actions nonconsts + else + None + | None, _ -> same_actions nonconsts + in + match act0 with + | Some act -> + (* This case deviates from our policy, by typically + generating three bytecode instructions. + + It can save a lot of bytecode space when matching + on a type with many non-constant constructors, + all sent to the same action. This pattern occurs + several times in the compiler codebase + (for example), due to code fragments such as the + following: + + match token with SEMISEMI -> true | _ -> false + + (The type of tokens has more than 120 constructors.) + *) + Lifthenelse + ( Lprim (Pisint, [ arg ], loc), + call_switcher loc fail_opt arg + ~low:0 ~high:(n - 1) consts, + act ) + | None -> + (* In the general case, emit a switch. *) + let sw = + { sw_numconsts = cstr.cstr_consts; + sw_consts = consts; + sw_numblocks = cstr.cstr_nonconsts; + sw_blocks = nonconsts; + sw_failaction = fail_opt + } + in + let hs, sw = share_actions_sw sw in + let sw = reintroduce_fail sw in + hs (Lswitch (arg, sw, loc)) + ) + ) + in + (lambda1, Jumps.union local_jumps total1) + +let combine_constructor loc arg pat_env cstr partial ctx def actions = match cstr.cstr_tag with | Cstr_extension _ -> - (* Special cases for extensions *) - let fail, local_jumps = mk_failaction_neg partial ctx def in - let lambda1 = - let consts, nonconsts = - split_extension_cases (List.map tag_lambda descr_lambda_list) in - let default, consts, nonconsts = - match fail with - | None -> ( - match (consts, nonconsts) with - | _, (_, act) :: rem -> (act, consts, rem) - | (_, act) :: rem, _ -> (act, rem, nonconsts) - | _ -> assert false - ) - | Some fail -> (fail, consts, nonconsts) - in - let nonconst_lambda = - match nonconsts with - | [] -> default - | _ -> - let tag = Ident.create_local "tag" in - let tests = - List.fold_right - (fun (path, act) rem -> - let ext = transl_extension_path loc pat_env path in - Lifthenelse - (Lprim (Pintcomp Ceq, [ Lvar tag; ext ], loc), act, rem)) - nonconsts default - in - Llet (Alias, Pgenval, tag, - Lprim (Pfield (0, Pointer, Immutable), [ arg ], loc), tests) - in - List.fold_right - (fun (path, act) rem -> - let ext = transl_extension_path loc pat_env path in - Lifthenelse (Lprim (Pintcomp Ceq, [ arg; ext ], loc), act, rem)) - consts nonconst_lambda - in - (lambda1, Jumps.union local_jumps total1) + combine_extension_constructor loc arg pat_env partial ctx def actions | _ -> - (* Regular concrete type *) - let ncases = List.length descr_lambda_list - and nconstrs = cstr.cstr_consts + cstr.cstr_nonconsts in - let sig_complete = ncases = nconstrs in - let fail_opt, fails, local_jumps = - if sig_complete then - (None, [], Jumps.empty Total) - else - let constrs = - List.map2 (fun (constr, _act) p -> { p with pat_desc = constr }) - descr_lambda_list pats in - mk_failaction_pos partial constrs ctx def - in - let descr_lambda_list = fails @ descr_lambda_list in - let consts, nonconsts = - split_cases (List.map tag_lambda descr_lambda_list) in - (* Our duty below is to generate code, for matching on a list of - constructor+action cases, that is good for both bytecode and - native-code compilation. (Optimizations that only work well - for one backend should be done in the backend.) - - The [Lswitch] construct is generally an excellent choice, as - it generates a single instruction in bytecode, and can be - turned into efficient, simpler control-flow constructs in - native-code. (The lambda/switch.ml module is precisely - responsible for efficiently compiling switches to simpler - tests.) - - Some additional optimizations make sense here when they let - us generate better code, including in bytecode: the generated - code should still fit in one bytecode instruction or less. - - [Lswitch] has the downside of always needing a byte per - constructor in the generated bytecode, even when many actions - are shared. For types with a lot of constructors, calling the - switcher directly can result in more compact code. This is - a reason to deviate from the one-instruction policy. - *) - let lambda1 = - match (fail_opt, same_actions descr_lambda_list) with - | None, Some act -> - (* Identical actions, no failure: 0 control-flow instructions. *) - act - | _ -> ( - match - (cstr.cstr_consts, cstr.cstr_nonconsts, consts, nonconsts) - with - | 1, 1, [ (0, act1) ], [ (0, act2) ] -> - (* This case is very frequent, it corresponds to - options and lists. *) - transl_match_on_option arg loc ~if_none:act1 ~if_some:act2 - | n, 0, _, [] -> - (* The matched type defines constant constructors only. - (typically the constant cases are dense, so - call_switcher will generate a Lswitch, still one - instruction.) *) - call_switcher loc fail_opt arg 0 (n - 1) consts - | n, _, _, _ -> ( - let act0 = - (* = Some act when all non-const constructors match to act *) - match (fail_opt, nonconsts) with - | Some a, [] -> Some a - | Some _, _ -> - if List.length nonconsts = cstr.cstr_nonconsts then - same_actions nonconsts - else - None - | None, _ -> same_actions nonconsts - in - match act0 with - | Some act -> - (* This case deviates from our policy, by typically - generating three bytecode instructions. - - It can save a lot of bytecode space when matching - on a type with many non-constant constructors, - all sent to the same action. This pattern occurs - several times in the compiler codebase - (for example), due to code fragments such as the - following: - - match token with SEMISEMI -> true | _ -> false - - (The type of tokens has more than 120 constructors.) - *) - Lifthenelse - ( Lprim (Pisint, [ arg ], loc), - call_switcher loc fail_opt arg 0 (n - 1) consts, - act ) - | None -> - (* In the general case, emit a switch. *) - let sw = - { sw_numconsts = cstr.cstr_consts; - sw_consts = consts; - sw_numblocks = cstr.cstr_nonconsts; - sw_blocks = nonconsts; - sw_failaction = fail_opt - } - in - let hs, sw = share_actions_sw sw in - let sw = reintroduce_fail sw in - hs (Lswitch (arg, sw, loc)) - ) - ) - in - (lambda1, Jumps.union local_jumps total1) + combine_regular_constructor loc arg cstr partial ctx def actions let make_test_sequence_variant_constant fail arg int_lambda_list = - let _, (cases, actions) = as_interval fail min_int max_int int_lambda_list in + let _, (cases, actions) = as_interval fail int_lambda_list in Switcher.test_sequence arg cases actions let call_switcher_variant_constant loc fail arg int_lambda_list = - call_switcher loc fail arg min_int max_int int_lambda_list + call_switcher loc fail arg int_lambda_list let call_switcher_variant_constr loc fail arg int_lambda_list = let v = Ident.create_local "variant" in @@ -3363,7 +3371,7 @@ let call_switcher_variant_constr loc fail arg int_lambda_list = Pgenval, v, Lprim (Pfield (0, Pointer, Immutable), [ arg ], loc), - call_switcher loc fail (Lvar v) min_int max_int int_lambda_list ) + call_switcher loc fail (Lvar v) int_lambda_list ) let combine_variant loc row arg partial ctx def (tag_lambda_list, total1, _pats) = @@ -3435,7 +3443,7 @@ let combine_array loc arg kind partial ctx def (len_lambda_list, total1, _pats) let lambda1 = let newvar = Ident.create_local "len" in let switch = - call_switcher loc fail (Lvar newvar) 0 max_int len_lambda_list + call_switcher loc fail (Lvar newvar) ~low:0 len_lambda_list in bind Alias newvar (Lprim (Parraylength kind, [ arg ], loc)) switch in @@ -3637,7 +3645,7 @@ let rec name_pattern default = function | ((pat, _), _) :: rem -> ( match pat.pat_desc with | Tpat_var (id, _, _) -> id - | Tpat_alias (_, id, _, _) -> id + | Tpat_alias (_, id, _, _, _) -> id | _ -> name_pattern default rem ) | _ -> Ident.create_local default @@ -3861,7 +3869,7 @@ and bind_match_arg kind v arg (lam, jumps) = and combine_handlers ~scopes repr partial ctx first_match rem = comp_match_handlers - (( if dbg then + (( if dbg () then do_compile_matching_pr ~scopes else do_compile_matching ~scopes @@ -4194,10 +4202,12 @@ let assign_pat ~scopes opt nraise catch_ids loc pat lam = match (pat.pat_desc, lam) with | Tpat_tuple patl, Lprim (Pmakeblock _, lams, _) -> opt := true; - List.fold_left2 collect acc patl lams + List.fold_left2 + (fun acc (_, pat) lam -> collect acc pat lam) + acc patl lams | Tpat_tuple patl, Lconst (Const_block (_, scl)) -> opt := true; - let collect_const acc pat sc = collect acc pat (Lconst sc) in + let collect_const acc (_, pat) sc = collect acc pat (Lconst sc) in List.fold_left2 collect_const acc patl scl | _ -> (* pattern idents will be bound in staticcatch (let body), so we @@ -4230,7 +4240,7 @@ let for_let ~scopes loc param pat body = (* This eliminates a useless variable (and stack slot in bytecode) for "let _ = ...". See #6865. *) Lsequence (param, body) - | Tpat_var (id, _, _) | Tpat_alias ({ pat_desc = Tpat_any }, id, _, _) -> + | Tpat_var (id, _, _) | Tpat_alias ({ pat_desc = Tpat_any }, id, _, _, _) -> (* Fast path, and keep track of simple bindings to unboxable numbers. Note: the (Tpat_alias (Tpat_any, id)) case needs to be @@ -4272,13 +4282,13 @@ let for_tupled_function ~scopes loc paraml pats_act_list partial = let flatten_pattern size p = match p.pat_desc with - | Tpat_tuple args -> args + | Tpat_tuple args -> List.map snd args | Tpat_any -> Patterns.omegas size | _ -> raise Cannot_flatten let flatten_simple_pattern size (p : Simple.pattern) = match p.pat_desc with - | `Tuple args -> args + | `Tuple args -> (List.map snd args) | `Any -> Patterns.omegas size | `Array _ | `Variant _ diff --git a/lambda/printlambda.ml b/lambda/printlambda.ml index 76989a40..484c2ce2 100644 --- a/lambda/printlambda.ml +++ b/lambda/printlambda.ml @@ -156,6 +156,10 @@ let primitive ppf = function fprintf ppf "makeblock %i%a" tag block_shape shape | Pmakeblock(tag, Mutable, shape) -> fprintf ppf "makemutable %i%a" tag block_shape shape + | Pmakelazyblock Lazy_tag -> + fprintf ppf "makelazyblock" + | Pmakelazyblock Forward_tag -> + fprintf ppf "makeforwardblock" | Pfield(n, ptr, mut) -> let instr = match ptr, mut with @@ -350,13 +354,7 @@ let primitive ppf = function | Pbswap16 -> fprintf ppf "bswap16" | Pbbswap(bi) -> print_boxed_integer "bswap" ppf bi | Pint_as_pointer -> fprintf ppf "int_as_pointer" - | Patomic_load {immediate_or_pointer} -> - (match immediate_or_pointer with - | Immediate -> fprintf ppf "atomic_load_imm" - | Pointer -> fprintf ppf "atomic_load_ptr") - | Patomic_exchange -> fprintf ppf "atomic_exchange" - | Patomic_cas -> fprintf ppf "atomic_cas" - | Patomic_fetch_add -> fprintf ppf "atomic_fetch_add" + | Patomic_load -> fprintf ppf "atomic_load" | Popaque -> fprintf ppf "opaque" | Pdls_get -> fprintf ppf "dls_get" | Ppoll -> fprintf ppf "poll" @@ -368,6 +366,7 @@ let name_of_primitive = function | Pgetglobal _ -> "Pgetglobal" | Psetglobal _ -> "Psetglobal" | Pmakeblock _ -> "Pmakeblock" + | Pmakelazyblock _ -> "Pmakelazyblock" | Pfield _ -> "Pfield" | Pfield_computed -> "Pfield_computed" | Psetfield _ -> "Psetfield" @@ -462,13 +461,7 @@ let name_of_primitive = function | Pbswap16 -> "Pbswap16" | Pbbswap _ -> "Pbbswap" | Pint_as_pointer -> "Pint_as_pointer" - | Patomic_load {immediate_or_pointer} -> - (match immediate_or_pointer with - | Immediate -> "atomic_load_imm" - | Pointer -> "atomic_load_ptr") - | Patomic_exchange -> "Patomic_exchange" - | Patomic_cas -> "Patomic_cas" - | Patomic_fetch_add -> "Patomic_fetch_add" + | Patomic_load -> "Patomic_load" | Popaque -> "Popaque" | Prunstack -> "Prunstack" | Presume -> "Presume" diff --git a/lambda/tmc.ml b/lambda/tmc.ml index 8b5b6664..8826eee3 100644 --- a/lambda/tmc.ml +++ b/lambda/tmc.ml @@ -865,7 +865,7 @@ let rec choice ctx t = | Prunstack | Pperform | Presume | Preperform | Pdls_get (* we don't handle atomic primitives *) - | Patomic_exchange | Patomic_cas | Patomic_fetch_add | Patomic_load _ + | Patomic_load (* we don't handle array indices as destinations yet *) | (Pmakearray _ | Pduparray _) @@ -882,6 +882,13 @@ let rec choice ctx t = | Pandbint _ | Porbint _ | Pxorbint _ | Plslbint _ | Plsrbint _ | Pasrbint _ | Pbintcomp _ + (* Lazy blocks should never contain a recursive call directly: + either it's a closure (Lazy_tag), or a variable (Forward_tag). + The case 'let foo = recursive_call in lazy foo' could be translated to + use tmc in the cases where 'foo' might be of type lazy or float, but + given the fragility of such a transformation we choose not to. *) + | Pmakelazyblock _ + (* more common cases... *) | Pbigarrayref _ | Pbigarrayset _ | Pbigarraydim _ diff --git a/lambda/translclass.ml b/lambda/translclass.ml index 5a693987..59f2c4fc 100644 --- a/lambda/translclass.ml +++ b/lambda/translclass.ml @@ -13,6 +13,176 @@ (* *) (**************************************************************************) +(* + # Translation of class and object expressions + + ## Objects + + ### Memory layout + + Objects are represented in memory using two layers: + - The outer layer is a block with tag [Obj.object_tag]. + It has a first field pointing to the inner layer (the methods), + a second field acting as a unique identifier to allow + polymorphic comparison, and the rest of the block contains + the values of the instance variables, class parameters, and + other values that can vary between two objects of the same class. + + - The inner layer is a regular block (with tag zero). It contains + all values that are shared between all objects of the same class, + which means mostly methods. The first field corresponds to the number of + public methods, the second field is a mask used for optimising method + access, the following fields are alternating between the method closures + and the hash of their name (sorted in increasing hash order). + Additional fields are used for private methods. + + +-------+------+-------+-------+-----+-------+-------+-----------+ + | n_pub | mask | met_1 | tag_1 | ... | met_n | tag_n | other ... | + +-------+------+-------+-------+-----+-------+-------+-----------+ + + ### Primitives + + Method access is compiled in one of three possible ways: + - Generic method access (outside a class, or to an object that is not + self or an ancestor) uses dynamic lookup. A dichotomic search in + the part of the method array that stores public methods finds + the expected closure and calls it on the current object. + In most cases, a fast path also exists: each method access in the + source code has an associated cache location that stores the offset + of the last method called at this point in its method array. + Before the dichotomic search, the last stored offset (clamped + to the actual size of the method array using the mask) is checked, + and if the tag matches the associated closure is called directly. + - Method access through the self object inside a class: + the (runtime) index of the method inside the method array + has been computed at class creation time, so the method is fetched + from the block through a dynamic block load (like an array load). + - Accessing the method of an ancestor inside a class (ancestors are + variables bound by [inherit ... as ancestor] constructions): + at class creation time, the closure of the ancestor method is bound + to a variable, and the method call just calls this function without + any (further) dynamic lookup. + + Instance variable access (getting and setting) also computes offsets + at class initialisation time, with those offsets used to index directly + in the outer layer of the object. + + Functional object copy [ {< ... >} ] copies the outer layer, resets the + unique ID, and performs the required instance variable updates. + + There are no other object primitives (objects cannot be allocated + in the IR directly, they are allocated in [CamlinternalOO]) + + ## Classes + + Classes are stored as module fields. The runtime value that represents + classes is used in two contexts: + + - When using the [new] construction, to generate an object from a class. + - When referencing a class inside another class (either through + inheritance or other class expressions). + + This is done by storing classes as blocks where the first field + is used to generate objects, and the second field is used to derive + classes (in a general sense, not only for inheritance). + In practice classes also contain one other field, which is used to + implement some optimisations in the main compiler (to ensure that each + class only runs its initialisation code once in the whole program, even + if its definition is in a context that is expected to be run several + times like a functor). + So the block layout is the following: + - A field named [obj_init] that is used for creating objects + - A field named [class_init] that is used for deriving classes + - A field named [env] containing values for all the variables + captured by [Translobj.oo_wrap] calls. + + The module [CamlinternalOO] also defines a type [table] that represents + class layouts. Such values are not stored in the class block directly, + but the [obj_init] field captures the table for the class and [class_init] + manipulates such tables. + + ### The [obj_init] field + + As described earlier, each object contains an inner layer that is computed + only once at class initialisation time; it seems natural to store this + block in the runtime value of the class (this block is one of the fields of + the [CamlinternalOO.table] type). However, given that creating an + object also involves setting up the instance variables and running the + initialisers, in practice the class only exports a function that creates + objects, and the table is captured in this function's closure along with + any value necessary to properly initialise the object. + Classes can have parameters, so in practice this object creation function + takes a first unit parameter (to ensure that it is always a function) + and returns a regular OCaml value that is either an object (if the class + doesn't have parameters) or a function which, given values + for the class parameters, will return an object. + + Here is the type of the [obj_init] function for a class which type is + [p1 -> ... -> pn -> object method m1 : t1 ... method mn : tn end]: + [unit -> p1 -> ... -> pn -> < m1 : t1; ... mn : tn >] + (If the class has instance variables or initialisers, they are not + reflected in the type of [obj_init]). + + ### The [class_init] field + + This field is used in two cases: + - When a class is defined in terms of another class, for instance as an + alias, a partial application, or some other kind of wrapper. + - When a class structure (i.e. the [object ... end] syntactic construction) + contains inheritance fields (e.g. [inherit cl as super]). + + In both cases, we only have access to the other class' public type at + compile time, but we must still make sure all of the private fields + are setup correctly, in a way that is compatible with the current + class. + + This is where tables come into play: the [class_init] field is a function + taking a table as parameter, updates it in-place, and returns a function + that is very similar to the [obj_init] function, except that instead of + taking [unit] as its first parameter and returning an object, it takes + a partially initialised object, and updates the parts of it that are + relevant for the corresponding class. It also takes the [env] field as + a parameter, so that different instances of the class can share the + same [class_init] function. + + Thus, the type of [class_init] is: + [table -> env -> Obj.t -> p1 -> ... -> pn -> unit] + + ### The [env] field + + The [env] field is a structure similar to a function's closure, storing + the value of free variables of the class expression. The actual + representation is a bit complex and not very important. + + ### Compilation scheme + + The algorithm implemented below aims at sharing code as much as possible + between the various similar parts of the class. + + - The code of the [obj_init] function is very similar to the code of + the function returned by [class_init]. The main difference is that + [obj_init] starts from scratch, allocating then initialising the object, + while inside [class_init] we want to run initialisation code on an already + allocated object (that we don't need to return). + So in practice we will build a single function that, depending on the value + of its first parameter, will either do the allocation and return the object + (if the parameter is the integer constant 0), or assume the parameter is + an already allocated and update it. + The body of this function is returned by [build_object_init]. + - The table for the current class (that [obj_init] will read from) is + computed by allocating a basic table, then passing it to [class_init], + and finally calling [CamlinternalOO.init_class] on it. + This means that all the code for setting up the class (computing instance + variable indices, calling inherited class initialisers, and so on) is only + generated once, in the [class_init] function. + After building [obj_init], [build_class_init] wraps it with the class + initialization code to build the [class_init] function. + + That's all for the high-level algorithm; the rest will be detailed close to + the corresponding code. + +*) + open Asttypes open Types open Typedtree @@ -98,6 +268,33 @@ let meths_super tbl meths inh_meths = with Not_found -> rem) inh_meths [] +(* +[build_class_init] has two parameters ([cstr] and [super]) that are set when +translating the expression of a class that will be inherited in an outer class. + +They could be replaced with the following type: + +``` +type inheritance_status = + | Normal (** Not under an [inherit] construct *) + | Inheriting of { + must_narrow : bool; + (** [false] if we already went through a call to [narrow] *) + method_getters : (Ident.t * lambda) list; + (** Ancestor methods are accessed through identifiers. + These identifiers are bound at class initialisation time, + by fetching the actual closures from the table just + after setting up the inherited class. *) + instance_vars : (string * Ident.t) list; + (** Inherited instance variables need to have their index bound + in the scope of the child class *) + } +``` + +[cstr] is the negation of [must_narrow], and [super] is the pair +[(instance_vars, method_getters)]. +*) + let bind_super tbl (vals, meths) cl_init = transl_vals tbl false StrictOpt vals (List.fold_right (fun (_nm, id, def) rem -> @@ -110,7 +307,7 @@ let create_object cl obj init = if obj_init = lambda_unit then (inh_init, mkappl (oo_prim (if has_init then "create_object_and_run_initializers" - else"create_object_opt"), + else "create_object_opt"), [obj; Lvar cl])) else begin (inh_init, @@ -125,12 +322,40 @@ let create_object cl obj init = let name_pattern default p = match p.pat_desc with | Tpat_var (id, _, _) -> id - | Tpat_alias(_, id, _, _) -> id + | Tpat_alias(_, id, _, _, _) -> id | _ -> Ident.create_local default +(* + [build_object_init] returns an expression that creates and initialises new + objects. If the class takes parameters, it is a function that, given values + for the parameters, performs the initialisations and (if needed) object + creation. + The [obj] expression will be bound to either the integer 0, in which case + [obj_init] must allocate the object and return it, or to an already allocated + object, in which case [obj_init] will initialize the relevant parts of it + through side-effects. In the case of an immediate object it is always 0. + Parameters: + - [scopes] corresponds to the location scopes (as in the rest of the + translation code) + - [cl_table] is the variable to which the table for the current class is + bound + - [obj] is the parameter of the [obj_init] function we want to create. + As explained above at runtime it might point to either an already allocated + object, when inheriting, or a dummy zero value, when calling [new]. + - [params] stores the anonymous instance variables associated with all + variables that occur inside the class definition but outside the + [object ... end] structure: class parameters and class let bindings. + The definition is always the identifier corresponding to the original + variable. + - [inh_init] accumulates data about the class identifiers encountered, and is + returned at the end to be reused in [build_class_init]. + - [cl] is the class we're compiling *) + let rec build_object_init ~scopes cl_table obj params inh_init obj_init cl = match cl.cl_desc with Tcl_ident (path, _, _) -> + (* The object initialiser for the class in [path], specialised + to the class being defined *) let obj_init = Ident.create_local "obj_init" in let envs, inh_init = inh_init in let env = @@ -142,19 +367,30 @@ let rec build_object_init ~scopes cl_table obj params inh_init obj_init cl = in let loc = of_location ~scopes cl.cl_loc in let path_lam = transl_class_path loc cl.cl_env path in + (* Note: we don't need to bind [params] here, as they are + only used in structures. Outside structures (in class lets or + applications) we use the regular identifiers. *) ((envs, (path, path_lam, obj_init) :: inh_init), mkappl(Lvar obj_init, env @ [obj])) | Tcl_structure str -> + (* Initialising a concrete class structure *) create_object cl_table obj (fun obj -> + (* [obj] will be bound to the allocated object, + unlike the original [obj] which might be zero if called directly + from an object creation expression. *) let (inh_init, obj_init, has_init) = List.fold_right (fun field (inh_init, obj_init, has_init) -> match field.cf_desc with Tcf_inherit (_, cl, _, _, _) -> let (inh_init, obj_init') = + (* Reset [params]. The current ones will be bound + outside the structure. *) build_object_init ~scopes cl_table (Lvar obj) [] inh_init (fun _ -> lambda_unit) cl in + (* Since [obj] is bound to a concrete object, + only the side-effects of [obj_init'] are relevant. *) (inh_init, lsequence obj_init' obj_init, true) | Tcf_val (_, _, id, Tcfk_concrete (_, exp), _) -> (inh_init, @@ -168,6 +404,8 @@ let rec build_object_init ~scopes cl_table obj params inh_init obj_init cl = str.cstr_fields (inh_init, obj_init obj, false) in + (* Set the instance variables associated to the class parameters and + let bindings to their expected value. *) (inh_init, List.fold_right (fun (id, expr) rem -> @@ -176,6 +414,7 @@ let rec build_object_init ~scopes cl_table obj params inh_init obj_init cl = has_init)) | Tcl_fun (_, pat, vals, cl, partial) -> let (inh_init, obj_init) = + (* [vals] maps all pattern variables to idents for use inside methods *) build_object_init ~scopes cl_table obj (vals @ params) inh_init obj_init cl in @@ -200,15 +439,20 @@ let rec build_object_init ~scopes cl_table obj params inh_init obj_init cl = in (inh_init, transl_apply ~scopes obj_init oexprs Loc_unknown) | Tcl_let (rec_flag, defs, vals, cl) -> + (* See comment on the [Tcl_fun] case for the meaning of [vals] *) let (inh_init, obj_init) = build_object_init ~scopes cl_table obj (vals @ params) inh_init obj_init cl in (inh_init, Translcore.transl_let ~scopes rec_flag defs obj_init) | Tcl_open (_, cl) + (* Class local opens are restricted to paths only, so no code is generated + *) | Tcl_constraint (cl, _, _, _, _) -> build_object_init ~scopes cl_table obj params inh_init obj_init cl +(* The manual specifies that toplevel lets *must* be evaluated outside of the + class. This piece of code makes sure we skip them. *) let rec build_object_init_0 ~scopes cl_table params cl copy_env subst_env top ids = match cl.cl_desc with @@ -278,6 +522,25 @@ let rec index a = function let bind_id_as_val (id, _) = ("", id) +(** Build the class initialisation code. + Parameters: + - [scopes] corresponds to the location scopes (as in the rest of the + translation code) + - [cla] is the variable to which the table for the current class is bound + - [cstr] is [true] when called from outside, but [false] when called + from an [inherit] field. Narrowing is necessary during inheritance to + prevent clashes between methods/variables in the child class and private + methods/variables in the parent. + - [super] stores, if we're building an inherited class, the variables and + methods exposed to the child. The variables need to have their associated + index exposed, and methods have to be bound in case the child refers to + them through the ancestor variables. + - [inh_init] is the sequence of inheritance paths computed during + [build_object_init]. + - [cl_init] is the expression we're building. + - [msubst] replaces methods with builtin methods when possible. + - [top] is [false] if the current class is under [Translobj.oo_wrap]. + - [cl] is the class we're compiling *) let rec build_class_init ~scopes cla cstr super inh_init cl_init msubst top cl = match cl.cl_desc with | Tcl_ident _ -> @@ -285,11 +548,17 @@ let rec build_class_init ~scopes cla cstr super inh_init cl_init msubst top cl = | (_, path_lam, obj_init)::inh_init -> (inh_init, Llet (Strict, Pgenval, obj_init, + (* Load the [class_init] field of the class, + and apply it to our current table and the class' environment. + This gets us the object initialiser. *) mkappl(Lprim(Pfield (1, Pointer, Mutable), [path_lam], Loc_unknown), Lvar cla :: if top then [Lprim(Pfield (2, Pointer, Mutable), [path_lam], Loc_unknown)] else []), + (* The methods and variables for this class are fully registered + in the table. If we are in an inheritance context, we can now + bind everything. *) bind_super cla super cl_init)) | _ -> assert false @@ -303,11 +572,18 @@ let rec build_class_init ~scopes cla cstr super inh_init cl_init msubst top cl = Tcf_inherit (_, cl, _, vals, meths) -> let cl_init = output_methods cla methods cl_init in let inh_init, cl_init = + (* Build the initialisation code for the inherited class, + plus its wrappers. + Make sure the wrappers bind the inherited methods + and variables. *) build_class_init ~scopes cla false (vals, meths_super cla str.cstr_meths meths) inh_init cl_init msubst top cl in (inh_init, cl_init, [], values) | Tcf_val (name, _, id, _, over) -> + (* If this is an override, the variable is the same as + the one from the earlier definition, and must not be + bound again. *) let values = if over then values else (name.txt, id) :: values in @@ -342,12 +618,21 @@ let rec build_class_init ~scopes cla cstr super inh_init cl_init msubst top cl = str.cstr_fields (inh_init, cl_init, [], []) in + (* In order of execution at runtime: + - Bind the method and variable indices for the current class + ([bind_methods]) + - Run the code for setting up the individual fields ([cl_init], plus + [output_methods] for the remaining unset methods) + - If we are in an inheritance context, bind the inherited variables + and methods for use in the child ([bind_super] at the top of this + branch) *) let cl_init = output_methods cla methods cl_init in (inh_init, bind_methods cla str.cstr_meths values cl_init) | Tcl_fun (_, _pat, vals, cl, _) -> let (inh_init, cl_init) = build_class_init ~scopes cla cstr super inh_init cl_init msubst top cl in + (* Create anonymous instance variables and define them in the table *) let vals = List.map bind_id_as_val vals in (inh_init, transl_vals cla true StrictOpt vals cl_init) | Tcl_apply (cl, _exprs) -> @@ -356,6 +641,7 @@ let rec build_class_init ~scopes cla cstr super inh_init cl_init msubst top cl = let (inh_init, cl_init) = build_class_init ~scopes cla cstr super inh_init cl_init msubst top cl in + (* Create anonymous instance variables and define them in the table *) let vals = List.map bind_id_as_val vals in (inh_init, transl_vals cla true StrictOpt vals cl_init) | Tcl_constraint (cl, _, vals, meths, concr_meths) -> @@ -398,6 +684,7 @@ let rec build_class_init ~scopes cla cstr super inh_init cl_init msubst top cl = build_class_init ~scopes cla true super inh_init cl_init msubst top cl in + (* Skip narrowing if we're not directly under [inherit] *) if cstr then core cl_init else let (inh_init, cl_init) = core (Lsequence (mkappl (oo_prim "widen", [Lvar cla]), cl_init)) @@ -710,6 +997,8 @@ let transl_class ~scopes ids cl_id pub_meths cl vflag = let tables = Ident.create_local (Ident.name cl_id ^ "_tables") in let (top_env, req) = oo_add_class tables in let top = not req in + (* The manual specifies that toplevel lets *must* be evaluated outside of the + class *) let cl_env, llets = build_class_lets ~scopes cl in let new_ids = if top then [] else Env.diff top_env cl_env in let env2 = Ident.create_local "env" in @@ -790,10 +1079,12 @@ let transl_class ~scopes ids cl_id pub_meths cl vflag = and class_init = Ident.create_local (Ident.name cl_id ^ "_init") and env_init = Ident.create_local "env_init" and obj_init = Ident.create_local "obj_init" in + (* Sort methods by hash *) let pub_meths = List.sort (fun s s' -> compare (Btype.hash_variant s) (Btype.hash_variant s')) pub_meths in + (* Check for hash conflicts *) let tags = List.map Btype.hash_variant pub_meths in let rev_map = List.combine tags pub_meths in List.iter2 @@ -828,10 +1119,13 @@ let transl_class ~scopes ids cl_id pub_meths cl vflag = Llet(Strict, Pgenval, class_init, cl_init, lam), rkind and lbody fv = if List.for_all (fun id -> not (Ident.Set.mem id fv)) ids then + (* Not recursive: can use make_class directly *) mkappl (oo_prim "make_class",[transl_meth_list pub_meths; Lvar class_init]), Dynamic else + (* Recursive: need to have an actual allocation for let rec compilation + to work, so hardcode make_class *) ltable table ( Llet( Strict, Pgenval, env_init, mkappl (Lvar class_init, [Lvar table]), @@ -843,6 +1137,8 @@ let transl_class ~scopes ids cl_id pub_meths cl vflag = Loc_unknown)))), Static and lbody_virt lenvs = + (* Virtual classes only need to provide the [class_init] and [env] + fields. [obj_init] is filled with a dummy [lambda_unit] value. *) Lprim(Pmakeblock(0, Immutable, None), [lambda_unit; Lambda.lfunction ~kind:Curried diff --git a/lambda/translcore.ml b/lambda/translcore.ml index dc84de48..9695814a 100644 --- a/lambda/translcore.ml +++ b/lambda/translcore.ml @@ -20,6 +20,7 @@ open Misc open Asttypes open Primitive open Types +open Data_types open Typedtree open Typeopt open Lambda @@ -31,7 +32,7 @@ type error = exception Error of Location.t * error -let use_dup_for_constant_arrays_bigger_than = 4 +let use_dup_for_constant_mutable_arrays_bigger_than = 4 (* Forward declaration -- to be filled in by Translmod.transl_module *) let transl_module = @@ -158,7 +159,7 @@ let fuse_method_arity parent_params parent_body = let rec iter_exn_names f pat = match pat.pat_desc with | Tpat_var (id, _, _) -> f id - | Tpat_alias (p, id, _, _) -> + | Tpat_alias (p, id, _, _, _) -> f id; iter_exn_names f p | _ -> () @@ -173,6 +174,10 @@ let transl_ident loc env ty path desc = transl_value_path loc env path | _ -> fatal_error "Translcore.transl_exp: bad Texp_ident" +let is_omitted = function + | Arg _ -> false + | Omitted () -> true + let rec transl_exp ~scopes e = transl_exp1 ~scopes ~in_new_scope:false e @@ -212,10 +217,10 @@ and transl_exp0 ~in_new_scope ~scopes e = | Texp_apply({ exp_desc = Texp_ident(path, _, {val_kind = Val_prim p}); exp_type = prim_type } as funct, oargs) when List.length oargs >= p.prim_arity - && List.for_all (fun (_, arg) -> arg <> None) oargs -> + && List.for_all (fun (_, arg) -> not (is_omitted arg)) oargs -> let argl, extra_args = cut p.prim_arity oargs in let arg_exps = - List.map (function _, Some x -> x | _ -> assert false) argl + List.map (function _, Arg x -> x | _, Omitted () -> assert false) argl in let args = transl_list ~scopes arg_exps in let prim_exp = if extra_args = [] then Some e else None in @@ -274,7 +279,7 @@ and transl_exp0 ~in_new_scope ~scopes e = | Texp_try(body, exn_pat_expr_list, eff_pat_expr_list) -> transl_handler ~scopes e body None exn_pat_expr_list eff_pat_expr_list | Texp_tuple el -> - let ll, shape = transl_list_with_shape ~scopes el in + let ll, shape = transl_list_with_shape ~scopes (List.map snd el) in begin try Lconst(Const_block(0, List.map extract_constant ll)) with Not_constant -> @@ -325,7 +330,16 @@ and transl_exp0 ~in_new_scope ~scopes e = | Texp_record {fields; representation; extended_expression} -> transl_record ~scopes e.exp_loc e.exp_env fields representation extended_expression - | Texp_field(arg, _, lbl) -> + | Texp_atomic_loc (arg, _, lbl) -> + let shape = Some [Typeopt.value_kind arg.exp_env arg.exp_type; Pintval] in + let (arg, lbl) = transl_atomic_loc ~scopes arg lbl in + let loc = of_location ~scopes e.exp_loc in + Lprim (Pmakeblock (0, Immutable, shape), [arg; lbl], loc) + | Texp_field (arg, _, ({ lbl_atomic = Atomic; _ } as lbl)) -> + let arg, lbl = transl_atomic_loc ~scopes arg lbl in + let loc = of_location ~scopes e.exp_loc in + Lprim (Patomic_load, [arg; lbl], loc) + | Texp_field (arg, _, lbl) -> let targ = transl_exp ~scopes arg in begin match lbl.lbl_repres with Record_regular | Record_inlined _ -> @@ -339,6 +353,19 @@ and transl_exp0 ~in_new_scope ~scopes e = Lprim (Pfield (lbl.lbl_pos + 1, maybe_pointer e, lbl.lbl_mut), [targ], of_location ~scopes e.exp_loc) end + | Texp_setfield (arg, _, ({ lbl_atomic = Atomic; _ } as lbl), newval) -> + let prim = + Primitive.simple + ~name:"caml_atomic_exchange_field" ~arity:3 ~alloc:false + in + let arg, lbl = transl_atomic_loc ~scopes arg lbl in + let newval = transl_exp ~scopes newval in + let loc = of_location ~scopes e.exp_loc in + Lprim ( + Pignore, + [Lprim (Pccall prim, [arg; lbl; newval], loc)], + loc + ) | Texp_setfield(arg, _, lbl, newval) -> let access = match lbl.lbl_repres with @@ -352,40 +379,45 @@ and transl_exp0 ~in_new_scope ~scopes e = in Lprim(access, [transl_exp ~scopes arg; transl_exp ~scopes newval], of_location ~scopes e.exp_loc) - | Texp_array expr_list -> + | Texp_array (amut, expr_list) -> let kind = array_kind e in let ll = transl_list ~scopes expr_list in + let loc = of_location ~scopes e.exp_loc in + let makearray mutability = + Lprim (Pmakearray (kind, mutability), ll, loc) + in + let duparray_to_mutable array = + Lprim (Pduparray (kind, Mutable), [array], loc) + in + let imm_array = makearray Immutable in begin try (* For native code the decision as to which compilation strategy to use is made later. This enables the Flambda passes to lift certain kinds of array definitions to symbols. *) (* Deactivate constant optimization if array is small enough *) - if List.length ll <= use_dup_for_constant_arrays_bigger_than + if amut = Asttypes.Mutable && + List.length ll <= use_dup_for_constant_mutable_arrays_bigger_than then begin raise Not_constant end; begin match List.map extract_constant ll with - | exception Not_constant when kind = Pfloatarray -> - (* We cannot currently lift [Pintarray] arrays safely in Flambda - because [caml_modify] might be called upon them (e.g. from - code operating on polymorphic arrays, or functions such as - [caml_array_blit]. - To avoid having different Lambda code for - bytecode/Closure vs. Flambda, we always generate - [Pduparray] here, and deal with it in [Bytegen] (or in - the case of Closure, in [Cmmgen], which already has to - handle [Pduparray Pmakearray Pfloatarray] in the case - where the array turned out to be inconstant). + | exception Not_constant + when kind = Pfloatarray && amut = Asttypes.Mutable -> + (* We cannot currently lift mutable [Pintarray] arrays safely in + Flambda because [caml_modify] might be called upon them + (e.g. from code operating on polymorphic arrays, or functions + such as [caml_array_blit]. + To avoid having different Lambda code for bytecode/Closure + vs. Flambda, we always generate [Pduparray] for mutable arrays + here, and deal with it in [Bytegen] (or in the case of Closure, + in [Cmmgen], which already has to handle [Pduparray Pmakearray + Pfloatarray] in the case where the array turned out to be + inconstant). When not [Pfloatarray], the exception propagates to the handler below. *) - let imm_array = - Lprim (Pmakearray (kind, Immutable), ll, - of_location ~scopes e.exp_loc) - in - Lprim (Pduparray (kind, Mutable), [imm_array], - of_location ~scopes e.exp_loc) + duparray_to_mutable imm_array | cl -> - let imm_array = + let const = match kind with | Paddrarray | Pintarray -> Lconst(Const_block(0, cl)) @@ -394,12 +426,12 @@ and transl_exp0 ~in_new_scope ~scopes e = | Pgenarray -> raise Not_constant (* can this really happen? *) in - Lprim (Pduparray (kind, Mutable), [imm_array], - of_location ~scopes e.exp_loc) + match amut with + | Mutable -> duparray_to_mutable const + | Immutable -> const end with Not_constant -> - Lprim(Pmakearray (kind, Mutable), ll, - of_location ~scopes e.exp_loc) + makearray amut end | Texp_ifthenelse(cond, ifso, Some ifnot) -> Lifthenelse(transl_exp ~scopes cond, @@ -515,23 +547,10 @@ and transl_exp0 ~in_new_scope ~scopes e = (* A constant expr (of type <> float if [Config.flat_float_array] is true) gets compiled as itself. *) transl_exp ~scopes e - | `Float_that_cannot_be_shortcut -> - (* We don't need to wrap with Popaque: this forward - block will never be shortcutted since it points to a float - and Config.flat_float_array is true. *) - Lprim(Pmakeblock(Obj.forward_tag, Immutable, None), - [transl_exp ~scopes e], of_location ~scopes e.exp_loc) + | `Float_that_cannot_be_shortcut | `Identifier `Forward_value -> - (* CR-someday mshinwell: Consider adding a new primitive - that expresses the construction of forward_tag blocks. - We need to use [Popaque] here to prevent unsound - optimisation in Flambda, but the concept of a mutable - block doesn't really match what is going on here. This - value may subsequently turn into an immediate... *) - Lprim (Popaque, - [Lprim(Pmakeblock(Obj.forward_tag, Immutable, None), - [transl_exp ~scopes e], - of_location ~scopes e.exp_loc)], + Lprim (Pmakelazyblock Forward_tag, + [transl_exp ~scopes e], of_location ~scopes e.exp_loc) | `Identifier `Other -> transl_exp ~scopes e @@ -547,7 +566,7 @@ and transl_exp0 ~in_new_scope ~scopes e = ~attr:function_attribute_disallowing_arity_fusion ~loc:(of_location ~scopes e.exp_loc) ~body:(transl_exp ~scopes e) in - Lprim(Pmakeblock(Config.lazy_tag, Mutable, None), [fn], + Lprim(Pmakelazyblock Lazy_tag, [fn], of_location ~scopes e.exp_loc) end | Texp_object (cs, meths) -> @@ -683,7 +702,7 @@ and transl_apply ~scopes non-optional parameter that follows it have been received. *) let rec build_apply lam args = function - (None, optional) :: l -> + (Omitted (), optional) :: l -> (* Out-of-order partial application; we will need to build a closure *) let defs = ref [] in let protect name lam = @@ -713,7 +732,9 @@ and transl_apply ~scopes (* Evaluate the remaining arguments; if we already passed here this is a no-op. *) let l = - List.map (fun (arg, opt) -> Option.map (protect "arg") arg, opt) l + List.map + (fun (arg, opt) -> Typedtree.map_apply_arg (protect "arg") arg, opt) + l in let id_arg = Ident.create_local "param" in (* Process remaining arguments and build closure *) @@ -733,13 +754,14 @@ and transl_apply ~scopes List.fold_right (fun (id, lam) body -> Llet(Strict, Pgenval, id, lam, body)) !defs body - | (Some arg, optional) :: l -> + | (Arg arg, optional) :: l -> build_apply lam ((arg, optional) :: args) l | [] -> lapply lam (List.rev_map fst args) in - (build_apply lam [] (List.map (fun (l, x) -> - Option.map (transl_exp ~scopes) x, + let transl_arg arg = Typedtree.map_apply_arg (transl_exp ~scopes) arg in + (build_apply lam [] (List.map (fun (l, arg) -> + transl_arg arg, Btype.is_optional l) sargs) : Lambda.lambda) @@ -961,7 +983,7 @@ and transl_let ~scopes ?(in_structure=false) rec_flag pat_expr_list = List.map (fun {vb_pat=pat} -> match pat.pat_desc with Tpat_var (id,_,_) -> id - | Tpat_alias ({pat_desc=Tpat_any}, id,_,_) -> id + | Tpat_alias ({pat_desc=Tpat_any}, id,_,_,_) -> id | _ -> assert false) pat_expr_list in let transl_case {vb_expr=expr; vb_attributes; vb_rec_kind = rkind; @@ -1078,6 +1100,23 @@ and transl_record ~scopes loc env fields repres opt_init_expr = end end +and transl_atomic_loc ~scopes arg lbl = + let arg = transl_exp ~scopes arg in + let offset = + match lbl.lbl_repres with + | Record_regular + | Record_inlined _ -> 0 + | Record_float -> + fatal_error + "Translcore.transl_atomic_loc: atomic field in float record" + | Record_unboxed _ -> + fatal_error + "Translcore.transl_atomic_loc: atomic field in unboxed record" + | Record_extension _ -> 1 + in + let lbl = Lconst (Const_base (Const_int (lbl.lbl_pos + offset))) in + (arg, lbl) + and transl_match ~scopes e arg pat_expr_list partial = let rewrite_case (val_cases, exn_cases, static_handlers as acc) ({ c_lhs; c_guard; c_rhs } as case) = @@ -1157,8 +1196,9 @@ and transl_match ~scopes e arg pat_expr_list partial = | {exp_desc = Texp_tuple argl}, [] -> assert (static_handlers = []); Matching.for_multiple_match ~scopes e.exp_loc - (transl_list ~scopes argl) val_cases partial + (transl_list ~scopes (List.map snd argl)) val_cases partial | {exp_desc = Texp_tuple argl}, _ :: _ -> + let argl = List.map snd argl in let val_ids = List.map (fun arg -> diff --git a/lambda/translcore.mli b/lambda/translcore.mli index 7c119d98..d2985b94 100644 --- a/lambda/translcore.mli +++ b/lambda/translcore.mli @@ -28,7 +28,7 @@ val transl_apply: scopes:scopes -> ?tailcall:tailcall_attribute -> ?inlined:inline_attribute -> ?specialised:specialise_attribute - -> lambda -> (arg_label * expression option) list + -> lambda -> (arg_label * apply_arg) list -> scoped_location -> lambda val transl_let: scopes:scopes -> ?in_structure:bool -> rec_flag -> value_binding list -> lambda -> lambda diff --git a/lambda/translmod.ml b/lambda/translmod.ml index 5b0092c9..e5516507 100644 --- a/lambda/translmod.ml +++ b/lambda/translmod.ml @@ -515,7 +515,7 @@ and transl_module ~scopes cc rootpath mexp = apply_coercion loc Strict cc (transl_module_path loc mexp.mod_env path) | Tmod_structure str -> - fst (transl_struct ~scopes loc [] cc rootpath str) + transl_struct ~scopes loc [] cc rootpath str | Tmod_functor _ -> oo_wrap mexp.mod_env true (fun () -> compile_functor ~scopes mexp cc rootpath loc) () @@ -551,12 +551,11 @@ and transl_struct ~scopes loc fields cc rootpath {str_final_env; str_items; _} = warning by increasing locations. *) and transl_structure ~scopes loc fields cc rootpath final_env = function [] -> - let body, size = + let body = match cc with Tcoerce_none -> Lprim(Pmakeblock(0, Immutable, None), - List.map (fun id -> Lvar id) (List.rev fields), loc), - List.length fields + List.map (fun id -> Lvar id) (List.rev fields), loc) | Tcoerce_structure(pos_cc_list, id_pos_list) -> (* Do not ignore id_pos_list ! *) (*Format.eprintf "%a@.@[" Includemod.print_coercion cc; @@ -584,30 +583,28 @@ and transl_structure ~scopes loc fields cc rootpath final_env = function List.filter (fun (id,_,_) -> not (Ident.Set.mem id ids)) id_pos_list in - wrap_id_pos_list loc id_pos_list get_field lam, - List.length pos_cc_list + wrap_id_pos_list loc id_pos_list get_field lam | _ -> fatal_error "Translmod.transl_structure" in (* This debugging event provides information regarding the structure items. It is ignored by the OCaml debugger but is used by Js_of_ocaml to preserve variable names. *) - (if !Clflags.debug && not !Clflags.native_code then - Levent(body, - {lev_loc = loc; - lev_kind = Lev_pseudo; - lev_repr = None; - lev_env = final_env}) - else - body), - size + if !Clflags.debug && not !Clflags.native_code then + Levent(body, + {lev_loc = loc; + lev_kind = Lev_pseudo; + lev_repr = None; + lev_env = final_env}) + else + body | item :: rem -> match item.str_desc with | Tstr_eval (expr, _) -> - let body, size = + let body = transl_structure ~scopes loc fields cc rootpath final_env rem in - Lsequence(transl_exp ~scopes expr, body), size + Lsequence(transl_exp ~scopes expr, body) | Tstr_value(rec_flag, pat_expr_list) -> (* Translate bindings first *) let mk_lam_let = @@ -615,10 +612,10 @@ and transl_structure ~scopes loc fields cc rootpath final_env = function let ext_fields = List.rev_append (let_bound_idents pat_expr_list) fields in (* Then, translate remainder of struct *) - let body, size = + let body = transl_structure ~scopes loc ext_fields cc rootpath final_env rem in - mk_lam_let body, size + mk_lam_let body | Tstr_primitive descr -> record_primitive descr.val_val; transl_structure ~scopes loc fields cc rootpath final_env rem @@ -626,23 +623,22 @@ and transl_structure ~scopes loc fields cc rootpath final_env = function transl_structure ~scopes loc fields cc rootpath final_env rem | Tstr_typext(tyext) -> let ids = List.map (fun ext -> ext.ext_id) tyext.tyext_constructors in - let body, size = + let body = transl_structure ~scopes loc (List.rev_append ids fields) cc rootpath final_env rem in - transl_type_extension ~scopes item.str_env rootpath tyext body, size + transl_type_extension ~scopes item.str_env rootpath tyext body | Tstr_exception ext -> let id = ext.tyexn_constructor.ext_id in let path = field_path rootpath id in - let body, size = + let body = transl_structure ~scopes loc (id::fields) cc rootpath final_env rem in Llet(Strict, Pgenval, id, transl_extension_constructor ~scopes item.str_env path - ext.tyexn_constructor, body), - size + ext.tyexn_constructor, body) | Tstr_module ({mb_presence=Mp_present} as mb) -> let id = mb.mb_id in (* Translate module first *) @@ -658,17 +654,16 @@ and transl_structure ~scopes loc fields cc rootpath final_env = function mb.mb_attributes in (* Translate remainder second *) - let body, size = + let body = transl_structure ~scopes loc (cons_opt id fields) cc rootpath final_env rem in begin match id with | None -> Lsequence (Lprim(Pignore, [module_body], - of_location ~scopes mb.mb_name.loc), body), - size + of_location ~scopes mb.mb_name.loc), body) | Some id -> - Llet(pure_module mb.mb_expr, Pgenval, id, module_body, body), size + Llet(pure_module mb.mb_expr, Pgenval, id, module_body, body) end | Tstr_module ({mb_presence=Mp_absent}) -> transl_structure ~scopes loc fields cc rootpath final_env rem @@ -677,7 +672,7 @@ and transl_structure ~scopes loc fields cc rootpath final_env = function List.rev_append (List.filter_map (fun mb -> mb.mb_id) bindings) fields in - let body, size = + let body = transl_structure ~scopes loc ext_fields cc rootpath final_env rem in let lam = @@ -690,14 +685,14 @@ and transl_structure ~scopes loc fields cc rootpath final_env = function Tcoerce_none (field_path rootpath id) modl ) bindings body in - lam, size + lam | Tstr_class cl_list -> let (ids, class_bindings) = transl_class_bindings ~scopes cl_list in - let body, size = + let body = transl_structure ~scopes loc (List.rev_append ids fields) cc rootpath final_env rem in - Value_rec_compiler.compile_letrec class_bindings body, size + Value_rec_compiler.compile_letrec class_bindings body | Tstr_include incl -> let ids = bound_value_identifiers incl.incl_type in let modl = incl.incl_mod in @@ -706,18 +701,16 @@ and transl_structure ~scopes loc fields cc rootpath final_env = function [] -> transl_structure ~scopes loc newfields cc rootpath final_env rem | id :: ids -> - let body, size = + let body = rebind_idents (pos + 1) (id :: newfields) ids in Llet(Alias, Pgenval, id, Lprim(Pfield (pos, Pointer, Mutable), - [Lvar mid], of_location ~scopes incl.incl_loc), body), - size + [Lvar mid], of_location ~scopes incl.incl_loc), body) in - let body, size = rebind_idents 0 fields ids in + let body = rebind_idents 0 fields ids in Llet(pure_module modl, Pgenval, mid, - transl_module ~scopes Tcoerce_none None modl, body), - size + transl_module ~scopes Tcoerce_none None modl, body) | Tstr_open od -> let pure = pure_module od.open_expr in @@ -735,18 +728,16 @@ and transl_structure ~scopes loc fields cc rootpath final_env = function [] -> transl_structure ~scopes loc newfields cc rootpath final_env rem | id :: ids -> - let body, size = + let body = rebind_idents (pos + 1) (id :: newfields) ids in Llet(Alias, Pgenval, id, Lprim(Pfield (pos, Pointer, Mutable), [Lvar mid], - of_location ~scopes od.open_loc), body), - size + of_location ~scopes od.open_loc), body) in - let body, size = rebind_idents 0 fields ids in + let body = rebind_idents 0 fields ids in Llet(pure, Pgenval, mid, - transl_module ~scopes Tcoerce_none None od.open_expr, body), - size + transl_module ~scopes Tcoerce_none None od.open_expr, body) end | Tstr_modtype _ | Tstr_class_type _ @@ -794,17 +785,27 @@ let required_globals ~flambda body = (* Compile an implementation *) +let module_block_size component_names coercion = + match coercion with + | Tcoerce_none -> List.length component_names + | Tcoerce_structure (l, _) -> List.length l + | Tcoerce_functor _ + | Tcoerce_primitive _ + | Tcoerce_alias _ -> assert false + let transl_implementation_flambda module_name (str, cc) = reset_labels (); primitive_declarations := []; Translprim.clear_used_primitives (); let module_id = Ident.create_persistent module_name in let scopes = enter_module_definition ~scopes:empty_scopes module_id in - let body, size = + let body = Translobj.transl_label_init (fun () -> transl_struct ~scopes Loc_unknown [] cc (global_path module_id) str) in + let size = + module_block_size (bound_value_identifiers str.str_type) cc in { module_ident = module_id; main_module_block_size = size; required_globals = required_globals ~flambda:true body; @@ -1442,7 +1443,7 @@ let toploop_setvalue id lam = let toploop_setvalue_id id = toploop_setvalue id (Lvar id) -let close_toplevel_term (lam, ()) = +let close_toplevel_term lam = Ident.Set.fold (fun id l -> Llet(Strict, Pgenval, id, toploop_getvalue id, l)) (free_variables lam) lam @@ -1556,7 +1557,7 @@ let transl_toplevel_item ~scopes item = let transl_toplevel_item_and_close ~scopes itm = close_toplevel_term - (transl_label_init (fun () -> transl_toplevel_item ~scopes itm, ())) + (transl_label_init (fun () -> transl_toplevel_item ~scopes itm)) let transl_toplevel_definition str = reset_labels (); @@ -1572,15 +1573,7 @@ let get_component = function | Some id -> Lprim(Pgetglobal id, [], Loc_unknown) let transl_package_flambda component_names coercion = - let size = - match coercion with - | Tcoerce_none -> List.length component_names - | Tcoerce_structure (l, _) -> List.length l - | Tcoerce_functor _ - | Tcoerce_primitive _ - | Tcoerce_alias _ -> assert false - in - size, + module_block_size component_names coercion, apply_coercion Loc_unknown Strict coercion (Lprim(Pmakeblock(0, Immutable, None), List.map get_component component_names, diff --git a/lambda/translobj.ml b/lambda/translobj.ml index e0945038..dcf1fd7c 100644 --- a/lambda/translobj.ml +++ b/lambda/translobj.ml @@ -88,7 +88,7 @@ let prim_makearray = (* Also use it for required globals *) let transl_label_init_general f = - let expr, size = f () in + let expr = f () in let expr = Hashtbl.fold (fun c id expr -> Llet(Alias, Pgenval, id, Lconst c, expr)) @@ -101,7 +101,7 @@ let transl_label_init_general f = in Env.reset_required_globals ();*) reset_labels (); - expr, size + expr let transl_label_init_flambda f = assert(Config.flambda); @@ -110,7 +110,7 @@ let transl_label_init_flambda f = (* Calling f (usually Translmod.transl_struct) requires the method_cache variable to be initialised to be able to generate method accesses. *) - let expr, size = f () in + let expr = f () in let expr = if !method_count = 0 then expr else @@ -120,7 +120,7 @@ let transl_label_init_flambda f = Loc_unknown), expr) in - transl_label_init_general (fun () -> expr, size) + transl_label_init_general (fun () -> expr) let transl_store_label_init glob size f arg = assert(not Config.flambda); @@ -142,8 +142,7 @@ let transl_store_label_init glob size f arg = Loc_unknown), expr)) in - let lam, size = transl_label_init_general (fun () -> (expr, size)) in - size, lam + size, transl_label_init_general (fun () -> expr) let transl_label_init f = if !Clflags.native_code then diff --git a/lambda/translobj.mli b/lambda/translobj.mli index fbfd07e3..bcec2040 100644 --- a/lambda/translobj.mli +++ b/lambda/translobj.mli @@ -21,7 +21,7 @@ val share: structured_constant -> lambda val meth: lambda -> string -> lambda * lambda list val reset_labels: unit -> unit -val transl_label_init: (unit -> lambda * 'a) -> lambda * 'a +val transl_label_init: (unit -> lambda) -> lambda val transl_store_label_init: Ident.t -> int -> ('a -> lambda) -> 'a -> int * lambda diff --git a/lambda/translprim.ml b/lambda/translprim.ml index df46ea3a..52f39e06 100644 --- a/lambda/translprim.ml +++ b/lambda/translprim.ml @@ -18,7 +18,6 @@ open Misc open Asttypes open Primitive -open Types open Typedtree open Typeopt open Lambda @@ -77,6 +76,17 @@ type loc_kind = | Loc_POS | Loc_FUNCTION +type atomic_kind = + | Ref (* operation on an atomic reference (takes only a pointer) *) + | Field (* operation on an atomic field (takes a pointer and an offset) *) + | Loc (* operation on a first-class field (takes a (pointer, offset) pair *) + +type atomic_op = + | Load + | Exchange + | Cas + | Faa + type prim = | Primitive of Lambda.primitive * int | External of Primitive.description @@ -92,6 +102,7 @@ type prim = | Identity | Apply | Revapply + | Atomic of atomic_op * atomic_kind let used_primitives = Hashtbl.create 7 let add_used_primitive loc env path = @@ -113,6 +124,13 @@ let gen_array_kind = let prim_sys_argv = Primitive.simple ~name:"caml_sys_argv" ~arity:1 ~alloc:true +let prim_atomic_exchange = + Primitive.simple ~name:"caml_atomic_exchange_field" ~arity:3 ~alloc:false +let prim_atomic_cas = + Primitive.simple ~name:"caml_atomic_cas_field" ~arity:4 ~alloc:false +let prim_atomic_fetch_add = + Primitive.simple ~name:"caml_atomic_fetch_add_field" ~arity:3 ~alloc:false + let primitives_table = create_hashtable 57 [ "%identity", Identity; @@ -364,11 +382,18 @@ let primitives_table = "%greaterequal", Comparison(Greater_equal, Compare_generic); "%greaterthan", Comparison(Greater_than, Compare_generic); "%compare", Comparison(Compare, Compare_generic); - "%atomic_load", - Primitive ((Patomic_load {immediate_or_pointer=Pointer}), 1); - "%atomic_exchange", Primitive (Patomic_exchange, 2); - "%atomic_cas", Primitive (Patomic_cas, 3); - "%atomic_fetch_add", Primitive (Patomic_fetch_add, 2); + "%atomic_load", Atomic(Load, Ref); + "%atomic_exchange", Atomic(Exchange, Ref); + "%atomic_cas", Atomic(Cas, Ref); + "%atomic_fetch_add", Atomic(Faa, Ref); + "%atomic_load_field", Atomic(Load, Field); + "%atomic_exchange_field", Atomic(Exchange, Field); + "%atomic_cas_field", Atomic(Cas, Field); + "%atomic_fetch_add_field", Atomic(Faa, Field); + "%atomic_load_loc", Atomic(Load, Loc); + "%atomic_exchange_loc", Atomic(Exchange, Loc); + "%atomic_cas_loc", Atomic(Cas, Loc); + "%atomic_fetch_add_loc", Atomic(Faa, Loc); "%runstack", Primitive (Prunstack, 3); "%reperform", Primitive (Preperform, 3); "%perform", Primitive (Pperform, 1); @@ -490,13 +515,6 @@ let specialize_primitive env ty ~has_constant_constructor prim = if useful then Some (Primitive (Pmakeblock(tag, mut, Some shape), arity)) else None end - | Primitive (Patomic_load { immediate_or_pointer = Pointer }, - arity), _ ->begin - let is_int = match is_function_type env ty with - | None -> Pointer - | Some (_p1, rhs) -> maybe_pointer_type env rhs in - Some (Primitive (Patomic_load {immediate_or_pointer = is_int}, arity)) - end | Comparison(comp, Compare_generic), p1 :: _ -> if (has_constant_constructor && simplify_constant_constructor comp) then begin @@ -658,6 +676,79 @@ let lambda_of_loc kind sloc = let scope_name = Debuginfo.Scoped_location.string_of_scoped_location sloc in Lconst (Const_immstring scope_name) +let atomic_arity op (kind : atomic_kind) = + let arity_of_op = + match op with + | Load -> 1 + | Exchange -> 2 + | Cas -> 3 + | Faa -> 2 + in + let extra_kind_arity = + match kind with + | Ref | Loc -> 0 + | Field -> 1 + in + arity_of_op + extra_kind_arity + +let lambda_of_atomic prim_name loc op (kind : atomic_kind) args = + if List.length args <> atomic_arity op kind then + raise (Error (to_location loc, Wrong_arity_builtin_primitive prim_name)) ; + let split = function + | [] -> + (* split is only called when [arity >= 1] *) + assert false + | first :: rest -> + first, rest + in + let prim = + match op with + | Load -> Patomic_load + | Exchange -> Pccall prim_atomic_exchange + | Cas -> Pccall prim_atomic_cas + | Faa -> Pccall prim_atomic_fetch_add + in + match kind with + | Ref -> + (* the primitive application + [Lprim(%atomic_exchange, [ref; v])] + becomes + [Lprim(caml_atomic_exchange_field, [ref; 0; v])] + *) + let ref_arg, rest = split args in + let args = ref_arg :: Lconst (Lambda.const_int 0) :: rest in + Lprim (prim, args, loc) + | Field -> + (* the primitive application + [Lprim(%atomic_exchange_field, [ptr; ofs; v])] + becomes + [Lprim(caml_atomic_exchange_field, [ptr; ofs; v])] *) + Lprim (prim, args, loc) + | Loc -> + (* the primitive application + [Lprim(%atomic_exchange_loc, [(ptr, ofs); v])] + becomes + [Lprim(caml_atomic_exchange_field, [ptr; ofs; v])] + and in the general case of a non-tuple expression + [Lprim(%atomic_exchange_loc, [loc; v])] + becomes + [Llet(p, loc, + Lprim(caml_atomic_exchange_field, [Field(p, 0); Field(p, 1); v]))] + *) + let loc_arg, rest = split args in + match loc_arg with + | Lprim (Pmakeblock _, [ptr; ofs], _argloc) -> + let args = ptr :: ofs :: rest in + Lprim (prim, args, loc) + | _ -> + let varg = Ident.create_local "atomic_arg" in + let ptr = Lprim (Pfield (0, Pointer, Immutable), [Lvar varg], loc) in + let ofs = + Lprim (Pfield (1, Immediate, Immutable), [Lvar varg], loc) + in + let args = ptr :: ofs :: rest in + Llet (Strict, Pgenval, varg, loc_arg, Lprim (prim, args, loc)) + let caml_restore_raw_backtrace = Primitive.simple ~name:"caml_restore_raw_backtrace" ~arity:2 ~alloc:false @@ -744,10 +835,13 @@ let lambda_of_prim prim_name prim loc args arg_exps = ap_inlined = Default_inline; ap_specialised = Default_specialise; } + | Atomic (op, kind), args -> + lambda_of_atomic prim_name loc op kind args | (Raise _ | Raise_with_backtrace | Lazy_force | Loc _ | Primitive _ | Comparison _ | Send | Send_self | Send_cache | Frame_pointers | Identity - | Apply | Revapply), _ -> + | Apply | Revapply + ), _ -> raise(Error(to_location loc, Wrong_arity_builtin_primitive prim_name)) let check_primitive_arity loc p = @@ -766,6 +860,7 @@ let check_primitive_arity loc p = | Frame_pointers -> p.prim_arity = 0 | Identity -> p.prim_arity = 1 | Apply | Revapply -> p.prim_arity = 2 + | Atomic (op, kind) -> p.prim_arity = atomic_arity op kind in if not ok then raise(Error(loc, Wrong_arity_builtin_primitive p.prim_name)) @@ -826,8 +921,9 @@ let lambda_primitive_needs_event_after = function | Pfloatcomp _ | Pstringlength | Pstringrefu | Pbyteslength | Pbytesrefu | Pbytessetu | Pmakearray ((Pintarray | Paddrarray | Pfloatarray), _) | Parraylength _ | Parrayrefu _ | Parraysetu _ | Pisint | Pisout - | Patomic_exchange | Patomic_cas | Patomic_fetch_add | Patomic_load _ + | Patomic_load | Pintofbint _ | Pctconst _ | Pbswap16 | Pint_as_pointer | Popaque | Pdls_get + | Pmakelazyblock _ -> false (* Determine if a primitive should be surrounded by an "after" debug event *) @@ -838,7 +934,11 @@ let primitive_needs_event_after = function lambda_primitive_needs_event_after (comparison_primitive comp knd) | Lazy_force | Send | Send_self | Send_cache | Apply | Revapply -> true - | Raise _ | Raise_with_backtrace | Loc _ | Frame_pointers | Identity -> false + | Raise _ | Raise_with_backtrace + | Loc _ + | Frame_pointers | Identity + | Atomic (_, _) + -> false let transl_primitive_application loc p env ty path exp args arg_exps = let prim = diff --git a/lambda/value_rec_compiler.ml b/lambda/value_rec_compiler.ml index a240a780..a1ec5456 100644 --- a/lambda/value_rec_compiler.ml +++ b/lambda/value_rec_compiler.ml @@ -43,12 +43,32 @@ open Lambda +(** Allocation and backpatching primitives *) + +let alloc_prim = + Primitive.simple ~name:"caml_alloc_dummy" ~arity:1 ~alloc:true + +let alloc_float_record_prim = + Primitive.simple ~name:"caml_alloc_dummy_float" ~arity:1 ~alloc:true + +let alloc_lazy_prim = + Primitive.simple ~name:"caml_alloc_dummy_lazy" ~arity:1 ~alloc:true + +let update_prim = + (* Note: [alloc] could be false, but it probably doesn't matter *) + Primitive.simple ~name:"caml_update_dummy" ~arity:2 ~alloc:true + +let update_lazy_prim = + Primitive.simple ~name:"caml_update_dummy_lazy" ~arity:2 ~alloc:true + + (** {1. Sizing} *) (* Simple blocks *) type block_size = | Regular_block of int | Float_record of int + | Lazy_block type size = | Unreachable @@ -106,6 +126,39 @@ let join_sizes size1 size2 = | Unreachable, size | size, Unreachable -> size | _, _ -> dynamic_size () +(* We need to recognize the Pmakeblock that we transformed into + primitive calls, to support size compilation in nested recursive + definitions. Consider this example from Vincent Laviron: + {[let f a = + let rec x = + let rec y = Some a in y + in x + ]} + + [let rec y = Some a in y] gets compiled to + {[let y = caml_alloc_dummy 1 in + caml_update_dummy(y, ...); + y]} + and we need to recognize from this definition that this + value has known size [1]. +*) +let find_size_of_alloc_prim prim args = + let same_as other_prim = + let open Primitive in + String.equal prim.prim_name other_prim.prim_name + in + let int_arg = match args with + | [Lconst (Const_base (Const_int n))] -> Some n + | _ -> None + in + if same_as alloc_prim then + Option.map (fun n -> Regular_block n) int_arg + else if same_as alloc_float_record_prim then + Option.map (fun n -> Float_record n) int_arg + else if same_as alloc_lazy_prim then + Some Lazy_block + else None + let compute_static_size lam = let rec compute_expression_size env lam = match lam with @@ -219,6 +272,8 @@ let compute_static_size lam = Note that flat float arrays/records use Pmakearray, so we don't need to check the tag here. *) Block (Regular_block (List.length args)) + | Pmakelazyblock _ -> + Block Lazy_block | Pmakearray (kind, _) -> let size = List.length args in begin match kind with @@ -244,6 +299,12 @@ let compute_static_size lam = so we should never end up here; but these are constants anyway. *) Constant + | Pccall prim -> + begin match find_size_of_alloc_prim prim args with + | Some size -> Block size + | None -> dynamic_size () + end + | Pbytes_to_string | Pbytes_of_string | Pgetglobal _ @@ -255,7 +316,6 @@ let compute_static_size lam = | Pperform | Presume | Preperform - | Pccall _ | Psequand | Psequor | Pnot | Pnegint | Paddint | Psubint | Pmulint | Pdivint _ | Pmodint _ @@ -304,10 +364,7 @@ let compute_static_size lam = | Pbswap16 | Pbbswap _ | Pint_as_pointer - | Patomic_load _ - | Patomic_exchange - | Patomic_cas - | Patomic_fetch_add + | Patomic_load | Popaque | Pdls_get -> dynamic_size () @@ -688,17 +745,72 @@ let empty_bindings = dynamic = []; } -(** Allocation and backpatching primitives *) - -let alloc_prim = - Primitive.simple ~name:"caml_alloc_dummy" ~arity:1 ~alloc:true - -let alloc_float_record_prim = - Primitive.simple ~name:"caml_alloc_dummy_float" ~arity:1 ~alloc:true +(** Allocation and backpatching code *) + +let compile_indirect newval = + let indirect = Lambda.transl_prim "CamlinternalLazy" "indirect" in + Lapply { + ap_func = indirect; + ap_args = [newval]; + ap_loc = no_loc; + ap_tailcall = Default_tailcall; + ap_inlined = Default_inline; + ap_specialised = Default_specialise; + } -let update_prim = - (* Note: [alloc] could be false, but it probably doesn't matter *) - Primitive.simple ~name:"caml_update_dummy" ~arity:2 ~alloc:true +let compile_alloc size = + let alloc prim size = + Lprim (Pccall prim, + [Lconst (Lambda.const_int size)], + no_loc) + in + (* if you add new allocation primitives below, + you should update {!find_size_of_alloc_prim} as well. *) + match size with + | Regular_block size -> + alloc alloc_prim size + | Float_record size -> + alloc alloc_float_record_prim size + | Lazy_block -> + Lprim(Pccall alloc_lazy_prim, + [Lambda.lambda_unit], + no_loc) + +let compile_update size dummy newval = + let prim, newval = + match size with + | Regular_block _ | Float_record _ -> + update_prim, newval + | Lazy_block -> + (* Consider the following example from Vincent Laviron: + {[let rec v = + let l = lazy (expensive computation) in + let () = maybe_force_in_another_domain l in + l + ]} + + The naive/simple compilation scheme would do + a [caml_update_dummy_lazy(v, l)], and the dummy-update code + could run concurrently with another domain forcing [l]. + + To avoid this issue, lazy blocks get updated via + [caml_update_dummy_lazy(dummy, CamlinternalLazy.indirect newval)], + where [CamlinternalLazy.indirect] returns a fresh/local thunk + that is not getting forced concurrently (whereas [newval] + might be). + *) + update_lazy_prim, + begin match newval with + | Lprim(Pmakelazyblock _, _, _) -> + (* No need to wrap the thunk if was just constructed. + This removes indirections on terms defined as lazy thunks + at the toplevel: [let rec x = lazy ...] *) + newval + | _ -> compile_indirect newval + end + in + Lprim (Pccall prim, [dummy; newval], + no_loc) (** Compilation function *) @@ -752,12 +864,9 @@ let compile_letrec input_bindings body = empty_bindings input_bindings in let body_with_patches = - List.fold_left (fun body (id, _size, lam) -> - let update = - Lprim (Pccall update_prim, [Lvar id; lam], no_loc) - in - Lsequence (update, body)) - body (all_bindings_rev.static) + List.fold_left (fun body (id, size, lam) -> + Lsequence (compile_update size (Lvar id) lam, body) + ) body (all_bindings_rev.static) in let body_with_functions = match all_bindings_rev.functions with @@ -777,16 +886,7 @@ let compile_letrec input_bindings body = in let body_with_pre_allocations = List.fold_left (fun body (id, size, _lam) -> - let alloc_prim, size = - match size with - | Regular_block size -> alloc_prim, size - | Float_record size -> alloc_float_record_prim, size - in - let alloc = - Lprim (Pccall alloc_prim, - [Lconst (Lambda.const_int size)], - no_loc) - in + let alloc = compile_alloc size in Llet(Strict, Pgenval, id, alloc, body)) body_with_dynamic_values all_bindings_rev.static in diff --git a/man/ocamldep.1 b/man/ocamldep.1 index 166936b7..d73b82ef 100644 --- a/man/ocamldep.1 +++ b/man/ocamldep.1 @@ -111,6 +111,11 @@ Process .IR file as a .mli file. .TP +.BI \-keywords " version+list" +Set keywords according to the +.IR version+list +specification. +.TP .BI \-map " file" Read an propagate the delayed dependencies for module aliases in .IR file , diff --git a/man/ocamlprof.1 b/man/ocamlprof.1 index 4d9b37fc..e3d8d253 100644 --- a/man/ocamlprof.1 +++ b/man/ocamlprof.1 @@ -71,6 +71,11 @@ Compile the file .I filename as an interface file, even if its extension is not .mli. .TP +.BI \-keywords " version+list" +Set keywords according to the +.IR version+list +specification. +.TP .B \-version Print version string and exit. .TP diff --git a/manual/README.md b/manual/README.md index b6fc76ad..691b189b 100644 --- a/manual/README.md +++ b/manual/README.md @@ -80,11 +80,13 @@ chapters (or sometimes sections) are mapped to a distinct `.etex` file: - Dependency generator (ocamldep): `ocamldep.etex` - The documentation generator (ocamldoc): `ocamldoc.etex` - The debugger (ocamldebug): `debugger.etex` - - Profiling (ocamlprof): `profil.etex` + - Profiling (ocamlprof, perf): `profil.etex` - Interfacing C with OCaml: `intf-c.etex` - Optimisation with Flambda: `flambda.etex` - Fuzzing with afl-fuzz: `afl-fuzz.etex` - Runtime tracing with Runtime_events: `runtime_tracing.etex` + - The “Tail Modulo Constructor” program transformation: `tail-mod-cons.etex` + - Runtime detection of data races with ThreadSanitizer: `tsan.etex` Note that ocamlc,ocamlopt and the toplevel options overlap a lot. Consequently, these options are described together in the file @@ -104,6 +106,8 @@ of `unified-options.etex` contains the relevant information. - The runtime_events library: `libruntime_events.etex` - The dynlink library: dynamic loading and linking of object files: `libdynlink.etex` + - Recently removed or moved libraries (Graphics, Bigarray, Num, LablTk): + `old.etex` Latex extensions ---------------- diff --git a/manual/src/cmds/Makefile b/manual/src/cmds/Makefile index e169d9d2..04ad573d 100644 --- a/manual/src/cmds/Makefile +++ b/manual/src/cmds/Makefile @@ -9,10 +9,10 @@ CAMLLATEX = $(OCAMLRUN) $(addprefix -I ,$(LD_PATH)) \ TEXQUOTE = $(OCAMLRUN) $(TOOLS)/texquote2 TRANSF = $(OCAMLRUN) $(TOOLS)/transf -FILES = comp.tex top.tex runtime.tex native.tex lexyacc.tex intf-c.tex \ - ocamldep.tex profil.tex debugger.tex ocamldoc.tex \ - warnings-help.tex flambda.tex tail-mod-cons.tex \ - afl-fuzz.tex runtime-tracing.tex unified-options.tex tsan.tex +FILES = afl-fuzz.tex comp.tex debugger.tex flambda.tex intf-c.tex \ + lexyacc.tex native.tex ocamldep.tex ocamldoc.tex profil.tex \ + runtime-tracing.tex runtime.tex tail-mod-cons.tex \ + top.tex tsan.tex unified-options.tex warnings-help.tex etex-files: $(FILES) all: $(FILES) diff --git a/manual/src/cmds/intf-c.etex b/manual/src/cmds/intf-c.etex index 24b20764..fc9145ce 100644 --- a/manual/src/cmds/intf-c.etex +++ b/manual/src/cmds/intf-c.etex @@ -658,7 +658,7 @@ Since public method tags are hashed in the same way as variant tags, and methods are functions taking self as first argument, if you want to do the method call "foo#bar" from the C side, you should call: \begin{verbatim} - callback(caml_get_public_method(foo, hash_variant("bar")), foo); + callback(caml_get_public_method(foo, caml_hash_variant("bar")), foo); \end{verbatim} \subsection{ss:c-polyvar}{Polymorphic variants} @@ -668,14 +668,14 @@ as integers (for polymorphic variants without argument), or as blocks (for polymorphic variants with an argument). Unlike constructed terms, variant constructors are not numbered starting from 0, but identified by a hash value (an OCaml integer), as computed by the C function -"hash_variant" (declared in ""): +"caml_hash_variant" (declared in ""): the hash value for a variant constructor named, say, "VConstr" -is "hash_variant(\"VConstr\")". +is "caml_hash_variant(\"VConstr\")". The variant value "`VConstr" is represented by -"hash_variant(\"VConstr\")". The variant value "`VConstr("\var{v}")" is +"caml_hash_variant(\"VConstr\")". The variant value "`VConstr("\var{v}")" is represented by a block of size 2 and tag 0, with field number 0 -containing "hash_variant(\"VConstr\")" and field number 1 containing +containing "caml_hash_variant(\"VConstr\")" and field number 1 containing \var{v}. Unlike constructed values, polymorphic variant values taking several @@ -701,17 +701,24 @@ type) corresponds to the "Some" constructor. \subsection{ss:c-int-ops}{Operations on integers} +The header "" defines a C integer type "intnat" of signed 64-bit +integers (32-bit integers on 32-bit architectures). This type is used to +represent the integer encoded by a "value" corresponding to an unboxed integer +without truncation. + \begin{itemize} -\item "Val_long("\var{l}")" returns the value encoding the "long int" \var{l}. -\item "Long_val("\var{v}")" returns the "long int" encoded in value \var{v}. +\item "Val_long("\var{n}")" returns the value encoding the "intnat" \var{n}. +\item "Long_val("\var{v}")" returns the "intnat" encoded in value \var{v}. \item "Val_int("\var{i}")" returns the value encoding the "int" \var{i}. -\item "Int_val("\var{v}")" returns the "int" encoded in value \var{v}. +\item "Int_val("\var{v}")" returns the "int" encoded in value \var{v}. Note that +this operation may result in a truncated value since "int" is 32-bit wide on +64-bit architectures. \item "Val_bool("\var{x}")" returns the OCaml boolean representing the truth value of the C integer \var{x}. \item "Bool_val("\var{v}")" returns 0 if \var{v} is the OCaml boolean "false", 1 if \var{v} is "true". \item "Val_true", "Val_false" represent the OCaml booleans "true" and "false". -\item "Val_emptylist", "Val_emptylist" represents the empty list. +\item "Val_emptylist" represents the empty list. \item "Val_none" represents the OCaml value "None". \end{itemize} @@ -774,7 +781,7 @@ of a value \var{v} of any boxed type (record or concrete data type). \item "caml_field_unboxable("\var{v}")" calls either "caml_field_unboxed" or "caml_field_boxed" according to the default representation of unboxable types in the current version of OCaml. -\item "Some_val("\var{v}")" returns the argument "\var{x}" of a value \var{v} of +\item "Some_val("\var{v}")" returns the argument \var{x} of a value \var{v} of the form "Some("\var{x}")". \end{itemize} The expressions "Field("\var{v}", "\var{n}")", @@ -1528,19 +1535,19 @@ re-raising the exception (if any) or continuing the computation. "caml_result" values can be manipulated using the following functions and macros: \begin{itemize} -\item "value caml_get_value_or_raise(caml_result \var{res})" +\item "value caml_get_value_or_raise(caml_result "\var{res}")" (in "fail.h") returns the value contained in \var{res} or reraises the exception it contains. In particular, "(void)caml_get_value_or_raise(res)" can be used to ignore an OCaml result of type "unit", yet propagate exceptions to the caller. -\item "Result_value(value \var{v})" (in "mlvalues.h") is the result +\item "Result_value(value "\var{v}")" (in "mlvalues.h") is the result that represents returning the value \var{v}. -\item "Result_exception(value \var{exn})" (in "mlvalues.h") is the +\item "Result_exception(value "\var{exn}")" (in "mlvalues.h") is the result that represents raising the exception \var{exn}. -\item "int caml_result_is_exception(caml_result \var{res})" +\item "int caml_result_is_exception(caml_result "\var{res}")" (in "mlvalues.h") is true if \var{res} represents an exception. \item The macro "CAMLlocalresult(foo)" (in "memory.h") is the @@ -1934,7 +1941,7 @@ following "mod.ml" OCaml source: \begin{verbatim} (* File mod.ml -- some "useful" OCaml functions *) -let rec fib n = if n < 2 then 1 else fib(n-1) + fib(n-2) +let rec fib n = if n < 2 then n else fib(n-1) + fib(n-2) let format_result n = Printf.sprintf "Result is: %d\n" n @@ -2045,11 +2052,9 @@ when the block becomes unreachable and is about to be reclaimed. The block is passed as first argument to the function. The "finalize" field can also be "custom_finalize_default" to indicate that no finalization function is associated with the block. -Note the caution below: there are many restrictions on the behaviour -of these custom block finalizers; they must not allocate on the Caml -heap, or call OCaml code or allow it to be called (for example, they -should not call "caml_release_runtime_system()"). For more powerful -and flexible finalization, use "Gc.finalise" (see \stdmoduleref{Gc}). +Note the caution below: there are many restrictions on the +behaviour of these custom block finalizers. For more powerful and +flexible finalization, use "Gc.finalise" (see \stdmoduleref{Gc}). \item "int (*compare)(value v1, value v2)" \\ The "compare" field contains a pointer to a C function that is @@ -2139,16 +2144,25 @@ specified in the "fixed_length" structure, and do not consume space in the serialized output. \end{itemize} -\emph{Caution}: the "finalize", "compare", "hash", "serialize", and "deserialize" -functions attached to custom blocks descriptors are only allowed limited -interactions with the OCaml runtime. Within these functions, do not call any of -the OCaml allocation functions, and do not perform any callback into OCaml -code. Do not use "CAMLparam" to register the parameters to these functions, and -do not use "CAMLreturn" to return the result. Do not raise exceptions (to -signal an error during deserialization, use "caml_deserialize_error"). Do not -remove global roots. When in doubt, err on the side of caution. Within -"serialize" and "deserialize" functions, use of the corresponding functions -from section~\ref{ss:c-custom-serialization} is allowed (and even recommended). +\emph{Caution}: the "finalize", "compare", "hash", "serialize", and +"deserialize" functions attached to custom block descriptors are allowed +only limited interactions with the OCaml runtime. Within these functions, do +not call any of the OCaml allocation functions, and do not perform any +callback into OCaml code or allow it to be called (for example, do not call +"caml_release_runtime_system()"). Do not use "CAMLparam" to register the +parameters to these functions, do not use "CAMLlocal" to register their +local variables, and do not use "CAMLreturn" to return the result. Do not +raise exceptions. To signal an error during deserialization, use +"caml_deserialize_error", and "serialize" and "deserialize" functions may +freely use the functions from section~\ref{ss:c-custom-serialization}. +There are especially stringent restrictions on the behavior of custom block +finalizers. In addition to the restrictions above, finalizers must not +access the OCaml heap, or mutate the OCaml heap or any memory reachable from +OCaml GC roots. However, note that "finalize" functions may freely use +"caml_remove_global_root" and "caml_remove_generational_global_root". In +short, if a custom block finalizer does anything with the "value" it +receives other than call "Data_custom_val" on it, then it is probably +unsafe. When in doubt, err on the side of caution. \subsection{ss:c-custom-alloc}{Allocating custom blocks} diff --git a/manual/src/cmds/ocamldep.etex b/manual/src/cmds/ocamldep.etex index 1213cb9b..25b53a3f 100644 --- a/manual/src/cmds/ocamldep.etex +++ b/manual/src/cmds/ocamldep.etex @@ -80,6 +80,21 @@ Process \var{file} as a ".ml" file. \item["-intf" \var{file}] Process \var{file} as a ".mli" file. + +\item["-keywords" \var{version+list}] +Set keywords according to the \var{version+list} +specification. + +This specification starts with an optional version number, defining the base set +of keywords, followed by a \var{+}-separated list of additional keywords to add +to this base set. + +Without an explicit version number, the base set of keywords is the +set of keywords in the current version of OCaml. +Additional keywords that do not match any known keyword in the current +version of the language trigger an error whenever they are present in the +source code. + \item["-map" \var{file}] Read and propagate the delayed dependencies for module aliases in \var{file}, so that the following files will depend on the diff --git a/manual/src/cmds/profil.etex b/manual/src/cmds/profil.etex index 7826fab3..1dbf5743 100644 --- a/manual/src/cmds/profil.etex +++ b/manual/src/cmds/profil.etex @@ -1,11 +1,17 @@ -\chapter{Profiling (ocamlprof)} \label{c:profiler} +\chapter{Profiling (ocamlprof, perf)} \label{c:profiler} %HEVEA\cutname{profil.html} -This chapter describes how the execution of OCaml -programs can be profiled, by recording how many times functions are -called, branches of conditionals are taken, \ldots +This chapter describes different ways to profile the execution of OCaml +programs. -\section{s:ocamlprof-compiling}{Compiling for profiling} +\section{s:ocamlprog-overview}{Profiling execution counts with ocamlprof} + +This section describes how the execution of OCaml programs can be profiled, +by recording how many times functions are called, and branches of conditionals +are taken. This approach applies to OCaml programs compiled with the bytecode +and native backends. + +\subsection{s:ocamlprof-compiling}{Compiling for profiling} Before profiling an execution, the program must be compiled in profiling mode, using the "ocamlcp" front-end to the "ocamlc" compiler @@ -63,8 +69,7 @@ The "ocamlcp" and "ocamloptp" commands also accept all the options of the corresponding "ocamlc" or "ocamlopt" compiler, except the "-pp" (preprocessing) option. - -\section{s:ocamlprof-profiling}{Profiling an execution} +\subsection{s:ocamlprof-profiling}{Profiling an execution} Running an executable that has been compiled with "ocamlcp" or "ocamloptp" records the execution counts for the specified parts of @@ -85,7 +90,7 @@ different inputs. Note that dump files produced by byte-code executables (compiled with "ocamlcp") are compatible with the dump files produced by native executables (compiled with "ocamloptp"). -\section{s:ocamlprof-printing}{Printing profiling information} +\subsection{s:ocamlprof-printing}{Printing profiling information} The "ocamlprof" command produces a source listing of the program modules where execution counts have been inserted as comments. For instance, @@ -125,6 +130,10 @@ extension is not ".ml". Process the file \var{filename} as an interface file, even if its extension is not ".mli". +\item["-keywords" \var{version+list}] +Set keywords according to the \var{version+list} +specification. + \item["-version"] Print version string and exit. @@ -136,11 +145,234 @@ Display a short usage summary and exit. % \end{options} -\section{s:ocamlprof-time-profiling}{Time profiling} - Profiling with "ocamlprof" only records execution counts, not the actual time spent within each function. There is currently no way to perform -time profiling on bytecode programs generated by "ocamlc". For time -profiling of native code, users are recommended to use standard tools -such as perf (on Linux), Instruments (on macOS) and DTrace. Profiling -with "gprof" is no longer supported. +time profiling on bytecode programs generated by "ocamlc". + +\section{s:ocamlprof-time-profiling}{Time profiling with Linux perf} + +This section describes how to use \texttt{perf} to profile OCaml programs. Linux Performance Events (aka \texttt{perf}) is a suite of tools for performance observability included with the Linux kernel. The main features covered here are recording events using \texttt{perf-record(1)}, and visualising recorded events using \texttt{perf-report(1)}. \texttt{perf} has many additional profiling and visualising features, for more comprehensive documentation, see (man \texttt{perf(1)}, \href{https://perfwiki.github.io/main/}{\texttt{perf} wiki} or \href{https://www.brendangregg.com/perf.html}{Brendan Gregg's Blog}). + +\subsection{s:ocamlprof-time-profiling-background}{Background} + +Time profiling is typically performed by sampling the CPU call graph at frequent intervals to gather statistics on the code paths that are consuming CPU resources. To profile OCaml code, \texttt{perf} needs to understand the call graph of an OCaml program. \texttt{perf} supports multiple options for recording call graphs: +\begin{itemize} +\item Frame Pointers, which is the default. +\item DWARF's Call Frame Information (CFI). +\item Hardware Last Branch Record (LBR). +\end{itemize} + +Frame pointer based call graphs use a convention where a register called the frame pointer holds the address for the beginning of the stack frame, and the previous values for the frame pointer are stored at a known offset from the current frame pointer. Using this information the call graph for the current function can be calculated purely based on the current stack, a process called unwinding. On x86_64 the register used for storing the frame pointer is \$rbp, while ARM64 uses the register x29. OCaml 5 introduced non-contiguous stacks as part of the implementation of effects, see \href{https://dl.acm.org/doi/10.1145/3453483.3454039}{Retrofitting effect handlers onto OCaml} (Section 5.5). Due to this implementation detail, frame pointers work better with the copying nature of perf. + +DWARF based call graphs use the DWARF CFI information to perform unwinding. However this interacts poorly with the copying nature of perf, often leading to truncated call graphs where not enough of the stack has been copied by \texttt{perf}. It also produces larger trace files that are more costly to capture and process. Finally it requires including CFI debugging information in your program resulting in slightly larger binaries. + +Hardware Last Branch Record (LBR) uses a processor provided method to record call graphs. This has the limitations of restricted availability (only on certain Intel CPUs) and a limited stack depth (16 on Haswell and 32 since Skylake). + +Of these options, frame pointers are recommended for profiling OCaml code. It has the following advantages: +\begin{itemize} +\item Unwinding is faster to calculate. +\item Tracing data produced is smaller. +\item Frame pointers provide more complete call graphs, particularly when used with a Linux distribution that supports them. +\item Frame pointers work better with perf's copying nature and OCaml 5's non-contiguous stacks. +\end{itemize} + +\subsection{s:ocamlprof-compiling-perf}{Compiling for Profiling} + +The process for compiling an executable for time profiling depends on the OCaml version. For OCaml versions 4.14 and earlier, either frame pointers or DWARF can be used, while for OCaml 5.0 and later, enabling frame pointers is recommended. + +To enable frame pointers, configure the compiler with \texttt{--enable-frame-pointers}. Alternatively, you can install an opam switch with frame pointers enabled, as follows: + +\begin{verbatim} + opam switch create ocaml-option-fp +\end{verbatim} + +Frame pointer support for OCaml is available on x86_64 architecture for Linux starting with OCaml 4.12 and on macOS from OCaml 5.3. ARM64 architecture is supported on Linux and macOS from OCaml 5.4, while other Tier-1 architectures (POWER, RISC-V, and s390x) are currently unsupported. + +\subsection{s:ocamlprof-profiling-perf}{Profiling an Execution} + +The basic \texttt{perf} command for profiling is: +\begin{verbatim} + perf record -F 99 --call-graph fp PROGRAM +\end{verbatim} + +The \texttt{-F 99} option sets \texttt{perf} to sample at 99Hz, reducing excessive data generation during longer runs and minimising overlap with other periodic activities. The \texttt{--call-graph fp} instructs \texttt{perf} to use frame pointers to get the call graph, followed by the OCaml executable you want to profile. This command creates a \texttt{perf.data} file in the current directory. Alternatively use \texttt{--output} to choose a more descriptive filename. + +The \texttt{perf record} command works by copying a segment of the call stack at each sample and recording this data into a \texttt{perf.data} file. These samples can then be processed after recording using \texttt{perf report} to reconstruct the profiled program’s call stack at every sample. + +\texttt{perf} uses the symbols present in an OCaml executable, so it helps to understand OCaml's name mangling scheme to map names to OCaml source locations. OCaml 5.4 onwards uses a name mangling scheme of \texttt{caml\$_}, where \texttt{NNN} is a randomly generated number. In OCaml 5.3 the separator is a dot \texttt{caml._}, and before OCaml 5.1 the separator is double underscores. All formats are supported by \texttt{perf}. + +Consider the following program: + +\begin{caml_example*}{verbatim} +(* fib.ml *) +module Compute = struct + let rec fib n = + if n = 0 then 0 + else if n = 1 then 1 + else fib (n-1) + fib (n-2) +end + +let main () = + let r = Compute.fib 20 in + Printf.printf "fib(20) = %d" r + +let _ = main () +\end{caml_example*} + +This program produces the names \texttt{camlFib\$main_274} for the \texttt{main} function and \texttt{camlFib\$fib_271} for the \texttt{fib} function in the \texttt{Compute} module. + +\subsection{s:ocamlprof-printing}{Displaying profiling information} + +The \texttt{perf report} command summarises data in the \texttt{perf.data} file. +The basic \texttt{perf report} command is: + +\begin{verbatim} + perf report -f --no-children -i perf.data +\end{verbatim} + +This command provides an interactive interface where you can navigate through the accumulated call graphs and select functions and threads for detailed information. Alternatively \texttt{--stdio} will output similar data using a text based report written to stdout. Note that if stack traces appear broken, it may be due to software not having frame pointer support enabled. + +Consider the following program which calculates the Tak function. +\begin{caml_example*}{verbatim} +let (x,y,z) = + try + let x = int_of_string Sys.argv.(1) in + let y = int_of_string Sys.argv.(2) in + let z = int_of_string Sys.argv.(3) in + (x,y,z) + with _ -> (18,12,6) + +let rec tak x y z = + if x > y then + tak (tak (x-1) y z) (tak (y-1) z x) (tak (z-1) x y) + else z + +let main () = + let r = tak x y z in + Printf.printf "tak %d %d %d = %d\n" x y z r + +let _ = main () +\end{caml_example*} + +The \texttt{perf} report for this might resemble the following. +\begin{verbatim} +Samples: 809 of event 'cycles', Event count (approx.): 24701952617 + Overhead Command Shared Object Symbol +- 100.00% tak-fp.exe tak-fp.exe [.] Tak\$tak_402 + Tak\$tak_402 + Tak\$tak_402 + + Tak\$tak_402 + 0.00% tak-fp.exe [kernel.kallsyms] [k] 0xffffb9a5ff79d854 + 0.00% perf-exec [kernel.kallsyms] [k] 0xffffb9a5ff719c34 +\end{verbatim} + +For a more interesting program implementing a Sudoku solver using Norvig's Backtracking algorithm, the output might resemble. + +\begin{verbatim} +Samples: 7K of event 'cycles:P', Event count (approx.): 141874642467 + Overhead Command Shared Object Symbol +- 35.90% sudoku_norvig.e sudoku_norvig.exe [.] Sudoku_norvig._pow_747 + - 35.29% Sudoku_norvig$_pow_747 + + 17.70% Sudoku_norvig$eliminate_value_760 + + 15.74% Sudoku_norvig$_pow_747 + + 1.03% Sudoku_norvig$fun_1435 + 0.61% Sudoku_norvig$eliminate_value_760 +- 12.99% sudoku_norvig.e sudoku_norvig.exe [.] BatList$findnext_1543 + - 12.00% BatList$findnext_1543 + - 11.71% BatList$find_all_1539 + + 8.07% Sudoku_norvig$fun_1421 + + 2.73% Sudoku_norvig$eliminate_948 + + 0.90% Sudoku_norvig$assign_949 +- 10.63% sudoku_norvig.e sudoku_norvig.exe [.] Sudoku_norvig$eliminate_value_760 + + 8.29% Sudoku_norvig$eliminate_value_760 + + 1.93% Sudoku_norvig$_pow_747 ++ 9.50% sudoku_norvig.e [kernel.kallsyms] [k] asm_exc_nmi ++ 7.24% sudoku_norvig.e sudoku_norvig.exe [.] Sudoku_norvig$fun_1435 ++ 5.06% sudoku_norvig.e sudoku_norvig.exe [.] caml_modify ++ 3.10% sudoku_norvig.e sudoku_norvig.exe [.] Sudoku_norvig$fun_1360 ++ 2.11% sudoku_norvig.e sudoku_norvig.exe [.] Sudoku_norvig$eliminate_948 ++ 2.00% sudoku_norvig.e sudoku_norvig.exe [.] Stdlib.List$iter_366 ++ 1.54% sudoku_norvig.e sudoku_norvig.exe [.] Sudoku_norvig$fun_1421 ++ 1.47% sudoku_norvig.e sudoku_norvig.exe [.] caml_apply2 ++ 1.42% sudoku_norvig.e sudoku_norvig.exe [.] BatList$find_all_1539 ++ 1.20% sudoku_norvig.e sudoku_norvig.exe [.] Sudoku_norvig$fun_1366 ++ 1.09% sudoku_norvig.e sudoku_norvig.exe [.] Stdlib.List$fold_left_380 +\end{verbatim} +Note this implementation clearly has some optimsation possible in `_pow_747` a recursive Power of 2 function, and parts of the OCaml runtime `caml_modify` are present. + +Profiling data can also be visualised as Flame Graphs, which highlight the most frequent code paths in stack traces. The original scripts scripts \texttt{stackcollapse-perf.pl} and \texttt{flamegraph.pl} can be found at Brendan Gregg's \href{https://www.brendangregg.com/flamegraphs.html}{Flame Graphs} web page and work as follows: + +\begin{verbatim} +git clone https://github.com/brendangregg/FlameGraph +cd FlameGraph + +# Collect the results into perf.data +perf record -F 99 --call-graph fp PROGRAM +perf script -i perf.data | ./stackcollapse-perf.pl out.folded +flamegraph.pl out.folded > flamegraph.svg ## Create the FlameGraph svg +\end{verbatim} + +Alternatively \href{https://github.com/jonhoo/inferno}{inferno} is a Rust port of the Flame Graphs tools which works in a similar way and is faster to process large perf files. + +\begin{verbatim} +cargo install inferno + +# Collect the results into perf.data +perf script -i perf.data | inferno-collapse-perf > stacks.folded +cat stacks.folded | inferno-flamegraph > flamegraph.svg +\end{verbatim} + +Some \texttt{perf} tools (e.g., \texttt{perf-report(1)} and \texttt{perf-annotate(1)}) use DWARF debugging information to associate symbols with source code locations, if you need these features, the program and it's dependencies need to be compiled with \texttt{-g} to include debugging information in the executable. + +Captured profile data can also be processed using \texttt{perf script} in various ways or with online tools like \href{https://www.speedscope.app}{speedscope.app} and \href{https://profiler.firefox.com/}{profiler.firefox.com}, or any other tool that supports \texttt{perf}-formatted data. + +\subsection{s:ocamlperf-conclusion}{Conclusion} + +For Time profiling of native code, standard tools such as \texttt{perf}, eBPF, DTrace, or Instruments (on macOS) are recommended. Compiling with frame pointers enabled is often necessary for these tools to work effectively. Profiling with \texttt{gprof} is no longer supported. + +Enabling frame pointers can impact performance on certain architectures (up to 10\% performance cost on x86_64 has been measured). Users of this feature are encouraged to benchmark their own applications to assess this impact. + +\section{s:ocamlprof-instruments}{Time profiling with macOS Instruments} + +Instruments is an application performance analyzer and visualizer provided in XCode on macOS. It includes a CLI tool "xctrace" that can capture Time Profiling information about OCaml programs, there is also a GUI application for running and visualising profiles. Here we only cover capturing time profiles with "xctrace", for more information on Instruments consult Apple's documentation. + +The same prerequisites hold for Time profiling with macOS Instruments as for Linux perf, consult "Background" (~\ref{s:ocamlprof-time-profiling-background}) from the previous section for an explanation of call graphs and follow the setup from "Compiling for Profiling" (~\ref{s:ocamlprof-compiling-perf}). + +The basic \texttt{xctrace} command for time profiling is: + +\begin{verbatim} +$ xcrun xctrace record --output . --template "Time Profiler" \ + --target-stdout - --launch -- PROGRAM +\end{verbatim} + +The \texttt{--template "Time Profiler"} selects pre-defined template for time profiling which will create a trace file with extension `.trace` that can be opened with Instruments. Use the \texttt{--output} to select a name for the trace file, by default xctrace will create a new file each run rather than overwriting the existing file. + +The resulting file can be opened with Instruments to view the profile, and it maybe be possible to generate Flame Graphs using \href{https://github.com/jonhoo/inferno}{inferno} or the scripts from \href{https://github.com/brendangregg/FlameGraph}{https://github.com/brendangregg/FlameGraph}. + +\lparagraph{p:ocamlprof-instruments}{Note} +Sometimes Instruments requires adding entitlements to an OCaml binary before it is able to profile it. This typically shows as a failure to launch the process or as a permission error. To work around this issue run the following command, replacing 'PROGRAM' with the program to trace. + +\begin{verbatim} +$ codesign -s - -v -f --entitlements =(echo -n +' + + + + com.apple.security.get-task-allow + + + ') PROGRAM +\end{verbatim} + +For more details on entitlements and codesigning consult Apple's documentation. + +\section{s:ocamlprof-glossary}{Glossary} + +The following terminology is used in this chapter of the manual. + +\begin{itemize} +\item[{\bf Call graph}] The chain of function calls that have lead to the current function (also referred to as a call stack). +\item[{\bf Unwinding}] The process of walking up the call stack (also called stack unwinding). +\item[{\bf Stack frame}] Refers to the portion of the stack allocated to a single function call. (also called an activation frame, activation record or simply frame). +\end{itemize} diff --git a/manual/src/cmds/unified-options.etex b/manual/src/cmds/unified-options.etex index 96cc29ce..8a74047d 100644 --- a/manual/src/cmds/unified-options.etex +++ b/manual/src/cmds/unified-options.etex @@ -643,7 +643,7 @@ After parsing, pipe the abstract syntax tree through the preprocessor \ifouthtml chapter~\ref{c:parsinglib}: \ahref{compilerlibref/Ast\_mapper.html}{ \texttt{Ast_mapper} } -\else section~\ref{Ast-underscoremapper}\fi, +\else section~\ref{Ast_mapper}\fi, implements the external interface of a preprocessor. \item["-principal"] @@ -702,7 +702,7 @@ compiler's intermediate representation of the program using "compiler-libs" library (see \ifouthtml chapter~\ref{c:parsinglib} and \ahref{compilerlibref/Compiler\_libs.html}{ \texttt{Compiler_libs} } -\else section~\ref{Compiler-underscorelibs}\fi +\else section~\ref{Compiler_libs}\fi ). }%nat diff --git a/manual/src/library/compilerlibs.etex b/manual/src/library/compilerlibs.etex index 4247a2c4..c9e742eb 100644 --- a/manual/src/library/compilerlibs.etex +++ b/manual/src/library/compilerlibs.etex @@ -1,5 +1,5 @@ \chapter{The compiler front-end} \label{c:parsinglib}\cutname{parsing.html} -\label{Compiler-underscorelibs} % redirect references to compiler_libs.mld here +\label{Compiler_libs} % redirect references to compiler_libs.mld here This chapter describes the OCaml front-end, which declares the abstract syntax tree used by the compiler, provides a way to parse, print diff --git a/manual/src/library/stdlib-blurb.etex b/manual/src/library/stdlib-blurb.etex index 41cf39f0..06ead84a 100644 --- a/manual/src/library/stdlib-blurb.etex +++ b/manual/src/library/stdlib-blurb.etex @@ -46,6 +46,7 @@ the above 4 modules \\ "Uchar" & p.~\stdpageref{Uchar} & Unicode characters \\ "Int" & p.~\stdpageref{Int} & integer values \\ "Option" & p.~\stdpageref{Option} & option values \\ +"Pair" & p.~\stdpageref{Pair} & pairs of values \\ "Result" & p.~\stdpageref{Result} & result values \\ "Effect" & p.~\stdpageref{Effect} & effect handlers \\ "Either" & p.~\stdpageref{Either} & either values \\ @@ -58,6 +59,7 @@ the above 4 modules \\ "Oo" & p.~\stdpageref{Oo} & useful functions on objects \\ "Stack" & p.~\stdpageref{Stack} & last-in first-out stacks \\ "Queue" & p.~\stdpageref{Queue} & first-in first-out queues \\ +"Pqueue" & p.~\stdpageref{Pqueue} & priority queues \\ "Buffer" & p.~\stdpageref{Buffer} & buffers that grow on demand \\ "Dynarray" & p.~\stdpageref{Dynarray} & dynamic arrays: arrays that grow on demand \\ "Seq" & p.~\stdpageref{Seq} & functional iterators \\ @@ -66,7 +68,8 @@ the above 4 modules \\ from being garbage-collected \\ "Atomic" & p.~\stdpageref{Atomic} & atomic references (for compatibility with concurrent runtimes) \\ "Ephemeron" & p.~\stdpageref{Ephemeron} & ephemerons and weak hash tables \\ -"Bigarray" & p.~\stdpageref{Bigarray} & large, multi-dimensional, numerical arrays +"Bigarray" & p.~\stdpageref{Bigarray} & large, multi-dimensional, numerical arrays \\ +"Iarray" & p.~\stdpageref{Iarray} & immutable arrays \end{tabular} \subsubsection*{sss:stdlib-arith}{Arithmetic:} \begin{tabular}{lll} @@ -79,8 +82,8 @@ integers \end{tabular} \subsubsection*{sss:stdlib-io}{input/output:} \begin{tabular}{lll} -"In_channel" & p.~\stdpageref{In-underscorechannel} & input channels \\ -"Out_channel" & p.~\stdpageref{Out-underscorechannel} & output channels \\ +"In_channel" & p.~\stdpageref{In_channel} & input channels \\ +"Out_channel" & p.~\stdpageref{Out_channel} & output channels \\ "Format" & p.~\stdpageref{Format} & pretty printing with automatic indentation and line breaking \\ "Marshal" & p.~\stdpageref{Marshal} & marshaling of data structures \\ @@ -115,6 +118,8 @@ be called from C \\ \begin{tabular}{lll} "Fun" & p.~\stdpageref{Fun} & function values \\ "Type" & p.~\stdpageref{Type} & type introspection \\ +"Repr" & p.~\stdpageref{Repr} & functions defined on the low-level +representation of values \\ \end{tabular} \end{latexonly} @@ -135,6 +140,7 @@ be called from C \\ \stddocitem{Domain}{Domain spawn/join and domain local variables} \stddocitem{Digest}{MD5 message digest} \stddocitem{Dynarray}{Dynamic arrays} +\stddocitem{Iarray}{Immutable arrays} \stddocitem{Effect}{deep and shallow effect handlers} \stddocitem{Either}{either values} \stddocitem{Ephemeron}{Ephemerons and weak hash table} @@ -160,18 +166,21 @@ be called from C \\ \stddocitem{Oo}{object-oriented extension} \stddocitem{Option}{option values} \stddocitem{Out_channel}{output channels} +\stddocitem{Pair}{pairs of values} \stddocitem{Parsing}{the run-time library for parsers generated by \texttt{ocamlyacc}} +\stddocitem{Pqueue}{priority queues} \stddocitem{Printexc}{facilities for printing exceptions} \stddocitem{Printf}{formatting printing functions} \stddocitem{Queue}{first-in first-out queues} \stddocitem{Random}{pseudo-random number generator (PRNG)} +\stddocitem{Repr}{functions defined on the low-level representation of values} \stddocitem{Result}{result values} \stddocitem{Scanf}{formatted input functions} \stddocitem{Seq}{functional iterators} \stddocitem{Set}{sets over ordered types} \stddocitem{Semaphore}{semaphores, another thread synchronization mechanism} \stddocitem{Stack}{last-in first-out stacks} -\stddocitem{StdLabels}{include modules \texttt{Array}, \texttt{List} and \texttt{String} with labels} +\stddocitem{StdLabels}{include modules \texttt{Array}, \texttt{List}, \texttt{String} and \texttt{Iarray} with labels} \stddocitem{String}{string operations} \stddocitem{StringLabels}{string operations (with labels)} \stddocitem{Sys}{system interface} diff --git a/manual/src/macros.tex b/manual/src/macros.tex index 9118ef5e..5e88a4d0 100644 --- a/manual/src/macros.tex +++ b/manual/src/macros.tex @@ -164,7 +164,8 @@ \pagestyle{myheadings} \def\partmark#1{\markboth{Part \thepart. \ #1}{}} -\def\chaptermark#1{\markright{Chapter \thechapter. \ #1}} +\def\chaptermark#1{\markboth{Chapter \thechapter. \ #1}{}} +\def\sectionmark#1{\markright{\thesection. \ #1}} % nth diff --git a/manual/src/refman/Makefile b/manual/src/refman/Makefile index 37f581fc..4030076d 100644 --- a/manual/src/refman/Makefile +++ b/manual/src/refman/Makefile @@ -16,7 +16,7 @@ EXTENSION_FILES = letrecvalues.tex recursivemodules.tex locallyabstract.tex \ generativefunctors.tex extensionsyntax.tex inlinerecords.tex \ doccomments.tex indexops.tex emptyvariants.tex alerts.tex \ generalizedopens.tex bindingops.tex extensionnodes.tex privatetypes.tex \ - effects.tex + effects.tex arrayliterals.tex labeledtuples.tex FILES = $(addprefix extensions/,$(EXTENSION_FILES)) \ refman.tex lex.tex names.tex values.tex const.tex types.tex \ diff --git a/manual/src/refman/expr.etex b/manual/src/refman/expr.etex index 81456a6d..89634b59 100644 --- a/manual/src/refman/expr.etex +++ b/manual/src/refman/expr.etex @@ -123,8 +123,10 @@ See also the following language extensions: \hyperref[s:explicit-overriding-open]{overriding in open statements}, \hyperref[s:bigarray-access]{syntax for Bigarray access}, \hyperref[s:attributes]{attributes}, -\hyperref[s:extension-nodes]{extension nodes} and -\hyperref[s:index-operators]{extended indexing operators}. +\hyperref[s:extension-nodes]{extension nodes}, +\hyperref[s:index-operators]{extended indexing operators}, +\hyperref[s:array-literals]{type-directed disambiguation of array literals}, and +\hyperref[s:labeled-tuples]{labeled tuples}. \subsection{ss:precedence-and-associativity}{Precedence and associativity} The table below shows the relative precedences and associativity of diff --git a/manual/src/refman/exten.etex b/manual/src/refman/exten.etex index 5cea0f3a..fbbd0113 100644 --- a/manual/src/refman/exten.etex +++ b/manual/src/refman/exten.etex @@ -6,122 +6,32 @@ that are implemented in OCaml, but not described in chapter \ref{c:refman}. %HEVEA\cutdef{section} -\section{s:letrecvalues}{Recursive definitions of values} -%HEVEA\cutname{letrecvalues.html} -\input{letrecvalues.tex} -\section{s:recursive-modules}{Recursive modules} -\ikwd{module\@\texttt{module}} -\ikwd{and\@\texttt{and}} -%HEVEA\cutname{recursivemodules.html} +\input{letrecvalues.tex} \input{recursivemodules.tex} - -\section{s:private-types}{Private types} -%HEVEA\cutname{privatetypes.html} -\ikwd{private\@\texttt{private}} \input{privatetypes.tex} - -\section{s:locally-abstract}{Locally abstract types} -\ikwd{type\@\texttt{type}} -\ikwd{fun\@\texttt{fun}} -%HEVEA\cutname{locallyabstract.html} \input{locallyabstract.tex} - -\section{s:first-class-modules}{First-class modules} -\ikwd{module\@\texttt{module}} -\ikwd{val\@\texttt{val}} -\ikwd{with\@\texttt{with}} -\ikwd{and\@\texttt{and}} -%HEVEA\cutname{firstclassmodules.html} \input{firstclassmodules.tex} - -\section{s:module-type-of}{Recovering the type of a module} -%HEVEA\cutname{moduletypeof.html} -\ikwd{module\@\texttt{module}} -\ikwd{type\@\texttt{type}} -\ikwd{of\@\texttt{of}} -\ikwd{include\@\texttt{include}} \input{moduletypeof.tex} - -\section{s:signature-substitution}{Substituting inside a signature} -\ikwd{with\@\texttt{with}} -\ikwd{module\@\texttt{module}} -\ikwd{type\@\texttt{type}} -%HEVEA\cutname{signaturesubstitution.html} \input{signaturesubstitution.tex} - -\section{s:module-alias}{Type-level module aliases} -\ikwd{module\@\texttt{module}} -%HEVEA\cutname{modulealias.html} \input{modulealias.tex} - -\section{s:explicit-overriding-open}{Overriding in open statements} -\ikwd{open.\@\texttt{open\char33}} -%HEVEA\cutname{overridingopen.html} \input{overridingopen.tex} - -\section{s:gadts}{Generalized algebraic datatypes} \ikwd{type\@\texttt{type}} -\ikwd{match\@\texttt{match}} -%HEVEA\cutname{gadts.html} \input{gadts.tex} - -\section{s:bigarray-access}{Syntax for Bigarray access} -%HEVEA\cutname{bigarray.html} \input{bigarray.tex} - -\section{s:attributes}{Attributes} -%HEVEA\cutname{attributes.html} -\ikwd{when\@\texttt{when}} \input{attributes.tex} - -\section{s:extension-nodes}{Extension nodes} -%HEVEA\cutname{extensionnodes.html} \input{extensionnodes.tex} - -\section{s:extensible-variants}{Extensible variant types} -%HEVEA\cutname{extensiblevariants.html} \input{extensiblevariants.tex} - -\section{s:generative-functors}{Generative functors} -%HEVEA\cutname{generativefunctors.html} \input{generativefunctors.tex} - -\section{s:extension-syntax}{Extension-only syntax} -%HEVEA\cutname{extensionsyntax.html} \input{extensionsyntax.tex} - -\section{s:inline-records}{Inline records} -%HEVEA\cutname{inlinerecords.html} \input{inlinerecords.tex} - -\section{s:doc-comments}{Documentation comments} -%HEVEA\cutname{doccomments.html} \input{doccomments.tex} - -\section{s:index-operators}{Extended indexing operators } -%HEVEA\cutname{indexops.html} \input{indexops.tex} - -\section{s:empty-variants}{Empty variant types} -%HEVEA\cutname{emptyvariants.html} -(Introduced in 4.07.0) \input{emptyvariants.tex} - -\section{s:alerts}{Alerts} -%HEVEA\cutname{alerts.html} \input{alerts.tex} - -\section{s:generalized-open}{Generalized open statements} -%HEVEA\cutname{generalizedopens.html} \input{generalizedopens.tex} - -\section{s:binding-operators}{Binding operators} -%HEVEA\cutname{bindingops.html} \input{bindingops.tex} - -\section{s:effect-handlers}{Effect handlers} -%HEVEA\cutname{effects.html} \input{effects.tex} - +\input{arrayliterals.tex} +\input{labeledtuples.tex} %HEVEA\cutend diff --git a/manual/src/refman/extensions/alerts.etex b/manual/src/refman/extensions/alerts.etex index f037a30f..e93e26c8 100644 --- a/manual/src/refman/extensions/alerts.etex +++ b/manual/src/refman/extensions/alerts.etex @@ -1,3 +1,6 @@ +\section{s:alerts}{Alerts} +%HEVEA\cutname{alerts.html} + (Introduced in 4.08) Since OCaml 4.08, it is possible to mark components (such as value or @@ -17,32 +20,85 @@ component is referenced). The "ocaml.alert" or "alert" attribute serves two purposes: (i) to mark component with an alert to be triggered when the component is -referenced, and (ii) to control which alert names are enabled. In the -first form, the attribute takes an identifier possibly +referenced, and (ii) to control which alerts are enabled. + +\subsection{ss:alert_marking}{Marking a component} + +When marking a component, the attribute takes an identifier possibly followed by a message. Here is an example of a value declaration marked with an alert: -\begin{verbatim} +\begin{caml_example*}{signature} module U: sig val fork: unit -> bool [@@alert unix "This function is only available under Unix."] end -\end{verbatim} +\end{caml_example*} Here "unix" is the identifier for the alert. If this alert category is enabled, any reference to "U.fork" will produce a message at compile time, which can be turned or not into a fatal error. -And here is another example as a floating attribute on top -of an ``.mli'' file (i.e. before any other non-attribute item) -or on top of an ``.ml'' file without a corresponding interface file, -so that any reference to that unit will trigger the alert: +For other structure or signature components, the syntax is as follows: -\begin{verbatim} +\begin{caml_example*}{verbatim} +module type Sig = sig + val v: int [@@alert name] +end + +let v [@alert name] = 1 +let `A (v [@alert name]) = `A 1 + +external e : int -> int = "c_function" [@@alert name] + +type t1 = A | B [@@alert name] +(* N.B.: this only alerts on use of "t1", not uses of the constructors "A" + and "B". So let x = A wouldn't alert, so long as you don't write down its + type. *) + +type t2 = A | B [@alert name] +(* Alerts on use of "B", but not "A" nor "t2". Note the single "@". *) + +type t3 = { a : int; b : int [@alert name] } +(* Alerts on use of "b", but not "a" nor "t3". Note the single "@". *) + +exception E of int [@alert name] +(* Alerts on use of "E". Note the single "@". *) + +module M = struct end [@@alert name] +module type S = sig end [@@alert name] +class c1 = object end [@@alert name] +class type c2 = object end [@@alert name] +\end{caml_example*} + +When the typer coerces a signature with alerts to a signature with different +alerts: + +\begin{caml_example*}{verbatim} +module M : sig + val x : int + val y : int [@@alert name] +end = struct + let x [@alert name] = 0 + let y = 1 +end +\end{caml_example*} + +any alert that isn't passed through, i.e. the alert on "x" here, gets +triggered. + +Finally, to alert when the module corresponding to a file is referenced, +a floating attribute can be written at the top of the ``.mli'' file +(i.e. before any other non-attribute item), or the top of the ``.ml'' file +if there is no ``.mli'' file: + +\begin{caml_example*}{verbatim} [@@@alert unsafe "This module is unsafe!"] -\end{verbatim} +\end{caml_example*} +\subsection{ss:control}{Controlling which alerts are enabled} + Controlling which alerts are enabled and whether they are turned into fatal errors is done either through the compiler's command-line option "-alert " or locally in the code through the "alert" or @@ -77,20 +133,22 @@ let x = end \end{verbatim} +\subsection{ss:alert_deprecated}{Shorthand syntax for deprecation} + Before OCaml 4.08, there was support for a single kind of deprecation alert. It is now known as the "deprecated" alert, but legacy attributes to trigger it and the legacy ways to control it as warning 3 are still supported. For instance, passing "-w +3" on the command-line is equivalent to "-alert +deprecated", and: -\begin{verbatim} +\begin{caml_example*}{signature} val x: int [@@ocaml.deprecated "Please do something else"] -\end{verbatim} +\end{caml_example*} is equivalent to: -\begin{verbatim} +\begin{caml_example*}{signature} val x: int [@@ocaml.alert deprecated "Please do something else"] -\end{verbatim} +\end{caml_example*} diff --git a/manual/src/refman/extensions/arrayliterals.etex b/manual/src/refman/extensions/arrayliterals.etex new file mode 100644 index 00000000..aa91fa9e --- /dev/null +++ b/manual/src/refman/extensions/arrayliterals.etex @@ -0,0 +1,67 @@ +\section{s:array-literals}{Type-directed disambiguation of array literals} +%HEVEA\cutname{arrayliterals.html} + +(Introduced in OCaml 5.4) + +Since OCaml 5.4, array literal syntax @"[|" e1 ';' e2 ';' ... ';' eN "|]"@ can +be used to denote values of type "floatarray" as well as "'a array", both in +expression and pattern positions. This syntax is also used to display +"floatarray" values in the toplevel. + +The compiler matches the expected type of the expression or pattern with the +type of the literal, in a manner analogous to the disambiguation of constructors +and record fields (see \ref{ss:record-and-variant-disambiguation}). + +In the absence of an expected type, array literals are assumed to be of type "'a +array". + +In the following examples, the array literals are assigned type "floatarray": + +\begin{caml_example}{verbatim} +let _ : floatarray = [|42.|];; +let _ = ([|42.|] : floatarray);; +let _ = Float.Array.length [|42.|];; +\end{caml_example} + +The same disambiguation mechanism is used for array literals appearing in +patterns: + +\begin{caml_example}{verbatim} +let f : floatarray -> _ = function + | [| 42. |] -> "It's a floatarray containing one element" + | _ -> "Also a floatarray" +;; +\end{caml_example} + +In the example below, "x" is assigned type "float array": + +\begin{caml_example}{verbatim} +let x = [|42.|];; +\end{caml_example} + +However, the following does not work: + +\begin{caml_example}{verbatim} +let f a = + match a with + | [| _ |] -> Float.Array.length a + | _ -> 42 +[@@expect error];; + +let f b (a : floatarray) = if b then [|42.|] else a +[@@expect error];; +\end{caml_example} + +Here the information learned from the use of "a" as a "floatarray" cannot be +propagated back to the array literal. In general, expected type information +cannot be propagated ``backwards''. + +In the following example, type disambiguation works because the type information +learned in the "then" branch of the conditional is propagated to the "else" +branch, which occurs ``later''. + +\begin{caml_example}{verbatim} +let f b (a : floatarray) = if b then a else [|42.|];; +\end{caml_example} + +Such cases trigger warning 18 "not-principal", if enabled. diff --git a/manual/src/refman/extensions/attributes.etex b/manual/src/refman/extensions/attributes.etex index 550069c5..7a837ce7 100644 --- a/manual/src/refman/extensions/attributes.etex +++ b/manual/src/refman/extensions/attributes.etex @@ -1,3 +1,7 @@ +\section{s:attributes}{Attributes} +%HEVEA\cutname{attributes.html} +\ikwd{when\@\texttt{when}} + (Introduced in OCaml 4.02, infix notations for constructs other than expressions added in 4.03) @@ -304,6 +308,10 @@ Some attributes are understood by the compiler: "ocaml.poll" or "poll" with an "error" payload on a function definition emits an error whenever the compiler inserts a runtime polling point in the body of the annotated function. + \item + "ocaml.atomic" or "atomic" on a record field definition, marks this + record field as atomic. See \ref{s:atomic-record-fields} for more + details. \end{itemize} \begin{caml_example*}{verbatim} diff --git a/manual/src/refman/extensions/bigarray.etex b/manual/src/refman/extensions/bigarray.etex index 17c94dbc..adeef6c7 100644 --- a/manual/src/refman/extensions/bigarray.etex +++ b/manual/src/refman/extensions/bigarray.etex @@ -1,3 +1,6 @@ +\section{s:bigarray-access}{Syntax for Bigarray access} +%HEVEA\cutname{bigarray.html} + (Introduced in Objective Caml 3.00) \begin{syntax} diff --git a/manual/src/refman/extensions/bindingops.etex b/manual/src/refman/extensions/bindingops.etex index 74b46276..9064ffd2 100644 --- a/manual/src/refman/extensions/bindingops.etex +++ b/manual/src/refman/extensions/bindingops.etex @@ -1,3 +1,6 @@ +\section{s:binding-operators}{Binding operators} +%HEVEA\cutname{bindingops.html} + (Introduced in 4.08.0) \begin{syntax} diff --git a/manual/src/refman/extensions/doccomments.etex b/manual/src/refman/extensions/doccomments.etex index 90b6cac2..1056f018 100644 --- a/manual/src/refman/extensions/doccomments.etex +++ b/manual/src/refman/extensions/doccomments.etex @@ -1,3 +1,6 @@ +\section{s:doc-comments}{Documentation comments} +%HEVEA\cutname{doccomments.html} + (Introduced in OCaml 4.03) Comments which start with "**" are treated specially by the diff --git a/manual/src/refman/extensions/effects.etex b/manual/src/refman/extensions/effects.etex index 1f4dd480..8446222b 100644 --- a/manual/src/refman/extensions/effects.etex +++ b/manual/src/refman/extensions/effects.etex @@ -1,3 +1,6 @@ +\section{s:effect-handlers}{Effect handlers} +%HEVEA\cutname{effects.html} + (Introduced in 5.0. The syntax support for deep handlers was introduced in 5.3.) diff --git a/manual/src/refman/extensions/emptyvariants.etex b/manual/src/refman/extensions/emptyvariants.etex index 541d09dd..d3600c7b 100644 --- a/manual/src/refman/extensions/emptyvariants.etex +++ b/manual/src/refman/extensions/emptyvariants.etex @@ -1,3 +1,7 @@ +\section{s:empty-variants}{Empty variant types} +%HEVEA\cutname{emptyvariants.html} +(Introduced in 4.07.0) + \begin{syntax} type-representation: ... diff --git a/manual/src/refman/extensions/extensiblevariants.etex b/manual/src/refman/extensions/extensiblevariants.etex index 8e76bcac..1166737a 100644 --- a/manual/src/refman/extensions/extensiblevariants.etex +++ b/manual/src/refman/extensions/extensiblevariants.etex @@ -1,3 +1,6 @@ +\section{s:extensible-variants}{Extensible variant types} +%HEVEA\cutname{extensiblevariants.html} + (Introduced in OCaml 4.02) \begin{syntax} diff --git a/manual/src/refman/extensions/extensionnodes.etex b/manual/src/refman/extensions/extensionnodes.etex index a5fa69d3..297803f0 100644 --- a/manual/src/refman/extensions/extensionnodes.etex +++ b/manual/src/refman/extensions/extensionnodes.etex @@ -1,3 +1,6 @@ +\section{s:extension-nodes}{Extension nodes} +%HEVEA\cutname{extensionnodes.html} + (Introduced in OCaml 4.02, infix notations for constructs other than expressions added in 4.03, infix notation (e1 ;\%ext e2) added in 4.04. @@ -114,11 +117,10 @@ escaping issues. Some extension nodes are understood by the compiler itself: \begin{itemize} \item - ``ocaml.extension_constructor'' or ``extension_constructor'' - take as payload a constructor from an extensible variant type + "ocaml.extension_constructor" or "extension_constructor" + extensions take as payload a constructor from an extensible variant type (see \ref{s:extensible-variants}) and return its extension constructor slot. -\end{itemize} \begin{caml_example*}{verbatim} type t = .. @@ -129,3 +131,9 @@ let y = [%extension_constructor Y] \begin{caml_example}{toplevel} x <> y;; \end{caml_example} + + \item + "ocaml.atomic.loc" or "atomic.loc" extensions take as payload an + OCaml expression denoting an atomic location. See + \ref{s:atomic-record-fields} for more details. +\end{itemize} diff --git a/manual/src/refman/extensions/extensionsyntax.etex b/manual/src/refman/extensions/extensionsyntax.etex index 53369fd7..372d9a7f 100644 --- a/manual/src/refman/extensions/extensionsyntax.etex +++ b/manual/src/refman/extensions/extensionsyntax.etex @@ -1,3 +1,6 @@ +\section{s:extension-syntax}{Extension-only syntax} +%HEVEA\cutname{extensionsyntax.html} + (Introduced in OCaml 4.02.2, extended in 4.03) Some syntactic constructions are accepted during parsing and rejected diff --git a/manual/src/refman/extensions/firstclassmodules.etex b/manual/src/refman/extensions/firstclassmodules.etex index 659f1b45..5911b67b 100644 --- a/manual/src/refman/extensions/firstclassmodules.etex +++ b/manual/src/refman/extensions/firstclassmodules.etex @@ -1,3 +1,10 @@ +\section{s:first-class-modules}{First-class modules} +%HEVEA\cutname{firstclassmodules.html} +\ikwd{module\@\texttt{module}} +\ikwd{val\@\texttt{val}} +\ikwd{with\@\texttt{with}} +\ikwd{and\@\texttt{and}} + (Introduced in OCaml 3.12; pattern syntax and package type inference introduced in 4.00; structural comparison of package types introduced in 4.02.; fewer parens required starting from 4.05) diff --git a/manual/src/refman/extensions/gadts.etex b/manual/src/refman/extensions/gadts.etex index a1a306c7..fc9f57ac 100644 --- a/manual/src/refman/extensions/gadts.etex +++ b/manual/src/refman/extensions/gadts.etex @@ -1,3 +1,8 @@ +\section{s:gadts}{Generalized algebraic datatypes} +%HEVEA\cutname{gadts.html} +\ikwd{type\@\texttt{type}} +\ikwd{match\@\texttt{match}} + Generalized algebraic datatypes, or GADTs, extend usual sum types in two ways: constraints on type parameters may change depending on the value constructor, and some type variables may be existentially diff --git a/manual/src/refman/extensions/generalizedopens.etex b/manual/src/refman/extensions/generalizedopens.etex index 0a02e192..fea333d0 100644 --- a/manual/src/refman/extensions/generalizedopens.etex +++ b/manual/src/refman/extensions/generalizedopens.etex @@ -1,3 +1,6 @@ +\section{s:generalized-open}{Generalized open statements} +%HEVEA\cutname{generalizedopens.html} + (Introduced in 4.08) \begin{syntax} diff --git a/manual/src/refman/extensions/generativefunctors.etex b/manual/src/refman/extensions/generativefunctors.etex index cf43ae76..fe10940b 100644 --- a/manual/src/refman/extensions/generativefunctors.etex +++ b/manual/src/refman/extensions/generativefunctors.etex @@ -1,3 +1,6 @@ +\section{s:generative-functors}{Generative functors} +%HEVEA\cutname{generativefunctors.html} + (Introduced in OCaml 4.02) \begin{syntax} diff --git a/manual/src/refman/extensions/indexops.etex b/manual/src/refman/extensions/indexops.etex index a4c49619..ea07d9c0 100644 --- a/manual/src/refman/extensions/indexops.etex +++ b/manual/src/refman/extensions/indexops.etex @@ -1,3 +1,6 @@ +\section{s:index-operators}{Extended indexing operators } +%HEVEA\cutname{indexops.html} + (Introduced in 4.06) \begin{syntax} diff --git a/manual/src/refman/extensions/inlinerecords.etex b/manual/src/refman/extensions/inlinerecords.etex index 2bc8ce4c..2af10bde 100644 --- a/manual/src/refman/extensions/inlinerecords.etex +++ b/manual/src/refman/extensions/inlinerecords.etex @@ -1,3 +1,6 @@ +\section{s:inline-records}{Inline records} +%HEVEA\cutname{inlinerecords.html} + (Introduced in OCaml 4.03) \begin{syntax} constr-args: diff --git a/manual/src/refman/extensions/labeledtuples.etex b/manual/src/refman/extensions/labeledtuples.etex new file mode 100644 index 00000000..c5ad573c --- /dev/null +++ b/manual/src/refman/extensions/labeledtuples.etex @@ -0,0 +1,112 @@ +\section{s:labeled-tuples}{Labeled tuples} +%HEVEA\cutname{labeledtuples.html} + +(Introduced in OCaml 5.4) + +\begin{syntax} +typexpr: + ... + | [label-name':'] typexpr {{ '*' [label-name':']typexpr }} +; +expr: + ... + | ['~'label-name':'] expr {{ ',' ['~'label-name':'] expr }} +; +pattern: + ... + | ['~'label-name':'] pattern {{ ',' ['~'label-name':'] pattern }} +; +\end{syntax} + +Since OCaml 5.4, tuple fields are optionally labeled. This feature is +conceptually dual to labeled function arguments, allowing you to give a helpful +name to constructed values where labeled function arguments permit giving a +helpful name to parameters. + +Here is a motivating example where we want to compute two values from a list and +be careful not to mix them up: + +\begin{caml_example}{verbatim} +let sum_and_product ints = + let init = ~sum:0, ~product:1 in + List.fold_left (fun (~sum, ~product) elem -> + let sum = elem + sum in + let product = elem * product in + ~sum, ~product) init ints +\end{caml_example} + +This example shows the use of labeled tuples in types and patterns. They may be +punned like record elements or function arguments. + +In types, tuple labels are written similarly to function argument labels. For +example, the function argument to "fold_left" in the previous example has the type: + +\begin{verbatim} +(sum:int * product:int) -> int -> sum:int * product:int +\end{verbatim} + +Labeled tuples can be useful anytime you want to use names to explain or +disambiguate the elements of a tuple, but declaring a new record feels too +heavy. + +Tuples may be partially labeled, which can be useful when some elements of the +tuple share a type and need disambiguation, but others don’t. For example: + +\begin{caml_example*}{verbatim} +type min_max_avg = min:int * max:int * float +\end{caml_example} + +\subsubsection*{sss:labledtuples-reordering}{Reordering and partial patterns} + +Like records, labeled tuple patterns may be reordered or partial. The compiler +only supports reordering / partial matching when it knows the type of the +pattern from its context. + +So, for example, we can write: + +\begin{caml_example}{verbatim} +let lt = ~x:0, ~y:42 +let twice_y = let ~y, .. = lt in y * 2 +\end{caml_example} + +When the type is not known (in the same sense that we require a type to be known +to disambiguate among constructors), the compiler will reject a partial +pattern. For example, this program + +\begin{caml_example}{verbatim}[error] +let get_y t = + let ~y, .. = t in + y +\end{caml_example} + +This example could be fixed by adding a type annotation to the function’s parameter. + +Labels may not be repeated in a tuple. However, unlabeled elements can be +thought of as all sharing the same unique label. When matching on such a tuple, +the first unlabeled element in the pattern is bound to the first unlabeled +element in the value, and so on. As a result, it’s also possible to partially +match on an unlabeled tuple to retrieve the first few elements. + +\subsubsection*{sss:labledtuples-limitations}{Limitations} + +Parentheses are necessary to disambiguate functions types with labeled arguments +from function types with labeled tuple arguments when the first element of the +tuple has a label. + +Unlike records, reordering is not supported in labeled tuple expressions, even +when the type is known. This is similar to the way the function definition for a +function with labeled arguments must bind the arguments in the same order as the +type. + +Labeled tuples do not support projection (extracting an element of the tuple by +label). + +\subsubsection*{sss:labledtuples-smlrelation}{Relationship to flexible records} + +Labeled tuples are similar in spirit to SML's flexible records. The primary +difference is that SML records are canonically ordered based on label name, +while labeled tuples are not. So, for example, "x:int * y:bool" and "y:bool * +x:int" are different types in OCaml, corresponding to two different orderings of +the fields in the runtime block. In SML, the corresponding record types are +considered equal and the runtime block is always ordered with the "x" field +first. diff --git a/manual/src/refman/extensions/letrecvalues.etex b/manual/src/refman/extensions/letrecvalues.etex index b8f8b028..ca0e4fd9 100644 --- a/manual/src/refman/extensions/letrecvalues.etex +++ b/manual/src/refman/extensions/letrecvalues.etex @@ -1,3 +1,6 @@ +\section{s:letrecvalues}{Recursive definitions of values} +%HEVEA\cutname{letrecvalues.html} + (Introduced in Objective Caml 1.00) As mentioned in section~\ref{sss:expr-localdef}, the @'let' 'rec'@ binding diff --git a/manual/src/refman/extensions/locallyabstract.etex b/manual/src/refman/extensions/locallyabstract.etex index 20fab438..d5063026 100644 --- a/manual/src/refman/extensions/locallyabstract.etex +++ b/manual/src/refman/extensions/locallyabstract.etex @@ -1,3 +1,8 @@ +\section{s:locally-abstract}{Locally abstract types} +%HEVEA\cutname{locallyabstract.html} +\ikwd{type\@\texttt{type}} +\ikwd{fun\@\texttt{fun}} + (Introduced in OCaml 3.12, short syntax added in 4.03) \begin{syntax} diff --git a/manual/src/refman/extensions/modulealias.etex b/manual/src/refman/extensions/modulealias.etex index 49e35228..acf3cdce 100644 --- a/manual/src/refman/extensions/modulealias.etex +++ b/manual/src/refman/extensions/modulealias.etex @@ -1,3 +1,7 @@ +\section{s:module-alias}{Type-level module aliases} +%HEVEA\cutname{modulealias.html} +\ikwd{module\@\texttt{module}} + (Introduced in OCaml 4.02) \begin{syntax} diff --git a/manual/src/refman/extensions/moduletypeof.etex b/manual/src/refman/extensions/moduletypeof.etex index 4fbc13b1..77a2b00d 100644 --- a/manual/src/refman/extensions/moduletypeof.etex +++ b/manual/src/refman/extensions/moduletypeof.etex @@ -1,3 +1,10 @@ +\section{s:module-type-of}{Recovering the type of a module} +%HEVEA\cutname{moduletypeof.html} +\ikwd{module\@\texttt{module}} +\ikwd{type\@\texttt{type}} +\ikwd{of\@\texttt{of}} +\ikwd{include\@\texttt{include}} + (Introduced in OCaml 3.12) \begin{syntax} diff --git a/manual/src/refman/extensions/overridingopen.etex b/manual/src/refman/extensions/overridingopen.etex index cde8bba5..14ab2bf8 100644 --- a/manual/src/refman/extensions/overridingopen.etex +++ b/manual/src/refman/extensions/overridingopen.etex @@ -1,3 +1,7 @@ +\section{s:explicit-overriding-open}{Overriding in open statements} +%HEVEA\cutname{overridingopen.html} +\ikwd{open.\@\texttt{open\char33}} + (Introduced in OCaml 4.01) \begin{syntax} diff --git a/manual/src/refman/extensions/privatetypes.etex b/manual/src/refman/extensions/privatetypes.etex index dfd1e756..04dbb899 100644 --- a/manual/src/refman/extensions/privatetypes.etex +++ b/manual/src/refman/extensions/privatetypes.etex @@ -1,3 +1,7 @@ +\section{s:private-types}{Private types} +%HEVEA\cutname{privatetypes.html} +\ikwd{private\@\texttt{private}} + Private type declarations in module signatures, of the form "type t = private ...", enable libraries to reveal some, but not all aspects of the implementation of a type to diff --git a/manual/src/refman/extensions/recursivemodules.etex b/manual/src/refman/extensions/recursivemodules.etex index f3ec87c7..887639d0 100644 --- a/manual/src/refman/extensions/recursivemodules.etex +++ b/manual/src/refman/extensions/recursivemodules.etex @@ -1,3 +1,8 @@ +\section{s:recursive-modules}{Recursive modules} +%HEVEA\cutname{recursivemodules.html} +\ikwd{module\@\texttt{module}} +\ikwd{and\@\texttt{and}} + (Introduced in Objective Caml 3.07) % TODO: relaxed syntax diff --git a/manual/src/refman/extensions/signaturesubstitution.etex b/manual/src/refman/extensions/signaturesubstitution.etex index 1b7d6d3c..3b790df3 100644 --- a/manual/src/refman/extensions/signaturesubstitution.etex +++ b/manual/src/refman/extensions/signaturesubstitution.etex @@ -1,3 +1,9 @@ +\section{s:signature-substitution}{Substituting inside a signature} +%HEVEA\cutname{signaturesubstitution.html} +\ikwd{with\@\texttt{with}} +\ikwd{module\@\texttt{module}} +\ikwd{type\@\texttt{type}} + \subsection{ss:destructive-substitution}{Destructive substitutions} (Introduced in OCaml 3.12, generalized in 4.06) diff --git a/manual/src/refman/modtypes.etex b/manual/src/refman/modtypes.etex index 2204c851..e6a66e0c 100644 --- a/manual/src/refman/modtypes.etex +++ b/manual/src/refman/modtypes.etex @@ -22,7 +22,7 @@ specify the general shape and type properties of modules. module-type: modtype-path | 'sig' { specification [';;'] } 'end' - | ['functor'] '(' module-name ':' module-type ')' '->' module-type + | ['functor'] {{ '(' module-name ':' module-type ')' }} '->' module-type | module-type '->' module-type | module-type 'with' mod-constraint { 'and' mod-constraint } | '(' module-type ')' diff --git a/manual/src/refman/modules.etex b/manual/src/refman/modules.etex index 429b12aa..61ead9db 100644 --- a/manual/src/refman/modules.etex +++ b/manual/src/refman/modules.etex @@ -22,7 +22,7 @@ for the specifications expressed in module types. module-expr: module-path | 'struct' [ module-items ] 'end' - | 'functor' '(' module-name ':' module-type ')' '->' module-expr + | 'functor' {{ '(' module-name ':' module-type ')' }} '->' module-expr | module-expr '(' module-expr ')' | '(' module-expr ')' | '(' module-expr ':' module-type ')' @@ -245,4 +245,3 @@ The expression @module-expr_1 '(' module-expr_2 ')'@ evaluates @module-expr_1@ to a functor and @module-expr_2@ to a module, and applies the former to the latter. The type of @module-expr_2@ must match the type expected for the arguments of the functor @module-expr_1@. - diff --git a/manual/src/refman/patterns.etex b/manual/src/refman/patterns.etex index a6a7ffe4..ab1a363d 100644 --- a/manual/src/refman/patterns.etex +++ b/manual/src/refman/patterns.etex @@ -30,8 +30,10 @@ pattern: See also the following language extensions: \hyperref[s:first-class-modules]{first-class modules}, \hyperref[s:attributes]{attributes}, -\hyperref[s:extension-nodes]{extension nodes} and -\hyperref[s:effect-handlers]{effect handlers}. +\hyperref[s:extension-nodes]{extension nodes}, +\hyperref[s:effect-handlers]{effect handlers}, +\hyperref[s:array-literals]{type-directed disambiguation of array literals} and +\hyperref[s:labeled-tuples]{labeled tuples}. The table below shows the relative precedences and associativity of operators and non-closed pattern constructions. The constructions with diff --git a/manual/src/refman/typedecl.etex b/manual/src/refman/typedecl.etex index 12176d03..77f2e7b2 100644 --- a/manual/src/refman/typedecl.etex +++ b/manual/src/refman/typedecl.etex @@ -155,6 +155,9 @@ The field declaration @'mutable' field-name ':' poly-typexpr@ behaves similarly; in addition, it allows physical modification of this field. Immutable fields are covariant, mutable fields are non-variant. +Since OCaml 5.4, mutable fields may be marked "[\@atomic]" for +concurrent access, see \ref{s:atomic-record-fields}. +\\ Both mutable and immutable fields may have explicitly polymorphic types. The polymorphism of the contents is statically checked whenever a record value is created or modified. Extracted values may have their diff --git a/manual/src/refman/types.etex b/manual/src/refman/types.etex index cb64a86f..17d041b7 100644 --- a/manual/src/refman/types.etex +++ b/manual/src/refman/types.etex @@ -29,8 +29,9 @@ method-type: \end{syntax} See also the following language extensions: \hyperref[s:first-class-modules]{first-class modules}, -\hyperref[s:attributes]{attributes} and -\hyperref[s:extension-nodes]{extension nodes}. +\hyperref[s:attributes]{attributes}, +\hyperref[s:extension-nodes]{extension nodes} and +\hyperref[s:labeled-tuples]{labeled tuples}. The table below shows the relative precedences and associativity of operators and non-closed type constructions. The constructions with diff --git a/manual/src/tutorials/parallelism.etex b/manual/src/tutorials/parallelism.etex index d2b30f9b..68567afd 100644 --- a/manual/src/tutorials/parallelism.etex +++ b/manual/src/tutorials/parallelism.etex @@ -63,7 +63,7 @@ number is given below. (* fib.ml *) let n = try int_of_string Sys.argv.(1) with _ -> 1 -let rec fib n = if n < 2 then 1 else fib (n - 1) + fib (n - 2) +let rec fib n = if n < 2 then n else fib (n - 1) + fib (n - 2) let main () = let r = fib n in @@ -77,7 +77,7 @@ The program can be compiled and benchmarked as follows: \begin{verbatim} $ ocamlopt -o fib.exe fib.ml $ ./fib.exe 42 -fib(42) = 433494437 +fib(42) = 267914296 $ hyperfine './fib.exe 42' # Benchmarking Benchmark 1: ./fib.exe 42 Time (mean ± sd): 1.193 s ± 0.006 s [User: 1.186 s, System: 0.003 s] @@ -94,7 +94,7 @@ computes the $n$th Fibonacci number twice in parallel. (* fib_twice.ml *) let n = int_of_string Sys.argv.(1) -let rec fib n = if n < 2 then 1 else fib (n - 1) + fib (n - 2) +let rec fib n = if n < 2 then n else fib (n - 1) + fib (n - 2) let main () = let d1 = Domain.spawn (fun _ -> fib n) in @@ -115,8 +115,8 @@ computation runs to completion. \begin{verbatim} $ ocamlopt -o fib_twice.exe fib_twice.ml $ ./fib_twice.exe 42 -fib(42) = 433494437 -fib(42) = 433494437 +fib(42) = 267914296 +fib(42) = 267914296 $ hyperfine './fib_twice.exe 42' Benchmark 1: ./fib_twice.exe 42 Time (mean ± sd): 1.249 s ± 0.025 s [User: 2.451 s, System: 0.012 s] @@ -137,7 +137,7 @@ by spawning domains for each one will not work as it spawns too many domains. let n = try int_of_string Sys.argv.(1) with _ -> 1 let rec fib n = - if n < 2 then 1 else begin + if n < 2 then n else begin let d1 = Domain.spawn (fun _ -> fib (n - 1)) in let d2 = Domain.spawn (fun _ -> fib (n - 2)) in Domain.join d1 + Domain.join d2 @@ -184,7 +184,7 @@ of the Fibonacci program follows: let num_domains = int_of_string Sys.argv.(1) let n = int_of_string Sys.argv.(2) -let rec fib n = if n < 2 then 1 else fib (n - 1) + fib (n - 2) +let rec fib n = if n < 2 then n else fib (n - 1) + fib (n - 2) module T = Domainslib.Task @@ -232,7 +232,7 @@ programs that use libraries installed through \begin{verbatim} $ ocamlfind ocamlopt -package domainslib -linkpkg -o fib_par2.exe fib_par2.ml $ ./fib_par2.exe 1 42 -fib(42) = 433494437 +fib(42) = 267914296 $ hyperfine './fib.exe 42' './fib_par2.exe 2 42' \ './fib_par2.exe 4 42' './fib_par2.exe 8 42' Benchmark 1: ./fib.exe 42 @@ -740,3 +740,52 @@ update the atomic reference at the same time. In this case, the "push" and allowing competing domains to make progress before retrying the failed operation. This lock-free stack implementation is called a \href{https://en.wikipedia.org/wiki/Treiber_stack}{Treiber stack}. + + +\subsection{s:atomic-record-fields}{Atomic record fields} + +The type "'a Atomic.t" is the atomic counterpart of the type of OCaml +references, "'a ref". Since OCaml 5.4, we also support atomic record +fields, which must be mutable, via the "[@atomic]" attribute. + +For example: +\begin{caml_example*}{verbatim} +type 'a refcounted = { + value : 'a; + mutable readers : int [@atomic]; +} +\end{caml_example*} + +The field "readers" is atomic, so that reading and writing to this +field are atomic operations similar to "Atomic.get" and +"Atomic.set". It is possible to perform other atomic operations on +this field by using a built-in extension node, "%atomic.loc": if +"rc" is a value of type "foo refcounted", then "[%atomic.loc rc.readers]" +is an expression of the built-in type "foo Atomic.Loc.t", which allows +atomic operations defined in the the \stdmoduleref{Atomic}.Loc module +of the standard library, mirroring the operations exposed for atomic +references in the \stdmoduleref{Atomic} module: + +\begin{caml_example}{toplevel} +let add_reader rc = + Atomic.Loc.fetch_and_add [%atomic.loc rc.readers] 1;; + +#show Atomic.Loc;; +\end{caml_example} + +\paragraph{Limitation} Currently there is no analogue of +"Atomic.make_contended" for atomic record fields. If false sharing is +an issue for a specific record field, the best supported approach is +to use a field of type "Atomic.t". We hope to implement support for +on-demand padding of record fields in the future. + +\paragraph{Performance note} Internally "[%atomic.loc rc.readers]" +is represented as a pair of the record value and a field +offset. Whenever this expression is directly applied to an atomic +primitive of the \stdmoduleref{Atomic}.Loc module, the compiler will +optimize away the creation of the pair; it passes the value and the +offset as separate parameters to an underlying runtime primitive. On +the other hand, storing an atomic location in a data-structure or +passing it to another, non-inlined function may allocate a pair. When +in doubt, you can inspect the "-dcmm" intermediate representation of +your code. diff --git a/manual/tests/check-stdlib-modules b/manual/tests/check-stdlib-modules index e01e580e..c939b82c 100755 --- a/manual/tests/check-stdlib-modules +++ b/manual/tests/check-stdlib-modules @@ -10,7 +10,7 @@ cut -c 2- $TMPDIR/stdlib-$$-files \ exitcode=0 for i in `cat $TMPDIR/stdlib-$$-modules`; do case $i in - Stdlib | Camlinternal* | *Labels | Obj | In_channel | Out_channel) continue;; + Stdlib | Camlinternal* | *Labels | Obj ) continue;; Std_exit*) continue;; esac grep -q -e '"'$i'" & p\.~\\stdpageref{'$i'} &' $1/manual/src/library/stdlib-blurb.etex || { diff --git a/manual/tests/cross_reference_checker.ml b/manual/tests/cross_reference_checker.ml index 492488eb..e66970a9 100644 --- a/manual/tests/cross_reference_checker.ml +++ b/manual/tests/cross_reference_checker.ml @@ -178,7 +178,8 @@ module OCaml_refs = struct let rec try_parse_as_list e = match e.Parsetree.pexp_desc with | Parsetree.Pexp_construct - ({ txt = Lident "::"; _ }, Some { pexp_desc = Pexp_tuple [ x; rest]; _ }) -> + ({ txt = Lident "::"; _ }, + Some { pexp_desc = Pexp_tuple [ None, x; None, rest]; _ }) -> ((int x) :: try_parse_as_list rest) | Parsetree.Pexp_construct ({ txt = Lident "[]"; _}, None) -> [] @@ -191,7 +192,7 @@ module OCaml_refs = struct let tuple_expected () = print_error (Tuple_or_list_expected loc) in match e.Parsetree.pexp_desc with | Parsetree.Pexp_tuple l -> - begin match int_list l with + begin match int_list (List.map snd l) with | None -> tuple_expected (); [] | Some pos -> pos end diff --git a/middle_end/clambda_primitives.ml b/middle_end/clambda_primitives.ml index bddb0149..03b4e8c7 100644 --- a/middle_end/clambda_primitives.ml +++ b/middle_end/clambda_primitives.ml @@ -30,10 +30,13 @@ type memory_access_size = | Thirty_two | Sixty_four +type lazy_block_tag = Lambda.lazy_block_tag + type primitive = | Pread_symbol of string (* Operations on heap blocks *) | Pmakeblock of int * mutable_flag * block_shape + | Pmakelazyblock of lazy_block_tag | Pfield of int * immediate_or_pointer * mutable_flag | Pfield_computed | Psetfield of int * immediate_or_pointer * initialization_or_assignment @@ -120,10 +123,7 @@ type primitive = (* Integer to external pointer *) | Pint_as_pointer (* Atomic operations *) - | Patomic_load of {immediate_or_pointer : immediate_or_pointer} - | Patomic_exchange - | Patomic_cas - | Patomic_fetch_add + | Patomic_load (* Inhibition of optimisation *) | Popaque (* Fetch domain-local state *) diff --git a/middle_end/clambda_primitives.mli b/middle_end/clambda_primitives.mli index 50d5a212..d52e680c 100644 --- a/middle_end/clambda_primitives.mli +++ b/middle_end/clambda_primitives.mli @@ -30,10 +30,13 @@ type memory_access_size = | Thirty_two | Sixty_four +type lazy_block_tag = Lambda.lazy_block_tag + type primitive = | Pread_symbol of string (* Operations on heap blocks *) | Pmakeblock of int * mutable_flag * block_shape + | Pmakelazyblock of lazy_block_tag | Pfield of int * immediate_or_pointer * mutable_flag | Pfield_computed | Psetfield of int * immediate_or_pointer * initialization_or_assignment @@ -123,10 +126,7 @@ type primitive = (* Integer to external pointer *) | Pint_as_pointer (* Atomic operations *) - | Patomic_load of {immediate_or_pointer : immediate_or_pointer} - | Patomic_exchange - | Patomic_cas - | Patomic_fetch_add + | Patomic_load (* Inhibition of optimisation *) | Popaque (* Fetch domain-local state *) diff --git a/middle_end/closure/closure.ml b/middle_end/closure/closure.ml index 880773fb..8b35606c 100644 --- a/middle_end/closure/closure.ml +++ b/middle_end/closure/closure.ml @@ -108,6 +108,7 @@ let prim_size prim args = match prim with | Pread_symbol _ -> 1 | Pmakeblock _ -> 5 + List.length args + | Pmakelazyblock _ -> 6 | Pfield _ -> 1 | Psetfield(_f, isptr, init) -> begin match init with @@ -773,6 +774,22 @@ let bind_params { backend; mutable_vars; _ } loc fdesc params args funct body = in aux V.Map.empty params args body +let bind_args_right_to_left env args fn = + let rec aux prev_args_rev next_args fn = + match next_args with + | [] -> fn (List.rev prev_args_rev) + | arg :: next_args -> + if is_substituable ~mutable_vars:env.mutable_vars arg + then aux (arg :: prev_args_rev) next_args fn + else + let id = V.create_local "arg" in + let fn args = + Ulet(Immutable, Pgenval, VP.create id, arg, fn args) + in + aux (Uvar id :: prev_args_rev) next_args fn + in + aux [] args fn + let warning_if_forced_inline ~loc ~attribute warning = if attribute = Always_inline then Location.prerr_warning (Debuginfo.Scoped_location.to_location loc) @@ -792,26 +809,14 @@ let direct_apply env fundesc ufunct uargs ~loc ~attribute = else if not fundesc.fun_closed && is_substituable ~mutable_vars:env.mutable_vars ufunct then Udirect_apply(fundesc.fun_label, uargs @ [ufunct], dbg) - else begin - let args = List.map (fun arg -> - if is_substituable ~mutable_vars:env.mutable_vars arg then - None, arg - else - let id = V.create_local "arg" in - Some (VP.create id, arg), Uvar id) uargs in - let app_args = List.map snd args in - List.fold_left (fun app (binding,_) -> - match binding with - | None -> app - | Some (v, e) -> Ulet(Immutable, Pgenval, v, e, app)) - (if fundesc.fun_closed then + else + bind_args_right_to_left env uargs (fun app_args -> + if fundesc.fun_closed then Usequence (ufunct, Udirect_apply (fundesc.fun_label, app_args, dbg)) else let clos = V.create_local "clos" in Ulet(Immutable, Pgenval, VP.create clos, ufunct, Udirect_apply(fundesc.fun_label, app_args @ [Uvar clos], dbg))) - args - end | Some(params, body), _ -> bind_params env loc fundesc params uargs ufunct body @@ -1004,7 +1009,9 @@ let rec close ({ backend; fenv; cenv ; mutable_vars } as env) lam = | ((ufunct, _), uargs) -> let dbg = Debuginfo.from_location loc in warning_if_forced_inline ~loc ~attribute "Unknown function"; - (Ugeneric_apply(ufunct, uargs, dbg), Value_unknown) + (bind_args_right_to_left env uargs (fun uargs -> + Ugeneric_apply(ufunct, uargs, dbg)), + Value_unknown) end | Lsend(kind, met, obj, args, loc) -> let (umet, _) = close env met in @@ -1058,9 +1065,9 @@ let rec close ({ backend; fenv; cenv ; mutable_vars } as env) lam = | Word_size -> make_const_int (8*B.size_int) | Int_size -> make_const_int (8*B.size_int - 1) | Max_wosize -> make_const_int ((1 lsl ((8*B.size_int) - 10)) - 1 ) - | Ostype_unix -> make_const_bool (Sys.os_type = "Unix") - | Ostype_win32 -> make_const_bool (Sys.os_type = "Win32") - | Ostype_cygwin -> make_const_bool (Sys.os_type = "Cygwin") + | Ostype_unix -> make_const_bool (Config.target_os_type = "Unix") + | Ostype_win32 -> make_const_bool (Config.target_os_type = "Win32") + | Ostype_cygwin -> make_const_bool (Config.target_os_type = "Cygwin") | Backend_type -> make_const_int 0 (* tag 0 is the same as Native here *) in diff --git a/middle_end/compilenv.ml b/middle_end/compilenv.ml index d975c178..83c19ad1 100644 --- a/middle_end/compilenv.ml +++ b/middle_end/compilenv.ml @@ -90,10 +90,13 @@ let current_unit = ui_export_info = default_ui_export_info; ui_for_pack = None } -let symbol_separator = - match Config.ccomp_type with - | "msvc" -> '$' (* MASM does not allow for dots in symbol names *) - | _ -> '.' +let linuxlike_mangling = match Config.system with + | "macosx" + | "mingw" | "mingw64" | "cygwin" | "win32" | "win64" -> false + | _ -> true + +let symbol_separator = if linuxlike_mangling then '.' else '$' +let escape_prefix = if linuxlike_mangling then "$" else "$$" let concat_symbol unitname id = Printf.sprintf "%s%c%s" unitname symbol_separator id diff --git a/middle_end/compilenv.mli b/middle_end/compilenv.mli index 2bcbca98..81a26da1 100644 --- a/middle_end/compilenv.mli +++ b/middle_end/compilenv.mli @@ -56,6 +56,10 @@ val current_unit_symbol: unit -> Symbol.t val symbol_separator: char (* Return the module separator used when building symbol names. *) +val escape_prefix: string + (* Return the escape prefix for hexadecimal escape sequences + in symbol names. *) + val make_symbol: ?unitname:string -> string option -> string (* [make_symbol ~unitname:u None] returns the asm symbol that corresponds to the compilation unit [u] (default: the current unit). diff --git a/middle_end/convert_primitives.ml b/middle_end/convert_primitives.ml index aa646513..9f2a0b6d 100644 --- a/middle_end/convert_primitives.ml +++ b/middle_end/convert_primitives.ml @@ -26,6 +26,8 @@ let convert (prim : Lambda.primitive) : Clambda_primitives.primitive = match prim with | Pmakeblock (tag, mutability, shape) -> Pmakeblock (tag, mutability, shape) + | Pmakelazyblock tag -> + Pmakelazyblock tag | Pfield (field, imm_or_pointer, mutability) -> Pfield (field, imm_or_pointer, mutability) | Pfield_computed -> Pfield_computed @@ -144,11 +146,7 @@ let convert (prim : Lambda.primitive) : Clambda_primitives.primitive = | Pbigarraydim dim -> Pbigarraydim dim | Pbswap16 -> Pbswap16 | Pint_as_pointer -> Pint_as_pointer - | Patomic_load { immediate_or_pointer } -> - Patomic_load { immediate_or_pointer } - | Patomic_exchange -> Patomic_exchange - | Patomic_cas -> Patomic_cas - | Patomic_fetch_add -> Patomic_fetch_add + | Patomic_load -> Patomic_load | Popaque -> Popaque | Pdls_get -> Pdls_get | Ppoll -> Ppoll diff --git a/middle_end/flambda/closure_conversion.ml b/middle_end/flambda/closure_conversion.ml index 6b9e8d96..1e2fdd6c 100644 --- a/middle_end/flambda/closure_conversion.ml +++ b/middle_end/flambda/closure_conversion.ml @@ -397,9 +397,12 @@ let rec close t env (lam : Lambda.lambda) : Flambda.t = | Int_size -> lambda_const_int (8*Backend.size_int - 1) | Max_wosize -> lambda_const_int ((1 lsl ((8*Backend.size_int) - 10)) - 1) - | Ostype_unix -> lambda_const_bool (String.equal Sys.os_type "Unix") - | Ostype_win32 -> lambda_const_bool (String.equal Sys.os_type "Win32") - | Ostype_cygwin -> lambda_const_bool (String.equal Sys.os_type "Cygwin") + | Ostype_unix -> + lambda_const_bool (String.equal Config.target_os_type "Unix") + | Ostype_win32 -> + lambda_const_bool (String.equal Config.target_os_type "Win32") + | Ostype_cygwin -> + lambda_const_bool (String.equal Config.target_os_type "Cygwin") | Backend_type -> Lambda.const_int 0 (* tag 0 is the same as Native *) end @@ -473,10 +476,16 @@ let rec close t env (lam : Lambda.lambda) : Flambda.t = | Lstaticcatch (body, (i, ids), handler) -> let st_exn = Static_exception.create () in let env = Env.add_static_exception env i st_exn in - let ids = List.map fst ids in - let vars = List.map Variable.create_with_same_name_as_ident ids in + let vars = + List.map (fun (id, kind) -> + Variable.create_with_same_name_as_ident id, kind) + ids + in + let env_handler = + Env.add_vars env (List.map fst ids) (List.map fst vars) + in Static_catch (st_exn, vars, close t env body, - close t (Env.add_vars env ids vars) handler) + close t env_handler handler) | Ltrywith (body, id, handler) -> let var = Variable.create_with_same_name_as_ident id in Try_with (close t env body, var, close t (Env.add_var env id var) handler) diff --git a/middle_end/flambda/flambda.ml b/middle_end/flambda/flambda.ml index 6dda2645..d2ee65b2 100644 --- a/middle_end/flambda/flambda.ml +++ b/middle_end/flambda/flambda.ml @@ -67,7 +67,8 @@ type t = | Switch of Variable.t * switch | String_switch of Variable.t * (string * t) list * t option | Static_raise of Static_exception.t * Variable.t list - | Static_catch of Static_exception.t * Variable.t list * t * t + | Static_catch of + Static_exception.t * (Variable.t * Lambda.value_kind) list * t * t | Try_with of t * Variable.t * t | While of t * t | For of for_loop @@ -188,6 +189,11 @@ let print_project_closure = Projection.print_project_closure (** CR-someday lwhite: use better name than this *) let rec lam ppf (flam : t) = + let print_kind ppf (kind : Lambda.value_kind) = + match kind with + | Pgenval -> () + | _ -> Format.fprintf ppf " %a" Printlambda.value_kind kind + in match flam with | Var (id) -> Variable.print ppf id @@ -240,11 +246,6 @@ let rec lam ppf (flam : t) = let expr = letbody body in fprintf ppf ")@]@ %a)@]" lam expr | Let_mutable { var = mut_var; initial_value = var; body; contents_kind } -> - let print_kind ppf (kind : Lambda.value_kind) = - match kind with - | Pgenval -> () - | _ -> Format.fprintf ppf " %a" Printlambda.value_kind kind - in fprintf ppf "@[<2>(let_mutable%a@ @[<2>%a@ %a@]@ %a)@]" print_kind contents_kind Mutable_variable.print mut_var @@ -302,7 +303,8 @@ let rec lam ppf (flam : t) = | [] -> () | _ -> List.iter - (fun x -> fprintf ppf " %a" Variable.print x) + (fun (x, kind) -> + fprintf ppf " %a%a" Variable.print x print_kind kind) vars) vars lam lhandler @@ -554,7 +556,7 @@ let rec variables_usage ?ignore_uses_as_callee ?ignore_uses_as_argument | Static_raise (_, es) -> List.iter free_variable es | Static_catch (_, vars, e1, e2) -> - List.iter bound_variable vars; + List.iter (fun (v, _) -> bound_variable v) vars; aux e1; aux e2 | Try_with (e1, var, e2) -> diff --git a/middle_end/flambda/flambda.mli b/middle_end/flambda/flambda.mli index 1f4aa206..4e58505b 100644 --- a/middle_end/flambda/flambda.mli +++ b/middle_end/flambda/flambda.mli @@ -101,7 +101,8 @@ type t = | String_switch of Variable.t * (string * t) list * t option (** Restrictions on [Lambda.Lstringswitch] also apply to [String_switch]. *) | Static_raise of Static_exception.t * Variable.t list - | Static_catch of Static_exception.t * Variable.t list * t * t + | Static_catch of + Static_exception.t * (Variable.t * Lambda.value_kind) list * t * t | Try_with of t * Variable.t * t | While of t * t | For of for_loop diff --git a/middle_end/flambda/flambda_invariants.ml b/middle_end/flambda/flambda_invariants.ml index acb81590..b5890fe7 100644 --- a/middle_end/flambda/flambda_invariants.ml +++ b/middle_end/flambda/flambda_invariants.ml @@ -131,7 +131,7 @@ let variable_and_symbol_invariants (program : Flambda.program) = var_env, mut_var_env, Symbol.Set.add sym sym_env in let add_binding_occurrences env vars = - List.fold_left (fun env var -> add_binding_occurrence env var) env vars + List.fold_left (fun env (var, _) -> add_binding_occurrence env var) env vars in let check_variable_is_bound (var_env, _, _) var = if not (Variable.Set.mem var var_env) then raise (Unbound_variable var) diff --git a/middle_end/flambda/flambda_to_clambda.ml b/middle_end/flambda/flambda_to_clambda.ml index 8a251040..7374f0b7 100644 --- a/middle_end/flambda/flambda_to_clambda.ml +++ b/middle_end/flambda/flambda_to_clambda.ml @@ -304,9 +304,9 @@ let rec to_clambda t env (flam : Flambda.t) : Clambda.ulambda = List.map (subst_var env) args) | Static_catch (static_exn, vars, body, handler) -> let env_handler, ids = - List.fold_right (fun var (env, ids) -> + List.fold_right (fun (var, kind) (env, ids) -> let id, env = Env.add_fresh_ident env var in - env, (VP.create id, Lambda.Pgenval) :: ids) + env, (VP.create id, kind) :: ids) vars (env, []) in Ucatch (Static_exception.to_int static_exn, ids, diff --git a/middle_end/flambda/flambda_utils.ml b/middle_end/flambda/flambda_utils.ml index 0cf52c5c..53c583cb 100644 --- a/middle_end/flambda/flambda_utils.ml +++ b/middle_end/flambda/flambda_utils.ml @@ -123,7 +123,10 @@ let rec same (l1 : Flambda.t) (l2 : Flambda.t) = | Static_raise _, _ | _, Static_raise _ -> false | Static_catch (s1, v1, a1, b1), Static_catch (s2, v2, a2, b2) -> Static_exception.equal s1 s2 - && Misc.Stdlib.List.equal Variable.equal v1 v2 + && Misc.Stdlib.List.equal + (fun (v1, k1) (v2, k2) -> Variable.equal v1 v2 + && Lambda.equal_value_kind k1 k2) + v1 v2 && same a1 a2 && same b1 b2 | Static_catch _, _ | _, Static_catch _ -> false diff --git a/middle_end/flambda/inconstant_idents.ml b/middle_end/flambda/inconstant_idents.ml index 7fbb8f60..7bee3e9f 100644 --- a/middle_end/flambda/inconstant_idents.ml +++ b/middle_end/flambda/inconstant_idents.ml @@ -246,7 +246,7 @@ module Inconstants (P:Param) (Backend:Backend_intf.S) = struct mark_loop ~toplevel [] f1; mark_loop ~toplevel [] f2 | Static_catch (_,ids,f1,f2) -> - List.iter (fun id -> mark_curr [Var id]) ids; + List.iter (fun (id, _) -> mark_curr [Var id]) ids; mark_curr curr; mark_loop ~toplevel [] f1; mark_loop ~toplevel [] f2 diff --git a/middle_end/flambda/inline_and_simplify.ml b/middle_end/flambda/inline_and_simplify.ml index 9f46dacb..2fc8586c 100644 --- a/middle_end/flambda/inline_and_simplify.ml +++ b/middle_end/flambda/inline_and_simplify.ml @@ -1160,17 +1160,17 @@ and simplify env r (tree : Flambda.t) : Flambda.t * R.t = | Static_raise (j, args) -> assert (Static_exception.equal i j); let handler = - List.fold_left2 (fun body var arg -> + List.fold_left2 (fun body (var, _) arg -> Flambda.create_let var (Expr (Var arg)) body) handler vars args in let r = R.exit_scope_catch r i in simplify env r handler | _ -> - let vars, sb = Freshening.add_variables' (E.freshening env) vars in + let vars, sb = Freshening.add_variables (E.freshening env) vars in let approx = R.approx r in let env = - List.fold_left (fun env id -> + List.fold_left (fun env (id, _) -> E.add env id (A.value_unknown Other)) (E.set_freshening env sb) vars in diff --git a/middle_end/flambda/inlining_cost.ml b/middle_end/flambda/inlining_cost.ml index b6021b9e..1654ffb7 100644 --- a/middle_end/flambda/inlining_cost.ml +++ b/middle_end/flambda/inlining_cost.ml @@ -22,6 +22,7 @@ open! Int_replace_polymorphic_compare let prim_size (prim : Clambda_primitives.primitive) args = match prim with | Pmakeblock _ -> 5 + List.length args + | Pmakelazyblock _ -> 6 | Pfield _ -> 1 | Psetfield (_, isptr, init) -> begin match init with @@ -269,7 +270,8 @@ module Benefit = struct let remove_code_helper_named b (named : Flambda.named) = match named with | Set_of_closures _ - | Prim ((Pmakearray _ | Pmakeblock _ | Pduprecord _), _, _) -> + | Prim ((Pmakearray _ | Pmakeblock _ + | Pmakelazyblock _ | Pduprecord _), _, _) -> b := remove_alloc !b (* CR-soon pchambart: should we consider that boxed integer and float operations are allocations ? *) diff --git a/middle_end/flambda/inlining_transforms.ml b/middle_end/flambda/inlining_transforms.ml index 6deb99b3..11c3a0fe 100644 --- a/middle_end/flambda/inlining_transforms.ml +++ b/middle_end/flambda/inlining_transforms.ml @@ -373,7 +373,7 @@ let add_free_var ~free_vars ~state ~free_var = end (* Add a function to the new set of closures iff: - 1) All it's specialised parameters are available in + 1) All its specialised parameters are available in [old_outside_to_new_outside] 2) At least one more parameter will become specialised *) let add_function ~specialised_args ~state ~fun_var ~function_decl = diff --git a/middle_end/internal_variable_names.ml b/middle_end/internal_variable_names.ml index ca529ac2..114aaff0 100644 --- a/middle_end/internal_variable_names.ml +++ b/middle_end/internal_variable_names.ml @@ -134,6 +134,7 @@ let plsrbint = "Plsrbint" let plsrint = "Plsrint" let pmakearray = "Pmakearray" let pmakeblock = "Pmakeblock" +let pmakelazyblock = "Pmakelazyblock" let pmodbint = "Pmodbint" let pmodint = "Pmodint" let pmulbint = "Pmulbint" @@ -169,9 +170,6 @@ let psubfloat = "Psubfloat" let psubint = "Psubint" let pxorbint = "Pxorbint" let pxorint = "Pxorint" -let patomic_cas = "Patomic_cas" -let patomic_exchange = "Patomic_exchange" -let patomic_fetch_add = "Patomic_fetch_add" let patomic_load = "Patomic_load" let prunstack = "Prunstack" let pperform = "Pperform" @@ -244,6 +242,7 @@ let plsrbint_arg = "Plsrbint_arg" let plsrint_arg = "Plsrint_arg" let pmakearray_arg = "Pmakearray_arg" let pmakeblock_arg = "Pmakeblock_arg" +let pmakelazyblock_arg = "Pmakelazyblock_arg" let pmodbint_arg = "Pmodbint_arg" let pmodint_arg = "Pmodint_arg" let pmulbint_arg = "Pmulbint_arg" @@ -282,9 +281,6 @@ let psubfloat_arg = "Psubfloat_arg" let psubint_arg = "Psubint_arg" let pxorbint_arg = "Pxorbint_arg" let pxorint_arg = "Pxorint_arg" -let patomic_cas_arg = "Patomic_cas_arg" -let patomic_exchange_arg = "Patomic_exchange_arg" -let patomic_fetch_add_arg = "Patomic_fetch_add_arg" let patomic_load_arg = "Patomic_load_arg" let prunstack_arg = "Prunstack_arg" let pperform_arg = "Pperform_arg" @@ -332,6 +328,7 @@ let of_primitive : Lambda.primitive -> string = function | Pgetglobal _ -> pgetglobal | Psetglobal _ -> psetglobal | Pmakeblock _ -> pmakeblock + | Pmakelazyblock _ -> pmakelazyblock | Pfield _ -> pfield | Pfield_computed -> pfield_computed | Psetfield _ -> psetfield @@ -427,10 +424,7 @@ let of_primitive : Lambda.primitive -> string = function | Pbbswap _ -> pbbswap | Pint_as_pointer -> pint_as_pointer | Popaque -> popaque - | Patomic_cas -> patomic_cas - | Patomic_exchange -> patomic_exchange - | Patomic_fetch_add -> patomic_fetch_add - | Patomic_load _ -> patomic_load + | Patomic_load -> patomic_load | Prunstack -> prunstack | Pperform -> pperform | Presume -> presume @@ -445,6 +439,7 @@ let of_primitive_arg : Lambda.primitive -> string = function | Pgetglobal _ -> pgetglobal_arg | Psetglobal _ -> psetglobal_arg | Pmakeblock _ -> pmakeblock_arg + | Pmakelazyblock _ -> pmakelazyblock_arg | Pfield _ -> pfield_arg | Pfield_computed -> pfield_computed_arg | Psetfield _ -> psetfield_arg @@ -540,10 +535,7 @@ let of_primitive_arg : Lambda.primitive -> string = function | Pbbswap _ -> pbbswap_arg | Pint_as_pointer -> pint_as_pointer_arg | Popaque -> popaque_arg - | Patomic_cas -> patomic_cas_arg - | Patomic_exchange -> patomic_exchange_arg - | Patomic_fetch_add -> patomic_fetch_add_arg - | Patomic_load _ -> patomic_load_arg + | Patomic_load -> patomic_load_arg | Prunstack -> prunstack_arg | Pperform -> pperform_arg | Presume -> presume_arg diff --git a/middle_end/printclambda_primitives.ml b/middle_end/printclambda_primitives.ml index 3f54a255..8737d241 100644 --- a/middle_end/printclambda_primitives.ml +++ b/middle_end/printclambda_primitives.ml @@ -61,6 +61,10 @@ let primitive ppf (prim:Clambda_primitives.primitive) = fprintf ppf "makeblock %i%a" tag Printlambda.block_shape shape | Pmakeblock(tag, Mutable, shape) -> fprintf ppf "makemutable %i%a" tag Printlambda.block_shape shape + | Pmakelazyblock Lazy_tag -> + fprintf ppf "makelazyblock" + | Pmakelazyblock Forward_tag -> + fprintf ppf "makeforwardblock" | Pfield(n, ptr, mut) -> let instr = match ptr, mut with @@ -213,13 +217,7 @@ let primitive ppf (prim:Clambda_primitives.primitive) = | Pbswap16 -> fprintf ppf "bswap16" | Pbbswap(bi) -> print_boxed_integer "bswap" ppf bi | Pint_as_pointer -> fprintf ppf "int_as_pointer" - | Patomic_load {immediate_or_pointer} -> - (match immediate_or_pointer with - | Immediate -> fprintf ppf "atomic_load_imm" - | Pointer -> fprintf ppf "atomic_load_ptr") - | Patomic_exchange -> fprintf ppf "atomic_exchange" - | Patomic_cas -> fprintf ppf "atomic_cas" - | Patomic_fetch_add -> fprintf ppf "atomic_fetch_add" + | Patomic_load -> fprintf ppf "atomic_load" | Popaque -> fprintf ppf "opaque" | Pdls_get -> fprintf ppf "dls_get" | Ppoll -> fprintf ppf "poll" diff --git a/middle_end/semantics_of_primitives.ml b/middle_end/semantics_of_primitives.ml index e921ee94..e92b5260 100644 --- a/middle_end/semantics_of_primitives.ml +++ b/middle_end/semantics_of_primitives.ml @@ -21,7 +21,7 @@ type coeffects = No_coeffects | Has_coeffects let for_primitive (prim : Clambda_primitives.primitive) = match prim with - | Pmakeblock _ + | Pmakeblock _ | Pmakelazyblock _ | Pmakearray (_, Mutable) -> Only_generative_effects, No_coeffects | Pmakearray (_, Immutable) -> No_effects, No_coeffects | Pduparray (_, Immutable) -> @@ -116,10 +116,7 @@ let for_primitive (prim : Clambda_primitives.primitive) = | Psetfield _ | Psetfield_computed _ | Psetfloatfield _ - | Patomic_load _ - | Patomic_exchange - | Patomic_cas - | Patomic_fetch_add + | Patomic_load | Parraysetu _ | Parraysets _ | Pbytessetu diff --git a/ocaml-variants.opam b/ocaml-variants.opam index c34a8088..c8706540 100644 --- a/ocaml-variants.opam +++ b/ocaml-variants.opam @@ -1,7 +1,7 @@ opam-version: "2.0" -version: "5.3.0" +version: "5.4.0" license: "LGPL-2.1-or-later WITH OCaml-LGPL-linking-exception" -synopsis: "Official release of OCaml 5.3.0" +synopsis: "Official release of OCaml 5.4.0" maintainer: "caml-list@inria.fr" authors: [ "Xavier Leroy" @@ -14,8 +14,8 @@ authors: [ homepage: "https://github.com/ocaml/ocaml/" bug-reports: "https://github.com/ocaml/ocaml/issues" depends: [ - # This is OCaml 5.3.0 - "ocaml" {= "5.3.0" & post} + # This is OCaml 5.4.0 + "ocaml" {= "5.4.0" & post} # General base- packages "base-unix" {post} diff --git a/ocamldoc/odoc_args.ml b/ocamldoc/odoc_args.ml index 8d615059..90adf0c4 100644 --- a/ocamldoc/odoc_args.ml +++ b/ocamldoc/odoc_args.ml @@ -297,6 +297,9 @@ let default_options = Options.list @ Arg.String (fun s -> Odoc_latex.latex_class_prefix := s), M.latex_class_prefix ; "-latex-class-type-prefix", Arg.String (fun s -> Odoc_latex.latex_class_type_prefix := s), M.latex_class_type_prefix ; + "-latex-escape-underscore", Arg.Bool ((:=) Odoc_latex.latex_escape_underscore), + "escape underscore in references"; + "-notoc", Arg.Unit (fun () -> Odoc_global.with_toc := false), M.no_toc ^ "\n\n *** texinfo options ***\n"; diff --git a/ocamldoc/odoc_ast.ml b/ocamldoc/odoc_ast.ml index 3d70fe13..c5be6b7a 100644 --- a/ocamldoc/odoc_ast.ml +++ b/ocamldoc/odoc_ast.ml @@ -51,7 +51,7 @@ module Typedtree_search = let iter_val_pattern = function | Typedtree.Tpat_any -> None | Typedtree.Tpat_var (name, _, _) - | Typedtree.Tpat_alias (_, name, _, _) -> Some (Name.from_ident name) + | Typedtree.Tpat_alias (_, name, _, _, _) -> Some (Name.from_ident name) | Typedtree.Tpat_tuple _ -> None (* FIXME when we will handle tuples *) | _ -> None @@ -259,17 +259,17 @@ module Analyser = sn_type = Odoc_env.subst_type env pat.pat_type } - | Typedtree.Tpat_alias (pat, _, _, _) -> + | Typedtree.Tpat_alias (pat, _, _, _, _) -> iter_pattern pat | Typedtree.Tpat_tuple patlist -> Tuple - (List.map iter_pattern patlist, + (List.map (fun (_, p) -> iter_pattern p) patlist, Odoc_env.subst_type env pat.pat_type) | Typedtree.Tpat_construct (_, cons_desc, _, _) when (* we give a name to the parameter only if it is unit *) - Path.same (Btype.cstr_type_path cons_desc) Predef.path_unit + Path.same (Data_types.cstr_res_type_path cons_desc) Predef.path_unit -> (* a () argument, it never has description *) Simple_name { sn_name = "()" ; @@ -335,7 +335,7 @@ module Analyser = let (pat, exp) = pat_exp in let comment_opt = Odoc_sig.analyze_alerts comment_opt attrs in match pat.pat_desc with - | Tpat_var (ident, _, _) | Tpat_alias (_, ident, _, _) -> + | Tpat_var (ident, _, _) | Tpat_alias (_, ident, _, _, _) -> begin match exp.exp_desc with | Texp_function (params, body) -> @@ -709,7 +709,7 @@ module Analyser = in (parameter :: params, k) - | (Parsetree.Pcl_apply (p_class_expr2, _), Tcl_apply (tt_class_expr2, exp_opt_optional_list)) -> + | (Parsetree.Pcl_apply (p_class_expr2, _), Tcl_apply (tt_class_expr2, arg_list)) -> let applied_name = (* we want an ident, or else the class applied will appear in the form object ... end, because if the class applied has no name, the code is kinda ugly, isn't it ? *) @@ -724,13 +724,10 @@ module Analyser = | _ -> Odoc_messages.object_end in - let param_exps = List.fold_left - (fun acc -> fun (_, exp_opt) -> - match exp_opt with - None -> acc - | Some e -> acc @ [e]) - [] - exp_opt_optional_list + let param_exps = List.filter_map (function + | _, Omitted () -> None + | _, Arg e -> Some e) + arg_list in let param_types = List.map (fun e -> e.Typedtree.exp_type) param_exps in let params_code = diff --git a/ocamldoc/odoc_env.ml b/ocamldoc/odoc_env.ml index 702519b0..341a60f5 100644 --- a/ocamldoc/odoc_env.ml +++ b/ocamldoc/odoc_env.ml @@ -176,11 +176,11 @@ let subst_type env t = let new_p = Odoc_name.to_path (full_type_name env (Odoc_name.from_path p)) in set_type_desc t (Tconstr (new_p, l, a)) - | Tpackage (p, fl) -> + | Tpackage {pack_path = p; pack_cstrs} -> let new_p = Odoc_name.to_path (full_module_type_name env (Odoc_name.from_path p)) in - set_type_desc t (Tpackage (new_p, fl)) + set_type_desc t (Tpackage {pack_path = new_p; pack_cstrs}) | Tobject (_, ({contents=Some(p,tyl)} as r)) -> let new_p = Odoc_name.to_path (full_type_name env (Odoc_name.from_path p)) in diff --git a/ocamldoc/odoc_html.ml b/ocamldoc/odoc_html.ml index 2ba94698..41a6e5b5 100644 --- a/ocamldoc/odoc_html.ml +++ b/ocamldoc/odoc_html.ml @@ -552,7 +552,7 @@ class virtual text = let (html, _) = Naming.html_files m.m_name in bp b "%s" html m.m_name; bs b ""; - self#html_of_info_first_sentence b m.m_info; + self#html_of_info_first_sentence ~with_p:false b m.m_info; with Not_found -> Odoc_global.pwarning (Odoc_messages.cross_module_not_found name); @@ -786,7 +786,7 @@ class virtual info = (** Print html code for the first sentence of a description. The titles and lists in this first sentence has been removed.*) - method html_of_info_first_sentence b info_opt = + method html_of_info_first_sentence ~with_p b info_opt = match info_opt with None -> () | Some info -> @@ -799,7 +799,7 @@ class virtual info = None -> () | Some d when d = [Odoc_info.Raw ""] -> () | Some d -> - self#html_of_text ~with_p:true b + self#html_of_text ~with_p b (Odoc_info.text_no_title_no_list (Odoc_info.first_sentence_of_text d)); bs b "\n" @@ -1707,6 +1707,7 @@ class html = if r.rf_mutable then bs b (self#keyword "mutable ") ; bp b "%s : " (gen_name r) r.rf_name; self#html_of_type_expr b father r.rf_type; + if r.rf_atomic then bs b (self#keyword " [@atomic]") ; bs b ";\n"; ( match r.rf_text with @@ -2076,7 +2077,7 @@ class html = if complete then self#html_of_info ~cls: "module top" ~indent: true else - self#html_of_info_first_sentence + self#html_of_info_first_sentence ~with_p:true ) b m.m_info else () @@ -2107,7 +2108,7 @@ class html = if complete then self#html_of_info ~cls: "modtype top" ~indent: true else - self#html_of_info_first_sentence + self#html_of_info_first_sentence ~with_p:true ) b mt.mt_info else () @@ -2262,7 +2263,7 @@ class html = if complete then self#html_of_info ~cls: "class top" ~indent: true else - self#html_of_info_first_sentence + self#html_of_info_first_sentence ~with_p:true ) b c.cl_info (** Print html code for a class type. *) @@ -2305,7 +2306,7 @@ class html = if complete then self#html_of_info ~cls: "classtype top" ~indent: true else - self#html_of_info_first_sentence + self#html_of_info_first_sentence ~with_p:true ) b ct.clt_info (** Return html code to represent a dag, represented as in Odoc_dag2html. *) @@ -2439,7 +2440,7 @@ class html = if simple_name <> father_name && father_name <> "" then bp b "[%s]" (fst (Naming.html_files father_name)) father_name; bs b "\n"; - self#html_of_info_first_sentence b (info e); + self#html_of_info_first_sentence ~with_p:false b (info e); bs b "\n" end in diff --git a/ocamldoc/odoc_html.mli b/ocamldoc/odoc_html.mli index 775f611b..fdebf50c 100644 --- a/ocamldoc/odoc_html.mli +++ b/ocamldoc/odoc_html.mli @@ -258,7 +258,7 @@ module Generator : ?cls:string -> ?indent:bool -> Buffer.t -> Odoc_types.info option -> unit method html_of_info_first_sentence : - Buffer.t -> Odoc_info.info option -> unit + with_p:bool -> Buffer.t -> Odoc_info.info option -> unit method html_of_method : Buffer.t -> Odoc_info.Value.t_method -> unit method html_of_modtype : Buffer.t -> @@ -555,7 +555,7 @@ module type Html_generator = ?cls:string -> ?indent:bool -> Buffer.t -> Odoc_types.info option -> unit method html_of_info_first_sentence : - Buffer.t -> Odoc_info.info option -> unit + with_p:bool -> Buffer.t -> Odoc_info.info option -> unit method html_of_method : Buffer.t -> Odoc_info.Value.t_method -> unit method html_of_modtype : Buffer.t -> diff --git a/ocamldoc/odoc_info.mli b/ocamldoc/odoc_info.mli index bb4aa1d8..b765e904 100644 --- a/ocamldoc/odoc_info.mli +++ b/ocamldoc/odoc_info.mli @@ -260,6 +260,7 @@ module Type : { rf_name : string ; (** Name of the field. *) rf_mutable : bool ; (** [true] if mutable. *) + rf_atomic : bool ; (** [true] if atomic. *) rf_type : Types.type_expr ; (** Type of the field. *) mutable rf_text : info option ; (** Optional description in the associated comment.*) } diff --git a/ocamldoc/odoc_latex.ml b/ocamldoc/odoc_latex.ml index 3eb1b7fb..2c6ef425 100644 --- a/ocamldoc/odoc_latex.ml +++ b/ocamldoc/odoc_latex.ml @@ -47,6 +47,7 @@ let latex_class_prefix = ref Odoc_messages.default_latex_class_prefix let latex_class_type_prefix = ref Odoc_messages.default_latex_class_type_prefix let latex_attribute_prefix = ref Odoc_messages.default_latex_attribute_prefix let latex_method_prefix = ref Odoc_messages.default_latex_method_prefix +let latex_escape_underscore = ref true let new_buf () = Buffer.create 1024 let new_fmt () = @@ -186,7 +187,10 @@ class text = for i = 0 to len - 1 do let (s_no_, s) = match name.[i] with - '_' -> ("-underscore", "_") + | '_' -> + if !latex_escape_underscore then + ("-underscore", "_") + else ("_","_") | '~' -> ("-tilde", "~") | '%' -> ("-percent", "%") | '@' -> ("-at", "\"@") @@ -542,10 +546,11 @@ class latex = List.map (fun r -> let s_field = p fmt - "@[ %s%s :@ %s ;" + "@[ %s%s :@ %s %s;" (if r.rf_mutable then "mutable " else "") r.rf_name - (self#normal_type mod_name r.rf_type); + (self#normal_type mod_name r.rf_type) + (if r.rf_atomic then "[@atomic] " else ""); flush () in [ CodePre s_field ] @ (self#entry_comment f r.rf_text) diff --git a/ocamldoc/odoc_latex.mli b/ocamldoc/odoc_latex.mli index e4011c96..07244541 100644 --- a/ocamldoc/odoc_latex.mli +++ b/ocamldoc/odoc_latex.mli @@ -41,6 +41,8 @@ val latex_attribute_prefix : string ref val latex_method_prefix : string ref +val latex_escape_underscore: bool ref + module Generator : sig class latex : diff --git a/ocamldoc/odoc_lexer.mll b/ocamldoc/odoc_lexer.mll index ab1bd45a..728b8c33 100644 --- a/ocamldoc/odoc_lexer.mll +++ b/ocamldoc/odoc_lexer.mll @@ -98,9 +98,9 @@ let validate_ident raw_name = match Misc.Utf8_lexeme.validate_identifier name with | Misc.Utf8_lexeme.Valid -> name | Misc.Utf8_lexeme.Invalid_character u -> - failwith (Format.asprintf "Invalid character U+%X" (Uchar.to_int u)) + failwith (Format.asprintf "Invalid character U+%04X" (Uchar.to_int u)) | Misc.Utf8_lexeme.Invalid_beginning u -> - failwith (Format.asprintf "Invalid first character U+%X" (Uchar.to_int u)) + failwith (Format.asprintf "Invalid first character U+%04X" (Uchar.to_int u)) let validate_exception_uident raw_name = let name = validate_ident raw_name in diff --git a/ocamldoc/odoc_man.ml b/ocamldoc/odoc_man.ml index 8530aa71..852cdb2f 100644 --- a/ocamldoc/odoc_man.ml +++ b/ocamldoc/odoc_man.ml @@ -572,6 +572,7 @@ class man = bs b (if r.rf_mutable then "\n\n.B mutable \n" else "\n "); bs b (r.rf_name^" : "); self#man_of_type_expr b father r.rf_type; + bs b (if r.rf_atomic then "\n.B [@atomic] " else ""); bs b ";"; self#field_comment b r.rf_text ; ) l; @@ -846,6 +847,7 @@ class man = if f.rf_mutable then bs b (Odoc_messages.mutab^" "); bs b (f.rf_name^" : "); self#man_of_type_expr b modname f.rf_type; + if f.rf_atomic then bs b "\n.B [@atomic] "; bs b "\n.sp\n"; self#man_of_info b f.rf_text; bs b "\n.sp\n" diff --git a/ocamldoc/odoc_misc.ml b/ocamldoc/odoc_misc.ml index a1898c10..1e587af6 100644 --- a/ocamldoc/odoc_misc.ml +++ b/ocamldoc/odoc_misc.ml @@ -83,9 +83,9 @@ let remove_duplicates (type a) compare (li : a list) = let rec string_of_longident li = match li with | Longident.Lident s -> s - | Longident.Ldot(li, s) -> string_of_longident li ^ "." ^ s + | Longident.Ldot(li, s) -> string_of_longident li.txt ^ "." ^ s.txt | Longident.Lapply(l1, l2) -> - string_of_longident l1 ^ "(" ^ string_of_longident l2 ^ ")" + string_of_longident l1.txt ^ "(" ^ string_of_longident l2.txt ^ ")" let rec string_of_text t = let rec iter t_ele = diff --git a/ocamldoc/odoc_sig.ml b/ocamldoc/odoc_sig.ml index 27372d5e..207c541d 100644 --- a/ocamldoc/odoc_sig.ml +++ b/ocamldoc/odoc_sig.ml @@ -433,7 +433,12 @@ module Analyser = Object_type (List.map f @@ fst @@ Ctype.flatten_fields fields) | _ -> Other (Odoc_env.subst_type env type_expr) - let get_field env name_comment_list {Types.ld_id=field_name;ld_mutable=mutable_flag;ld_type=type_expr;ld_attributes} = + let get_field env name_comment_list + {Types.ld_id=field_name; + ld_mutable=mutable_flag; + ld_atomic=atomic_flag; + ld_type=type_expr; + ld_attributes} = let field_name = Ident.name field_name in let comment_opt = try List.assoc field_name name_comment_list @@ -443,6 +448,7 @@ module Analyser = { rf_name = field_name ; rf_mutable = mutable_flag = Mutable ; + rf_atomic = atomic_flag = Atomic ; rf_type = Odoc_env.subst_type env type_expr ; rf_text = comment_opt } @@ -492,9 +498,9 @@ module Analyser = let get_cstr_args env pos_end = let tuple ct = Odoc_env.subst_type env ct.Typedtree.ctyp_type in let record comments - { Typedtree.ld_id; ld_mutable; ld_type; ld_loc; ld_attributes } = + { Typedtree.ld_id; ld_mutable; ld_atomic; ld_type; ld_loc; ld_attributes } = get_field env comments @@ - {Types.ld_id; ld_mutable; ld_type=ld_type.Typedtree.ctyp_type; + {Types.ld_id; ld_mutable; ld_atomic; ld_type=ld_type.Typedtree.ctyp_type; ld_loc; ld_attributes; ld_uid=Types.Uid.internal_not_actually_unique} in let open Typedtree in function diff --git a/ocamldoc/odoc_str.ml b/ocamldoc/odoc_str.ml index ce43a657..cd81f2c9 100644 --- a/ocamldoc/odoc_str.ml +++ b/ocamldoc/odoc_str.ml @@ -168,9 +168,10 @@ let string_of_record l = P.sprintf "{\n%s\n}" ( String.concat "\n" ( List.map (fun field -> - P.sprintf " %s%s : %s;%s" + P.sprintf " %s%s : %s%s;%s" (if field.M.rf_mutable then "mutable " else "") field.M.rf_name (Odoc_print.string_of_type_expr field.M.rf_type) + (if field.M.rf_atomic then " [@atomic]" else "") (field_doc_str field.M.rf_text) ) l ) diff --git a/ocamldoc/odoc_type.ml b/ocamldoc/odoc_type.ml index 7491ae1f..a5859456 100644 --- a/ocamldoc/odoc_type.ml +++ b/ocamldoc/odoc_type.ml @@ -23,6 +23,7 @@ type private_flag = Asttypes.private_flag = type record_field = { rf_name : string ; rf_mutable : bool ; (** true if mutable *) + rf_atomic : bool; (** true if atomic *) rf_type : Types.type_expr ; mutable rf_text : Odoc_types.info option ; (** optional user description *) } diff --git a/ocamldoc/odoc_type.mli b/ocamldoc/odoc_type.mli index 31ea19b6..619c259b 100644 --- a/ocamldoc/odoc_type.mli +++ b/ocamldoc/odoc_type.mli @@ -26,6 +26,7 @@ type private_flag = Asttypes.private_flag = Private | Public type record_field = { rf_name : string; rf_mutable : bool; + rf_atomic : bool; rf_type : Types.type_expr; mutable rf_text : Odoc_types.info option; } diff --git a/ocamldoc/odoc_value.ml b/ocamldoc/odoc_value.ml index aa69cb30..ff636d25 100644 --- a/ocamldoc/odoc_value.ml +++ b/ocamldoc/odoc_value.ml @@ -91,7 +91,7 @@ let dummy_parameter_list typ = let open Asttypes in if label = Nolabel then Odoc_parameter.Tuple - (List.map (fun t2 -> iter (Nolabel, t2)) l, t) + (List.map (fun t2 -> iter (Nolabel, t2)) (List.map snd l), t) else (* if there is a label, then we don't want to decompose the tuple *) Odoc_parameter.Simple_name diff --git a/ocamltest/OCAMLTEST.org b/ocamltest/OCAMLTEST.org index 077b76e0..0ef457e3 100644 --- a/ocamltest/OCAMLTEST.org +++ b/ocamltest/OCAMLTEST.org @@ -711,6 +711,10 @@ output: ... testing 'hello.ml' with 1 (script) => failed (Why should this pass in the first place) #+end_src +In addition, the script can write lines of the form ~variable="string"~, or +~variable+="string"~, or ~-variable~, to file ~${ocamltest_response}~, to set, append to, +and unset ocamltest environment variables, respectively. + * Key concepts :PROPERTIES: :CUSTOM_ID: concepts diff --git a/ocamltest/builtin_actions.ml b/ocamltest/builtin_actions.ml index 0f06062f..0b6b4e25 100644 --- a/ocamltest/builtin_actions.ml +++ b/ocamltest/builtin_actions.ml @@ -56,7 +56,7 @@ let cd = make try Sys.chdir cwd; (Result.pass, env) with _ -> - let reason = "Could not chidir to \"" ^ cwd ^ "\"" in + let reason = "Could not chdir to \"" ^ cwd ^ "\"" in let result = Result.fail_with_reason reason in (result, env) end) @@ -102,6 +102,13 @@ let hasstr = make "str library available" "str library not available") +let multicore = make + ~name:"multicore" + ~description:"Pass if running on multicore" + (Actions_helpers.pass_or_skip (Domain.recommended_domain_count () >= 2) + "running on multicore" + "not running on multicore") + let windows_OS = "Windows_NT" let get_OS () = Sys.safe_getenv "OS" @@ -123,10 +130,26 @@ let not_windows = make let not_msvc = make ~name:"not-msvc" ~description:"Pass if not using MSVC / clang-cl" - (Actions_helpers.pass_or_skip (Ocamltest_config.ccomptype <> "msvc") + (Actions_helpers.pass_or_skip (Ocamltest_config.ccomp_type <> "msvc") "not using MSVC / clang-cl" "using MSVC / clang-cl") +(* windows _passes_ on Cygwin; target_windows _skips_ for Cygwin *) + +let target_windows = make + ~name:"target-windows" + ~description:"Pass if the compiler does targets native Windows" + (Actions_helpers.pass_or_skip (Ocamltest_config.target_os_type = "Win32") + "targeting native Windows" + "not targeting native Windows") + +let not_target_windows = make + ~name:"not-target-windows" + ~description:"Pass if the compiler does not target native Windows" + (Actions_helpers.pass_or_skip (Ocamltest_config.target_os_type <> "Win32") + "not targeting native Windows" + "targeting native Windows") + let is_bsd_system s = match s with | "bsd_elf" | "netbsd" | "freebsd" | "openbsd" -> true @@ -146,6 +169,15 @@ let not_bsd = make "not on a BSD system" "on a BSD system") +let linux_system = "linux" + +let linux = make + ~name:"linux" + ~description:"Pass if running on a Linux system" + (Actions_helpers.pass_or_skip (Ocamltest_config.system = linux_system) + "on a Linux system" + "not on a Linux system") + let macos_system = "macosx" let macos = make @@ -214,12 +246,12 @@ let arch_power = make "Target is POWER architecture" "Target is not POWER architecture") -let arch_riscv64 = make - ~name:"arch_riscv64" - ~description:"Pass if target is a RiscV64 architecture" - (Actions_helpers.pass_or_skip (String.equal Ocamltest_config.arch "riscv64") - "Target is RiscV64 architecture" - "Target is not RiscV64 architecture") +let arch_riscv = make + ~name:"arch_riscv" + ~description:"Pass if target is a RISC-V architecture" + (Actions_helpers.pass_or_skip (String.equal Ocamltest_config.arch "riscv") + "Target is RISC-V architecture" + "Target is not RISC-V architecture") let arch_s390x = make ~name:"arch_s390x" @@ -367,13 +399,17 @@ let _ = hasunix; hassysthreads; hasstr; + multicore; libunix; libwin32unix; windows; not_windows; not_msvc; + target_windows; + not_target_windows; bsd; not_bsd; + linux; macos; not_macos_amd64_tsan; arch32; @@ -389,7 +425,7 @@ let _ = arch_amd64; arch_i386; arch_power; - arch_riscv64; + arch_riscv; arch_s390x; function_sections; frame_pointers; diff --git a/ocamltest/builtin_variables.ml b/ocamltest/builtin_variables.ml index c6b19d0d..48dcc89e 100644 --- a/ocamltest/builtin_variables.ml +++ b/ocamltest/builtin_variables.ml @@ -31,6 +31,9 @@ let cwd = Variables.make ("cwd", let commandline = Variables.make ("commandline", "Specify the commandline of a tool") +let dev_null = Variables.make ("dev_null", + "Path to /dev/null") + let dst = Variables.make ("dst", "Location where to copy files and directories") let exit_status = Variables.make ("exit_status", @@ -119,6 +122,7 @@ let _ = List.iter Variables.register_variable arguments; cwd; commandline; + dev_null; dst; exit_status; file; diff --git a/ocamltest/builtin_variables.mli b/ocamltest/builtin_variables.mli index b7ebf56f..573f497d 100644 --- a/ocamltest/builtin_variables.mli +++ b/ocamltest/builtin_variables.mli @@ -23,6 +23,8 @@ val cwd : Variables.t val commandline : Variables.t +val dev_null : Variables.t + val dst : Variables.t val exit_status : Variables.t diff --git a/ocamltest/debugger_actions.ml b/ocamltest/debugger_actions.ml new file mode 100644 index 00000000..48d0c04d --- /dev/null +++ b/ocamltest/debugger_actions.ml @@ -0,0 +1,129 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Tim McGilchrist, Tarides *) +(* *) +(* Copyright 2024 Tarides. *) +(* *) +(* All rights reserved. This file is distributed under the terms of *) +(* the GNU Lesser General Public License version 2.1, with the *) +(* special exception on linking described in the file LICENSE. *) +(* *) +(**************************************************************************) + +open Ocamltest_stdlib +open Actions + +let env_setting env_reader default_setting = + Printf.sprintf "%s=%s" + env_reader.Clflags.env_var + (env_reader.Clflags.print default_setting) + +let default_debugger_env = [| + "TERM=dumb"; + env_setting Clflags.color_reader Misc.Color.default_setting; + env_setting Clflags.error_style_reader Misc.Error_style.default_setting; + |] + +let env_with_lib_unix env = + let libunixdir = Ocaml_directories.libunix in + let newlibs = + match Environments.lookup Ocaml_variables.caml_ld_library_path env with + | None -> libunixdir + | Some libs -> libunixdir ^ " " ^ libs + in + Environments.add Ocaml_variables.caml_ld_library_path newlibs env + +type debugger_type = LLDB | GDB | Bytecode + +let debugger_type_to_string = function + | LLDB -> "lldb" + | GDB -> "gdb" + | Bytecode -> "ocamldebug" + +let debug debugger_type log env = + let program = Environments.safe_lookup Builtin_variables.program env in + let what = Printf.sprintf "Debugging program %s with %s" program + (debugger_type_to_string debugger_type) in + Printf.fprintf log "%s\n%!" what; + let commandline = match debugger_type with + | LLDB -> [ + "lldb"; + Debugger_flags.lldb_default_flags; + "-s " ^ (Environments.safe_lookup + Debugger_variables.debugger_script env); + program ] + | GDB -> [ + "gdb"; + Debugger_flags.gdb_default_flags; + "-x " ^ (Environments.safe_lookup + Debugger_variables.debugger_script env); + program ] + | Bytecode -> [ + Ocaml_commands.ocamlrun_ocamldebug; + Debugger_flags.ocamldebug_default_flags; + program + ] + in + let systemenv = + match debugger_type with + | LLDB | GDB -> + Environments.append_to_system_env + default_debugger_env env + | Bytecode -> + Environments.append_to_system_env + default_debugger_env + (env_with_lib_unix env) + in + let stdin_variable = match debugger_type with + | LLDB | GDB -> Builtin_variables.dev_null + | Bytecode -> Debugger_variables.debugger_script + in + let expected_exit_status = 0 in + let exit_status = + Actions_helpers.run_cmd + ~environment:systemenv + ~stdin_variable:stdin_variable + ~stdout_variable:Builtin_variables.output + ~stderr_variable:Builtin_variables.output + ~append:true + log (env_with_lib_unix env) commandline in + if exit_status=expected_exit_status + then (Result.pass, env) + else begin + let reason = + (Actions_helpers.mkreason + what (String.concat " " commandline) exit_status) in + (Result.fail_with_reason reason, env) + end + +let lldb = + Actions.make ~name:"lldb" + ~description:"Run LLDB on the program" (debug LLDB) + +let gdb = + Actions.make ~name:"gdb" + ~description:"Run GDB on the program" (debug GDB) + +let ocamldebug = + Actions.make ~name:"ocamldebug" + ~description:"Run ocamldebug on the program" (debug Bytecode) + +let initialize_test_exit_status_variables _log env = + Environments.add_bindings + [ + Builtin_variables.test_pass, "0"; + Builtin_variables.test_fail, "1"; + Builtin_variables.test_skip, "125"; + ] env + +let _ = + Environments.register_initializer Environments.Post + "test_exit_status_variables" initialize_test_exit_status_variables; + List.iter register + [ + lldb; + gdb; + ocamldebug; + ] diff --git a/ocamltest/debugger_actions.mli b/ocamltest/debugger_actions.mli new file mode 100644 index 00000000..54e47327 --- /dev/null +++ b/ocamltest/debugger_actions.mli @@ -0,0 +1,22 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Tim McGilchrist, Tarides *) +(* *) +(* Copyright 2024 Tarides. *) +(* *) +(* All rights reserved. This file is distributed under the terms of *) +(* the GNU Lesser General Public License version 2.1, with the *) +(* special exception on linking described in the file LICENSE. *) +(* *) +(**************************************************************************) + +(** Run LLDB debugger *) +val lldb : Actions.t + +(** Run GDB debugger *) +val gdb : Actions.t + +(** Run ocamldebug (bytecode) debugger *) +val ocamldebug : Actions.t diff --git a/ocamltest/debugger_flags.ml b/ocamltest/debugger_flags.ml new file mode 100644 index 00000000..4396c0bc --- /dev/null +++ b/ocamltest/debugger_flags.ml @@ -0,0 +1,21 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Tim McGilchrist, Tarides *) +(* *) +(* Copyright 2024 Tarides. *) +(* *) +(* All rights reserved. This file is distributed under the terms of *) +(* the GNU Lesser General Public License version 2.1, with the *) +(* special exception on linking described in the file LICENSE. *) +(* *) +(**************************************************************************) + +let ocamldebug_default_flags = + "-no-version -no-prompt -no-time -no-breakpoint-message " ^ + ("-I " ^ Ocaml_directories.stdlib ^ " ") + +let lldb_default_flags = "--no-use-colors" + +let gdb_default_flags = "--quiet --batch" diff --git a/ocamltest/debugger_flags.mli b/ocamltest/debugger_flags.mli new file mode 100644 index 00000000..2b4a8acb --- /dev/null +++ b/ocamltest/debugger_flags.mli @@ -0,0 +1,22 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Tim McGilchrist, Tarides *) +(* *) +(* Copyright 2024 Tarides. *) +(* *) +(* All rights reserved. This file is distributed under the terms of *) +(* the GNU Lesser General Public License version 2.1, with the *) +(* special exception on linking described in the file LICENSE. *) +(* *) +(**************************************************************************) + +(* Flags used in LLDB commands *) +val lldb_default_flags : string + +(* Flags used in GDB commands *) +val gdb_default_flags : string + +(* Flags used in Ocamldebug (bytecode debugger) commands *) +val ocamldebug_default_flags : string diff --git a/ocamltest/debugger_variables.ml b/ocamltest/debugger_variables.ml new file mode 100644 index 00000000..103ac191 --- /dev/null +++ b/ocamltest/debugger_variables.ml @@ -0,0 +1,21 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Tim McGilchrist, Tarides *) +(* *) +(* Copyright 2024 Tarides. *) +(* *) +(* All rights reserved. This file is distributed under the terms of *) +(* the GNU Lesser General Public License version 2.1, with the *) +(* special exception on linking described in the file LICENSE. *) +(* *) +(**************************************************************************) + +let debugger_script = Variables.make ("debugger_script", + "Where the debugger should read its commands") + +let _ = List.iter Variables.register_variable + [ + debugger_script; + ] diff --git a/ocamltest/debugger_variables.mli b/ocamltest/debugger_variables.mli new file mode 100644 index 00000000..8ef464cd --- /dev/null +++ b/ocamltest/debugger_variables.mli @@ -0,0 +1,19 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Tim McGilchrist, Tarides *) +(* *) +(* Copyright 2024 Tarides. *) +(* *) +(* All rights reserved. This file is distributed under the terms of *) +(* the GNU Lesser General Public License version 2.1, with the *) +(* special exception on linking described in the file LICENSE. *) +(* *) +(**************************************************************************) + +(* Definition of variables used by debugger actions *) + +(* The variables are listed in alphabetical order *) + +val debugger_script : Variables.t diff --git a/ocamltest/environments.ml b/ocamltest/environments.ml index e4aac562..4c9046af 100644 --- a/ocamltest/environments.ml +++ b/ocamltest/environments.ml @@ -115,9 +115,9 @@ let add variable value env = VariableMap.add variable (Some value) env let add_if_undefined variable value env = if VariableMap.mem variable env then env else add variable value env -let append variable appened_value environment = +let append variable appended_value environment = let previous_value = safe_lookup variable environment in - let new_value = previous_value ^ appened_value in + let new_value = previous_value ^ appended_value in VariableMap.add variable (Some new_value) environment let remove = VariableMap.remove diff --git a/ocamltest/filecompare.ml b/ocamltest/filecompare.ml index 8d1879f4..41d398cb 100644 --- a/ocamltest/filecompare.ml +++ b/ocamltest/filecompare.ml @@ -231,6 +231,12 @@ let diff files = let temporary_file = Filename.temp_file "ocamltest" "diff" in let diff = Ocamltest_config.diff in let diff_flags = String.words Ocamltest_config.diff_flags in + let diff_flags = + if Ocamltest_config.diff_supports_color then + (if Misc.Color.is_enabled () then "--color=always" else "--color=never") + :: diff_flags + else diff_flags + in let diff_files = [files.reference_filename; files.output_filename] in let diff_commandline = Filename.quote_command diff ~stdout:temporary_file diff --git a/ocamltest/main.ml b/ocamltest/main.ml index e6cb4800..95de179d 100644 --- a/ocamltest/main.ml +++ b/ocamltest/main.ml @@ -88,69 +88,88 @@ let report_error loc e bt = print_exn loc e bt; "=> error in test script" -type result_summary = No_failure | Some_failure | All_skipped -let join_result summary result = - let open Result in - match result.status, summary with - | Fail, _ - | _, Some_failure -> Some_failure - | Skip, All_skipped -> All_skipped - | _ -> No_failure +type summary = Result.status = Pass | Skip | Fail -let join_summaries sa sb = - match sa, sb with - | Some_failure, _ - | _, Some_failure -> Some_failure - | All_skipped, All_skipped -> All_skipped - | _ -> No_failure +(* The sequential join passes if both tests pass. + + This implies that a linear sequence of actions, a path along the + test tree, is considered successful if all actions passed. *) +let join_sequential r1 r2 = + match r1, r2 with + | Fail, _ | _, Fail -> Fail + | Pass, Pass -> Pass + | Skip, _ | _, Skip -> Skip + +(* The parallel join passes if either test passes. + + This implies that a test formed of several parallel branches is + considered successful if at least one of the branches is successful. +*) +let join_parallel r1 r2 = + match r1, r2 with + | Fail, _ | _, Fail -> Fail + | Pass, _ | _, Pass -> Pass + | Skip, Skip -> Skip let string_of_summary = function - | No_failure -> "passed" - | Some_failure -> "failed" - | All_skipped -> "skipped" + | Pass -> "passed" + | Fail -> "failed" + | Skip -> "skipped" -let rec run_test_tree log add_msg behavior env summ ast = - match ast with - | Ast (Environment_statement s :: stmts, subs) -> - begin match interpret_environment_statement env s with - | env -> - run_test_tree log add_msg behavior env summ (Ast (stmts, subs)) - | exception e -> - let bt = Printexc.get_backtrace () in - let line = s.loc.Location.loc_start.Lexing.pos_lnum in - Printf.ksprintf add_msg "line %d %s" line (report_error s.loc e bt); - Some_failure - end - | Ast (Test (_, name, mods) :: stmts, subs) -> - let locstr = - if name.loc = Location.none then - "default" - else - Printf.sprintf "line %d" name.loc.Location.loc_start.Lexing.pos_lnum - in - let (msg, children_behavior, newenv, result) = - match behavior with - | Skip_all -> ("=> n/a", Skip_all, env, Result.skip) - | Run -> - begin try - let testenv = List.fold_left apply_modifiers env mods in - let test = lookup_test name in - let (result, newenv) = Tests.run log testenv test in - let msg = Result.string_of_result result in - let sub_behavior = if Result.is_pass result then Run else Skip_all in - (msg, sub_behavior, newenv, result) - with e -> - let bt = Printexc.get_backtrace () in - (report_error name.loc e bt, Skip_all, env, Result.fail) +let run_test_tree log add_msg behavior env summ ast = + let run_statement (behavior, env, summ) = function + | Environment_statement s -> + begin match interpret_environment_statement env s with + | env -> Ok (behavior, env, summ) + | exception e -> + let bt = Printexc.get_backtrace () in + let line = s.loc.Location.loc_start.Lexing.pos_lnum in + Printf.ksprintf add_msg "line %d %s" line (report_error s.loc e bt); + Error Fail + end + | Test (_, name, mods) -> + let locstr = + if name.loc = Location.none then + "default" + else + Printf.sprintf "line %d" name.loc.Location.loc_start.Lexing.pos_lnum + in + let (msg, behavior, env, result) = + match behavior with + | Skip_all -> ("=> n/a", Skip_all, env, Result.skip) + | Run -> + begin try + let testenv = List.fold_left apply_modifiers env mods in + let test = lookup_test name in + let (result, newenv) = Tests.run log testenv test in + let msg = Result.string_of_result result in + let sub_behavior = + if Result.is_pass result then Run else Skip_all in + (msg, sub_behavior, newenv, result) + with e -> + let bt = Printexc.get_backtrace () in + (report_error name.loc e bt, Skip_all, env, Result.fail) + end + in + Printf.ksprintf add_msg "%s (%s) %s" locstr name.node msg; + let summ = join_sequential summ result.status in + Ok (behavior, env, summ) + in + let rec run_tree behavior env summ (Ast (stmts, subs)) = + match List.fold_left_result run_statement (behavior, env, summ) stmts with + | Error e -> e + | Ok (behavior, env, summ) -> + (* If [subs] is empty, there are no further test actions to + perform: we are at the end of a test path and can report + our current summary. Otherwise we continue with each + branch, and parallel-join the result summaries. *) + begin match subs with + | [] -> summ + | _ -> + List.fold_left join_parallel Skip + (List.map (run_tree behavior env summ) subs) end - in - Printf.ksprintf add_msg "%s (%s) %s" locstr name.node msg; - let newsumm = join_result summ result in - let newast = Ast (stmts, subs) in - run_test_tree log add_msg children_behavior newenv newsumm newast - | Ast ([], subs) -> - List.fold_left join_summaries summ - (List.map (run_test_tree log add_msg behavior env All_skipped) subs) + in run_tree behavior env summ ast let get_test_source_directory test_dirname = if (Filename.is_relative test_dirname) then @@ -235,6 +254,7 @@ let test_file test_filename = let make = try Sys.getenv "MAKE" with Not_found -> "make" in let initial_environment = Environments.from_bindings [ + Builtin_variables.dev_null, "/dev/null"; Builtin_variables.make, make; Builtin_variables.test_file, test_basename; Builtin_variables.reference, reference_filename; @@ -253,7 +273,7 @@ let test_file test_filename = let rootenv, initial_status, initial_summary = let rec loop env stmts = match stmts with - | [] -> (env, initial_status, All_skipped) + | [] -> (env, initial_status, Pass) | s :: t -> begin match interpret_environment_statement env s with | env -> loop env t @@ -262,7 +282,7 @@ let test_file test_filename = let line = s.loc.Location.loc_start.Lexing.pos_lnum in Printf.ksprintf add_msg "line %d %s" line (report_error s.loc e bt); - (env, Skip_all, Some_failure) + (env, Skip_all, Fail) end in loop rootenv rootenv_statements @@ -274,11 +294,11 @@ let test_file test_filename = in let common_prefix = " ... testing '" ^ test_basename ^ "'" in Printf.printf "%s => %s%s\n%!" common_prefix (string_of_summary summary) - (if Options.show_timings && summary = No_failure then + (if Options.show_timings && summary = Pass then let wall_clock_duration = Unix.gettimeofday () -. start in Printf.sprintf " (wall clock: %.02fs)" wall_clock_duration else ""); - if summary = Some_failure then + if summary = Fail then List.iter (Printf.printf "%s with %s\n%!" common_prefix) (List.rev !msgs); Actions.clear_all_hooks(); @@ -286,10 +306,10 @@ let test_file test_filename = ) in if not Options.log_to_stderr then close_out log; begin match summary with - | Some_failure -> + | Fail -> if not Options.log_to_stderr then Sys.dump_file stderr ~prefix:"> " log_filename - | No_failure | All_skipped -> + | Pass | Skip -> if not Options.keep_test_dir_on_success then clean_test_build_directory () end diff --git a/ocamltest/ocaml_actions.ml b/ocamltest/ocaml_actions.ml index 4c261d93..de8bf0ba 100644 --- a/ocamltest/ocaml_actions.ml +++ b/ocamltest/ocaml_actions.ml @@ -220,7 +220,7 @@ let compile_program (compiler : Ocaml_compilers.compiler) log env = let output_variable = compiler#output_variable in let prepare = prepare_module output_variable log env in let modules = - List.concatmap prepare (List.map Ocaml_filetypes.filetype all_modules) in + List.concat_map prepare (List.map Ocaml_filetypes.filetype all_modules) in let has_c_file = List.exists is_c_file modules in let c_headers_flags = if has_c_file then Ocaml_flags.c_includes else "" in @@ -350,7 +350,7 @@ let find_source_modules log env = ((plugins env) @ (modules env) @ [(Actions_helpers.testfile env)]) in print_module_names log "Specified" specified_modules; let source_modules = - List.concatmap + List.concat_map (add_module_interface source_directory) specified_modules in print_module_names log "Source" source_modules; @@ -534,43 +534,6 @@ let env_with_lib_unix env = in Environments.add Ocaml_variables.caml_ld_library_path newlibs env -let debug log env = - let program = Environments.safe_lookup Builtin_variables.program env in - let what = Printf.sprintf "Debugging program %s" program in - Printf.fprintf log "%s\n%!" what; - let commandline = - [ - Ocaml_commands.ocamlrun_ocamldebug; - Ocaml_flags.ocamldebug_default_flags; - program - ] in - let systemenv = - Environments.append_to_system_env - default_ocaml_env - (env_with_lib_unix env) - in - let expected_exit_status = 0 in - let exit_status = - Actions_helpers.run_cmd - ~environment:systemenv - ~stdin_variable: Ocaml_variables.ocamldebug_script - ~stdout_variable:Builtin_variables.output - ~stderr_variable:Builtin_variables.output - ~append:true - log (env_with_lib_unix env) commandline in - if exit_status=expected_exit_status - then (Result.pass, env) - else begin - let reason = - (Actions_helpers.mkreason - what (String.concat " " commandline) exit_status) in - (Result.fail_with_reason reason, env) - end - -let ocamldebug = - Actions.make ~name:"ocamldebug" ~description:"Run ocamldebug on the program" - debug - let objinfo log env = let tools_directory = Ocaml_directories.tools in let program = Environments.safe_lookup Builtin_variables.program env in @@ -611,7 +574,13 @@ let objinfo log env = let ocamlobjinfo = Actions.make ~name:"ocamlobjinfo" - ~description:"Run ocamlobjinfo on the program" objinfo + ~description:"Run ocamlobjinfo on the program" + (fun log env -> + if Ocamltest_config.ocamlobjinfo then + objinfo log env + else + Result.skip_with_reason "ocamlobjinfo not available", env + ) let mklib log env = let program = Environments.safe_lookup Builtin_variables.program env in @@ -738,7 +707,7 @@ let run_codegen log env = if exit_status=0 then begin let finalise = - if Ocamltest_config.ccomptype="msvc" + if Ocamltest_config.ccomp_type="msvc" then finalise_codegen_msvc else finalise_codegen_cc in @@ -760,7 +729,7 @@ let run_cc log env = let what = Printf.sprintf "Running C compiler to build %s" program in Printf.fprintf log "%s\n%!" what; let output_exe = - if Ocamltest_config.ccomptype="msvc" then "/Fe" else "-o " + if Ocamltest_config.ccomp_type="msvc" then "/Fe" else "-o " in let commandline = [ @@ -1438,7 +1407,6 @@ let _ = setup_ocamldoc_build_env; run_ocamldoc; check_ocamldoc_output; - ocamldebug; ocamlmklib; codegen; cc; diff --git a/ocamltest/ocaml_flags.ml b/ocamltest/ocaml_flags.ml index 87fd9f1b..42d84a6d 100644 --- a/ocamltest/ocaml_flags.ml +++ b/ocamltest/ocaml_flags.ml @@ -53,8 +53,4 @@ let runtime_flags env backend c_files = let toplevel_default_flags = "-noinit -no-version -noprompt" -let ocamldebug_default_flags = - "-no-version -no-prompt -no-time -no-breakpoint-message " ^ - ("-I " ^ Ocaml_directories.stdlib ^ " ") - let ocamlobjinfo_default_flags = "-null-crc" diff --git a/ocamltest/ocaml_flags.mli b/ocamltest/ocaml_flags.mli index 3d4e4cfc..8c878ffd 100644 --- a/ocamltest/ocaml_flags.mli +++ b/ocamltest/ocaml_flags.mli @@ -26,6 +26,4 @@ val runtime_flags : val toplevel_default_flags : string -val ocamldebug_default_flags : string - val ocamlobjinfo_default_flags : string diff --git a/ocamltest/ocaml_tests.ml b/ocamltest/ocaml_tests.ml index baf643ec..fbef17b3 100644 --- a/ocamltest/ocaml_tests.ml +++ b/ocamltest/ocaml_tests.ml @@ -153,7 +153,7 @@ let asmgen_skip_on_bytecode_only = Actions_helpers.skip_with_reason "native compiler disabled" let msvc64 = - Ocamltest_config.ccomptype = "msvc" && Ocamltest_config.arch="amd64" + Ocamltest_config.ccomp_type = "msvc" && Ocamltest_config.arch="amd64" let asmgen_skip_on_msvc64 = Actions_helpers.skip_with_reason "not ported to MSVC64 yet" diff --git a/ocamltest/ocaml_variables.ml b/ocamltest/ocaml_variables.ml index 9eb366ef..68ff3ff8 100644 --- a/ocamltest/ocaml_variables.ml +++ b/ocamltest/ocaml_variables.ml @@ -203,9 +203,6 @@ let ocamlsrcdir = make ("ocamlsrcdir", let ocamldebug_flags = make ("ocamldebug_flags", "Flags for ocamldebug") -let ocamldebug_script = make ("ocamldebug_script", - "Where ocamldebug should read its commands") - let os_type = make ("os_type", "The OS we are running on") @@ -301,7 +298,6 @@ let _ = List.iter register_variable ocamldoc_reference; ocamldoc_exit_status; ocamldebug_flags; - ocamldebug_script; ocaml_script_as_argument; os_type; plugins; diff --git a/ocamltest/ocaml_variables.mli b/ocamltest/ocaml_variables.mli index 1dc1ebb6..93486371 100644 --- a/ocamltest/ocaml_variables.mli +++ b/ocamltest/ocaml_variables.mli @@ -119,7 +119,6 @@ val ocamlsrcdir : Variables.t val ocamldebug_flags : Variables.t -val ocamldebug_script : Variables.t val os_type : Variables.t diff --git a/ocamltest/ocamltest_config.ml.in b/ocamltest/ocamltest_config.ml.in index 2c53e45c..68b572de 100644 --- a/ocamltest/ocamltest_config.ml.in +++ b/ocamltest/ocamltest_config.ml.in @@ -31,10 +31,13 @@ let cc = {@QS@|@CC@|@QS@} let cflags = {@QS@|@common_cflags@|@QS@} -let ccomptype = {@QS@|@ccomptype@|@QS@} +let ccomp_type = {@QS@|@ccomp_type@|@QS@} + +let target_os_type = {@QS@|@target_os_type@|@QS@} let diff = {@QS@|@DIFF@|@QS@} let diff_flags = {@QS@|@DIFF_FLAGS@|@QS@} +let diff_supports_color = @diff_supports_color@ let shared_libraries = @supports_shared_libraries@ @@ -65,6 +68,8 @@ let ocamldoc = @build_ocamldoc@ let ocamldebug = @build_ocamldebug@ +let ocamlobjinfo = @build_ocamlobjinfo@ + let native_compiler = @native_compiler@ let native_dynlink = @natdynlink@ @@ -77,7 +82,7 @@ let csc = {@QS@|@CSC@|@QS@} let csc_flags = {@QS@|@CSCFLAGS@|@QS@} -let exe = {@QS@|@exeext@|@QS@} +let exe = {@QS@|@EXEEXT@|@QS@} let mkdll = {@QS@|@mkdll_exp@|@QS@} let mkexe = {@QS@|@mkexe_exp@|@QS@} diff --git a/ocamltest/ocamltest_config.mli b/ocamltest/ocamltest_config.mli index d75ae87f..55bc657c 100644 --- a/ocamltest/ocamltest_config.mli +++ b/ocamltest/ocamltest_config.mli @@ -36,15 +36,21 @@ val cc : string val cflags : string (** Flags to pass to the C compiler *) -val ccomptype : string +val ccomp_type : string (** Type of C compiler (msvc, cc, etc.) *) +val target_os_type : string +(** The value of Sys.os_type for the target (cf. Config.target_os_type) *) + val diff : string (** Path to the diff tool *) val diff_flags : string (** Flags to pass to the diff tool *) +val diff_supports_color : bool +(** Whether {!diff} supports the [--color={auto,always,never}] flag *) + val shared_libraries : bool (** [true] if shared libraries are supported, [false] otherwise *) @@ -91,6 +97,9 @@ val ocamldoc : bool val ocamldebug : bool (** Whether ocamldebug has been enabled at configure time *) +val ocamlobjinfo : bool +(** Whether ocamlobjinfo has been enabled at configure time *) + val native_compiler : bool (** Whether the native compiler has been enabled at configure time *) diff --git a/ocamltest/ocamltest_stdlib.ml b/ocamltest/ocamltest_stdlib.ml index d52ee997..75f4ee14 100644 --- a/ocamltest/ocamltest_stdlib.ml +++ b/ocamltest/ocamltest_stdlib.ml @@ -45,9 +45,13 @@ end module List = struct include List - let rec concatmap f = function - | [] -> [] - | x::xs -> (f x) @ (concatmap f xs) + + let rec fold_left_result f acc = function + | [] -> Ok acc + | x :: xs -> + match f acc x with + | Error _ as err -> err + | Ok acc -> fold_left_result f acc xs end module String = struct diff --git a/ocamltest/ocamltest_stdlib.mli b/ocamltest/ocamltest_stdlib.mli index cdd14f7e..8e71d4ea 100644 --- a/ocamltest/ocamltest_stdlib.mli +++ b/ocamltest/ocamltest_stdlib.mli @@ -35,7 +35,8 @@ end module List : sig include module type of List - val concatmap : ('a -> 'b list) -> 'a list -> 'b list + val fold_left_result : + ('acc -> 'a -> ('acc, 'e) result) -> 'acc -> 'a list -> ('acc, 'e) result end module String : sig diff --git a/ocamltest/options.ml b/ocamltest/options.ml index d85f5b1e..c2c1a4a6 100644 --- a/ocamltest/options.ml +++ b/ocamltest/options.ml @@ -98,14 +98,31 @@ let commandline_options = " If translating, preserve line numbers in the output."); ("-keep-chars", Arg.Unit (fun () -> style := Translate.Chars), " If translating, preserve char offsets in the output."); + ("-color", + Arg.Symbol (["auto"; "always"; "never"], + (Misc.set_or_ignore Clflags.color_reader.parse Clflags.color)), + Printf.sprintf + " Enable or disable colors in compiler messages\n\ + \ The following settings are supported:\n\ + \ auto use heuristics to enable colors only if supported\n\ + \ always enable colors\n\ + \ never disable colors\n\ + \ The default setting is 'auto', and the current heuristic\n\ + \ checks that the TERM environment variable exists and is\n\ + \ not empty or \"dumb\", and that isatty(stderr) holds.\n\ + \ If the option is not specified, these setting can alternatively\n\ + \ be set through the OCAML_COLOR environment variable."); ] let files_to_test = ref [] -let usage = "Usage: " ^ Sys.argv.(0) ^ " options files to test" +let usage = "Usage: ocamltest [options] " let () = - Arg.parse (Arg.align commandline_options) (add_to_list files_to_test) usage + Arg.parse (Arg.align commandline_options) (add_to_list files_to_test) usage; + Compmisc.read_clflags_from_env (); + Misc.Style.setup !Clflags.color; + () let log_to_stderr = !log_to_stderr let files_to_test = !files_to_test diff --git a/ocamltest/run_command.ml b/ocamltest/run_command.ml index 5819fa66..2643466f 100644 --- a/ocamltest/run_command.ml +++ b/ocamltest/run_command.ml @@ -48,5 +48,18 @@ let settings_of_commandline ?(stdout_fname="") ?(stderr_fname="") commandline = } external run : settings -> int = "caml_run_command" +external drop_privilege : string -> unit = "caml_drop_privilege" + +let () = + (* This allows lib-runtime-events/test_create_cursor_failures.ml to operate + correctly. That test removes its own access to a file and cannot be run as + root. Cygwin intentionally enables SeBackupPrivilege (see + set_cygwin_privileges in sec/helper.cc) in order to allow an elevated + process to behave in a root-like fashion. Thwart this by dropping the + privilege from our primary token - CreateProcess uses the primary token, + which means anything called by ocamltest will not be able to enable + SeBackupPrivilege. *) + if Sys.cygwin then + drop_privilege "SeBackupPrivilege" let run_commandline commandline = run (settings_of_commandline commandline) diff --git a/ocamltest/run_common.h b/ocamltest/run_common.h index fdedd86c..3d02bfa4 100644 --- a/ocamltest/run_common.h +++ b/ocamltest/run_common.h @@ -30,7 +30,7 @@ static void defaultLogger(void *where, const char *format, va_list ap) vfprintf(stderr, format, ap); } -static void mylog(Logger *logger, void *loggerData, char *fmt, ...) +static void mylog(Logger *logger, void *loggerData, const char *fmt, ...) { va_list ap; va_start(ap, fmt); diff --git a/ocamltest/run_stubs.c b/ocamltest/run_stubs.c index aa5c716b..b1fca038 100644 --- a/ocamltest/run_stubs.c +++ b/ocamltest/run_stubs.c @@ -19,6 +19,10 @@ #define CAML_INTERNALS +#ifdef __CYGWIN__ +#include +#endif + #include #include #include @@ -31,6 +35,7 @@ #include "caml/memory.h" #include "caml/io.h" #include "caml/osdeps.h" +#include /* cstringvect: inspired by similar function in otherlibs/unix/cstringv.c */ static array cstringvect(value arg) @@ -109,3 +114,55 @@ CAMLprim value caml_run_command(value caml_settings) caml_stat_free(settings.stderr_filename); CAMLreturn(Val_int(res)); } + +CAMLprim value caml_drop_privilege(value name) +{ +#ifdef __CYGWIN__ + LUID privilege_luid; + DWORD dwReturnLength; + + if (!LookupPrivilegeValue(NULL, String_val(name), &privilege_luid)) + caml_raise_not_found(); + + /* Search through the primary token and, if this privilege is found, remove + it. */ + if (!GetTokenInformation(GetCurrentProcessToken(), TokenPrivileges, NULL, 0, + &dwReturnLength) + && GetLastError() == ERROR_INSUFFICIENT_BUFFER) { + TOKEN_PRIVILEGES* process_privileges; + + if (!(process_privileges = (TOKEN_PRIVILEGES*)malloc(dwReturnLength))) + caml_raise_out_of_memory(); + + if (GetTokenInformation(GetCurrentProcessToken(), + TokenPrivileges, process_privileges, + dwReturnLength, &dwReturnLength)) { + LUID_AND_ATTRIBUTES* privilege = process_privileges->Privileges; + + for (int i = 0; i < process_privileges->PrivilegeCount; i++) { + if (privilege->Luid.HighPart == privilege_luid.HighPart && + privilege->Luid.LowPart == privilege_luid.LowPart) { + HANDLE hToken; + if (OpenProcessToken(GetCurrentProcess(), + TOKEN_ADJUST_PRIVILEGES | TOKEN_DUPLICATE, + &hToken)) { + TOKEN_PRIVILEGES adjustment; + adjustment.PrivilegeCount = 1; + adjustment.Privileges->Luid = privilege_luid; + adjustment.Privileges->Attributes = SE_PRIVILEGE_REMOVED; + AdjustTokenPrivileges(hToken, FALSE, &adjustment, + sizeof(TOKEN_PRIVILEGES), NULL, NULL); + CloseHandle(hToken); + } + + break; + } + privilege++; + } + } + + free(process_privileges); + } +#endif + return Val_unit; +} diff --git a/ocamltest/run_unix.c b/ocamltest/run_unix.c index a800bd73..72eebcc6 100644 --- a/ocamltest/run_unix.c +++ b/ocamltest/run_unix.c @@ -136,7 +136,7 @@ static int paths_same_file( static void update_environment(array local_env) { for (array envp = local_env; *envp != NULL; envp++) { - char *pos_eq = strchr(*envp, '='); + const char *pos_eq = strchr(*envp, '='); if (pos_eq != NULL) { char *name, *value; int name_length = pos_eq - *envp; @@ -249,7 +249,6 @@ static int handle_process_termination( pid_t pid, int status, const char *corefilename_prefix) { int signal, core = 0; - char *corestr; if (WIFEXITED(status)) return WEXITSTATUS(status); @@ -262,10 +261,9 @@ static int handle_process_termination( #ifdef WCOREDUMP core = WCOREDUMP(status); #endif /* WCOREDUMP */ - corestr = core ? "" : "no "; fprintf(stderr, "Process %lld got signal %d(%s), %score dumped\n", - (long long) pid, signal, strsignal(signal), corestr + (long long) pid, signal, strsignal(signal), core ? "" : "no " ); if (core) diff --git a/ocamltest/tsl_lexer.mll b/ocamltest/tsl_lexer.mll index b643509e..e55b30dc 100644 --- a/ocamltest/tsl_lexer.mll +++ b/ocamltest/tsl_lexer.mll @@ -112,6 +112,7 @@ and string acc = parse { let space = match blank with None -> "" | Some blank -> String.make 1 blank in + Lexing.new_line lexbuf; string (acc ^ space) lexbuf } | '\\' {string (acc ^ "\\") lexbuf} @@ -139,6 +140,11 @@ and comment = parse file line column in lexer_error message } + | newline + { + Lexing.new_line lexbuf; + comment lexbuf + } | _ { comment lexbuf diff --git a/otherlibs/dynlink/byte/dynlink.ml b/otherlibs/dynlink/byte/dynlink.ml index 0f315d3a..1f011562 100644 --- a/otherlibs/dynlink/byte/dynlink.ml +++ b/otherlibs/dynlink/byte/dynlink.ml @@ -60,7 +60,8 @@ module Bytecode = struct let unsafe_module (t : t) = t.cu_primitives <> [] end - type handle = Stdlib.in_channel * filename * Digest.t + type handle = + Stdlib.in_channel * filename * Digest.t * Symtable.global_map option let default_crcs = ref [] let default_global_map = ref Symtable.empty_global_map @@ -118,9 +119,8 @@ module Bytecode = struct Obj.t * (unit -> Obj.t) = "caml_reify_bytecode" - let run lock (ic, file_name, file_digest) ~unit_header ~priv = + let run lock (ic, file_name, file_digest, _old_st) ~unit_header ~priv:_ = let clos = with_lock lock (fun () -> - let old_state = Symtable.current_state () in let compunit : compilation_unit = unit_header in seek_in ic compunit.cu_pos; let code = @@ -157,7 +157,6 @@ module Bytecode = struct seek_in ic compunit.cu_debug; [| (Compression.input_value ic : instruct_debug_event list) |] end in - if priv then Symtable.hide_additions old_state; let _, clos = reify_bytecode code events (Some digest) in clos ) @@ -171,7 +170,7 @@ module Bytecode = struct (DT.Error (Library's_module_initializers_failed exn)) (Printexc.get_raw_backtrace ()) - let load ~filename:file_name ~priv:_ = + let load ~filename:file_name ~priv = let ic = try open_in_bin file_name with exc -> raise (DT.Error (Cannot_open_dynamic_library exc)) @@ -183,7 +182,13 @@ module Bytecode = struct try really_input_string ic (String.length Config.cmo_magic_number) with End_of_file -> raise (DT.Error (Not_a_bytecode_file file_name)) in - let handle = ic, file_name, file_digest in + let old_symtable = + if priv then + Some (Symtable.current_state ()) + else + None + in + let handle = ic, file_name, file_digest, old_symtable in if buffer = Config.cmo_magic_number then begin let compunit_pos = input_binary_int ic in (* Go to descriptor *) seek_in ic compunit_pos; @@ -219,7 +224,12 @@ module Bytecode = struct | exception _ -> None | obj -> Some obj - let finish (ic, _filename, _digest) = + let finish (ic, _filename, _digest, restore_symtable) = + begin match restore_symtable with + | Some old_state -> + Symtable.hide_additions old_state + | None -> () + end; close_in ic end diff --git a/otherlibs/dynlink/dynlink_config.ml.in b/otherlibs/dynlink/dynlink_config.ml.in index 60132fe5..231bda97 100644 --- a/otherlibs/dynlink/dynlink_config.ml.in +++ b/otherlibs/dynlink/dynlink_config.ml.in @@ -21,6 +21,6 @@ let magic_length = @MAGIC_LENGTH@ let ext_dll = "." ^ {@QS@|@SO@|@QS@} -and cmo_magic_number = {@QS@|@CMO_MAGIC_NUMBER@|@QS@} -and cma_magic_number = {@QS@|@CMA_MAGIC_NUMBER@|@QS@} -and cmxs_magic_number = {@QS@|@CMXS_MAGIC_NUMBER@|@QS@} +and cmo_magic_number = {magic|@CMO_MAGIC_NUMBER@|magic} +and cma_magic_number = {magic|@CMA_MAGIC_NUMBER@|magic} +and cmxs_magic_number = {magic|@CMXS_MAGIC_NUMBER@|magic} diff --git a/otherlibs/dynlink/dynlink_types.ml b/otherlibs/dynlink/dynlink_types.ml index 9b690dcd..82c917e9 100644 --- a/otherlibs/dynlink/dynlink_types.ml +++ b/otherlibs/dynlink/dynlink_types.ml @@ -98,7 +98,7 @@ let () = | Corrupted_interface s -> Printf.sprintf "Corrupted_interface %S" s | Cannot_open_dynamic_library exn -> - Printf.sprintf "Cannot_open_dll %s" (Printexc.to_string exn) + Printf.sprintf "Cannot_open_dll %S" (Printexc.to_string exn) | Inconsistent_implementation s -> Printf.sprintf "Inconsistent_implementation %S" s | Library's_module_initializers_failed exn -> diff --git a/otherlibs/runtime_events/runtime_events.ml b/otherlibs/runtime_events/runtime_events.ml index 61709ef3..9f01e78b 100644 --- a/otherlibs/runtime_events/runtime_events.ml +++ b/otherlibs/runtime_events/runtime_events.ml @@ -92,6 +92,7 @@ type runtime_phase = | EV_COMPACT_EVACUATE | EV_COMPACT_FORWARD | EV_COMPACT_RELEASE +| EV_EMPTY_MINOR type lifecycle = EV_RING_START @@ -200,6 +201,7 @@ let runtime_phase_name phase = | EV_COMPACT_EVACUATE -> "compaction_evacuate" | EV_COMPACT_FORWARD -> "compaction_forward" | EV_COMPACT_RELEASE -> "compaction_release" + | EV_EMPTY_MINOR -> "empty_minor" let lifecycle_name lifecycle = match lifecycle with @@ -219,6 +221,11 @@ module Timestamp = struct let to_int64 t = t + + external get_current : unit -> (t [@unboxed]) = + "caml_ml_runtime_current_timestamp" + "caml_ml_runtime_current_timestamp_unboxed" + [@@noalloc] end module Type = struct diff --git a/otherlibs/runtime_events/runtime_events.mli b/otherlibs/runtime_events/runtime_events.mli index c10e10c8..21e8da58 100644 --- a/otherlibs/runtime_events/runtime_events.mli +++ b/otherlibs/runtime_events/runtime_events.mli @@ -450,6 +450,12 @@ evacuation during a compaction. Event spanning releasing the evacuated pools at the end of a compaction. @since 5.2 *) +| EV_EMPTY_MINOR +(** +Event spanning a domain needing to empty its minor heap for a new allocation. +This includes time spent trying to become stop-the-world leader. +@since 5.4 +*) (** Lifecycle events for Runtime_events and domains. *) type lifecycle = @@ -515,6 +521,11 @@ module Timestamp : sig (** Type for the int64 timestamp to allow for future changes. *) val to_int64 : t -> int64 + + val get_current : unit -> t + (** Access the current timestamp. The timestamp is incremented by one + every nanosecond, but the starting point is unspecified. + @since 5.4 *) end module Type : sig diff --git a/otherlibs/runtime_events/runtime_events_consumer.c b/otherlibs/runtime_events/runtime_events_consumer.c index 3ffc261b..8b94ab4e 100644 --- a/otherlibs/runtime_events/runtime_events_consumer.c +++ b/otherlibs/runtime_events/runtime_events_consumer.c @@ -41,10 +41,6 @@ #include #else #include -#endif - - -#if defined(HAS_UNISTD) #include #endif @@ -465,7 +461,7 @@ caml_runtime_events_read_poll(struct caml_runtime_events_cursor *cursor, return E_CORRUPT_STREAM; } - struct runtime_events_buffer_header *runtime_events_buffer_header = + const struct runtime_events_buffer_header *runtime_events_buffer_header = (struct runtime_events_buffer_header *)( get_map_offset(cursor, cursor->metadata.headers_offset, domain_num, @@ -1338,3 +1334,11 @@ CAMLprim value caml_ml_runtime_events_read_poll(value wrapper, CAMLreturn(Val_int(events_consumed)); } + +CAMLprim uint64_t caml_ml_runtime_current_timestamp_unboxed(value unit) { + return caml_time_counter(); +} + +CAMLprim value caml_ml_runtime_current_timestamp(value unit) { + return caml_copy_int64(caml_time_counter()); +} diff --git a/otherlibs/str/strstubs.c b/otherlibs/str/strstubs.c index c88ede27..98cfdf9e 100644 --- a/otherlibs/str/strstubs.c +++ b/otherlibs/str/strstubs.c @@ -124,12 +124,12 @@ static const unsigned char re_word_letters[32] = { Beginning of group #N is at 2N, end is at 2N+1. Take position = -1 when group wasn't matched. */ -static value re_alloc_groups(value re, unsigned char * starttxt, +static value re_alloc_groups(value re, const unsigned char * starttxt, struct re_group * groups) { value res; int n = Numgroups(re); - struct re_group * group; + const struct re_group * group; res = caml_alloc(n * 2, 0); for (int i = 0; i < n; i++) { @@ -149,9 +149,9 @@ static value re_alloc_groups(value re, unsigned char * starttxt, Return Caml array of matched groups on success, 0 on failure. */ static value re_match(value re, - unsigned char * starttxt, + const unsigned char * starttxt, register unsigned char * txt, - register unsigned char * endtxt, + register const unsigned char * endtxt, int accept_partial_match) { /* Fields of [re] */ @@ -212,7 +212,7 @@ static value re_match(value re, txt++; break; case STRING: { - unsigned char * s = + const unsigned char * s = (unsigned char *) String_val(Field(cpool, Arg(instr))); while ((c = *s++) != 0) { if (txt == endtxt) goto prefix_match; @@ -222,7 +222,7 @@ static value re_match(value re, break; } case STRINGNORM: { - unsigned char * s = + const unsigned char * s = (unsigned char *) String_val(Field(cpool, Arg(instr))); while ((c = *s++) != 0) { if (txt == endtxt) goto prefix_match; @@ -423,10 +423,9 @@ CAMLprim value re_partial_match(value re, value str, value pos) CAMLprim value re_search_forward(value re, value str, value startpos) { - unsigned char * starttxt = &Byte_u(str, 0); + const unsigned char * starttxt = &Byte_u(str, 0); unsigned char * txt = &Byte_u(str, Long_val(startpos)); unsigned char * endtxt = &Byte_u(str, caml_string_length(str)); - unsigned char * startchars; value res; if (txt < starttxt || txt > endtxt) @@ -439,7 +438,7 @@ CAMLprim value re_search_forward(value re, value str, value startpos) } while (txt <= endtxt); return Atom(0); } else { - startchars = + const unsigned char * startchars = (unsigned char *) String_val(Field(Cpool(re), Startchars(re))); do { while (txt < endtxt && startchars[*txt] == 0) txt++; @@ -455,8 +454,7 @@ CAMLprim value re_search_backward(value re, value str, value startpos) { unsigned char * starttxt = &Byte_u(str, 0); unsigned char * txt = &Byte_u(str, Long_val(startpos)); - unsigned char * endtxt = &Byte_u(str, caml_string_length(str)); - unsigned char * startchars; + const unsigned char * endtxt = &Byte_u(str, caml_string_length(str)); value res; if (txt < starttxt || txt > endtxt) @@ -469,7 +467,7 @@ CAMLprim value re_search_backward(value re, value str, value startpos) } while (txt >= starttxt); return Atom(0); } else { - startchars = + const unsigned char * startchars = (unsigned char *) String_val(Field(Cpool(re), Startchars(re))); do { while (txt > starttxt && startchars[*txt] == 0) txt--; diff --git a/otherlibs/systhreads/st_posix.h b/otherlibs/systhreads/st_posix.h index 31b367af..22c3dbd4 100644 --- a/otherlibs/systhreads/st_posix.h +++ b/otherlibs/systhreads/st_posix.h @@ -15,81 +15,42 @@ /* POSIX thread implementation of the "st" interface */ -#ifdef HAS_SYS_SELECT_H -#include -#endif +#define CAML_INTERNALS +#include "caml/misc.h" -Caml_inline void st_msleep(int msec) -{ - struct timeval timeout = {0, msec * 1000}; - select(0, NULL, NULL, NULL, &timeout); -} +#ifdef HAS_NANOSLEEP -#include "st_pthreads.h" +#include -/* Signal handling */ +typedef struct timespec st_timeout; -static void st_decode_sigset(value vset, sigset_t * set) +Caml_inline st_timeout st_timeout_of_msec(int msec) { - sigemptyset(set); - for (/*nothing*/; vset != Val_emptylist; vset = Field(vset, 1)) { - int sig = caml_convert_signal_number(Int_val(Field(vset, 0))); - sigaddset(set, sig); - } + return (st_timeout){ .tv_sec = 0, .tv_nsec = msec * NSEC_PER_MSEC }; } -#ifndef NSIG -#define NSIG 64 -#endif - -static value st_encode_sigset(sigset_t * set) +Caml_inline void st_msleep(const st_timeout *timeout) { - CAMLparam0(); - CAMLlocal1(res); + nanosleep(timeout, NULL); +} - res = Val_emptylist; +#else - for (int i = 1; i < NSIG; i++) - if (sigismember(set, i) > 0) { - res = caml_alloc_2(Tag_cons, - Val_int(caml_rev_convert_signal_number(i)), res); - } - CAMLreturn(res); -} +#ifdef HAS_SYS_SELECT_H +#include +#endif -static int sigmask_cmd[3] = { SIG_SETMASK, SIG_BLOCK, SIG_UNBLOCK }; +typedef struct timeval st_timeout; -value caml_thread_sigmask(value cmd, value sigs) +Caml_inline st_timeout st_timeout_of_msec(int msec) { - int how; - sigset_t set, oldset; - int retcode; - - how = sigmask_cmd[Int_val(cmd)]; - st_decode_sigset(sigs, &set); - caml_enter_blocking_section(); - retcode = pthread_sigmask(how, &set, &oldset); - caml_leave_blocking_section(); - sync_check_error(retcode, "Thread.sigmask"); - /* Run any handlers for just-unmasked pending signals */ - caml_process_pending_actions(); - return st_encode_sigset(&oldset); + return (st_timeout){ .tv_sec = 0, .tv_usec = msec * USEC_PER_MSEC }; } -value caml_wait_signal(value sigs) +Caml_inline void st_msleep(st_timeout *timeout) { -#ifdef HAS_SIGWAIT - sigset_t set; - int retcode, signo; - - st_decode_sigset(sigs, &set); - caml_enter_blocking_section(); - retcode = sigwait(&set, &signo); - caml_leave_blocking_section(); - sync_check_error(retcode, "Thread.wait_signal"); - return Val_int(caml_rev_convert_signal_number(signo)); -#else - caml_invalid_argument("Thread.wait_signal not implemented"); - return Val_int(0); /* not reached */ -#endif + select(0, NULL, NULL, NULL, timeout); } +#endif + +#include "st_pthreads.h" diff --git a/otherlibs/systhreads/st_pthreads.h b/otherlibs/systhreads/st_pthreads.h index 16991acf..dea18d2d 100644 --- a/otherlibs/systhreads/st_pthreads.h +++ b/otherlibs/systhreads/st_pthreads.h @@ -22,17 +22,10 @@ #include #include #include -#ifdef HAS_UNISTD +#ifndef _WIN32 #include #endif -typedef int st_retcode; - -/* OS-specific initialization */ -static int st_initialize(void) -{ - return 0; -} typedef pthread_t st_thread_id; @@ -87,10 +80,10 @@ Caml_inline void st_tls_set(st_tlskey k, void * v) threads. */ typedef struct { - int init; /* have the mutex and the cond been + bool init; /* have the mutex and the cond been initialized already? */ pthread_mutex_t lock; /* to protect contents */ - uintnat busy; /* 0 = free, 1 = taken */ + bool busy; /* false = free, true = taken */ atomic_uintnat waiters; /* number of threads waiting on master lock */ pthread_cond_t is_free; /* signaled when free */ } st_masterlock; @@ -104,9 +97,9 @@ static int st_masterlock_init(st_masterlock * m) if (rc != 0) goto out_err; rc = pthread_cond_init(&m->is_free, NULL); if (rc != 0) goto out_err2; - m->init = 1; + m->init = true; } - m->busy = 1; + m->busy = true; atomic_store_release(&m->waiters, 0); return 0; @@ -121,35 +114,6 @@ static uintnat st_masterlock_waiters(st_masterlock * m) return atomic_load_acquire(&m->waiters); } -static void st_bt_lock_acquire(st_masterlock *m) { - - /* We do not want to signal the backup thread if it is not "working" - as it may very well not be, because we could have just resumed - execution from another thread right away. */ - if (caml_bt_is_in_blocking_section()) { - caml_bt_enter_ocaml(); - } - - caml_acquire_domain_lock(); - - return; -} - -static void st_bt_lock_release(st_masterlock *m) { - - /* Here we do want to signal the backup thread iff there's - no thread waiting to be scheduled, and the backup thread is currently - idle. */ - if (st_masterlock_waiters(m) == 0 && - caml_bt_is_in_blocking_section() == 0) { - caml_bt_exit_ocaml(); - } - - caml_release_domain_lock(); - - return; -} - static void st_masterlock_acquire(st_masterlock *m) { pthread_mutex_lock(&m->lock); @@ -158,8 +122,8 @@ static void st_masterlock_acquire(st_masterlock *m) pthread_cond_wait(&m->is_free, &m->lock); atomic_fetch_add(&m->waiters, -1); } - m->busy = 1; - st_bt_lock_acquire(m); + m->busy = true; + st_bt_lock_acquire(); pthread_mutex_unlock(&m->lock); return; @@ -168,8 +132,8 @@ static void st_masterlock_acquire(st_masterlock *m) static void st_masterlock_release(st_masterlock * m) { pthread_mutex_lock(&m->lock); - m->busy = 0; - st_bt_lock_release(m); + m->busy = false; + st_bt_lock_release(st_masterlock_waiters(m) == 0); pthread_cond_signal(&m->is_free); pthread_mutex_unlock(&m->lock); @@ -200,7 +164,7 @@ Caml_inline void st_thread_yield(st_masterlock * m) return; } - m->busy = 0; + m->busy = false; atomic_fetch_add(&m->waiters, +1); pthread_cond_signal(&m->is_free); /* releasing the domain lock but not triggering bt messaging @@ -217,7 +181,7 @@ Caml_inline void st_thread_yield(st_masterlock * m) pthread_cond_wait(&m->is_free, &m->lock); } while (m->busy); - m->busy = 1; + m->busy = true; atomic_fetch_add(&m->waiters, -1); caml_acquire_domain_lock(); @@ -231,7 +195,7 @@ Caml_inline void st_thread_yield(st_masterlock * m) typedef struct st_event_struct { pthread_mutex_t lock; /* to protect contents */ - int status; /* 0 = not triggered, 1 = triggered */ + bool status; /* false = not triggered, true = triggered */ pthread_cond_t triggered; /* signaled when triggered */ } * st_event; @@ -246,7 +210,7 @@ static int st_event_create(st_event * res) rc = pthread_cond_init(&e->triggered, NULL); if (rc != 0) { pthread_mutex_destroy(&e->lock); caml_stat_free(e); return rc; } - e->status = 0; + e->status = false; *res = e; return 0; } @@ -265,7 +229,7 @@ static int st_event_trigger(st_event e) int rc; rc = pthread_mutex_lock(&e->lock); if (rc != 0) return rc; - e->status = 1; + e->status = true; rc = pthread_mutex_unlock(&e->lock); if (rc != 0) return rc; rc = pthread_cond_broadcast(&e->triggered); @@ -277,36 +241,10 @@ static int st_event_wait(st_event e) int rc; rc = pthread_mutex_lock(&e->lock); if (rc != 0) return rc; - while(e->status == 0) { + while(!e->status) { rc = pthread_cond_wait(&e->triggered, &e->lock); if (rc != 0) return rc; } rc = pthread_mutex_unlock(&e->lock); return rc; } - -struct caml_thread_tick_args { - int domain_id; - atomic_uintnat* stop; -}; - -/* The tick thread: interrupt the domain periodically to force preemption */ -static void * caml_thread_tick(void * arg) -{ - struct caml_thread_tick_args* tick_thread_args = - (struct caml_thread_tick_args*) arg; - int domain_id = tick_thread_args->domain_id; - atomic_uintnat* stop = tick_thread_args->stop; - caml_stat_free(tick_thread_args); - - caml_init_domain_self(domain_id); - caml_domain_state *domain = Caml_state; - - while(! atomic_load_acquire(stop)) { - st_msleep(Thread_timeout); - - atomic_store_release(&domain->requested_external_interrupt, 1); - caml_interrupt_self(); - } - return NULL; -} diff --git a/otherlibs/systhreads/st_stubs.c b/otherlibs/systhreads/st_stubs.c index fdb43254..e234669f 100644 --- a/otherlibs/systhreads/st_stubs.c +++ b/otherlibs/systhreads/st_stubs.c @@ -15,6 +15,10 @@ #define CAML_INTERNALS +/* These macros must be defined before any winpthreads headers are included for + any reason. In mingw-w64 13.0.0, a subtle change meant that time.h causes + pthread_compat.h to be read. For this reason, this next block must appear + before anything headers are included. */ #if defined(_WIN32) && !defined(NATIVE_CODE) && !defined(_MSC_VER) /* Ensure that pthread.h marks symbols __declspec(dllimport) so that they can be picked up from the runtime (which will have linked winpthreads statically). @@ -29,6 +33,31 @@ #define DLL_EXPORT #endif +#define _GNU_SOURCE /* helps to find pthread_setname_np() */ +#include "caml/config.h" + +#if defined(_WIN32) +# define WIN32_LEAN_AND_MEAN +# include +# include +# include "caml/osdeps.h" + +# if defined(HAS_SETTHREADDESCRIPTION) && \ + !defined(HAS_DECL_SETTHREADDESCRIPTION) +WINBASEAPI HRESULT WINAPI +SetThreadDescription(HANDLE hThread, PCWSTR lpThreadDescription); +# endif + +#elif defined(HAS_PRCTL) +# include +#elif defined(HAS_PTHREAD_SETNAME_NP) || defined(HAS_PTHREAD_SET_NAME_NP) +# include + +# if defined(HAS_PTHREAD_NP_H) +# include +# endif +#endif + #include #include "caml/alloc.h" @@ -52,14 +81,42 @@ #include "caml/sys.h" #include "caml/memprof.h" -#include "../../runtime/sync_posix.h" - /* "caml/threads.h" is *not* included since it contains the _external_ declarations for the caml_c_thread_register and caml_c_thread_unregister functions. */ /* Max computation time before rescheduling, in milliseconds */ -#define Thread_timeout 50 +#define Thread_timeout_msec 50 + +typedef int st_retcode; + +static void st_bt_lock_acquire(void) { + + /* We do not want to signal the backup thread if it is not "working" + as it may very well not be, because we could have just resumed + execution from another thread right away. */ + if (caml_bt_is_in_blocking_section()) { + caml_bt_enter_ocaml(); + } + + caml_acquire_domain_lock(); + + return; +} + +static void st_bt_lock_release(bool other_threads_waiting) { + + /* Here we do want to signal the backup thread iff there's + no thread waiting to be scheduled, and the backup thread is currently + idle. */ + if (other_threads_waiting && caml_bt_is_in_blocking_section() == 0) { + caml_bt_exit_ocaml(); + } + + caml_release_domain_lock(); + + return; +} /* OS-specific code */ #ifdef _WIN32 @@ -170,9 +227,8 @@ static void caml_thread_scan_roots( scanning_action action, scanning_action_flags fflags, void *fdata, caml_domain_state *domain_state) { - caml_thread_t active, th; - - active = th = thread_table[domain_state->id].active_thread; + const caml_thread_t active = thread_table[domain_state->id].active_thread; + caml_thread_t th = active; /* The GC could be triggered before [active_thread] is initialized, or after [caml_thread_domain_stop_hook] has been called; in this @@ -440,7 +496,7 @@ static void caml_thread_reinitialize(void) the effective owner of the lock. So there is no need to run st_masterlock_acquire (busy = 1) */ st_masterlock *m = Thread_lock(Caml_state->id); - m->init = 0; /* force reinitialization */ + m->init = false; /* force reinitialization */ /* Note: initializing an already-initialized mutex and cond variable is UB (especially mutexes that are locked). This is best effort. */ @@ -453,7 +509,7 @@ static void caml_thread_reinitialize(void) for (struct channel *chan = caml_all_opened_channels; chan != NULL; chan = chan->next) { - caml_plat_mutex_init(&chan->mutex); + caml_plat_mutex_reinit(&chan->mutex); } } @@ -494,11 +550,9 @@ static void caml_thread_domain_initialize_hook(void) caml_thread_t new_thread; atomic_store_release(&Tick_thread_stop, 0); - /* OS-specific initialization */ - st_initialize(); int ret = st_masterlock_init(Thread_lock(Caml_state->id)); - sync_check_error(ret, "caml_thread_domain_initialize_hook"); + caml_check_error(ret, "caml_thread_domain_initialize_hook"); new_thread = (caml_thread_t) caml_stat_alloc(sizeof(struct caml_thread_struct)); @@ -650,6 +704,33 @@ static void * caml_thread_start(void * v) return 0; } +struct caml_thread_tick_args { + int domain_id; + atomic_uintnat* stop; +}; + +/* The tick thread: interrupt the domain periodically to force preemption */ +static void * caml_thread_tick(void * arg) +{ + struct caml_thread_tick_args* tick_thread_args = + (struct caml_thread_tick_args*) arg; + int domain_id = tick_thread_args->domain_id; + atomic_uintnat* stop = tick_thread_args->stop; + st_timeout t = st_timeout_of_msec(Thread_timeout_msec); + caml_stat_free(tick_thread_args); + + caml_init_domain_self(domain_id); + caml_domain_state *domain = Caml_state; + + while(! atomic_load_acquire(stop)) { + st_msleep(&t); + + atomic_store_release(&domain->requested_external_interrupt, 1); + caml_interrupt_self(); + } + return NULL; +} + static st_retcode create_tick_thread(void) { if (Tick_thread_running) return 0; @@ -678,7 +759,10 @@ static st_retcode create_tick_thread(void) pthread_sigmask(SIG_SETMASK, &old_mask, NULL); #endif - if (err != 0) return err; + if (err != 0) { + caml_stat_free(tick_thread_args); + return err; + } Tick_thread_running = 1; return 0; @@ -697,7 +781,7 @@ CAMLprim value caml_thread_new(value clos) Because of PR#4666, we start the tick thread late, only when we create the first additional thread in the current process */ st_retcode err = create_tick_thread(); - sync_check_error(err, "Thread.create"); + caml_check_error(err, "Thread.create"); /* Create a thread info block */ caml_thread_t th = thread_alloc_and_add(); @@ -709,7 +793,7 @@ CAMLprim value caml_thread_new(value clos) if (err != 0) { /* Creation failed, remove thread info block from list of threads */ caml_thread_remove_and_free(th); - sync_check_error(err, "Thread.create"); + caml_check_error(err, "Thread.create"); } CAMLreturn(th->descr); @@ -837,7 +921,7 @@ CAMLprim value caml_thread_yield(value unit) CAMLprim value caml_thread_join(value th) { st_retcode rc = caml_threadstatus_wait(Terminated(th)); - sync_check_error(rc, "Thread.join"); + caml_check_error(rc, "Thread.join"); return Val_unit; } @@ -872,7 +956,7 @@ static value caml_threadstatus_new (void) { st_event ts = NULL; /* suppress warning */ value wrapper; - sync_check_error(st_event_create(&ts), "Thread.create"); + caml_check_error(st_event_create(&ts), "Thread.create"); wrapper = caml_alloc_custom(&caml_threadstatus_ops, sizeof(st_event *), 0, 1); @@ -897,3 +981,65 @@ static st_retcode caml_threadstatus_wait (value wrapper) CAMLreturnT(st_retcode, retcode); } + +#define caml_set_current_thread_name_warning(w) \ + do { \ + if (caml_runtime_warnings_active()) { \ + fprintf(stderr, "[ocaml] error while setting thread name: %s\n", w); \ + fflush(stderr); \ + } \ + } while (0) + +/* Set the current thread's name. */ +CAMLprim value caml_set_current_thread_name(value name) +{ +#if defined(_WIN32) +# if defined(HAS_SETTHREADDESCRIPTION) + wchar_t *thread_name = caml_stat_strdup_to_utf16(String_val(name)); + HRESULT hr = SetThreadDescription(GetCurrentThread(), thread_name); + caml_stat_free(thread_name); + if (FAILED(hr)) + caml_set_current_thread_name_warning("SetThreadDescription failed!"); +# endif + +# if defined(HAS_PTHREAD_SETNAME_NP) + // We are using both methods. + // See: https://github.com/ocaml/ocaml/pull/13504#discussion_r1786358928 + char buf[1024]; + int ret = pthread_setname_np(pthread_self(), String_val(name)); + if (ret != 0) + caml_set_current_thread_name_warning(caml_strerror(ret, buf, sizeof(buf))); +# endif + +#elif defined(HAS_PRCTL) + char buf[1024]; + int ret = prctl(PR_SET_NAME, String_val(name)); + if (ret == -1) + caml_set_current_thread_name_warning( + caml_strerror(errno, buf, sizeof(buf))); +#elif defined(HAS_PTHREAD_SETNAME_NP) +# if defined(__APPLE__) + // Darwin implementation does not return any error code. + pthread_setname_np(String_val(name)); +# elif defined(__NetBSD__) + char buf[1024]; + int ret = pthread_setname_np(pthread_self(), "%s", (void *)String_val(name)); + if (ret != 0) + caml_set_current_thread_name_warning(caml_strerror(ret, buf, sizeof(buf))); +# else + char buf[1024]; + // Both linux and freebsd document return value as 0 or error + // code. + int ret = pthread_setname_np(pthread_self(), String_val(name)); + if (ret != 0) + caml_set_current_thread_name_warning(caml_strerror(ret, buf, sizeof(buf))); +# endif +#elif defined(HAS_PTHREAD_SET_NAME_NP) + // pthread_set_name_np seems to be the no-error alternative. + pthread_set_name_np(pthread_self(), String_val(name)); +#else + caml_set_current_thread_name_warning("set thread name not implemented"); +#endif + + return Val_unit; +} diff --git a/otherlibs/systhreads/st_win32.h b/otherlibs/systhreads/st_win32.h index 5092134d..733ea72f 100644 --- a/otherlibs/systhreads/st_win32.h +++ b/otherlibs/systhreads/st_win32.h @@ -15,27 +15,19 @@ /* Win32 implementation of the "st" interface */ -#undef _WIN32_WINNT -#define _WIN32_WINNT 0x0400 +#define WIN32_LEAN_AND_MEAN #include -Caml_inline void st_msleep(int msec) -{ - Sleep(msec); -} - -#include "st_pthreads.h" +typedef DWORD st_timeout; -/* Signal handling -- none under Win32 */ - -value caml_thread_sigmask(value cmd, value sigs) +Caml_inline st_timeout st_timeout_of_msec(int msec) { - caml_invalid_argument("Thread.sigmask not implemented"); - return Val_int(0); /* not reached */ + return msec; } -value caml_wait_signal(value sigs) +Caml_inline void st_msleep(const st_timeout *timeout) { - caml_invalid_argument("Thread.wait_signal not implemented"); - return Val_int(0); /* not reached */ + Sleep(*timeout); } + +#include "st_pthreads.h" diff --git a/otherlibs/systhreads/thread.ml b/otherlibs/systhreads/thread.ml index b5a4d8fb..4df433f0 100644 --- a/otherlibs/systhreads/thread.ml +++ b/otherlibs/systhreads/thread.ml @@ -90,6 +90,8 @@ let select = Unix.select let wait_pid p = Unix.waitpid [] p -external sigmask : Unix.sigprocmask_command -> int list -> int list - = "caml_thread_sigmask" -external wait_signal : int list -> int = "caml_wait_signal" +let sigmask = Unix.sigprocmask +let wait_signal = Unix.sigwait + +external set_current_thread_name : string -> unit = + "caml_set_current_thread_name" diff --git a/otherlibs/systhreads/thread.mli b/otherlibs/systhreads/thread.mli index b2cf78a5..71a8de9d 100644 --- a/otherlibs/systhreads/thread.mli +++ b/otherlibs/systhreads/thread.mli @@ -45,6 +45,17 @@ val id : t -> int is an integer that identifies uniquely the thread. It can be used to build data structures indexed by threads. *) +val set_current_thread_name : string -> unit +(** Set the thread's name. This should be called from within the thread + function. Setting thread name is available on most systems. + + This does nothing if the functionality is not implemented but will + print a warning on the standard error if enabled. + + Likewise, a warning is printed if the operation fails. + + @since 5.4 *) + exception Exit (** Exception raised by user code to initiate termination of the current thread. @@ -141,7 +152,8 @@ val wait_pid : int -> int * Unix.process_status under Unix, but not under Win32, nor by the VM thread library. *) val sigmask : Unix.sigprocmask_command -> int list -> int list -(** [sigmask cmd sigs] changes the set of blocked signals for the +(** Same function as {!Unix.sigprocmask}. + [sigmask cmd sigs] changes the set of blocked signals for the calling thread. If [cmd] is [SIG_SETMASK], blocked signals are set to those in the list [sigs]. @@ -151,9 +163,9 @@ val sigmask : Unix.sigprocmask_command -> int list -> int list from the set of blocked signals. [sigmask] returns the set of previously blocked signals for the thread. *) - val wait_signal : int list -> int -(** [wait_signal sigs] suspends the execution of the calling thread +(** Same function as {!Unix.sigwait}. + [wait_signal sigs] suspends the execution of the calling thread until the process receives one of the signals specified in the list [sigs]. It then returns the number of the signal received. Signal handlers attached to the signals in [sigs] will not diff --git a/otherlibs/unix/access.c b/otherlibs/unix/access.c index 3e5ab2a4..b4300bf5 100644 --- a/otherlibs/unix/access.c +++ b/otherlibs/unix/access.c @@ -13,28 +13,26 @@ /* */ /**************************************************************************/ +#define CAML_INTERNALS #include #include #include #include -#define CAML_INTERNALS #include #include "caml/unixsupport.h" -#ifdef HAS_UNISTD -# include +#ifdef _WIN32 +# include #else -# ifdef _WIN32 -# include -# else -# include -# endif -# ifndef R_OK -# define R_OK 4/* test for read permission */ -# define W_OK 2/* test for write permission */ -# define X_OK 1/* test for execute (search) permission */ -# define F_OK 0/* test for presence of file */ -# endif +# include +# include +#endif + +#ifndef R_OK +# define R_OK 4/* test for read permission */ +# define W_OK 2/* test for write permission */ +# define X_OK 1/* test for execute (search) permission */ +# define F_OK 0/* test for presence of file */ #endif static const int access_permission_table[] = { @@ -42,7 +40,7 @@ static const int access_permission_table[] = { W_OK, #ifdef _WIN32 /* Since there is no concept of execute permission on Windows, - we fall b+ack to the read permission */ + we fall back to the read permission */ R_OK, #else X_OK, diff --git a/otherlibs/unix/caml/unixsupport.h b/otherlibs/unix/caml/unixsupport.h index 5270f392..e8460b79 100644 --- a/otherlibs/unix/caml/unixsupport.h +++ b/otherlibs/unix/caml/unixsupport.h @@ -30,7 +30,7 @@ #include #include #else /* Unix */ -#ifdef HAS_UNISTD +#ifndef _WIN32 #include #endif #endif @@ -107,11 +107,11 @@ CAMLnoret extern void caml_uerror (const char * cmdname, value arg); extern void caml_unix_check_path(value path, const char * cmdname); -#define UNIX_BUFFER_SIZE 65536 +#define UNIX_BUFFER_SIZE IO_BUFFER_SIZE #define DIR_Val(v) *((DIR **) &Field(v, 0)) -extern char_os ** caml_unix_cstringvect(value arg, char * cmdname); +extern char_os ** caml_unix_cstringvect(value arg, const char * cmdname); extern void caml_unix_cstringvect_free(char_os **); extern int caml_unix_cloexec_default; @@ -123,8 +123,8 @@ extern int caml_win32_set_inherit(HANDLE fd, BOOL inherit); #define caml_win32_set_cloexec(fd, cloexec) \ caml_win32_set_inherit((fd), ! caml_unix_cloexec_p((cloexec))) #else -extern void caml_unix_set_cloexec(int fd, char * cmdname, value arg); -extern void caml_unix_clear_cloexec(int fd, char * cmdname, value arg); +extern void caml_unix_set_cloexec(int fd, const char * cmdname, value arg); +extern void caml_unix_clear_cloexec(int fd, const char * cmdname, value arg); #endif /* _WIN32 */ /* Compatibility definitions for the pre-5.0 names of these functions */ @@ -167,4 +167,40 @@ extern void caml_unix_clear_cloexec(int fd, char * cmdname, value arg); #define EXECV_CAST #endif +#ifdef CAML_INTERNALS +#include +#include +#ifndef _WIN32 +#include +#endif + +Caml_inline struct timespec caml_timespec_of_sec(double sec) +{ + double int_sec, frac_sec; + frac_sec = modf(sec, &int_sec); + return (struct timespec) + { .tv_sec = (time_t) int_sec, +#if __STDC_VERSION__ >= 202311L + .tv_nsec = (typeof((struct timespec){0}.tv_nsec)) +#else + .tv_nsec = (long) +#endif + (frac_sec * NSEC_PER_SEC) }; +} + +Caml_inline struct timeval caml_timeval_of_sec(double sec) +{ + double int_sec, frac_sec; + frac_sec = modf(sec, &int_sec); + return (struct timeval) +#ifdef _WIN32 + { .tv_sec = (long) int_sec, + .tv_usec = (long) (frac_sec * USEC_PER_SEC) }; +#else + { .tv_sec = (time_t) int_sec, + .tv_usec = (suseconds_t) (frac_sec * USEC_PER_SEC) }; +#endif +} +#endif /* CAML_INTERNALS */ + #endif /* CAML_UNIXSUPPORT_H */ diff --git a/otherlibs/unix/channels_win32.c b/otherlibs/unix/channels_win32.c index c493807f..7a51ab63 100644 --- a/otherlibs/unix/channels_win32.c +++ b/otherlibs/unix/channels_win32.c @@ -81,7 +81,25 @@ int caml_win32_CRT_fd_of_filedescr(value handle) if (! atomic_compare_exchange_strong(&CRT_field_val(handle), &fd, GETTING_CRT_FD)) break; /* try again */ - fd = _open_osfhandle((intptr_t) Handle_val(handle), O_BINARY); + /* _open_osfhandle cares about four possible flags: + - O_TEXT / O_BINARY - the Unix library only opens descriptors in binary + mode; the only way to get a text mode file_descr is to go via the + runtime (which will retrieve the CRT fd and call setmode on it). Here + we can always specify O_BINARY, therefore. + - O_APPEND - FIXME at present, in caml_unix_open, we call + SetFilePointer when the file is opened in append mode, but this is + not presently done on each write operation, nor do we ensure that the + writes cannot overlap. + - O_NOINHERIT - probably for historical reasons, the CRT chooses not to + detect that a handle is inheritable, so we have to do that here. */ + int flags = O_BINARY; + DWORD handle_flags = 0; + /* Ignore errors from GetHandleInformation - we'll rely on _open_osfhandle + failing instead */ + GetHandleInformation(Handle_val(handle), &handle_flags); + if ((handle_flags & HANDLE_FLAG_INHERIT) == 0) + flags |= O_NOINHERIT; + fd = _open_osfhandle((intptr_t) Handle_val(handle), flags); if (fd == -1) { atomic_store(&CRT_field_val(handle), NO_CRT_FD); caml_uerror("channel_of_descr", Nothing); diff --git a/otherlibs/unix/cstringv.c b/otherlibs/unix/cstringv.c index 572b9d4a..692b0b43 100644 --- a/otherlibs/unix/cstringv.c +++ b/otherlibs/unix/cstringv.c @@ -21,7 +21,7 @@ #include #include "caml/unixsupport.h" -char_os ** caml_unix_cstringvect(value arg, char * cmdname) +char_os ** caml_unix_cstringvect(value arg, const char * cmdname) { char_os ** res; mlsize_t size; diff --git a/otherlibs/unix/envir_unix.c b/otherlibs/unix/envir_unix.c index cef6cb0a..0eaac46b 100644 --- a/otherlibs/unix/envir_unix.c +++ b/otherlibs/unix/envir_unix.c @@ -15,7 +15,7 @@ #include -#ifdef HAS_UNISTD +#ifndef _WIN32 #include #endif #include diff --git a/otherlibs/unix/execvp.c b/otherlibs/unix/execvp.c index b9052d18..8fff5db3 100644 --- a/otherlibs/unix/execvp.c +++ b/otherlibs/unix/execvp.c @@ -13,12 +13,12 @@ /* */ /**************************************************************************/ +#define CAML_INTERNALS #define _GNU_SOURCE /* helps to find execvpe() */ #include #include #include #include -#define CAML_INTERNALS #include #include "caml/unixsupport.h" @@ -101,7 +101,8 @@ int caml_unix_execvpe_emulation(const char * name, char * const argv[], char * const envp[]) { - char * searchpath, * p, * q, * fullname; + const char * searchpath, * p, * q; + char * fullname; size_t namelen, dirlen; int r, got_eacces; diff --git a/otherlibs/unix/fcntl.c b/otherlibs/unix/fcntl.c index 9d2a3c29..ba73f5a3 100644 --- a/otherlibs/unix/fcntl.c +++ b/otherlibs/unix/fcntl.c @@ -16,7 +16,7 @@ #include #include #include "caml/unixsupport.h" -#ifdef HAS_UNISTD +#ifndef _WIN32 #include #endif #include diff --git a/otherlibs/unix/ftruncate.c b/otherlibs/unix/ftruncate.c index aeca8b8d..6c23fc17 100644 --- a/otherlibs/unix/ftruncate.c +++ b/otherlibs/unix/ftruncate.c @@ -21,7 +21,7 @@ #include #include #include "caml/unixsupport.h" -#ifdef HAS_UNISTD +#ifndef _WIN32 #include #endif diff --git a/otherlibs/unix/getgroups.c b/otherlibs/unix/getgroups.c index 22d13ad0..74382713 100644 --- a/otherlibs/unix/getgroups.c +++ b/otherlibs/unix/getgroups.c @@ -16,27 +16,40 @@ #include #include #include +#include #ifdef HAS_GETGROUPS #include -#ifdef HAS_UNISTD +#ifndef _WIN32 #include #endif -#include +#include #include "caml/unixsupport.h" CAMLprim value caml_unix_getgroups(value unit) { - gid_t gidset[NGROUPS_MAX]; - int n; + gid_t* gidset = NULL; + int n, ngroups_max; value res; - n = getgroups(NGROUPS_MAX, gidset); - if (n == -1) caml_uerror("getgroups", Nothing); + while (1) { + if ((ngroups_max = getgroups(0, NULL)) == -1) { + if (gidset != NULL) caml_stat_free(gidset); + caml_uerror("getgroups", Nothing); + } + gidset = caml_stat_resize(gidset, ngroups_max * sizeof(gid_t)); + if ((n = getgroups(ngroups_max, gidset)) == -1) { + if (errno == EINVAL) continue; // result size changed, retry + caml_stat_free(gidset); + caml_uerror("getgroups", Nothing); + } + break; + } res = caml_alloc_tuple(n); for (int i = 0; i < n; i++) Field(res, i) = Val_int(gidset[i]); + caml_stat_free(gidset); return res; } diff --git a/otherlibs/unix/gethost.c b/otherlibs/unix/gethost.c index 728b3d64..8837e142 100644 --- a/otherlibs/unix/gethost.c +++ b/otherlibs/unix/gethost.c @@ -79,7 +79,7 @@ static value alloc_host_entry(struct hostent *entry) CAMLprim value caml_unix_gethostbyaddr(value a) { - char * adr; + const char * adr; struct in_addr in4; struct hostent * hp; int addr_type = AF_INET; diff --git a/otherlibs/unix/gettimeofday_unix.c b/otherlibs/unix/gettimeofday_unix.c index f8c4c106..50d341ae 100644 --- a/otherlibs/unix/gettimeofday_unix.c +++ b/otherlibs/unix/gettimeofday_unix.c @@ -13,6 +13,7 @@ /* */ /**************************************************************************/ +#define CAML_INTERNALS #include #include #include @@ -24,7 +25,7 @@ double caml_unix_gettimeofday_unboxed(value unit) { struct timeval tp; gettimeofday(&tp, NULL); - return ((double) tp.tv_sec + (double) tp.tv_usec / 1e6); + return ((double) tp.tv_sec + (double) tp.tv_usec / USEC_PER_SEC); } CAMLprim value caml_unix_gettimeofday(value unit) diff --git a/otherlibs/unix/gettimeofday_win32.c b/otherlibs/unix/gettimeofday_win32.c index 8689b4d0..60c1ee49 100644 --- a/otherlibs/unix/gettimeofday_win32.c +++ b/otherlibs/unix/gettimeofday_win32.c @@ -13,13 +13,11 @@ /* */ /**************************************************************************/ +#define CAML_INTERNALS #include #include #include - -#define CAML_INTERNALS #include - #include "caml/unixsupport.h" double caml_unix_gettimeofday_unboxed(value unit) diff --git a/otherlibs/unix/initgroups.c b/otherlibs/unix/initgroups.c index 168b2f0e..1c0a34bc 100644 --- a/otherlibs/unix/initgroups.c +++ b/otherlibs/unix/initgroups.c @@ -20,7 +20,7 @@ #ifdef HAS_INITGROUPS #include -#ifdef HAS_UNISTD +#ifndef _WIN32 #include #endif #include diff --git a/otherlibs/unix/itimer.c b/otherlibs/unix/itimer.c index b1cb146c..5b2d18f0 100644 --- a/otherlibs/unix/itimer.c +++ b/otherlibs/unix/itimer.c @@ -13,6 +13,7 @@ /* */ /**************************************************************************/ +#define CAML_INTERNALS #include #include #include @@ -24,20 +25,20 @@ #include #include -static void caml_unix_set_timeval(struct timeval * tv, double d) +static void caml_unix_set_timeval(struct timeval * tv, double sec) { - double integr, frac; - frac = modf(d, &integr); - /* Round time up so that if d is small but not 0, we end up with + double int_sec, frac_sec; + frac_sec = modf(sec, &int_sec); + /* Round time up so that if [sec] is small but not 0, we end up with a non-0 timeval. */ - tv->tv_sec = integr; - tv->tv_usec = ceil(1e6 * frac); - if (tv->tv_usec >= 1000000) { tv->tv_sec++; tv->tv_usec = 0; } + tv->tv_sec = int_sec; + tv->tv_usec = ceil(frac_sec * USEC_PER_SEC); + if (tv->tv_usec >= USEC_PER_SEC) { tv->tv_sec++; tv->tv_usec = 0; } } static value caml_unix_convert_itimer(struct itimerval *tp) { -#define Get_timeval(tv) (double) tv.tv_sec + (double) tv.tv_usec / 1e6 +#define Get_timeval(tv) (double) tv.tv_sec + (double) tv.tv_usec / USEC_PER_SEC value res = caml_alloc_small(Double_wosize * 2, Double_array_tag); Store_double_flat_field(res, 0, Get_timeval(tp->it_interval)); Store_double_flat_field(res, 1, Get_timeval(tp->it_value)); @@ -45,7 +46,7 @@ static value caml_unix_convert_itimer(struct itimerval *tp) #undef Get_timeval } -static int itimers[3] = { ITIMER_REAL, ITIMER_VIRTUAL, ITIMER_PROF }; +static const int itimers[3] = { ITIMER_REAL, ITIMER_VIRTUAL, ITIMER_PROF }; CAMLprim value caml_unix_setitimer(value which, value newval) { diff --git a/otherlibs/unix/link_win32.c b/otherlibs/unix/link_win32.c index aa7d1770..6d0d3572 100644 --- a/otherlibs/unix/link_win32.c +++ b/otherlibs/unix/link_win32.c @@ -23,35 +23,21 @@ #include #include -typedef -BOOL (WINAPI *tCreateHardLink)( - LPCWSTR lpFileName, - LPCWSTR lpExistingFileName, - LPSECURITY_ATTRIBUTES lpSecurityAttributes -); - CAMLprim value caml_unix_link(value follow, value path1, value path2) { - HMODULE hModKernel32; - tCreateHardLink pCreateHardLink; BOOL result; wchar_t * wpath1, * wpath2; if (Is_some(follow) && !Bool_val(Some_val(follow))) { errno = ENOSYS; caml_uerror("link", path2); } - hModKernel32 = GetModuleHandle(L"KERNEL32.DLL"); - pCreateHardLink = - (tCreateHardLink) GetProcAddress(hModKernel32, "CreateHardLinkW"); - if (pCreateHardLink == NULL) - caml_invalid_argument("Unix.link not implemented"); caml_unix_check_path(path1, "link"); caml_unix_check_path(path2, "link"); wpath1 = caml_stat_strdup_to_utf16(String_val(path1)); wpath2 = caml_stat_strdup_to_utf16(String_val(path2)); - result = pCreateHardLink(wpath2, wpath1, NULL); + result = CreateHardLink(wpath2, wpath1, NULL); caml_stat_free(wpath1); caml_stat_free(wpath2); diff --git a/otherlibs/unix/lockf_unix.c b/otherlibs/unix/lockf_unix.c index 95dc5f51..67bd4a77 100644 --- a/otherlibs/unix/lockf_unix.c +++ b/otherlibs/unix/lockf_unix.c @@ -87,7 +87,7 @@ CAMLprim value caml_unix_lockf(value fd, value cmd, value span) #else #ifdef HAS_LOCKF -#ifdef HAS_UNISTD +#ifndef _WIN32 #include #else #define F_ULOCK 0 diff --git a/otherlibs/unix/lseek_unix.c b/otherlibs/unix/lseek_unix.c index 30c1fb09..fe8836ed 100644 --- a/otherlibs/unix/lseek_unix.c +++ b/otherlibs/unix/lseek_unix.c @@ -23,7 +23,7 @@ #include #include "caml/unixsupport.h" -#ifdef HAS_UNISTD +#ifndef _WIN32 #include #else #define SEEK_SET 0 diff --git a/otherlibs/unix/lseek_win32.c b/otherlibs/unix/lseek_win32.c index 10903f3d..17e566ac 100644 --- a/otherlibs/unix/lseek_win32.c +++ b/otherlibs/unix/lseek_win32.c @@ -18,7 +18,7 @@ #include #include "caml/unixsupport.h" -#ifdef HAS_UNISTD +#ifndef _WIN32 #include #else #define SEEK_SET 0 diff --git a/otherlibs/unix/mmap_ba.c b/otherlibs/unix/mmap_ba.c index df832e9b..321af4c7 100644 --- a/otherlibs/unix/mmap_ba.c +++ b/otherlibs/unix/mmap_ba.c @@ -20,6 +20,7 @@ #include "caml/custom.h" #include "caml/memory.h" #include "caml/misc.h" +#include "caml/memprof.h" /* Allocation of bigarrays for memory-mapped files. This is the OS-independent part of [mmap.c]. */ @@ -33,7 +34,7 @@ static void caml_ba_mapped_finalize(value v) if (b->proxy == NULL) { caml_ba_unmap_file(b->data, caml_ba_byte_size(b)); } else { - if (-- b->proxy->refcount == 0) { + if (caml_atomic_counter_decr(&b->proxy->refcount) == 0) { caml_ba_unmap_file(b->proxy->data, b->proxy->size); free(b->proxy); } @@ -60,7 +61,7 @@ static struct custom_operations caml_ba_mapped_ops = { CAMLexport value caml_unix_mapped_alloc(int flags, int num_dims, void * data, intnat * dim) { - uintnat asize; + uintnat asize, mem_words; value res; struct caml_ba_array * b; intnat dimcopy[CAML_BA_MAX_NUM_DIMS]; @@ -77,5 +78,8 @@ caml_unix_mapped_alloc(int flags, int num_dims, void * data, intnat * dim) b->flags = flags | CAML_BA_MAPPED_FILE; b->proxy = NULL; for (int i = 0; i < num_dims; i++) b->dim[i] = dimcopy[i]; + mem_words = (caml_ba_byte_size(b) + sizeof(value) - 1) / sizeof(value); + caml_memprof_sample_block( + res, mem_words, mem_words, CAML_MEMPROF_SRC_MAP_FILE); return res; } diff --git a/otherlibs/unix/mmap_unix.c b/otherlibs/unix/mmap_unix.c index b61448ac..026cbcf5 100644 --- a/otherlibs/unix/mmap_unix.c +++ b/otherlibs/unix/mmap_unix.c @@ -29,7 +29,7 @@ #include "caml/unixsupport.h" #include -#ifdef HAS_UNISTD +#ifndef _WIN32 #include #endif #ifdef HAS_MMAP diff --git a/otherlibs/unix/nice.c b/otherlibs/unix/nice.c index 487bcf44..9ca9bea2 100644 --- a/otherlibs/unix/nice.c +++ b/otherlibs/unix/nice.c @@ -16,7 +16,7 @@ #include #include "caml/unixsupport.h" #include -#ifdef HAS_UNISTD +#ifndef _WIN32 #include #endif diff --git a/otherlibs/unix/open_unix.c b/otherlibs/unix/open_unix.c index 4eeffb22..639a8234 100644 --- a/otherlibs/unix/open_unix.c +++ b/otherlibs/unix/open_unix.c @@ -20,7 +20,7 @@ #include #include "caml/unixsupport.h" #include -#ifdef HAS_UNISTD +#ifndef _WIN32 #include #endif #include diff --git a/otherlibs/unix/select_unix.c b/otherlibs/unix/select_unix.c index ab02e54c..8d4dc12d 100644 --- a/otherlibs/unix/select_unix.c +++ b/otherlibs/unix/select_unix.c @@ -13,6 +13,7 @@ /* */ /**************************************************************************/ +#define CAML_INTERNALS #include #include #include @@ -62,12 +63,12 @@ static value fdset_to_fdlist(value fdlist, fd_set *fdset) } CAMLprim value caml_unix_select(value readfds, value writefds, value exceptfds, - value timeout) + value timeout_sec) { CAMLparam3(readfds, writefds, exceptfds); fd_set read, write, except; int maxfd; - double tm; + double tm_sec; struct timeval tv; struct timeval * tvp; int retcode; @@ -79,12 +80,11 @@ CAMLprim value caml_unix_select(value readfds, value writefds, value exceptfds, retcode += fdlist_to_fdset(exceptfds, &except, &maxfd); /* PR#5563: if a bad fd was encountered, report EINVAL error */ if (retcode != 0) caml_unix_error(EINVAL, "select", Nothing); - tm = Double_val(timeout); - if (tm < 0.0) + tm_sec = Double_val(timeout_sec); + if (tm_sec < 0.0) { tvp = (struct timeval *) NULL; - else { - tv.tv_sec = (int) tm; - tv.tv_usec = (int) (1e6 * (tm - tv.tv_sec)); + } else { + tv = caml_timeval_of_sec(tm_sec); tvp = &tv; } caml_enter_blocking_section(); diff --git a/otherlibs/unix/select_win32.c b/otherlibs/unix/select_win32.c index 5118ea72..79e0ea90 100644 --- a/otherlibs/unix/select_win32.c +++ b/otherlibs/unix/select_win32.c @@ -964,8 +964,9 @@ static value fdset_to_fdlist(value fdlist, fd_set *fdset) CAMLreturn(res); } + CAMLprim value caml_unix_select(value readfds, value writefds, value exceptfds, - value timeout) + value timeout_sec) { /* Event associated to handle */ DWORD nEventsCount; @@ -986,7 +987,7 @@ CAMLprim value caml_unix_select(value readfds, value writefds, value exceptfds, DWORD err; /* Time to wait */ - DWORD milliseconds; + DWORD tm_msec; /* Is there static select data */ BOOL hasStaticData = FALSE; @@ -1001,26 +1002,26 @@ CAMLprim value caml_unix_select(value readfds, value writefds, value exceptfds, DWORD writefds_len; DWORD exceptfds_len; - CAMLparam4 (readfds, writefds, exceptfds, timeout); + CAMLparam4 (readfds, writefds, exceptfds, timeout_sec); CAMLlocal5 (read_list, write_list, except_list, res, l); CAMLlocal1 (fd); fd_set read, write, except; - double tm; + double tm_sec; struct timeval tv; struct timeval * tvp; DEBUG_PRINT("in select"); err = 0; - tm = Double_val(timeout); + tm_sec = Double_val(timeout_sec); if (readfds == Val_emptylist && writefds == Val_emptylist && exceptfds == Val_emptylist) { DEBUG_PRINT("nothing to do"); - if ( tm > 0.0 ) { + if ( tm_sec > 0.0 ) { caml_enter_blocking_section(); - Sleep( (int)(tm * 1000)); + Sleep((DWORD) (tm_sec * MSEC_PER_SEC)); caml_leave_blocking_section(); } read_list = write_list = except_list = Val_emptylist; @@ -1029,11 +1030,10 @@ CAMLprim value caml_unix_select(value readfds, value writefds, value exceptfds, && fdlist_to_fdset(writefds, &write) && fdlist_to_fdset(exceptfds, &except)) { DEBUG_PRINT("only sockets to select on, using classic select"); - if (tm < 0.0) { + if (tm_sec < 0.0) { tvp = (struct timeval *) NULL; } else { - tv.tv_sec = (int) tm; - tv.tv_usec = (int) (1e6 * (tm - (int) tm)); + tv = caml_timeval_of_sec(tm_sec); tvp = &tv; } caml_enter_blocking_section(); @@ -1065,14 +1065,15 @@ CAMLprim value caml_unix_select(value readfds, value writefds, value exceptfds, hdsData = (HANDLE *)caml_stat_alloc(sizeof(HANDLE) * hdsMax); - if (tm >= 0.0) + if (tm_sec >= 0.0) { - milliseconds = (DWORD)(1000 * tm); - DEBUG_PRINT("Will wait %d ms", milliseconds); + double msec = tm_sec * MSEC_PER_SEC; + tm_msec = msec < INFINITE ? (DWORD) msec : INFINITE - 1; + DEBUG_PRINT("Will wait %d ms", tm_msec); } else { - milliseconds = INFINITE; + tm_msec = INFINITE; } @@ -1184,7 +1185,7 @@ CAMLprim value caml_unix_select(value readfds, value writefds, value exceptfds, { DEBUG_PRINT("Waiting for one select worker to be done"); switch (WaitForMultipleObjects(nEventsCount, lpEventsDone, FALSE, - milliseconds)) + tm_msec)) { case WAIT_FAILED: err = GetLastError(); @@ -1228,7 +1229,7 @@ CAMLprim value caml_unix_select(value readfds, value writefds, value exceptfds, /* Nothing to monitor but some time to wait. */ else if (!hasStaticData) { - Sleep(milliseconds); + Sleep(tm_msec); } caml_leave_blocking_section(); diff --git a/otherlibs/unix/setgroups.c b/otherlibs/unix/setgroups.c index 433660e8..0bc68f4e 100644 --- a/otherlibs/unix/setgroups.c +++ b/otherlibs/unix/setgroups.c @@ -21,7 +21,7 @@ #ifdef HAS_SETGROUPS #include -#ifdef HAS_UNISTD +#ifndef _WIN32 #include #endif #include diff --git a/otherlibs/unix/setsid.c b/otherlibs/unix/setsid.c index 72a35789..65c1dab3 100644 --- a/otherlibs/unix/setsid.c +++ b/otherlibs/unix/setsid.c @@ -16,7 +16,7 @@ #include #include #include "caml/unixsupport.h" -#ifdef HAS_UNISTD +#ifndef _WIN32 #include #endif diff --git a/otherlibs/unix/signals.c b/otherlibs/unix/signals.c index 5d728aad..27c5ab9a 100644 --- a/otherlibs/unix/signals.c +++ b/otherlibs/unix/signals.c @@ -50,7 +50,7 @@ static value encode_sigset(sigset_t * set) CAMLreturn(res); } -static int sigprocmask_cmd[3] = { SIG_SETMASK, SIG_BLOCK, SIG_UNBLOCK }; +static const int sigprocmask_cmd[3] = { SIG_SETMASK, SIG_BLOCK, SIG_UNBLOCK }; CAMLprim value caml_unix_sigprocmask(value vaction, value vset) { @@ -97,6 +97,19 @@ CAMLprim value caml_unix_sigsuspend(value vset) return Val_unit; } +CAMLprim value caml_unix_sigwait(value sigs) +{ + sigset_t set; + int retcode, signo; + + decode_sigset(sigs, &set); + caml_enter_blocking_section(); + retcode = sigwait(&set, &signo); + caml_leave_blocking_section(); + if (retcode != 0) caml_unix_error(retcode, "sigwait", Nothing); + return Val_int(caml_rev_convert_signal_number(signo)); +} + #else CAMLprim value caml_unix_sigprocmask(value vaction, value vset) @@ -108,4 +121,7 @@ CAMLprim value caml_unix_sigpending(value unit) CAMLprim value caml_unix_sigsuspend(value vset) { caml_invalid_argument("Unix.sigsuspend not available"); } +CAMLprim value caml_unix_sigwait(value vset) +{ caml_invalid_argument("Unix.sigwait not available"); } + #endif diff --git a/otherlibs/unix/sleep_unix.c b/otherlibs/unix/sleep_unix.c index 59dd5f9e..7c4f73ae 100644 --- a/otherlibs/unix/sleep_unix.c +++ b/otherlibs/unix/sleep_unix.c @@ -13,6 +13,7 @@ /* */ /**************************************************************************/ +#define CAML_INTERNALS #include #include #include "caml/unixsupport.h" @@ -27,16 +28,15 @@ #endif #endif -CAMLprim value caml_unix_sleep(value duration) + +CAMLprim value caml_unix_sleep(value duration_sec) { - double d = Double_val(duration); - if (d < 0.0) return Val_unit; + double sec = Double_val(duration_sec); + if (sec < 0.0) return Val_unit; #if defined(HAS_NANOSLEEP) { - struct timespec t; + struct timespec t = caml_timespec_of_sec(sec); int ret; - t.tv_sec = (time_t) d; - t.tv_nsec = (d - t.tv_sec) * 1e9; do { caml_enter_blocking_section(); ret = nanosleep(&t, &t); @@ -50,10 +50,8 @@ CAMLprim value caml_unix_sleep(value duration) } #elif defined(HAS_SELECT) { - struct timeval t; + struct timeval t = caml_timeval_of_sec(sec); int ret; - t.tv_sec = (time_t) d; - t.tv_usec = (d - t.tv_sec) * 1e6; do { caml_enter_blocking_section(); ret = select(0, NULL, NULL, NULL, &t); @@ -68,7 +66,7 @@ CAMLprim value caml_unix_sleep(value duration) remaining time returned by sleep() is generally rounded up. */ { caml_enter_blocking_section(); - sleep ((unsigned int) d); + sleep((unsigned int) sec); caml_leave_blocking_section(); } #endif diff --git a/otherlibs/unix/sleep_win32.c b/otherlibs/unix/sleep_win32.c index de22d7b7..3c00f86d 100644 --- a/otherlibs/unix/sleep_win32.c +++ b/otherlibs/unix/sleep_win32.c @@ -13,15 +13,16 @@ /* */ /**************************************************************************/ +#define CAML_INTERNALS #include #include #include "caml/unixsupport.h" -CAMLprim value caml_unix_sleep(value t) +CAMLprim value caml_unix_sleep(value sec) { - DWORD ms = (DWORD)(Double_val(t) * 1e3); + DWORD msec = (DWORD) (Double_val(sec) * MSEC_PER_SEC); caml_enter_blocking_section(); - Sleep(ms); + Sleep(msec); caml_leave_blocking_section(); return Val_unit; } diff --git a/otherlibs/unix/sockopt_unix.c b/otherlibs/unix/sockopt_unix.c index a826de86..685ff1a9 100644 --- a/otherlibs/unix/sockopt_unix.c +++ b/otherlibs/unix/sockopt_unix.c @@ -13,6 +13,7 @@ /* */ /**************************************************************************/ +#define CAML_INTERNALS #include #include #include @@ -214,7 +215,7 @@ CAMLexport value caml_unix_getsockopt_aux(const char * name, break; case TYPE_TIMEVAL: res = caml_copy_double((double) optval.tv.tv_sec - + (double) optval.tv.tv_usec / 1e6); + + (double) optval.tv.tv_usec / USEC_PER_SEC); break; case TYPE_UNIX_ERROR: if (optval.i == 0) { @@ -236,7 +237,6 @@ CAMLexport value caml_unix_setsockopt_aux(const char * name, { union option_value optval; socklen_param_type optsize; - double f; switch (ty) { case TYPE_BOOL: @@ -251,10 +251,8 @@ CAMLexport value caml_unix_setsockopt_aux(const char * name, optval.lg.l_linger = Int_val(Some_val(val)); break; case TYPE_TIMEVAL: - f = Double_val(val); + optval.tv = caml_timeval_of_sec(Double_val(val)); optsize = sizeof(optval.tv); - optval.tv.tv_sec = (int) f; - optval.tv.tv_usec = (int) (1e6 * (f - optval.tv.tv_sec)); break; case TYPE_UNIX_ERROR: default: diff --git a/otherlibs/unix/sockopt_win32.c b/otherlibs/unix/sockopt_win32.c index 64d17b08..f8f85302 100644 --- a/otherlibs/unix/sockopt_win32.c +++ b/otherlibs/unix/sockopt_win32.c @@ -13,6 +13,7 @@ /* */ /**************************************************************************/ +#define CAML_INTERNALS #include #include #include @@ -152,7 +153,7 @@ CAMLexport value caml_unix_getsockopt_aux(const char * name, break; case TYPE_TIMEVAL: res = caml_copy_double((double) optval.tv.tv_sec - + (double) optval.tv.tv_usec / 1e6); + + (double) optval.tv.tv_usec / USEC_PER_SEC); break; case TYPE_UNIX_ERROR: if (optval.i == 0) { @@ -174,7 +175,6 @@ CAMLexport value caml_unix_setsockopt_aux(const char * name, { union option_value optval; socklen_param_type optsize; - double f; switch (ty) { case TYPE_BOOL: @@ -189,10 +189,8 @@ CAMLexport value caml_unix_setsockopt_aux(const char * name, optval.lg.l_linger = Int_val(Some_val(val)); break; case TYPE_TIMEVAL: - f = Double_val(val); + optval.tv = caml_timeval_of_sec(Double_val(val)); optsize = sizeof(optval.tv); - optval.tv.tv_sec = (int) f; - optval.tv.tv_usec = (int) (1e6 * (f - optval.tv.tv_sec)); break; case TYPE_UNIX_ERROR: default: diff --git a/otherlibs/unix/stat_unix.c b/otherlibs/unix/stat_unix.c index c51c1013..f5a5b234 100644 --- a/otherlibs/unix/stat_unix.c +++ b/otherlibs/unix/stat_unix.c @@ -60,7 +60,7 @@ static double stat_timestamp(time_t sec, long nsec) double s = (double) sec; /* The conversion of nsec to fraction of seconds can round. Still, we have 0 <= n < 1.0. */ - double n = (double) nsec / 1e9; + double n = (double) nsec / NSEC_PER_SEC; /* The sum s + n can round up, hence s <= t + <= s + 1.0 */ double t = s + n; /* Detect the "round up to s + 1" case and decrease t so that diff --git a/otherlibs/unix/stat_win32.c b/otherlibs/unix/stat_win32.c index f66f5fbc..8585b5b7 100644 --- a/otherlibs/unix/stat_win32.c +++ b/otherlibs/unix/stat_win32.c @@ -75,8 +75,8 @@ static const int file_kind_table[] = { static double stat_timestamp(__time64_t tm) { /* Split the timestamp into seconds and remaining 100ns units */ - __int64 sec = tm / 10000000; /* 10^7 */ - int n100sec = tm % 10000000; + __int64 sec = tm / (NSEC_PER_SEC / 100); /* 10^7 */ + int n100sec = tm % (NSEC_PER_SEC / 100); /* The conversion of sec to FP is exact for the foreseeable future. (It starts rounding when sec > 2^53, i.e. in 285 million years.) */ double s = (double) sec; diff --git a/otherlibs/unix/times_unix.c b/otherlibs/unix/times_unix.c index 65839034..025eb332 100644 --- a/otherlibs/unix/times_unix.c +++ b/otherlibs/unix/times_unix.c @@ -13,6 +13,7 @@ /* */ /**************************************************************************/ +#define CAML_INTERNALS #include #include #include @@ -36,14 +37,14 @@ CAMLprim value caml_unix_times(value unit) getrusage (RUSAGE_SELF, &ru); Store_double_flat_field(res, 0, - ru.ru_utime.tv_sec + ru.ru_utime.tv_usec / 1e6); + ru.ru_utime.tv_sec + (double) ru.ru_utime.tv_usec / USEC_PER_SEC); Store_double_flat_field(res, 1, - ru.ru_stime.tv_sec + ru.ru_stime.tv_usec / 1e6); + ru.ru_stime.tv_sec + (double) ru.ru_stime.tv_usec / USEC_PER_SEC); getrusage (RUSAGE_CHILDREN, &ru); Store_double_flat_field(res, 2, - ru.ru_utime.tv_sec + ru.ru_utime.tv_usec / 1e6); + ru.ru_utime.tv_sec + (double) ru.ru_utime.tv_usec / USEC_PER_SEC); Store_double_flat_field(res, 3, - ru.ru_stime.tv_sec + ru.ru_stime.tv_usec / 1e6); + ru.ru_stime.tv_sec + (double) ru.ru_stime.tv_usec / USEC_PER_SEC); return res; #else diff --git a/otherlibs/unix/truncate_unix.c b/otherlibs/unix/truncate_unix.c index 6afdfc8e..a4cbfc99 100644 --- a/otherlibs/unix/truncate_unix.c +++ b/otherlibs/unix/truncate_unix.c @@ -22,7 +22,7 @@ #include #include #include "caml/unixsupport.h" -#ifdef HAS_UNISTD +#ifndef _WIN32 #include #endif diff --git a/otherlibs/unix/unix.mli b/otherlibs/unix/unix.mli index 3e355145..46d71209 100644 --- a/otherlibs/unix/unix.mli +++ b/otherlibs/unix/unix.mli @@ -190,15 +190,14 @@ type process_status = WEXITED of int (** The process terminated normally by [exit]; the argument is the return code. *) - | WSIGNALED of int + | WSIGNALED of Sys.signal (** The process was killed by a signal; the argument is the signal number. *) - | WSTOPPED of int + | WSTOPPED of Sys.signal (** The process was stopped by a signal; the argument is the signal number. *) -(** The termination status of a process. See module {!Sys} for the - definitions of the standard signal numbers. Note that they are - not the numbers used by the OS. +(** The termination status of a process. See {!Sys.signal} for the + definitions of the standard signal numbers. On Windows: only [WEXITED] is used (as there are no inter-process signals) but with specific return codes to indicate special termination causes. @@ -1097,7 +1096,11 @@ val select : The result is composed of three sets of descriptors: those ready for reading (first component), ready for writing (second component), and over which an exceptional condition is pending (third - component). *) + component). + + On Windows, if one of descriptor lists exceeds [FD_SETSIZE] elements + (64 by default), or if at least one non-socket file descriptor is + used, the maximal timeout is capped to 2{^32} milliseconds. *) (** {1 Locking} *) @@ -1148,7 +1151,7 @@ val lockf : file_descr -> lock_command -> int -> unit the functions {!Sys.signal} and {!Sys.set_signal}. *) -val kill : int -> int -> unit +val kill : int -> Sys.signal -> unit (** [kill pid signal] sends signal number [signal] to the process with id [pid]. @@ -1159,7 +1162,7 @@ type sigprocmask_command = | SIG_BLOCK | SIG_UNBLOCK -val sigprocmask : sigprocmask_command -> int list -> int list +val sigprocmask : sigprocmask_command -> Sys.signal list -> Sys.signal list (** [sigprocmask mode sigs] changes the set of blocked signals. If [mode] is [SIG_SETMASK], blocked signals are set to those in the list [sigs]. @@ -1169,20 +1172,20 @@ val sigprocmask : sigprocmask_command -> int list -> int list from the set of blocked signals. [sigprocmask] returns the set of previously blocked signals. - When the systhreads version of the [Thread] module is loaded, this - function redirects to [Thread.sigmask]. I.e., [sigprocmask] only - changes the mask of the current thread. + Each domain, and each thread when the [Thread] module is loaded, + has its own signal mask. [sigprocmask] only changes the mask + of the current domain or current thread. @raise Invalid_argument on Windows (no inter-process signals on Windows) *) -val sigpending : unit -> int list +val sigpending : unit -> Sys.signal list (** Return the set of blocked signals that are currently pending. @raise Invalid_argument on Windows (no inter-process signals on Windows) *) -val sigsuspend : int list -> unit +val sigsuspend : Sys.signal list -> unit (** [sigsuspend sigs] atomically sets the blocked signals to [sigs] and waits for a non-ignored, non-blocked signal to be delivered. On return, the blocked signals are reset to their initial value. @@ -1196,6 +1199,17 @@ val pause : unit -> unit @raise Invalid_argument on Windows (no inter-process signals on Windows) *) +val sigwait : Sys.signal list -> Sys.signal +(** [sigwait sigs] waits until one of the signals in the list [sigs] + becomes pending. It then removes this signal from the set of pending + signals, and returns the number of this signal. + Signal handlers attached to the signals in [sigs] will not be + invoked. The signals [sigs] are expected to be blocked before + calling [sigwait]. + + @since 5.4 + @raise Invalid_argument on Windows (no inter-process signals on + Windows) *) (** {1 Time functions} *) diff --git a/otherlibs/unix/unixLabels.mli b/otherlibs/unix/unixLabels.mli index 25643807..a738cc2b 100644 --- a/otherlibs/unix/unixLabels.mli +++ b/otherlibs/unix/unixLabels.mli @@ -190,15 +190,14 @@ type process_status = Unix.process_status = WEXITED of int (** The process terminated normally by [exit]; the argument is the return code. *) - | WSIGNALED of int + | WSIGNALED of Sys.signal (** The process was killed by a signal; the argument is the signal number. *) - | WSTOPPED of int + | WSTOPPED of Sys.signal (** The process was stopped by a signal; the argument is the signal number. *) -(** The termination status of a process. See module {!Sys} for the - definitions of the standard signal numbers. Note that they are - not the numbers used by the OS. +(** The termination status of a process. See {!Sys.signal} for the + definitions of the standard signal numbers. On Windows: only [WEXITED] is used (as there are no inter-process signals) but with specific return codes to indicate special termination causes. @@ -1097,7 +1096,11 @@ val select : The result is composed of three sets of descriptors: those ready for reading (first component), ready for writing (second component), and over which an exceptional condition is pending (third - component). *) + component). + + On Windows, if one of descriptor lists exceeds [FD_SETSIZE] elements + (64 by default), or if at least one non-socket file descriptor is + used, the maximal timeout is capped to 2{^32} milliseconds. *) (** {1 Locking} *) @@ -1148,7 +1151,7 @@ val lockf : file_descr -> mode:lock_command -> len:int -> unit the functions {!Sys.signal} and {!Sys.set_signal}. *) -val kill : pid:int -> signal:int -> unit +val kill : pid:int -> signal:Sys.signal -> unit (** [kill ~pid ~signal] sends signal number [signal] to the process with id [pid]. @@ -1159,7 +1162,7 @@ type sigprocmask_command = Unix.sigprocmask_command = | SIG_BLOCK | SIG_UNBLOCK -val sigprocmask : mode:sigprocmask_command -> int list -> int list +val sigprocmask : mode:sigprocmask_command -> Sys.signal list -> Sys.signal list (** [sigprocmask ~mode sigs] changes the set of blocked signals. If [mode] is [SIG_SETMASK], blocked signals are set to those in the list [sigs]. @@ -1169,20 +1172,20 @@ val sigprocmask : mode:sigprocmask_command -> int list -> int list from the set of blocked signals. [sigprocmask] returns the set of previously blocked signals. - When the systhreads version of the [Thread] module is loaded, this - function redirects to [Thread.sigmask]. I.e., [sigprocmask] only - changes the mask of the current thread. + Each domain, and each thread when the [Thread] module is loaded, + has its own signal mask. [sigprocmask] only changes the mask + of the current domain or current thread. @raise Invalid_argument on Windows (no inter-process signals on Windows) *) -val sigpending : unit -> int list +val sigpending : unit -> Sys.signal list (** Return the set of blocked signals that are currently pending. @raise Invalid_argument on Windows (no inter-process signals on Windows) *) -val sigsuspend : int list -> unit +val sigsuspend : Sys.signal list -> unit (** [sigsuspend sigs] atomically sets the blocked signals to [sigs] and waits for a non-ignored, non-blocked signal to be delivered. On return, the blocked signals are reset to their initial value. @@ -1196,6 +1199,17 @@ val pause : unit -> unit @raise Invalid_argument on Windows (no inter-process signals on Windows) *) +val sigwait : Sys.signal list -> Sys.signal +(** [sigwait sigs] waits until one of the signals in the list [sigs] + becomes pending. It then removes this signal from the set of pending + signals, and returns the number of this signal. + Signal handlers attached to the signals in [sigs] will not be + invoked. The signals [sigs] are expected to be blocked before + calling [sigwait]. + + @since 5.4 + @raise Invalid_argument on Windows (no inter-process signals on + Windows) *) (** {1 Time functions} *) diff --git a/otherlibs/unix/unix_unix.ml b/otherlibs/unix/unix_unix.ml index c79758d7..ddc655f0 100644 --- a/otherlibs/unix/unix_unix.ml +++ b/otherlibs/unix/unix_unix.ml @@ -472,6 +472,7 @@ external sigprocmask: sigprocmask_command -> int list -> int list = "caml_unix_sigprocmask" external sigpending: unit -> int list = "caml_unix_sigpending" external sigsuspend: int list -> unit = "caml_unix_sigsuspend" +external sigwait: int list -> int = "caml_unix_sigwait" let pause() = let sigs = sigprocmask SIG_BLOCK [] in sigsuspend sigs diff --git a/otherlibs/unix/unix_win32.ml b/otherlibs/unix/unix_win32.ml index ebfdcc88..e29fca8d 100644 --- a/otherlibs/unix/unix_win32.ml +++ b/otherlibs/unix/unix_win32.ml @@ -579,6 +579,7 @@ let sigprocmask _cmd _sigs = invalid_arg "Unix.sigprocmask not implemented" let sigpending () = invalid_arg "Unix.sigpending not implemented" let sigsuspend _sigs = invalid_arg "Unix.sigsuspend not implemented" let pause () = invalid_arg "Unix.pause not implemented" +let sigwait _sigs = invalid_arg "Unix.sigwait not implemented" (* Time functions *) diff --git a/otherlibs/unix/unixsupport_unix.c b/otherlibs/unix/unixsupport_unix.c index 21fb325c..03c6a505 100644 --- a/otherlibs/unix/unixsupport_unix.c +++ b/otherlibs/unix/unixsupport_unix.c @@ -24,7 +24,7 @@ #include "caml/unixsupport.h" #include "cst2constr.h" #include -#ifdef HAS_UNISTD +#ifndef _WIN32 #include #endif #include @@ -336,7 +336,7 @@ int caml_unix_cloexec_p(value cloexec) return caml_unix_cloexec_default; } -void caml_unix_set_cloexec(int fd, char *cmdname, value cmdarg) +void caml_unix_set_cloexec(int fd, const char *cmdname, value cmdarg) { int flags = fcntl(fd, F_GETFD, 0); if (flags == -1 || @@ -344,7 +344,7 @@ void caml_unix_set_cloexec(int fd, char *cmdname, value cmdarg) caml_uerror(cmdname, cmdarg); } -void caml_unix_clear_cloexec(int fd, char *cmdname, value cmdarg) +void caml_unix_clear_cloexec(int fd, const char *cmdname, value cmdarg) { int flags = fcntl(fd, F_GETFD, 0); if (flags == -1 || diff --git a/otherlibs/unix/utimes_unix.c b/otherlibs/unix/utimes_unix.c index 78d85cae..77468025 100644 --- a/otherlibs/unix/utimes_unix.c +++ b/otherlibs/unix/utimes_unix.c @@ -40,10 +40,8 @@ CAMLprim value caml_unix_utimes(value path, value atime, value mtime) if (at == 0.0 && mt == 0.0) { t = (struct timeval *) NULL; } else { - tv[0].tv_sec = at; - tv[0].tv_usec = (at - tv[0].tv_sec) * 1000000; - tv[1].tv_sec = mt; - tv[1].tv_usec = (mt - tv[1].tv_sec) * 1000000; + tv[0] = caml_timeval_of_sec(at); + tv[1] = caml_timeval_of_sec(mt); t = tv; } p = caml_stat_strdup(String_val(path)); diff --git a/otherlibs/unix/utimes_win32.c b/otherlibs/unix/utimes_win32.c index e5391038..66e917f7 100644 --- a/otherlibs/unix/utimes_win32.c +++ b/otherlibs/unix/utimes_win32.c @@ -59,9 +59,9 @@ CAMLprim value caml_unix_utimes(value path, value atime, value mtime) lastModificationTime.ul = lastAccessTime.ul; } else { lastAccessTime.ul = - (ULONGLONG)(at * 10000000.0) + CAML_NT_EPOCH_100ns_TICKS; + (ULONGLONG)(at * (NSEC_PER_SEC / 100)) + CAML_NT_EPOCH_100ns_TICKS; lastModificationTime.ul = - (ULONGLONG)(mt * 10000000.0) + CAML_NT_EPOCH_100ns_TICKS; + (ULONGLONG)(mt * (NSEC_PER_SEC / 100)) + CAML_NT_EPOCH_100ns_TICKS; } caml_enter_blocking_section(); res = SetFileTime(hFile, NULL, &lastAccessTime.ft, &lastModificationTime.ft); diff --git a/parsing/HACKING.adoc b/parsing/HACKING.adoc index 0566c013..32a14915 100644 --- a/parsing/HACKING.adoc +++ b/parsing/HACKING.adoc @@ -53,7 +53,8 @@ those that should not modify the parsed AST at all: 4. Before committing any change, remember to remove the `.ast` files from your index (using `git reset HEAD`), and maybe remove them - completely (unless you plan to check further changes). + completely (unless you plan to check further changes) -- you can + run `make clean-all-asts` to remove them. ---- # save pre-change ASTs diff --git a/parsing/ast_helper.ml b/parsing/ast_helper.ml index daa73c42..bcd5e5eb 100644 --- a/parsing/ast_helper.ml +++ b/parsing/ast_helper.ml @@ -75,7 +75,7 @@ module Typ = struct let alias ?loc ?attrs a b = mk ?loc ?attrs (Ptyp_alias (a, b)) let variant ?loc ?attrs a b c = mk ?loc ?attrs (Ptyp_variant (a, b, c)) let poly ?loc ?attrs a b = mk ?loc ?attrs (Ptyp_poly (a, b)) - let package ?loc ?attrs a b = mk ?loc ?attrs (Ptyp_package (a, b)) + let package ?loc ?attrs a = mk ?loc ?attrs (Ptyp_package a) let extension ?loc ?attrs a = mk ?loc ?attrs (Ptyp_extension a) let open_ ?loc ?attrs mod_ident t = mk ?loc ?attrs (Ptyp_open (mod_ident, t)) @@ -98,7 +98,8 @@ module Typ = struct Ptyp_var x | Ptyp_arrow (label,core_type,core_type') -> Ptyp_arrow(label, loop core_type, loop core_type') - | Ptyp_tuple lst -> Ptyp_tuple (List.map loop lst) + | Ptyp_tuple lst -> + Ptyp_tuple (List.map (fun (l, t) -> l, loop t) lst) | Ptyp_constr( { txt = Longident.Lident s }, []) when List.mem s var_names -> Ptyp_var s @@ -118,8 +119,8 @@ module Typ = struct List.iter (fun v -> check_variable var_names t.ptyp_loc v.txt) string_lst; Ptyp_poly(string_lst, loop core_type) - | Ptyp_package(longident,lst) -> - Ptyp_package(longident,List.map (fun (n,typ) -> (n,loop typ) ) lst) + | Ptyp_package ptyp -> + Ptyp_package (loop_package_type ptyp) | Ptyp_open (mod_ident, core_type) -> Ptyp_open (mod_ident, loop core_type) | Ptyp_extension (s, arg) -> @@ -142,9 +143,17 @@ module Typ = struct Oinherit (loop t) in { field with pof_desc; } + and loop_package_type ptyp = + { ptyp with + ppt_cstrs = List.map (fun (n,typ) -> (n,loop typ) ) ptyp.ppt_cstrs } in loop t + let package_type ?(loc = !default_loc) ?(attrs = []) p c = + {ppt_loc = loc; + ppt_path = p; + ppt_cstrs = c; + ppt_attrs = attrs} end module Pat = struct @@ -160,7 +169,7 @@ module Pat = struct let alias ?loc ?attrs a b = mk ?loc ?attrs (Ppat_alias (a, b)) let constant ?loc ?attrs a = mk ?loc ?attrs (Ppat_constant a) let interval ?loc ?attrs a b = mk ?loc ?attrs (Ppat_interval (a, b)) - let tuple ?loc ?attrs a = mk ?loc ?attrs (Ppat_tuple a) + let tuple ?loc ?attrs a b = mk ?loc ?attrs (Ppat_tuple (a, b)) let construct ?loc ?attrs a b = mk ?loc ?attrs (Ppat_construct (a, b)) let variant ?loc ?attrs a b = mk ?loc ?attrs (Ppat_variant (a, b)) let record ?loc ?attrs a b = mk ?loc ?attrs (Ppat_record (a, b)) @@ -215,7 +224,7 @@ module Exp = struct let poly ?loc ?attrs a b = mk ?loc ?attrs (Pexp_poly (a, b)) let object_ ?loc ?attrs a = mk ?loc ?attrs (Pexp_object a) let newtype ?loc ?attrs a b = mk ?loc ?attrs (Pexp_newtype (a, b)) - let pack ?loc ?attrs a = mk ?loc ?attrs (Pexp_pack a) + let pack ?loc ?attrs a b = mk ?loc ?attrs (Pexp_pack (a, b)) let open_ ?loc ?attrs a b = mk ?loc ?attrs (Pexp_open (a, b)) let letop ?loc ?attrs let_ ands body = mk ?loc ?attrs (Pexp_letop {let_; ands; body}) diff --git a/parsing/ast_helper.mli b/parsing/ast_helper.mli index 6a8a0fa3..f63b15ee 100644 --- a/parsing/ast_helper.mli +++ b/parsing/ast_helper.mli @@ -73,7 +73,8 @@ module Typ : val var: ?loc:loc -> ?attrs:attrs -> string -> core_type val arrow: ?loc:loc -> ?attrs:attrs -> arg_label -> core_type -> core_type -> core_type - val tuple: ?loc:loc -> ?attrs:attrs -> core_type list -> core_type + val tuple: ?loc:loc -> ?attrs:attrs -> (string option * core_type) list + -> core_type val constr: ?loc:loc -> ?attrs:attrs -> lid -> core_type list -> core_type val object_: ?loc:loc -> ?attrs:attrs -> object_field list -> closed_flag -> core_type @@ -83,8 +84,7 @@ module Typ : val variant: ?loc:loc -> ?attrs:attrs -> row_field list -> closed_flag -> label list option -> core_type val poly: ?loc:loc -> ?attrs:attrs -> str list -> core_type -> core_type - val package: ?loc:loc -> ?attrs:attrs -> lid -> (lid * core_type) list - -> core_type + val package: ?loc:loc -> ?attrs:attrs -> package_type -> core_type val open_ : ?loc:loc -> ?attrs:attrs -> lid -> core_type -> core_type val extension: ?loc:loc -> ?attrs:attrs -> extension -> core_type @@ -98,6 +98,10 @@ module Typ : appears in [newtypes]. @since 4.05 *) + + val package_type: ?loc:loc -> ?attrs:attrs -> lid -> (lid * core_type) list + -> package_type + (** @since 5.4 *) end (** Patterns *) @@ -111,7 +115,8 @@ module Pat: val alias: ?loc:loc -> ?attrs:attrs -> pattern -> str -> pattern val constant: ?loc:loc -> ?attrs:attrs -> constant -> pattern val interval: ?loc:loc -> ?attrs:attrs -> constant -> constant -> pattern - val tuple: ?loc:loc -> ?attrs:attrs -> pattern list -> pattern + val tuple: ?loc:loc -> ?attrs:attrs -> (string option * pattern) list + -> closed_flag -> pattern val construct: ?loc:loc -> ?attrs:attrs -> lid -> (str list * pattern) option -> pattern val variant: ?loc:loc -> ?attrs:attrs -> label -> pattern option -> pattern @@ -147,7 +152,8 @@ module Exp: val match_: ?loc:loc -> ?attrs:attrs -> expression -> case list -> expression val try_: ?loc:loc -> ?attrs:attrs -> expression -> case list -> expression - val tuple: ?loc:loc -> ?attrs:attrs -> expression list -> expression + val tuple: ?loc:loc -> ?attrs:attrs -> (string option * expression) list + -> expression val construct: ?loc:loc -> ?attrs:attrs -> lid -> expression option -> expression val variant: ?loc:loc -> ?attrs:attrs -> label -> expression option @@ -186,7 +192,8 @@ module Exp: -> expression val object_: ?loc:loc -> ?attrs:attrs -> class_structure -> expression val newtype: ?loc:loc -> ?attrs:attrs -> str -> expression -> expression - val pack: ?loc:loc -> ?attrs:attrs -> module_expr -> expression + val pack: ?loc:loc -> ?attrs:attrs -> module_expr -> package_type option + -> expression val open_: ?loc:loc -> ?attrs:attrs -> open_declaration -> expression -> expression val letop: ?loc:loc -> ?attrs:attrs -> binding_op diff --git a/parsing/ast_invariants.ml b/parsing/ast_invariants.ml index 53e8a162..fcf90810 100644 --- a/parsing/ast_invariants.ml +++ b/parsing/ast_invariants.ml @@ -20,6 +20,10 @@ let err = Syntaxerr.ill_formed_ast let empty_record loc = err loc "Records cannot be empty." let invalid_tuple loc = err loc "Tuples must have at least 2 components." +let empty_open_tuple_pat loc = + err loc "Open tuple patterns must have at least one component." +let short_closed_tuple_pat loc = + err loc "Closed tuple patterns must have at least two components." let no_args loc = err loc "Function application with no argument." let empty_let loc = err loc "Let with no bindings." let empty_type loc = err loc "Type declarations cannot be empty." @@ -34,7 +38,7 @@ let function_without_value_parameters loc = let simple_longident id = let rec is_simple = function | Longident.Lident _ -> true - | Longident.Ldot (id, _) -> is_simple id + | Longident.Ldot (id, _) -> is_simple id.txt | Longident.Lapply _ -> false in if not (is_simple id.txt) then complex_id id.loc @@ -53,8 +57,8 @@ let iterator = let loc = ty.ptyp_loc in match ty.ptyp_desc with | Ptyp_tuple ([] | [_]) -> invalid_tuple loc - | Ptyp_package (_, cstrs) -> - List.iter (fun (id, _) -> simple_longident id) cstrs + | Ptyp_package ptyp -> + List.iter (fun (id, _) -> simple_longident id) ptyp.ppt_cstrs | Ptyp_poly([],_) -> empty_poly_binder loc | _ -> () in @@ -68,7 +72,8 @@ let iterator = end; let loc = pat.ppat_loc in match pat.ppat_desc with - | Ppat_tuple ([] | [_]) -> invalid_tuple loc + | Ppat_tuple (([] | [_]), Closed) -> short_closed_tuple_pat loc + | Ppat_tuple ([], Open) -> empty_open_tuple_pat loc | Ppat_record ([], _) -> empty_record loc | Ppat_construct (id, _) -> simple_longident id | Ppat_record (fields, _) -> @@ -211,3 +216,88 @@ let iterator = let structure st = iterator.structure iterator st let signature sg = iterator.signature iterator sg + +let check_loc_ghost meth v ~source_contents = + let equal_modulo_loc = + let no_locs = + { Ast_mapper.default_mapper + with location = (fun _ _ -> Location.none); + attributes = (fun _ _ -> []); + (* type z = (int [@foo]) create int at location "int" instead of + "int [@foo]". I'd rather loosen the check than worsen the location + for type errors. *) + } + in + fun meth node1 node2 -> + let norm1 = (meth no_locs) no_locs node1 in + let norm2 = (meth no_locs) no_locs node2 in + Stdlib.(=) norm1 norm2 + in + let super = Ast_iterator.default_iterator in + let depth = ref 0 in + let limit_quadratic_complexity meth f = + fun self v -> + if !depth < 1000 then ( + depth := !depth + 1; + (meth super) self v; + depth := !depth -1 ; + f v; + ) + in + let check ?print ?(wrap = Fun.id) meth parse ast1 (loc : Location.t) = + let source_fragment = + wrap ( + String.sub source_contents + loc.loc_start.pos_cnum + (loc.loc_end.pos_cnum - loc.loc_start.pos_cnum) + ) + in + let lexbuf = Lexing.from_string source_fragment in + let should_be_loc_ghost, error_if_not = + match parse lexbuf with + | exception Parsing.Parse_error | exception _ -> + true, "non-ghost location points to a non parsable range" + | ast2 -> + if equal_modulo_loc meth ast1 ast2 + then false, "ghost location should be non-ghost" + else true, "non-ghost location points to a range of source \ + code that contains the wrong ast" + in + if loc.loc_ghost <> should_be_loc_ghost + then ( + Format.eprintf "@[<2>%a: %s%t@]@." Location.print_loc loc error_if_not + (fun f -> + match print with + | None -> () + | Some print -> Format.fprintf f "@\n%a" print ast1) + ) + in + let self = + { super with + expr = + limit_quadratic_complexity (fun s -> s.expr) + (fun v -> + check (fun s -> s.expr) Parse.expression v v.pexp_loc + (* ~print:(fun f ty -> Printast.expression 0 f ty) *) + (* Add parens because in 1 + 2, + gets assigned a non-ghost + location, but + without parens is not a valid expression. *) + ~wrap:(fun s -> "( " ^ s ^ " )")) + ; pat = + limit_quadratic_complexity (fun s -> s.pat) + (fun v -> check (fun s -> s.pat) Parse.pattern v v.ppat_loc ) + ; typ = + limit_quadratic_complexity (fun s -> s.typ) + (fun v -> + check + (* ~print:(fun f ty -> Printast.payload 0 f (PTyp ty)) *) + (fun s -> s.typ) Parse.core_type v v.ptyp_loc ) + ; attribute = (fun self attr -> + (* Doc comments would probably need some special case to check they are + correctly placed. *) + if attr.attr_name.txt = "ocaml.doc" + || attr.attr_name.txt = "ocaml.text" + then () + else super.attribute self attr) + } + in + (meth self) self v diff --git a/parsing/ast_invariants.mli b/parsing/ast_invariants.mli index fdb56aa5..deb09840 100644 --- a/parsing/ast_invariants.mli +++ b/parsing/ast_invariants.mli @@ -21,3 +21,13 @@ val structure : Parsetree.structure -> unit val signature : Parsetree.signature -> unit + +(** Checks the invariant of Location.t's loc_ghost field, that are stated in + location.mli. This can be run with -dparsetree-loc-ghost-invariants, which + is used slightly in the testsuite, but should be used more to find more + of the places where the invariant is broken. *) +val check_loc_ghost : + (Ast_iterator.iterator -> Ast_iterator.iterator -> 'a -> unit) + -> 'a + -> source_contents:string + -> unit diff --git a/parsing/ast_iterator.ml b/parsing/ast_iterator.ml index 389a9a40..638bbc66 100644 --- a/parsing/ast_iterator.ml +++ b/parsing/ast_iterator.ml @@ -56,6 +56,7 @@ type iterator = { module_type_declaration: iterator -> module_type_declaration -> unit; open_declaration: iterator -> open_declaration -> unit; open_description: iterator -> open_description -> unit; + package_type: iterator -> package_type -> unit; pat: iterator -> pattern -> unit; payload: iterator -> payload -> unit; signature: iterator -> signature -> unit; @@ -88,6 +89,20 @@ let iter_opt f = function None -> () | Some x -> f x let iter_loc sub {loc; txt = _} = sub.location sub loc +let rec iter_lid sub lid = + let open Longident in + match lid with + | Lident _ -> () + | Ldot (lid, id) -> + iter_loc sub lid; iter_lid sub lid.txt; iter_loc sub id + | Lapply (lid, lid') -> + iter_loc sub lid; iter_lid sub lid.txt; + iter_loc sub lid'; iter_lid sub lid'.txt + +let iter_loc_lid sub {loc; txt} = + iter_loc sub {loc; txt}; + iter_lid sub txt + module T = struct (* Type expressions for the core language *) @@ -121,22 +136,21 @@ module T = struct | Ptyp_var _ -> () | Ptyp_arrow (_lab, t1, t2) -> sub.typ sub t1; sub.typ sub t2 - | Ptyp_tuple tyl -> List.iter (sub.typ sub) tyl + | Ptyp_tuple tyl -> List.iter (fun (_, e) -> sub.typ sub e) tyl | Ptyp_constr (lid, tl) -> - iter_loc sub lid; List.iter (sub.typ sub) tl + iter_loc_lid sub lid; List.iter (sub.typ sub) tl | Ptyp_object (ol, _o) -> List.iter (object_field sub) ol | Ptyp_class (lid, tl) -> - iter_loc sub lid; List.iter (sub.typ sub) tl + iter_loc_lid sub lid; List.iter (sub.typ sub) tl | Ptyp_alias (t, _) -> sub.typ sub t | Ptyp_variant (rl, _b, _ll) -> List.iter (row_field sub) rl | Ptyp_poly (_, t) -> sub.typ sub t - | Ptyp_package (lid, l) -> - iter_loc sub lid; - List.iter (iter_tuple (iter_loc sub) (sub.typ sub)) l + | Ptyp_package ptyp -> + sub.package_type sub ptyp | Ptyp_open (mod_ident, t) -> - iter_loc sub mod_ident; + iter_loc_lid sub mod_ident; sub.typ sub t | Ptyp_extension x -> sub.extension sub x @@ -175,7 +189,7 @@ module T = struct ptyext_private = _; ptyext_loc; ptyext_attributes} = - iter_loc sub ptyext_path; + iter_loc_lid sub ptyext_path; List.iter (sub.extension_constructor sub) ptyext_constructors; List.iter (iter_fst (sub.typ sub)) ptyext_params; sub.location sub ptyext_loc; @@ -193,7 +207,7 @@ module T = struct iter_constructor_arguments sub ctl; iter_opt (sub.typ sub) cto | Pext_rebind li -> - iter_loc sub li + iter_loc_lid sub li let iter_extension_constructor sub {pext_name; @@ -205,6 +219,12 @@ module T = struct sub.location sub pext_loc; sub.attributes sub pext_attributes + let iter_package_type sub {ppt_path; ppt_cstrs; ppt_loc; ppt_attrs} = + sub.location sub ppt_loc; + iter_loc_lid sub ppt_path; + List.iter (iter_tuple (iter_loc_lid sub) (sub.typ sub)) ppt_cstrs; + sub.attributes sub ppt_attrs + end module CT = struct @@ -215,7 +235,7 @@ module CT = struct sub.attributes sub attrs; match desc with | Pcty_constr (lid, tys) -> - iter_loc sub lid; List.iter (sub.typ sub) tys + iter_loc_lid sub lid; List.iter (sub.typ sub) tys | Pcty_signature x -> sub.class_signature sub x | Pcty_arrow (_lab, t, ct) -> sub.typ sub t; sub.class_type sub ct @@ -254,8 +274,8 @@ module MT = struct sub.location sub loc; sub.attributes sub attrs; match desc with - | Pmty_ident s -> iter_loc sub s - | Pmty_alias s -> iter_loc sub s + | Pmty_ident s -> iter_loc_lid sub s + | Pmty_alias s -> iter_loc_lid sub s | Pmty_signature sg -> sub.signature sub sg | Pmty_functor (param, mt2) -> iter_functor_param sub param; @@ -268,17 +288,17 @@ module MT = struct let iter_with_constraint sub = function | Pwith_type (lid, d) -> - iter_loc sub lid; sub.type_declaration sub d + iter_loc_lid sub lid; sub.type_declaration sub d | Pwith_module (lid, lid2) -> - iter_loc sub lid; iter_loc sub lid2 + iter_loc_lid sub lid; iter_loc_lid sub lid2 | Pwith_modtype (lid, mty) -> - iter_loc sub lid; sub.module_type sub mty + iter_loc_lid sub lid; sub.module_type sub mty | Pwith_typesubst (lid, d) -> - iter_loc sub lid; sub.type_declaration sub d + iter_loc_lid sub lid; sub.type_declaration sub d | Pwith_modsubst (s, lid) -> - iter_loc sub s; iter_loc sub lid + iter_loc_lid sub s; iter_loc_lid sub lid | Pwith_modtypesubst (lid, mty) -> - iter_loc sub lid; sub.module_type sub mty + iter_loc_lid sub lid; sub.module_type sub mty let iter_signature_item sub {psig_desc = desc; psig_loc = loc} = sub.location sub loc; @@ -313,7 +333,7 @@ module M = struct sub.location sub loc; sub.attributes sub attrs; match desc with - | Pmod_ident x -> iter_loc sub x + | Pmod_ident x -> iter_loc_lid sub x | Pmod_structure str -> sub.structure sub str | Pmod_functor (param, body) -> iter_functor_param sub param; @@ -384,7 +404,7 @@ module E = struct sub.location sub loc; sub.attributes sub attrs; match desc with - | Pexp_ident x -> iter_loc sub x + | Pexp_ident x -> iter_loc_lid sub x | Pexp_constant _ -> () | Pexp_let (_r, vbs, e) -> List.iter (sub.value_binding sub) vbs; @@ -398,18 +418,18 @@ module E = struct | Pexp_match (e, pel) -> sub.expr sub e; sub.cases sub pel | Pexp_try (e, pel) -> sub.expr sub e; sub.cases sub pel - | Pexp_tuple el -> List.iter (sub.expr sub) el + | Pexp_tuple el -> List.iter (fun (_, e) -> sub.expr sub e) el | Pexp_construct (lid, arg) -> - iter_loc sub lid; iter_opt (sub.expr sub) arg + iter_loc_lid sub lid; iter_opt (sub.expr sub) arg | Pexp_variant (_lab, eo) -> iter_opt (sub.expr sub) eo | Pexp_record (l, eo) -> - List.iter (iter_tuple (iter_loc sub) (sub.expr sub)) l; + List.iter (iter_tuple (iter_loc_lid sub) (sub.expr sub)) l; iter_opt (sub.expr sub) eo | Pexp_field (e, lid) -> - sub.expr sub e; iter_loc sub lid + sub.expr sub e; iter_loc_lid sub lid | Pexp_setfield (e1, lid, e2) -> - sub.expr sub e1; iter_loc sub lid; + sub.expr sub e1; iter_loc_lid sub lid; sub.expr sub e2 | Pexp_array el -> List.iter (sub.expr sub) el | Pexp_ifthenelse (e1, e2, e3) -> @@ -428,7 +448,7 @@ module E = struct | Pexp_constraint (e, t) -> sub.expr sub e; sub.typ sub t | Pexp_send (e, _s) -> sub.expr sub e - | Pexp_new lid -> iter_loc sub lid + | Pexp_new lid -> iter_loc_lid sub lid | Pexp_setinstvar (s, e) -> iter_loc sub s; sub.expr sub e | Pexp_override sel -> @@ -445,7 +465,9 @@ module E = struct sub.expr sub e; iter_opt (sub.typ sub) t | Pexp_object cls -> sub.class_structure sub cls | Pexp_newtype (_s, e) -> sub.expr sub e - | Pexp_pack me -> sub.module_expr sub me + | Pexp_pack (me, optyp) -> + sub.module_expr sub me; + Option.iter (sub.package_type sub) optyp | Pexp_open (o, e) -> sub.open_declaration sub o; sub.expr sub e | Pexp_letop {let_; ands; body} -> @@ -475,9 +497,9 @@ module P = struct | Ppat_alias (p, s) -> sub.pat sub p; iter_loc sub s | Ppat_constant _ -> () | Ppat_interval _ -> () - | Ppat_tuple pl -> List.iter (sub.pat sub) pl + | Ppat_tuple (pl, _) -> List.iter (fun (_, p) -> sub.pat sub p) pl | Ppat_construct (l, p) -> - iter_loc sub l; + iter_loc_lid sub l; iter_opt (fun (vl,p) -> List.iter (iter_loc sub) vl; @@ -485,19 +507,19 @@ module P = struct p | Ppat_variant (_l, p) -> iter_opt (sub.pat sub) p | Ppat_record (lpl, _cf) -> - List.iter (iter_tuple (iter_loc sub) (sub.pat sub)) lpl + List.iter (iter_tuple (iter_loc_lid sub) (sub.pat sub)) lpl | Ppat_array pl -> List.iter (sub.pat sub) pl | Ppat_or (p1, p2) -> sub.pat sub p1; sub.pat sub p2 | Ppat_constraint (p, t) -> sub.pat sub p; sub.typ sub t - | Ppat_type s -> iter_loc sub s + | Ppat_type s -> iter_loc_lid sub s | Ppat_lazy p -> sub.pat sub p | Ppat_unpack s -> iter_loc sub s | Ppat_effect (p1,p2) -> sub.pat sub p1; sub.pat sub p2 | Ppat_exception p -> sub.pat sub p | Ppat_extension x -> sub.extension sub x | Ppat_open (lid, p) -> - iter_loc sub lid; sub.pat sub p + iter_loc_lid sub lid; sub.pat sub p end @@ -509,7 +531,7 @@ module CE = struct sub.attributes sub attrs; match desc with | Pcl_constr (lid, tys) -> - iter_loc sub lid; List.iter (sub.typ sub) tys + iter_loc_lid sub lid; List.iter (sub.typ sub) tys | Pcl_structure s -> sub.class_structure sub s | Pcl_fun (_lab, e, p, ce) -> @@ -592,6 +614,7 @@ let default_iterator = type_extension = T.iter_type_extension; type_exception = T.iter_type_exception; extension_constructor = T.iter_extension_constructor; + package_type = T.iter_package_type; value_description = (fun this {pval_name; pval_type; pval_prim = _; pval_loc; pval_attributes} -> @@ -616,7 +639,7 @@ let default_iterator = module_substitution = (fun this {pms_name; pms_manifest; pms_attributes; pms_loc} -> iter_loc this pms_name; - iter_loc this pms_manifest; + iter_loc_lid this pms_manifest; this.location this pms_loc; this.attributes this pms_attributes; ); @@ -645,7 +668,7 @@ let default_iterator = open_description = (fun this {popen_expr; popen_override = _; popen_attributes; popen_loc} -> - iter_loc this popen_expr; + iter_loc_lid this popen_expr; this.location this popen_loc; this.attributes this popen_attributes ); @@ -729,7 +752,10 @@ let default_iterator = directive_argument = (fun this a -> - this.location this a.pdira_loc + this.location this a.pdira_loc; + match a.pdira_desc with + | Pdir_ident lid -> iter_lid this lid + | Pdir_int _ | Pdir_string _ | Pdir_bool _ -> () ); toplevel_directive = diff --git a/parsing/ast_iterator.mli b/parsing/ast_iterator.mli index 6b028891..fb619698 100644 --- a/parsing/ast_iterator.mli +++ b/parsing/ast_iterator.mli @@ -59,6 +59,7 @@ type iterator = { module_type_declaration: iterator -> module_type_declaration -> unit; open_declaration: iterator -> open_declaration -> unit; open_description: iterator -> open_description -> unit; + package_type: iterator -> package_type -> unit; pat: iterator -> pattern -> unit; payload: iterator -> payload -> unit; signature: iterator -> signature -> unit; diff --git a/parsing/ast_mapper.ml b/parsing/ast_mapper.ml index 25512e59..ecf1054f 100644 --- a/parsing/ast_mapper.ml +++ b/parsing/ast_mapper.ml @@ -66,6 +66,7 @@ type mapper = { -> module_type_declaration; open_declaration: mapper -> open_declaration -> open_declaration; open_description: mapper -> open_description -> open_description; + package_type: mapper -> package_type -> package_type; pat: mapper -> pattern -> pattern; payload: mapper -> payload -> payload; signature: mapper -> signature -> signature; @@ -92,6 +93,22 @@ let map_opt f = function None -> None | Some x -> Some (f x) let map_loc sub {loc; txt} = {loc = sub.location sub loc; txt} +let rec map_lid sub lid = + let open Longident in + match lid with + | Lident id -> Lident id + | Ldot (lid, id) -> + let lid = { lid with txt = map_lid sub lid.txt } in + Ldot (map_loc sub lid, map_loc sub id) + | Lapply (lid, lid') -> + let lid = { lid with txt = map_lid sub lid.txt } in + let lid' = { lid' with txt = map_lid sub lid'.txt } in + Lapply(map_loc sub lid, map_loc sub lid') + +let map_loc_lid sub {loc; txt} = + let txt = map_lid sub txt in + map_loc sub {loc; txt} + module C = struct (* Constants *) @@ -147,13 +164,14 @@ module T = struct | Ptyp_var s -> var ~loc ~attrs s | Ptyp_arrow (lab, t1, t2) -> arrow ~loc ~attrs lab (sub.typ sub t1) (sub.typ sub t2) - | Ptyp_tuple tyl -> tuple ~loc ~attrs (List.map (sub.typ sub) tyl) + | Ptyp_tuple tyl -> + tuple ~loc ~attrs (List.map (fun (l, t) -> l, sub.typ sub t) tyl) | Ptyp_constr (lid, tl) -> - constr ~loc ~attrs (map_loc sub lid) (List.map (sub.typ sub) tl) + constr ~loc ~attrs (map_loc_lid sub lid) (List.map (sub.typ sub) tl) | Ptyp_object (l, o) -> object_ ~loc ~attrs (List.map (object_field sub) l) o | Ptyp_class (lid, tl) -> - class_ ~loc ~attrs (map_loc sub lid) (List.map (sub.typ sub) tl) + class_ ~loc ~attrs (map_loc_lid sub lid) (List.map (sub.typ sub) tl) | Ptyp_alias (t, s) -> let s = map_loc sub s in alias ~loc ~attrs (sub.typ sub t) s @@ -161,11 +179,10 @@ module T = struct variant ~loc ~attrs (List.map (row_field sub) rl) b ll | Ptyp_poly (sl, t) -> poly ~loc ~attrs (List.map (map_loc sub) sl) (sub.typ sub t) - | Ptyp_package (lid, l) -> - package ~loc ~attrs (map_loc sub lid) - (List.map (map_tuple (map_loc sub) (sub.typ sub)) l) + | Ptyp_package ptyp -> + package ~loc ~attrs (sub.package_type sub ptyp) | Ptyp_open (mod_ident, t) -> - open_ ~loc ~attrs (map_loc sub mod_ident) (sub.typ sub t) + open_ ~loc ~attrs (map_loc_lid sub mod_ident) (sub.typ sub t) | Ptyp_extension x -> extension ~loc ~attrs (sub.extension sub x) let map_type_declaration sub @@ -207,7 +224,7 @@ module T = struct let loc = sub.location sub ptyext_loc in let attrs = sub.attributes sub ptyext_attributes in Te.mk ~loc ~attrs - (map_loc sub ptyext_path) + (map_loc_lid sub ptyext_path) (List.map (sub.extension_constructor sub) ptyext_constructors) ~params:(List.map (map_fst (sub.typ sub)) ptyext_params) ~priv:ptyext_private @@ -225,7 +242,7 @@ module T = struct map_constructor_arguments sub ctl, map_opt (sub.typ sub) cto) | Pext_rebind li -> - Pext_rebind (map_loc sub li) + Pext_rebind (map_loc_lid sub li) let map_extension_constructor sub {pext_name; @@ -238,6 +255,12 @@ module T = struct (map_loc sub pext_name) (map_extension_constructor_kind sub pext_kind) + let map_package_type sub {ppt_loc; ppt_path; ppt_cstrs; ppt_attrs} = + let loc = sub.location sub ppt_loc in + let attrs = sub.attributes sub ppt_attrs in + Typ.package_type ~loc ~attrs (map_loc_lid sub ppt_path) + (List.map (map_tuple (map_loc_lid sub) (sub.typ sub)) ppt_cstrs) + end module CT = struct @@ -249,7 +272,7 @@ module CT = struct let attrs = sub.attributes sub attrs in match desc with | Pcty_constr (lid, tys) -> - constr ~loc ~attrs (map_loc sub lid) (List.map (sub.typ sub) tys) + constr ~loc ~attrs (map_loc_lid sub lid) (List.map (sub.typ sub) tys) | Pcty_signature x -> signature ~loc ~attrs (sub.class_signature sub x) | Pcty_arrow (lab, t, ct) -> arrow ~loc ~attrs lab (sub.typ sub t) (sub.class_type sub ct) @@ -291,8 +314,8 @@ module MT = struct let loc = sub.location sub loc in let attrs = sub.attributes sub attrs in match desc with - | Pmty_ident s -> ident ~loc ~attrs (map_loc sub s) - | Pmty_alias s -> alias ~loc ~attrs (map_loc sub s) + | Pmty_ident s -> ident ~loc ~attrs (map_loc_lid sub s) + | Pmty_alias s -> alias ~loc ~attrs (map_loc_lid sub s) | Pmty_signature sg -> signature ~loc ~attrs (sub.signature sub sg) | Pmty_functor (param, mt) -> functor_ ~loc ~attrs @@ -306,17 +329,17 @@ module MT = struct let map_with_constraint sub = function | Pwith_type (lid, d) -> - Pwith_type (map_loc sub lid, sub.type_declaration sub d) + Pwith_type (map_loc_lid sub lid, sub.type_declaration sub d) | Pwith_module (lid, lid2) -> - Pwith_module (map_loc sub lid, map_loc sub lid2) + Pwith_module (map_loc_lid sub lid, map_loc_lid sub lid2) | Pwith_modtype (lid, mty) -> - Pwith_modtype (map_loc sub lid, sub.module_type sub mty) + Pwith_modtype (map_loc_lid sub lid, sub.module_type sub mty) | Pwith_typesubst (lid, d) -> - Pwith_typesubst (map_loc sub lid, sub.type_declaration sub d) + Pwith_typesubst (map_loc_lid sub lid, sub.type_declaration sub d) | Pwith_modsubst (s, lid) -> - Pwith_modsubst (map_loc sub s, map_loc sub lid) + Pwith_modsubst (map_loc_lid sub s, map_loc_lid sub lid) | Pwith_modtypesubst (lid, mty) -> - Pwith_modtypesubst (map_loc sub lid, sub.module_type sub mty) + Pwith_modtypesubst (map_loc_lid sub lid, sub.module_type sub mty) let map_signature_item sub {psig_desc = desc; psig_loc = loc} = let open Sig in @@ -356,7 +379,7 @@ module M = struct let loc = sub.location sub loc in let attrs = sub.attributes sub attrs in match desc with - | Pmod_ident x -> ident ~loc ~attrs (map_loc sub x) + | Pmod_ident x -> ident ~loc ~attrs (map_loc_lid sub x) | Pmod_structure str -> structure ~loc ~attrs (sub.structure sub str) | Pmod_functor (param, body) -> functor_ ~loc ~attrs @@ -435,7 +458,7 @@ module E = struct let loc = sub.location sub loc in let attrs = sub.attributes sub attrs in match desc with - | Pexp_ident x -> ident ~loc ~attrs (map_loc sub x) + | Pexp_ident x -> ident ~loc ~attrs (map_loc_lid sub x) | Pexp_constant x -> constant ~loc ~attrs (sub.constant sub x) | Pexp_let (r, vbs, e) -> let_ ~loc ~attrs r (List.map (sub.value_binding sub) vbs) @@ -450,18 +473,20 @@ module E = struct | Pexp_match (e, pel) -> match_ ~loc ~attrs (sub.expr sub e) (sub.cases sub pel) | Pexp_try (e, pel) -> try_ ~loc ~attrs (sub.expr sub e) (sub.cases sub pel) - | Pexp_tuple el -> tuple ~loc ~attrs (List.map (sub.expr sub) el) + | Pexp_tuple el -> + tuple ~loc ~attrs (List.map (fun (l, e) -> l, sub.expr sub e) el) | Pexp_construct (lid, arg) -> - construct ~loc ~attrs (map_loc sub lid) (map_opt (sub.expr sub) arg) + construct ~loc ~attrs (map_loc_lid sub lid) (map_opt (sub.expr sub) arg) | Pexp_variant (lab, eo) -> variant ~loc ~attrs lab (map_opt (sub.expr sub) eo) | Pexp_record (l, eo) -> - record ~loc ~attrs (List.map (map_tuple (map_loc sub) (sub.expr sub)) l) + record ~loc ~attrs + (List.map (map_tuple (map_loc_lid sub) (sub.expr sub)) l) (map_opt (sub.expr sub) eo) | Pexp_field (e, lid) -> - field ~loc ~attrs (sub.expr sub e) (map_loc sub lid) + field ~loc ~attrs (sub.expr sub e) (map_loc_lid sub lid) | Pexp_setfield (e1, lid, e2) -> - setfield ~loc ~attrs (sub.expr sub e1) (map_loc sub lid) + setfield ~loc ~attrs (sub.expr sub e1) (map_loc_lid sub lid) (sub.expr sub e2) | Pexp_array el -> array ~loc ~attrs (List.map (sub.expr sub) el) | Pexp_ifthenelse (e1, e2, e3) -> @@ -481,7 +506,7 @@ module E = struct constraint_ ~loc ~attrs (sub.expr sub e) (sub.typ sub t) | Pexp_send (e, s) -> send ~loc ~attrs (sub.expr sub e) (map_loc sub s) - | Pexp_new lid -> new_ ~loc ~attrs (map_loc sub lid) + | Pexp_new lid -> new_ ~loc ~attrs (map_loc_lid sub lid) | Pexp_setinstvar (s, e) -> setinstvar ~loc ~attrs (map_loc sub s) (sub.expr sub e) | Pexp_override sel -> @@ -501,7 +526,9 @@ module E = struct | Pexp_object cls -> object_ ~loc ~attrs (sub.class_structure sub cls) | Pexp_newtype (s, e) -> newtype ~loc ~attrs (map_loc sub s) (sub.expr sub e) - | Pexp_pack me -> pack ~loc ~attrs (sub.module_expr sub me) + | Pexp_pack (me, optyp) -> + let optyp = Option.map (sub.package_type sub) optyp in + pack ~loc ~attrs (sub.module_expr sub me) optyp | Pexp_open (o, e) -> open_ ~loc ~attrs (sub.open_declaration sub o) (sub.expr sub e) | Pexp_letop {let_; ands; body} -> @@ -534,24 +561,26 @@ module P = struct | Ppat_constant c -> constant ~loc ~attrs (sub.constant sub c) | Ppat_interval (c1, c2) -> interval ~loc ~attrs (sub.constant sub c1) (sub.constant sub c2) - | Ppat_tuple pl -> tuple ~loc ~attrs (List.map (sub.pat sub) pl) + | Ppat_tuple (pl,c) -> + tuple ~loc ~attrs (List.map (fun (l, p) -> l, sub.pat sub p) pl) c | Ppat_construct (l, p) -> - construct ~loc ~attrs (map_loc sub l) + construct ~loc ~attrs (map_loc_lid sub l) (map_opt (fun (vl, p) -> List.map (map_loc sub) vl, sub.pat sub p) p) | Ppat_variant (l, p) -> variant ~loc ~attrs l (map_opt (sub.pat sub) p) | Ppat_record (lpl, cf) -> record ~loc ~attrs - (List.map (map_tuple (map_loc sub) (sub.pat sub)) lpl) cf + (List.map (map_tuple (map_loc_lid sub) (sub.pat sub)) lpl) cf | Ppat_array pl -> array ~loc ~attrs (List.map (sub.pat sub) pl) | Ppat_or (p1, p2) -> or_ ~loc ~attrs (sub.pat sub p1) (sub.pat sub p2) | Ppat_constraint (p, t) -> constraint_ ~loc ~attrs (sub.pat sub p) (sub.typ sub t) - | Ppat_type s -> type_ ~loc ~attrs (map_loc sub s) + | Ppat_type s -> type_ ~loc ~attrs (map_loc_lid sub s) | Ppat_lazy p -> lazy_ ~loc ~attrs (sub.pat sub p) | Ppat_unpack s -> unpack ~loc ~attrs (map_loc sub s) - | Ppat_open (lid,p) -> open_ ~loc ~attrs (map_loc sub lid) (sub.pat sub p) + | Ppat_open (lid,p) -> + open_ ~loc ~attrs (map_loc_lid sub lid) (sub.pat sub p) | Ppat_exception p -> exception_ ~loc ~attrs (sub.pat sub p) | Ppat_effect(p1, p2) -> effect_ ~loc ~attrs (sub.pat sub p1) (sub.pat sub p2) @@ -567,7 +596,7 @@ module CE = struct let attrs = sub.attributes sub attrs in match desc with | Pcl_constr (lid, tys) -> - constr ~loc ~attrs (map_loc sub lid) (List.map (sub.typ sub) tys) + constr ~loc ~attrs (map_loc_lid sub lid) (List.map (sub.typ sub) tys) | Pcl_structure s -> structure ~loc ~attrs (sub.class_structure sub s) | Pcl_fun (lab, e, p, ce) -> @@ -657,6 +686,7 @@ let default_mapper = type_extension = T.map_type_extension; type_exception = T.map_type_exception; extension_constructor = T.map_extension_constructor; + package_type = T.map_package_type; value_description = (fun this {pval_name; pval_type; pval_prim; pval_loc; pval_attributes} -> @@ -685,7 +715,7 @@ let default_mapper = (fun this {pms_name; pms_manifest; pms_attributes; pms_loc} -> Ms.mk (map_loc this pms_name) - (map_loc this pms_manifest) + (map_loc_lid this pms_manifest) ~attrs:(this.attributes this pms_attributes) ~loc:(this.location this pms_loc) ); @@ -717,7 +747,7 @@ let default_mapper = open_description = (fun this {popen_expr; popen_override; popen_attributes; popen_loc} -> - Opn.mk (map_loc this popen_expr) + Opn.mk (map_loc_lid this popen_expr) ~override:popen_override ~loc:(this.location this popen_loc) ~attrs:(this.attributes this popen_attributes) @@ -816,7 +846,10 @@ let default_mapper = directive_argument = (fun this a -> - { pdira_desc= a.pdira_desc + { pdira_desc= begin match a.pdira_desc with + | Pdir_ident lid -> Pdir_ident (map_lid this lid) + | Pdir_int _ | Pdir_bool _ | Pdir_string _ as x -> x + end ; pdira_loc= this.location this a.pdira_loc} ); toplevel_directive = @@ -869,7 +902,7 @@ module PpxContext = struct open Asttypes open Ast_helper - let lid name = { txt = Lident name; loc = Location.none } + let lid name = mknoloc (Lident name) let make_string s = Exp.constant (Const.string s) @@ -881,12 +914,13 @@ module PpxContext = struct let rec make_list f lst = match lst with | x :: rest -> - Exp.construct (lid "::") (Some (Exp.tuple [f x; make_list f rest])) + Exp.construct (lid "::") + (Some (Exp.tuple [None, f x; None, make_list f rest])) | [] -> Exp.construct (lid "[]") None let make_pair f1 f2 (x1, x2) = - Exp.tuple [f1 x1; f2 x2] + Exp.tuple [None, f1 x1; None, f2 x2] let make_option f opt = match opt with @@ -923,7 +957,7 @@ module PpxContext = struct lid "use_vmthreads", make_bool false; lid "recursive_types", make_bool !Clflags.recursive_types; lid "principal", make_bool !Clflags.principal; - lid "transparent_modules", make_bool !Clflags.transparent_modules; + lid "no_alias_deps", make_bool !Clflags.no_alias_deps; lid "unboxed_types", make_bool !Clflags.unboxed_types; lid "unsafe_string", make_bool false; (* kept for compatibility *) get_cookies () @@ -958,7 +992,8 @@ module PpxContext = struct and get_list elem = function | {pexp_desc = Pexp_construct ({txt = Longident.Lident "::"}, - Some {pexp_desc = Pexp_tuple [exp; rest]}) } -> + Some {pexp_desc = Pexp_tuple [None, exp; + None, rest]}) } -> elem exp :: get_list elem rest | {pexp_desc = Pexp_construct ({txt = Longident.Lident "[]"}, None)} -> @@ -966,16 +1001,18 @@ module PpxContext = struct | _ -> raise_errorf "Internal error: invalid [@@@ocaml.ppx.context \ { %s }] list syntax" name and get_pair f1 f2 = function - | {pexp_desc = Pexp_tuple [e1; e2]} -> + | {pexp_desc = Pexp_tuple [None, e1; None, e2]} -> (f1 e1, f2 e2) | _ -> raise_errorf "Internal error: invalid [@@@ocaml.ppx.context \ { %s }] pair syntax" name and get_option elem = function | { pexp_desc = - Pexp_construct ({ txt = Longident.Lident "Some" }, Some exp) } -> + Pexp_construct ({ txt = Longident.Lident "Some" }, + Some exp) } -> Some (elem exp) | { pexp_desc = - Pexp_construct ({ txt = Longident.Lident "None" }, None) } -> + Pexp_construct ({ txt = Longident.Lident "None" }, + None) } -> None | _ -> raise_errorf "Internal error: invalid [@@@ocaml.ppx.context \ { %s }] option syntax" name @@ -1016,8 +1053,8 @@ module PpxContext = struct Clflags.recursive_types := get_bool payload | "principal" -> Clflags.principal := get_bool payload - | "transparent_modules" -> - Clflags.transparent_modules := get_bool payload + | "no_alias_deps" -> + Clflags.no_alias_deps := get_bool payload | "unboxed_types" -> Clflags.unboxed_types := get_bool payload | "cookies" -> diff --git a/parsing/ast_mapper.mli b/parsing/ast_mapper.mli index 541c1f7d..d77e1d6e 100644 --- a/parsing/ast_mapper.mli +++ b/parsing/ast_mapper.mli @@ -92,6 +92,7 @@ type mapper = { -> module_type_declaration; open_declaration: mapper -> open_declaration -> open_declaration; open_description: mapper -> open_description -> open_description; + package_type: mapper -> package_type -> package_type; pat: mapper -> pattern -> pattern; payload: mapper -> payload -> payload; signature: mapper -> signature -> signature; diff --git a/parsing/asttypes.ml b/parsing/asttypes.ml index 0a5e73a4..bf631bf3 100644 --- a/parsing/asttypes.ml +++ b/parsing/asttypes.ml @@ -38,6 +38,8 @@ type private_flag = Private | Public type mutable_flag = Immutable | Mutable +type atomic_flag = Nonatomic | Atomic + type virtual_flag = Virtual | Concrete type override_flag = Override | Fresh @@ -61,6 +63,7 @@ type variance = | Covariant | Contravariant | NoVariance + | Bivariant type injectivity = | Injective diff --git a/parsing/asttypes.mli b/parsing/asttypes.mli index e3cf5ae4..de104b17 100644 --- a/parsing/asttypes.mli +++ b/parsing/asttypes.mli @@ -38,6 +38,8 @@ type private_flag = Private | Public type mutable_flag = Immutable | Mutable +type atomic_flag = Nonatomic | Atomic + type virtual_flag = Virtual | Concrete type override_flag = Override | Fresh @@ -61,6 +63,7 @@ type variance = | Covariant | Contravariant | NoVariance + | Bivariant type injectivity = | Injective diff --git a/parsing/builtin_attributes.ml b/parsing/builtin_attributes.ml index 4d730d30..761a53e9 100644 --- a/parsing/builtin_attributes.ml +++ b/parsing/builtin_attributes.ml @@ -57,6 +57,7 @@ let warn_unused () = misplaced attribute warnings. *) let builtin_attrs = [ "alert" + ; "atomic" ; "boxed" ; "deprecated" ; "deprecated_mutable" @@ -410,3 +411,5 @@ let immediate64 attrs = has_attribute "immediate64" attrs let has_unboxed attrs = has_attribute "unboxed" attrs let has_boxed attrs = has_attribute "boxed" attrs + +let has_atomic attrs = has_attribute "atomic" attrs diff --git a/parsing/builtin_attributes.mli b/parsing/builtin_attributes.mli index 4176bcb9..eae3702c 100644 --- a/parsing/builtin_attributes.mli +++ b/parsing/builtin_attributes.mli @@ -185,3 +185,5 @@ val immediate64: Parsetree.attributes -> bool val has_unboxed: Parsetree.attributes -> bool val has_boxed: Parsetree.attributes -> bool + +val has_atomic: Parsetree.attributes -> bool diff --git a/parsing/depend.ml b/parsing/depend.ml index bed4fd70..d10a56f5 100644 --- a/parsing/depend.ml +++ b/parsing/depend.ml @@ -49,7 +49,7 @@ let rec lookup_free p m = let rec lookup_map lid m = match lid with Lident s -> String.Map.find s m - | Ldot (l, s) -> String.Map.find s (get_map (lookup_map l m)) + | Ldot (l, s) -> String.Map.find s.txt (get_map (lookup_map l.txt m)) | Lapply _ -> raise Not_found let free_structure_names = ref String.Set.empty @@ -65,8 +65,8 @@ let rec add_path bv ?(p=[]) = function (*String.Set.iter (fun s -> Printf.eprintf "%s " s) free; prerr_endline "";*) add_names free - | Ldot(l, s) -> add_path bv ~p:(s::p) l - | Lapply(l1, l2) -> add_path bv l1; add_path bv l2 + | Ldot(l, s) -> add_path bv ~p:(s.txt::p) l.txt + | Lapply(l1, l2) -> add_path bv l1.txt; add_path bv l2.txt let open_module bv lid = match lookup_map lid bv with @@ -78,7 +78,7 @@ let open_module bv lid = let add_parent bv lid = match lid.txt with - Ldot(l, _s) -> add_path bv l + Ldot(l, _s) -> add_path bv l.txt | _ -> () let add = add_parent @@ -98,7 +98,7 @@ let rec add_type bv ty = Ptyp_any -> () | Ptyp_var _ -> () | Ptyp_arrow(_, t1, t2) -> add_type bv t1; add_type bv t2 - | Ptyp_tuple tl -> List.iter (add_type bv) tl + | Ptyp_tuple tl -> List.iter (fun (_, t) -> add_type bv t) tl | Ptyp_constr(c, tl) -> add bv c; List.iter (add_type bv) tl | Ptyp_object (fl, _) -> List.iter @@ -120,9 +120,9 @@ let rec add_type bv ty = add_type bv t | Ptyp_extension e -> handle_extension e -and add_package_type bv (lid, l) = - add bv lid; - List.iter (add_type bv) (List.map (fun (_, e) -> e) l) +and add_package_type bv ptyp = + add bv ptyp.ppt_path; + List.iter (fun (_, ty) -> add_type bv ty) ptyp.ppt_cstrs let add_opt add_fn bv = function None -> () @@ -173,7 +173,7 @@ let rec add_pattern bv pat = | Ppat_alias(p, _) -> add_pattern bv p | Ppat_interval _ | Ppat_constant _ -> () - | Ppat_tuple pl -> List.iter (add_pattern bv) pl + | Ppat_tuple (pl, _) -> List.iter (fun (_, p) -> add_pattern bv p) pl | Ppat_construct(c, opt) -> add bv c; add_opt @@ -214,7 +214,7 @@ let rec add_expr bv exp = add_expr bv e; List.iter (fun (_,e) -> add_expr bv e) el | Pexp_match(e, pel) -> add_expr bv e; add_cases bv pel | Pexp_try(e, pel) -> add_expr bv e; add_cases bv pel - | Pexp_tuple el -> List.iter (add_expr bv) el + | Pexp_tuple el -> List.iter (fun (_, e) -> add_expr bv e) el | Pexp_construct(c, opte) -> add bv c; add_opt add_expr bv opte | Pexp_variant(_, opte) -> add_opt add_expr bv opte | Pexp_record(lblel, opte) -> @@ -255,7 +255,8 @@ let rec add_expr bv exp = | Pexp_object { pcstr_self = pat; pcstr_fields = fieldl } -> let bv = add_pattern bv pat in List.iter (add_class_field bv) fieldl | Pexp_newtype (_, e) -> add_expr bv e - | Pexp_pack m -> add_module_expr bv m + | Pexp_pack (m, opty) -> + add_module_expr bv m; add_opt add_package_type bv opty | Pexp_open (o, e) -> let bv = open_declaration bv o in add_expr bv e @@ -358,7 +359,7 @@ and add_modtype bv mty = and add_module_alias bv l = (* If we are in delayed dependencies mode, we delay the dependencies induced by "Lident s" *) - (if !Clflags.transparent_modules then add_parent else add_module_path) bv l; + (if !Clflags.no_alias_deps then add_parent else add_module_path) bv l; try lookup_map l.txt bv with Not_found -> @@ -570,7 +571,7 @@ and add_struct_item (bv, m) item : _ String.Map.t * _ String.Map.t = List.iter (add_class_type_declaration bv) cdtl; (bv, m) | Pstr_include incl -> let Node (s, m') as n = add_module_binding bv incl.pincl_mod in - if !Clflags.transparent_modules then + if !Clflags.no_alias_deps then add_names s else (* If we are not in the delayed dependency mode, we need to diff --git a/parsing/lexer.mll b/parsing/lexer.mll index d4d069d0..892e1a32 100644 --- a/parsing/lexer.mll +++ b/parsing/lexer.mll @@ -400,7 +400,10 @@ let prepare_error loc = function let msg = "Illegal empty character literal ''" in let sub = [Location.msg - "@{Hint@}: Did you mean ' ' or a type variable 'a?"] in + "@{Hint@}: Did you mean %a or a type variable %a?" + Style.inline_code "' '" + Style.inline_code "'a" + ] in Location.error ~loc ~sub msg | Keyword_as_label kwd -> Location.errorf ~loc @@ -419,7 +422,7 @@ let prepare_error loc = function | Invalid_encoding s -> Location.errorf ~loc "Invalid encoding of identifier %s." s | Invalid_char_in_ident u -> - Location.errorf ~loc "Invalid character U+%X in identifier" + Location.errorf ~loc "Invalid character U+%04X in identifier" (Uchar.to_int u) | Capitalized_raw_identifier lbl -> Location.errorf ~loc @@ -470,7 +473,6 @@ let symbolchar_or_hash = let kwdopchar = ['$' '&' '*' '+' '-' '/' '<' '=' '>' '@' '^' '|'] -let ident = (lowercase | uppercase) identchar* let ident_ext = identstart_ext identchar_ext* let extattrident = ident_ext ('.' ident_ext)* @@ -826,7 +828,7 @@ and comment = parse store_normalized_newline nl; comment lexbuf } - | ident + | ident_ext { store_lexeme lexbuf; comment lexbuf } | _ { store_lexeme lexbuf; comment lexbuf } diff --git a/parsing/location.ml b/parsing/location.ml index 865ca5f2..6da48f9e 100644 --- a/parsing/location.ml +++ b/parsing/location.ml @@ -739,22 +739,15 @@ let batch_mode_printer : report_printer = | Misc.Error_style.Short -> () in - Format.fprintf ppf "@[%a:@ %a@]" print_loc loc + Format.fprintf ppf "%a:@ %a" print_loc loc (Fmt.compat highlight) loc in - let pp_txt ppf txt = Format.fprintf ppf "@[%a@]" Fmt.Doc.format txt in + let pp_txt ppf txt = Format.fprintf ppf "%a" Fmt.Doc.format txt in let pp_footnote ppf f = Option.iter (Format.fprintf ppf "@,%a" pp_txt) f in - let pp self ppf report = - setup_tags (); - separate_new_message ppf; - (* Make sure we keep [num_loc_lines] updated. - The tabulation box is here to give submessage the option - to be aligned with the main message box - *) - print_updating_num_loc_lines ppf (fun ppf () -> - Format.fprintf ppf "@[%a%a%a: %a%a%a%a%a@]@." + let error_format self ppf report = + Format.fprintf ppf "@[%a%a%a: %a@[%a@]%a%a%a@]@." Format.pp_open_tbox () (self.pp_main_loc self report) report.main.loc (self.pp_report_kind self report) report.kind @@ -763,7 +756,30 @@ let batch_mode_printer : report_printer = (self.pp_submsgs self report) report.sub pp_footnote report.footnote Format.pp_close_tbox () - ) () + in + let warning_format self ppf report = + Format.fprintf ppf "@[%a@[%a: %a@]%a%a@]@." + (self.pp_main_loc self report) report.main.loc + (self.pp_report_kind self report) report.kind + (self.pp_main_txt self report) report.main.txt + (self.pp_submsgs self report) report.sub + pp_footnote report.footnote + in + let pp self ppf report = + setup_tags (); + separate_new_message ppf; + let printer ppf () = match report.kind with + | Report_warning _ + | Report_warning_as_error _ + | Report_alert _ | Report_alert_as_error _ -> + warning_format self ppf report + | Report_error -> error_format self ppf report + in + (* Make sure we keep [num_loc_lines] updated. + The tabulation box is here to give submessage the option + to be aligned with the main message box + *) + print_updating_num_loc_lines ppf printer () in let pp_report_kind _self _ ppf = function | Report_error -> Format.fprintf ppf "@{Error@}" @@ -786,9 +802,12 @@ let batch_mode_printer : report_printer = ) msgs in let pp_submsg self report ppf { loc; txt } = - Format.fprintf ppf "@[%a %a@]" - (self.pp_submsg_loc self report) loc - (self.pp_submsg_txt self report) txt + if loc.loc_ghost then + Format.fprintf ppf "@[%a@]" (self.pp_submsg_txt self report) txt + else + Format.fprintf ppf "%a @[%a@]" + (self.pp_submsg_loc self report) loc + (self.pp_submsg_txt self report) txt in let pp_submsg_loc self report ppf loc = if not loc.loc_ghost then @@ -854,6 +873,16 @@ let mkerror loc sub footnote txt = let errorf ?(loc = none) ?(sub = []) ?(footnote=Fun.const None) = Fmt.kdoc_printf (mkerror loc sub footnote) +let aligned_error_hint + ?(loc = none) ?(sub = []) ?(footnote=Fun.const None) fmt = + Fmt.kdoc_printf (fun main hint -> + match hint with + | None -> mkerror loc sub footnote main + | Some hint -> + let main, hint = Misc.align_error_hint ~main ~hint in + mkerror loc (mknoloc hint :: sub) footnote main + ) fmt + let error ?(loc = none) ?(sub = []) ?(footnote=Fun.const None) msg_str = mkerror loc sub footnote Fmt.Doc.(string msg_str empty) @@ -871,11 +900,10 @@ let default_warning_alert_reporter report mk (loc: t) w : report option = match report w with | `Inactive -> None | `Active { Warnings.id; message; is_error; sub_locs } -> - let msg_of_str str = Format_doc.Doc.(empty |> string str) in let kind = mk is_error id in - let main = { loc; txt = msg_of_str message } in + let main = { loc; txt = message } in let sub = List.map (fun (loc, sub_message) -> - { loc; txt = msg_of_str sub_message } + { loc; txt = sub_message } ) sub_locs in Some { kind; main; sub; footnote=None } diff --git a/parsing/location.mli b/parsing/location.mli index 5298386f..7ba15c04 100644 --- a/parsing/location.mli +++ b/parsing/location.mli @@ -26,7 +26,31 @@ type t = Warnings.loc = { loc_start: Lexing.position; loc_end: Lexing.position; loc_ghost: bool; -} + } +(** [t] represents a range of characters in the source code. + + loc_ghost=false whenever the AST described by the location can be parsed + from the location. In all other cases, loc_ghost must be true. Most + locations produced by the parser have loc_ghost=false. + When loc_ghost=true, the location is usually a best effort approximation. + + This info is used by tools like merlin that want to relate source code with + parsetrees or later asts. ocamlprof skips instrumentation of ghost nodes. + + Example: in `let f x = x`, we have: + - a structure item at location "let f x = x" + - a pattern "f" at location "f" + - an expression "fun x -> x" at location "x = x" with loc_ghost=true + - a pattern "x" at location "x" + - an expression "x" at location "x" + In this case, every node has loc_ghost=false, except the node "fun x -> x", + since [Parser.expression (Lexing.from_string "x = x")] would fail to parse. + By contrast, in `let f = fun x -> x`, every node has loc_ghost=false. + + Line directives can modify the filenames and line numbers arbitrarily, + which is orthogonal to loc_ghost, which describes the range of characters + from loc_start.pos_cnum to loc_end.pos_cnum in the parsed string. + *) (** Note on the use of Lexing.position in this module. If [pos_fname = ""], then use [!input_name] instead. @@ -335,6 +359,13 @@ val error: ?loc:t -> ?sub:msg list -> ?footnote:delayed_msg -> string -> error val errorf: ?loc:t -> ?sub:msg list -> ?footnote:delayed_msg -> ('a, Format_doc.formatter, unit, error) format4 -> 'a +val aligned_error_hint: + ?loc:t -> ?sub:msg list -> ?footnote:delayed_msg -> + ('a, Format_doc.formatter, unit, Format_doc.t option -> error) format4 -> 'a +(** [aligned_error_hint ?loc ?sub ?footnote fmt ... aligned_hint] produces an + error report where the potential [aligned_hint] message has been aligned + with the main error message before being added to the list of submessages.*) + val error_of_printer: ?loc:t -> ?sub:msg list -> ?footnote:delayed_msg -> (Format_doc.formatter -> 'a -> unit) -> 'a -> error diff --git a/parsing/longident.ml b/parsing/longident.ml index eaafb02b..588e8e1f 100644 --- a/parsing/longident.ml +++ b/parsing/longident.ml @@ -12,22 +12,41 @@ (* special exception on linking described in the file LICENSE. *) (* *) (**************************************************************************) +open Location type t = Lident of string - | Ldot of t * string - | Lapply of t * t + | Ldot of t loc * string loc + | Lapply of t loc * t loc + + +let rec same t t' = + t == t' + || match t, t' with + | Lident s, Lident s' -> + String.equal s s' + | Ldot ({ txt = t; _ }, { txt = s; _ }), + Ldot ({ txt = t'; _ }, { txt = s'; _ }) -> + if String.equal s s' then + same t t' + else + false + | Lapply ({ txt = tl; _ }, { txt = tr; _ }), + Lapply ({ txt = tl'; _ }, { txt = tr'; _ }) -> + same tl tl' && same tr tr' + | _, _ -> false + let rec flat accu = function Lident s -> s :: accu - | Ldot(lid, s) -> flat (s :: accu) lid + | Ldot({ txt = lid; _ }, { txt = s; _ }) -> flat (s :: accu) lid | Lapply(_, _) -> Misc.fatal_error "Longident.flat" let flatten lid = flat [] lid let last = function Lident s -> s - | Ldot(_, s) -> s + | Ldot(_, s) -> s.txt | Lapply(_, _) -> Misc.fatal_error "Longident.last" @@ -41,7 +60,9 @@ let rec split_at_dots s pos = let unflatten l = match l with | [] -> None - | hd :: tl -> Some (List.fold_left (fun p s -> Ldot(p, s)) (Lident hd) tl) + | hd :: tl -> + Some (List.fold_left (fun p s -> Ldot(mknoloc p, mknoloc s)) + (Lident hd) tl) let parse s = match unflatten (split_at_dots s 0) with diff --git a/parsing/longident.mli b/parsing/longident.mli index 8704a778..168d9000 100644 --- a/parsing/longident.mli +++ b/parsing/longident.mli @@ -23,10 +23,16 @@ *) +open Location + type t = Lident of string - | Ldot of t * string - | Lapply of t * t + | Ldot of t loc * string loc + | Lapply of t loc * t loc + +(** [same t t'] compares the longidents [t] and [t'] without taking locations + into account. *) +val same: t -> t -> bool val flatten: t -> string list val unflatten: string list -> t option diff --git a/parsing/parse.ml b/parsing/parse.ml index 2ef1392c..2f1067a7 100644 --- a/parsing/parse.ml +++ b/parsing/parse.ml @@ -119,11 +119,11 @@ let prepare_error err = | Unclosed(opening_loc, opening, closing_loc, closing) -> Location.errorf ~loc:closing_loc + "Syntax error: %a expected" Style.inline_code closing ~sub:[ Location.msg ~loc:opening_loc "This %a might be unmatched" Style.inline_code opening ] - "Syntax error: %a expected" Style.inline_code closing | Expecting (loc, nonterm) -> Location.errorf ~loc "Syntax error: %a expected." @@ -167,12 +167,18 @@ let prepare_error err = Location.errorf ~loc "Syntax error: invalid package type: %a" invalid ipt | Removed_string_set loc -> Location.errorf ~loc - "Syntax error: strings are immutable, there is no assignment \ - syntax for them.\n\ - @{Hint@}: Mutable sequences of bytes are available in \ - the Bytes module.\n\ - @{Hint@}: Did you mean to use %a?" - Style.inline_code "Bytes.set" + "Syntax error: strings are immutable,@ there@ is@ no@ assignment@ \ + syntax@ for@ them." + ~sub:[ + Location.msg + "@{Hint@}: Mutable sequences of bytes are available in \ + the %a module." + Style.inline_code "Bytes"; + Location.msg + "@{Hint@}: Did you mean to use %a?" + Style.inline_code "Bytes.set" + ] + let () = Location.register_error_of_exn (function diff --git a/parsing/parser.mly b/parsing/parser.mly index 84597d96..ee05cfae 100644 --- a/parsing/parser.mly +++ b/parsing/parser.mly @@ -50,8 +50,8 @@ let ghost_loc (startpos, endpos) = { } let mktyp ~loc ?attrs d = Typ.mk ~loc:(make_loc loc) ?attrs d -let mkpat ~loc d = Pat.mk ~loc:(make_loc loc) d -let mkexp ~loc d = Exp.mk ~loc:(make_loc loc) d +let mkpat ~loc ?attrs d = Pat.mk ~loc:(make_loc loc) ?attrs d +let mkexp ~loc ?attrs d = Exp.mk ~loc:(make_loc loc) ?attrs d let mkmty ~loc ?attrs d = Mty.mk ~loc:(make_loc loc) ?attrs d let mksig ~loc d = Sig.mk ~loc:(make_loc loc) d let mkmod ~loc ?attrs d = Mod.mk ~loc:(make_loc loc) ?attrs d @@ -95,6 +95,8 @@ let mkcf ~loc ?attrs ?docs d = let mkrhs rhs loc = mkloc rhs (make_loc loc) let ghrhs rhs loc = mkloc rhs (ghost_loc loc) +let ldot lid lid_loc name loc = Ldot (mkrhs lid lid_loc, mkrhs name loc) + let push_loc x acc = if x.Location.loc_ghost then acc @@ -106,7 +108,7 @@ let reloc_pat ~loc x = let reloc_exp ~loc x = { x with pexp_loc = make_loc loc; pexp_loc_stack = push_loc x.pexp_loc x.pexp_loc_stack } -let reloc_typ ~loc x = +let _reloc_typ ~loc x = { x with ptyp_loc = make_loc loc; ptyp_loc_stack = push_loc x.ptyp_loc x.ptyp_loc_stack } @@ -120,25 +122,14 @@ let mkpatvar ~loc name = mkpat ~loc (Ppat_var (mkrhs name loc)) (* - Ghost expressions and patterns: - expressions and patterns that do not appear explicitly in the - source file they have the loc_ghost flag set to true. - Then the profiler will not try to instrument them and the - -annot option will not try to display their type. + See ./location.mli for when to use a ghost location or not. Every grammar rule that generates an element with a location must make at most one non-ghost element, the topmost one. - - How to tell whether your location must be ghost: - A location corresponds to a range of characters in the source file. - If the location contains a piece of code that is syntactically - valid (according to the documentation), and corresponds to the - AST node, then the location must be real; in all other cases, - it must be ghost. *) -let ghexp ~loc d = Exp.mk ~loc:(ghost_loc loc) d -let ghpat ~loc d = Pat.mk ~loc:(ghost_loc loc) d -let ghtyp ~loc d = Typ.mk ~loc:(ghost_loc loc) d +let ghexp ~loc ?attrs d = Exp.mk ~loc:(ghost_loc loc) ?attrs d +let ghpat ~loc ?attrs d = Pat.mk ~loc:(ghost_loc loc) ?attrs d +let ghtyp ~loc ?attrs d = Typ.mk ~loc:(ghost_loc loc) ?attrs d let ghloc ~loc d = { txt = d; loc = ghost_loc loc } let ghstr ~loc d = Str.mk ~loc:(ghost_loc loc) d let ghsig ~loc d = Sig.mk ~loc:(ghost_loc loc) d @@ -209,7 +200,9 @@ let rec mktailexp nilloc = let open Location in function | e1 :: el -> let exp_el, el_loc = mktailexp nilloc el in let loc = (e1.pexp_loc.loc_start, snd el_loc) in - let arg = ghexp ~loc (Pexp_tuple [e1; ghexp ~loc:el_loc exp_el]) in + let arg = + ghexp ~loc (Pexp_tuple [None, e1; None, ghexp ~loc:el_loc exp_el]) + in ghexp_cons_desc loc arg, loc let rec mktailpat nilloc = let open Location in function @@ -219,7 +212,10 @@ let rec mktailpat nilloc = let open Location in function | p1 :: pl -> let pat_pl, el_loc = mktailpat nilloc pl in let loc = (p1.ppat_loc.loc_start, snd el_loc) in - let arg = ghpat ~loc (Ppat_tuple [p1; ghpat ~loc:el_loc pat_pl]) in + let arg = + ghpat ~loc + (Ppat_tuple ([None, p1; None, ghpat ~loc:el_loc pat_pl], Closed)) + in ghpat_cons_desc loc arg, loc let mkstrexp e attrs = @@ -319,9 +315,12 @@ type ('dot,'index) array_family = { } -let bigarray_untuplify = function - { pexp_desc = Pexp_tuple explist; pexp_loc = _ } -> explist - | exp -> [exp] +let bigarray_untuplify exp = + match exp.pexp_desc with + | Pexp_tuple explist + when List.for_all (fun (l, _) -> Option.is_none l) explist -> + List.map snd explist + | _ -> [exp] let builtin_arraylike_name loc _ ~assign paren_kind n = let opname = if assign then "set" else "get" in @@ -337,8 +336,8 @@ let builtin_arraylike_name loc _ ~assign paren_kind n = | Two -> "Array2" | Three -> "Array3" | Many -> "Genarray" in - Ldot(Lident "Bigarray", submodule_name) in - ghloc ~loc (Ldot(prefix,opname)) + Ldot(mknoloc (Lident "Bigarray"), mknoloc submodule_name) in + ghloc ~loc (Ldot(mknoloc prefix, mknoloc opname)) let builtin_arraylike_index loc paren_kind index = match paren_kind with | Paren | Bracket -> One, [Nolabel, index] @@ -368,7 +367,7 @@ let user_indexing_operator_name loc (prefix,ext) ~assign paren_kind n = String.concat "" ["."; ext; left; mid; right; assign] in let lid = match prefix with | None -> Lident name - | Some p -> Ldot(p,name) in + | Some p -> Ldot(mknoloc p,mknoloc name) in ghloc ~loc lid let user_index loc _ index = @@ -397,9 +396,9 @@ let indexop_unclosed_error loc_s s loc_e = let left, right = paren_to_strings s in unclosed left loc_s right loc_e -let lapply ~loc p1 p2 = +let lapply ~loc p1 loc_p1 p2 loc_p2 = if !Clflags.applicative_functors - then Lapply(p1, p2) + then Lapply(mkrhs p1 loc_p1, mkrhs p2 loc_p2) else raise (Syntaxerr.Error( Syntaxerr.Applicative_path (make_loc loc))) @@ -437,33 +436,28 @@ let wrap_type_annotation ~loc newtypes core_type body = let exp = mk_newtypes newtypes exp in (exp, ghtyp(Ptyp_poly(newtypes, Typ.varify_constructors newtypes core_type))) -let wrap_exp_attrs ~loc body (ext, attrs) = - let ghexp = ghexp ~loc in +let pexp_extension ~id e = Pexp_extension (id, PStr [mkstrexp e []]) + +let mkexp_attrs ~loc desc (ext, attrs) = (* todo: keep exact location for the entire attribute *) - let body = {body with pexp_attributes = attrs @ body.pexp_attributes} in match ext with - | None -> body - | Some id -> ghexp(Pexp_extension (id, PStr [mkstrexp body []])) - -let mkexp_attrs ~loc d attrs = - wrap_exp_attrs ~loc (mkexp ~loc d) attrs + | None -> mkexp ~loc ~attrs desc + | Some id -> + mkexp ~loc (pexp_extension ~id (ghexp ~loc ~attrs desc)) -let wrap_typ_attrs ~loc typ (ext, attrs) = +let mktyp_attrs ~loc desc (ext, attrs) = (* todo: keep exact location for the entire attribute *) - let typ = {typ with ptyp_attributes = attrs @ typ.ptyp_attributes} in match ext with - | None -> typ - | Some id -> ghtyp ~loc (Ptyp_extension (id, PTyp typ)) + | None -> mktyp ~loc ~attrs desc + | Some id -> + mktyp ~loc (Ptyp_extension (id, PTyp (ghtyp ~loc ~attrs desc))) -let wrap_pat_attrs ~loc pat (ext, attrs) = +let mkpat_attrs ~loc desc (ext, attrs) = (* todo: keep exact location for the entire attribute *) - let pat = {pat with ppat_attributes = attrs @ pat.ppat_attributes} in match ext with - | None -> pat - | Some id -> ghpat ~loc (Ppat_extension (id, PPat (pat, None))) - -let mkpat_attrs ~loc d attrs = - wrap_pat_attrs ~loc (mkpat ~loc d) attrs + | None -> mkpat ~loc ~attrs desc + | Some id -> + mkpat ~loc (Ppat_extension (id, PPat (ghpat ~loc ~attrs desc, None))) let wrap_class_attrs ~loc:_ body attrs = {body with pcl_attributes = attrs @ body.pcl_attributes} @@ -472,21 +466,15 @@ let wrap_mod_attrs ~loc:_ attrs body = let wrap_mty_attrs ~loc:_ attrs body = {body with pmty_attributes = attrs @ body.pmty_attributes} -let wrap_str_ext ~loc body ext = - match ext with - | None -> body - | Some id -> ghstr ~loc (Pstr_extension ((id, PStr [body]), [])) - let wrap_mkstr_ext ~loc (item, ext) = - wrap_str_ext ~loc (mkstr ~loc item) ext - -let wrap_sig_ext ~loc body ext = match ext with - | None -> body - | Some id -> ghsig ~loc (Psig_extension ((id, PSig [body]), [])) + | None -> mkstr ~loc item + | Some id -> mkstr ~loc (Pstr_extension ((id, PStr [ghstr ~loc item]), [])) let wrap_mksig_ext ~loc (item, ext) = - wrap_sig_ext ~loc (mksig ~loc item) ext + match ext with + | None -> mksig ~loc item + | Some id -> mksig ~loc (Psig_extension ((id, PSig [ghsig ~loc item]), [])) let mk_quotedext ~loc (id, idloc, str, strloc, delim) = let exp_id = mkloc id idloc in @@ -899,7 +887,7 @@ The precedences must be listed from low to high. %nonassoc AS %left BAR /* pattern (p|p|p) */ %nonassoc below_COMMA -%left COMMA /* expr/expr_comma_list (e,e,e) */ +%left COMMA /* expr/labeled_tuple (e,e,e) */ %right MINUSGREATER /* function_type (t -> t -> t) */ %right OR BARBAR /* expr (e || e || e) */ %right AMPERSAND AMPERAMPER /* expr (e && e && e) */ @@ -2175,8 +2163,8 @@ class_signature: class_self_type: LPAREN core_type RPAREN { $2 } - | mktyp((* empty *) { Ptyp_any }) - { $1 } + | (* empty *) + { ghtyp ~loc:$sloc Ptyp_any } ; %inline class_sig_fields: flatten(text_csig(class_sig_field)*) @@ -2339,9 +2327,7 @@ fun_seq_expr: { Pexp_sequence($1, $3) }) { $1 } | fun_expr SEMI PERCENT attr_id seq_expr - { let seq = mkexp ~loc:$sloc (Pexp_sequence ($1, $5)) in - let payload = PStr [mkstrexp seq []] in - mkexp ~loc:$sloc (Pexp_extension ($4, payload)) } + { mkexp_attrs ~loc:$sloc (Pexp_sequence ($1, $5)) (Some $4, []) } ; seq_expr: | or_function(fun_seq_expr) { $1 } @@ -2433,7 +2419,8 @@ fun_expr: let let_ = {pbop_op; pbop_pat; pbop_exp; pbop_loc} in mkexp ~loc:$sloc (Pexp_letop{ let_; ands; body}) } | fun_expr COLONCOLON expr - { mkexp_cons ~loc:$sloc $loc($2) (ghexp ~loc:$sloc (Pexp_tuple[$1;$3])) } + { mkexp_cons ~loc:$sloc $loc($2) + (ghexp ~loc:$sloc (Pexp_tuple[None,$1;None,$3])) } | mkrhs(label) LESSMINUS expr { mkexp ~loc:$sloc (Pexp_setinstvar($1, $3)) } | simple_expr DOT mkrhs(label_longident) LESSMINUS expr @@ -2496,7 +2483,7 @@ fun_expr: %inline expr_: | simple_expr nonempty_llist(labeled_simple_expr) { Pexp_apply($1, $2) } - | expr_comma_list %prec below_COMMA + | labeled_tuple %prec below_COMMA { Pexp_tuple($1) } | mkrhs(constr_longident) simple_expr %prec below_HASH { Pexp_construct($1, Some $2) } @@ -2540,9 +2527,9 @@ simple_expr: | NEW ext_attributes mkrhs(class_longident) { Pexp_new($3), $2 } | LPAREN MODULE ext_attributes module_expr RPAREN - { Pexp_pack $4, $3 } - | LPAREN MODULE ext_attributes module_expr COLON package_type RPAREN - { Pexp_constraint (ghexp ~loc:$sloc (Pexp_pack $4), $6), $3 } + { Pexp_pack ($4, None), $3 } + | LPAREN MODULE ext_attributes module_expr COLON package_type_ RPAREN + { Pexp_pack ($4, Some $6), $3 } | LPAREN MODULE ext_attributes module_expr COLON error { unclosed "(" $loc($1) ")" $loc($6) } | OBJECT ext_attributes class_structure END @@ -2562,11 +2549,9 @@ simple_expr: *) %inline metaocaml_expr: | METAOCAML_ESCAPE e = simple_expr - { wrap_exp_attrs ~loc:$sloc e - (Some (mknoloc "metaocaml.escape"), []) } + { mkexp ~loc:$sloc (pexp_extension ~id:(mknoloc "metaocaml.escape") e) } | METAOCAML_BRACKET_OPEN e = seq_expr METAOCAML_BRACKET_CLOSE - { wrap_exp_attrs ~loc:$sloc e - (Some (mknoloc "metaocaml.bracket"),[]) } + { mkexp ~loc:$sloc (pexp_extension ~id:(mknoloc "metaocaml.bracket") e) } ; %inline simple_expr_: @@ -2648,10 +2633,10 @@ simple_expr: LBRACKET expr_semi_list error { unclosed "[" $loc($3) "]" $loc($5) } | od=open_dot_declaration DOT LPAREN MODULE ext_attributes module_expr COLON - package_type RPAREN + ptyp = package_type_ RPAREN { let modexp = mkexp_attrs ~loc:($startpos($3), $endpos) - (Pexp_constraint (ghexp ~loc:$sloc (Pexp_pack $6), $8)) $5 in + (Pexp_pack ($6, Some ptyp)) $5 in Pexp_open(od, modexp) } | mod_longident DOT LPAREN MODULE ext_attributes module_expr COLON error @@ -2828,9 +2813,84 @@ fun_param_as_list: fun_params: | nonempty_concat(fun_param_as_list) { $1 } ; -%inline expr_comma_list: - es = separated_nontrivial_llist(COMMA, expr) - { es } + +(* Parsing labeled tuple expressions: + + The grammar we want to parse is something like: + + labeled_tuple_element := expr | ~x:expr | ~x | ~(x:ty) + labeled_tuple := lt_element [, lt_element]+ + + (The last case of [labeled_tuple_element] is a punned label with a type + constraint, which is allowed for functions, so we allow it here). + + So you might think [labeled_tuple] could therefore just be: + + labeled_tuple : + separated_nontrivial_llist(COMMA, labeled_tuple_element) + + But this doesn't work: + + - If we don't mark [labeled_tuple_element] %inline, this causes many + reduce/reduce conflicts (basically just ambiguities) because + [labeled_tuple_element] trivially reduces to [expr]. + + - If we do mark [labeled_tuple_element] %inline, it is not allowed to have + %prec annotations. Menhir doesn't permit these on %inline non-terminals + that are used in non-tail position. + + To get around this, we do mark it inlined, and then because we can only use + it in tail position it is _manually_ inlined into the occurrences in + [separated_nontrivial_llist] where it doesn't appear in tail position. This + results in [labeled_tuple] and [reversed_labeled_tuple_body] below. So the + latter is just a list of comma-separated labeled tuple elements, with length + at least two, where the first element in the base case is inlined (resulting + in one base case for each case of [labeled_tuple_element]. *) +%inline labeled_tuple_element : + | expr + { None, $1 } + | LABEL simple_expr %prec below_HASH + { Some $1, $2 } + | TILDE label = LIDENT + { let loc = $loc(label) in + Some label, mkexpvar ~loc label } + | TILDE LPAREN label = LIDENT c = type_constraint RPAREN %prec below_HASH + { Some label, + mkexp_constraint ~loc:($startpos($2), $endpos) + (mkexpvar ~loc:$loc(label) label) c } +; +reversed_labeled_tuple_body: + (* > 2 elements *) + xs = reversed_labeled_tuple_body + COMMA + x = labeled_tuple_element + { x :: xs } + (* base cases (2 elements) *) +| x1 = expr + COMMA + x2 = labeled_tuple_element + { [ x2; None, x1 ] } +| l1 = LABEL x1 = simple_expr + COMMA + x2 = labeled_tuple_element + { [ x2; Some l1, x1 ] } +| TILDE l1 = LIDENT + COMMA + x2 = labeled_tuple_element + { let loc = $loc(l1) in + [ x2; Some l1, mkexpvar ~loc l1] } +| TILDE LPAREN l1 = LIDENT c = type_constraint RPAREN + COMMA + x2 = labeled_tuple_element + { let x1 = + mkexp_constraint ~loc:($startpos($2), $endpos) + (mkexpvar ~loc:$loc(l1) l1) c + in + [ x2; Some l1, x1] } +; +%inline labeled_tuple: + xs = rev(reversed_labeled_tuple_body) + { xs } ; record_expr_content: eo = ioption(terminated(simple_expr, WITH)) @@ -2917,7 +2977,8 @@ pattern_no_exn: %inline pattern_(self): | self COLONCOLON pattern - { mkpat_cons ~loc:$sloc $loc($2) (ghpat ~loc:$sloc (Ppat_tuple[$1;$3])) } + { mkpat_cons ~loc:$sloc $loc($2) + (ghpat ~loc:$sloc (Ppat_tuple ([None, $1; None, $3], Closed))) } | self attribute { Pat.attr $1 $2 } | pattern_gen @@ -2927,8 +2988,8 @@ pattern_no_exn: { Ppat_alias($1, $3) } | self AS error { expecting $loc($3) "identifier" } - | pattern_comma_list(self) %prec below_COMMA - { Ppat_tuple(List.rev $1) } + | labeled_tuple_pattern(self) + { $1 } | self COLONCOLON error { expecting $loc($3) "pattern" } | self BAR pattern @@ -3034,10 +3095,66 @@ simple_delimited_pattern: { unclosed "[|" $loc($1) "|]" $loc($3) } ) { $1 } -pattern_comma_list(self): - pattern_comma_list(self) COMMA pattern { $3 :: $1 } - | self COMMA pattern { [$3; $1] } - | self COMMA error { expecting $loc($3) "pattern" } +(* Parsing labeled tuple patterns: + + Here we play essentially the same game we did for expressions - see the + comment beginning "Parsing labeled tuple expressions". + + One difference is that we would need to manually inline the definition of + individual elements in two places: Once in the base case for lists 2 or more + elements, and once in the special case for open patterns with just one + element (e.g., [~x, ..]). Rather than manually inlining + [labeled_tuple_pat_element] twice, we simply define it twice: once with the + [%prec] annotations needed for its occurrences in tail position, and once + without them suitable for use in other locations. +*) +%inline labeled_tuple_pat_element(self): + | self { None, $1 } + | LABEL simple_pattern %prec COMMA + { Some $1, $2 } + | TILDE label = LIDENT + { let loc = $loc(label) in + Some label, mkpatvar ~loc label } + | TILDE LPAREN label = LIDENT COLON cty = core_type RPAREN %prec COMMA + { let lbl_loc = $loc(label) in + let pat_loc = $startpos($2), $endpos in + let pat = mkpatvar ~loc:lbl_loc label in + Some label, mkpat ~loc:pat_loc (Ppat_constraint(pat, cty)) } +; +(* If changing this, don't forget to change its copy just above. *) +%inline labeled_tuple_pat_element_noprec(self): + | self { None, $1 } + | LABEL simple_pattern + { Some $1, $2 } + | TILDE label = LIDENT + { let loc = $loc(label) in + Some label, mkpatvar ~loc label } + | TILDE LPAREN label = LIDENT COLON cty = core_type RPAREN + { let lbl_loc = $loc(label) in + let pat_loc = $startpos($2), $endpos in + let pat = mkpatvar ~loc:lbl_loc label in + Some label, mkpat ~loc:pat_loc (Ppat_constraint(pat, cty)) } +; +labeled_tuple_pat_element_list(self): + | labeled_tuple_pat_element_list(self) COMMA labeled_tuple_pat_element(self) + { $3 :: $1 } + | labeled_tuple_pat_element_noprec(self) COMMA labeled_tuple_pat_element(self) + { [ $3; $1 ] } + | self COMMA error + { expecting $loc($3) "pattern" } +; +reversed_labeled_tuple_pattern(self): + | labeled_tuple_pat_element_list(self) %prec below_COMMA + { Closed, $1 } + | labeled_tuple_pat_element_list(self) COMMA DOTDOT + { Open, $1 } + | labeled_tuple_pat_element_noprec(self) COMMA DOTDOT + { Open, [ $1 ] } +; +labeled_tuple_pattern(self): + | reversed_labeled_tuple_pattern(self) + { let closed, pat = $1 in + Ppat_tuple(List.rev pat, closed) } ; %inline pattern_semi_list: ps = separated_or_terminated_nonempty_list(SEMI, pattern) @@ -3247,10 +3364,16 @@ type_variance: | INFIXOP2 { if $1 = "+!" then Covariant, Injective else if $1 = "-!" then Contravariant, Injective else + if $1 = "+-" then Bivariant, NoInjectivity else + if $1 = "-+" then Bivariant, NoInjectivity else + if $1 = "+-!" then Bivariant, Injective else + if $1 = "-+!" then Bivariant, Injective else expecting $loc($1) "type_variance" } | PREFIXOP { if $1 = "!+" then Covariant, Injective else if $1 = "!-" then Contravariant, Injective else + if $1 = "!+-" then Bivariant, Injective else + if $1 = "!-+" then Bivariant, Injective else expecting $loc($1) "type_variance" } ; @@ -3302,7 +3425,7 @@ str_exception_declaration: attrs = post_item_attributes { let loc = make_loc $sloc in let docs = symbol_docs $sloc in - Te.mk_exception ~attrs + Te.mk_exception ~attrs ~loc (Te.rebind id lid ~attrs:(attrs1 @ attrs2) ~loc ~docs) , ext } ; @@ -3317,7 +3440,7 @@ sig_exception_declaration: { let vars, args, res = vars_args_res in let loc = make_loc ($startpos, $endpos(attrs2)) in let docs = symbol_docs $sloc in - Te.mk_exception ~attrs + Te.mk_exception ~attrs ~loc (Te.decl id ~vars ~args ?res ~attrs:(attrs1 @ attrs2) ~loc ~docs) , ext } ; @@ -3390,7 +3513,8 @@ label_declaration_semi: attrs2 = post_item_attributes { let docs = symbol_docs $sloc in let attrs = attrs1 @ attrs2 in - Te.mk tid cs ~params ~priv ~attrs ~docs, + let loc = make_loc $sloc in + Te.mk tid cs ~params ~priv ~attrs ~docs ~loc, ext } ; %inline extension_constructor(opening): @@ -3537,6 +3661,34 @@ function_type: { Ptyp_arrow(label, domain, codomain) } ) { $1 } + (* The next two cases are for labled tuples - see comment on [tuple_type] + below. + + The first case is present just to resolve a shift/reduce conflict in a + module type [S with t := x:t1 * t2 -> ...] which might be the beginning of + [S with t := x:t1 * t2 -> S'] or [S with t := x:t1 * t2 -> t3] + It is the same as the previous case, but with [arg_label] specialized to + [LIDENT COLON] and the domain type specialized to [proper_tuple_type]. + Apparently, this is sufficient for menhir to be able to delay a decision + about which of the above module type cases we are in. *) + | mktyp( + label = LIDENT COLON + tuple = proper_tuple_type + MINUSGREATER + codomain = function_type + { let ty, ltys = tuple in + let tuple_loc = $loc(tuple) in + let domain = + mktyp ~loc:tuple_loc (Ptyp_tuple ((None, ty) :: ltys)) + in + let domain = extra_rhs_core_type domain ~pos:(snd tuple_loc) in + Ptyp_arrow(Labelled label, domain, codomain) } + ) + { $1 } + | label = LIDENT COLON proper_tuple_type %prec MINUSGREATER + { let ty, ltys = $3 in + mktyp ~loc:$sloc (Ptyp_tuple ((Some label, ty) :: ltys)) + } ; %inline arg_label: | label = optlabel @@ -3550,16 +3702,33 @@ function_type: - atomic types (see below); - proper tuple types: int * int * int list A proper tuple type is a star-separated list of at least two atomic types. - *) + Tuple components can also be labeled, as an [int * int list * y:bool]. + + However, the special case of labeled tuples where the first element has a + label is not parsed as a proper_tuple_type, but rather as a case of + function_type above. This resolves ambiguities around [x:t1 * t2 -> t3] + which must continue to parse as a function with one labeled argument even in + the presence of labled tuples. +*) tuple_type: | ty = atomic_type %prec below_HASH { ty } - | mktyp( - tys = separated_nontrivial_llist(STAR, atomic_type) - { Ptyp_tuple tys } - ) - { $1 } + | proper_tuple_type %prec below_WITH + { let ty, ltys = $1 in + mktyp ~loc:$sloc (Ptyp_tuple ((None, ty) :: ltys)) } +; +%inline proper_tuple_type: + | ty = atomic_type + STAR + ltys = separated_nonempty_llist(STAR, labeled_tuple_typ_element) + { ty, ltys } +; +%inline labeled_tuple_typ_element : + | atomic_type %prec STAR + { None, $1 } + | label = LIDENT COLON ty = atomic_type %prec STAR + { Some label, ty } ; (* Atomic types are the most basic level in the syntax of types. @@ -3596,8 +3765,8 @@ tuple_type: delimited_type_supporting_local_open: | LPAREN type_ = core_type RPAREN { type_ } - | LPAREN MODULE attrs = ext_attributes package_type = package_type RPAREN - { wrap_typ_attrs ~loc:$sloc (reloc_typ ~loc:$sloc package_type) attrs } + | LPAREN MODULE ext_attrs = ext_attributes package_type = package_type_ RPAREN + { mktyp_attrs ~loc:$sloc (Ptyp_package package_type) ext_attrs } | mktyp( LBRACKET field = tag_field RBRACKET { Ptyp_variant([ field ], Closed, None) } @@ -3687,10 +3856,12 @@ atomic_type: { tys } ; -%inline package_type: module_type +%inline package_type_: module_type { let (lid, cstrs, attrs) = package_type_of_module_type $1 in - let descr = Ptyp_package (lid, cstrs) in - mktyp ~loc:$sloc ~attrs descr } + Typ.package_type ~loc:(make_loc $sloc) ~attrs lid cstrs } + +%inline package_type: package_type_ + { mktyp ~loc:$sloc (Ptyp_package $1) } ; %inline row_field_list: separated_nonempty_llist(BAR, row_field) @@ -3861,13 +4032,13 @@ constr_ident: ; constr_longident: mod_longident %prec below_DOT { $1 } /* A.B.x vs (A).B.x */ - | mod_longident DOT constr_extra_ident { Ldot($1,$3) } + | mod_longident DOT constr_extra_ident { ldot $1 $loc($1) $3 $loc($3) } | constr_extra_ident { Lident $1 } | constr_extra_nonprefix_ident { Lident $1 } ; mk_longident(prefix,final): | final { Lident $1 } - | prefix DOT final { Ldot($1,$3) } + | prefix DOT final { ldot $1 $loc($1) $3 $loc($3) } ; val_longident: mk_longident(mod_longident, val_ident) { $1 } @@ -3884,7 +4055,7 @@ mod_longident: mod_ext_longident: mk_longident(mod_ext_longident, UIDENT) { $1 } | mod_ext_longident LPAREN mod_ext_longident RPAREN - { lapply ~loc:$sloc $1 $3 } + { lapply ~loc:$sloc $1 $loc($1) $3 $loc($3) } | mod_ext_longident LPAREN error { expecting $loc($3) "module path" } ; @@ -4043,6 +4214,7 @@ single_attr_id: | DO { "do" } | DONE { "done" } | DOWNTO { "downto" } + | EFFECT { "effect" } | ELSE { "else" } | END { "end" } | EXCEPTION { "exception" } diff --git a/parsing/parsetree.mli b/parsing/parsetree.mli index e22a9a78..fcf5287f 100644 --- a/parsing/parsetree.mli +++ b/parsing/parsetree.mli @@ -101,9 +101,14 @@ and core_type_desc = - [?l:T1 -> T2] when [lbl] is {{!Asttypes.arg_label.Optional}[Optional]}. *) - | Ptyp_tuple of core_type list - (** [Ptyp_tuple([T1 ; ... ; Tn])] - represents a product type [T1 * ... * Tn]. + | Ptyp_tuple of (string option * core_type) list + (** [Ptyp_tuple(tl)] represents a product type: + - [T1 * ... * Tn] + when [tl] is [(None, T1); ...; (None, Tn)] + - [L1:T1 * ... * Ln:Tn] + when [tl] is [(Some L1, T1); ...; (Some Ln, Tn)] + - A mix, e.g., [L1:T1 * T2] + when [tl] is [(Some L1, T1); (None, T2)] Invariant: [n >= 2]. *) @@ -174,10 +179,16 @@ and core_type_desc = | Ptyp_open of Longident.t loc * core_type (** [M.(T)] *) | Ptyp_extension of extension (** [[%id]]. *) -and package_type = Longident.t loc * (Longident.t loc * core_type) list +and package_type = + { + ppt_path: Longident.t loc; + ppt_cstrs: (Longident.t loc * core_type) list; + ppt_loc: Location.t; + ppt_attrs: attributes; + } (** As {!package_type} typed values: - - [(S, [])] represents [(module S)], - - [(S, [(t1, T1) ; ... ; (tn, Tn)])] + - [{ppt_path: S; ppt_cstrs: []}] represents [(module S)], + - [{ppt_path: S; ppt_cstrs: [(t1, T1) ; ... ; (tn, Tn)]}] represents [(module S with type t1 = T1 and ... and tn = Tn)]. *) @@ -234,11 +245,22 @@ and pattern_desc = Other forms of interval are recognized by the parser but rejected by the type-checker. *) - | Ppat_tuple of pattern list - (** Patterns [(P1, ..., Pn)]. - - Invariant: [n >= 2] - *) + | Ppat_tuple of (string option * pattern) list * Asttypes.closed_flag + (** [Ppat_tuple(pl, Closed)] represents + - [(P1, ..., Pn)] + when [pl] is [(None, P1); ...; (None, Pn)] + - [(~L1:P1, ..., ~Ln:Pn)] + when [pl] is [(Some L1, P1); ...; (Some Ln, Pn)] + - A mix, e.g. [(~L1:P1, P2)] + when [pl] is [(Some L1, P1); (None, P2)] + + [Ppat_tuple(pl, Open)] is similar, but indicates the pattern + additionally ends in a [..]. + + Invariant: + - If Closed, [n >= 2]. + - If Open, [n >= 1]. + *) | Ppat_construct of Longident.t loc * (string loc list * pattern) option (** [Ppat_construct(C, args)] represents: - [C] when [args] is [None], @@ -315,8 +337,9 @@ and expression_desc = [C] represents a type constraint or coercion placed immediately before the arrow, e.g. [fun P1 ... Pn : ty -> ...] when [C = Some (Pconstraint ty)]. - A function must have parameters. [Pexp_function (params, _, body)] must - have non-empty [params] or a [Pfunction_cases _] body. + A function must have parameters: in [Pexp_function (params, _, body)], + if [params] does not contain a [Pparam_val _], [body] must be + [Pfunction_cases _]. *) | Pexp_apply of expression * (arg_label * expression) list (** [Pexp_apply(E0, [(l1, E1) ; ... ; (ln, En)])] @@ -333,8 +356,14 @@ and expression_desc = (** [match E0 with P1 -> E1 | ... | Pn -> En] *) | Pexp_try of expression * case list (** [try E0 with P1 -> E1 | ... | Pn -> En] *) - | Pexp_tuple of expression list - (** Expressions [(E1, ..., En)] + | Pexp_tuple of (string option * expression) list + (** [Pexp_tuple(el)] represents + - [(E1, ..., En)] + when [el] is [(None, E1); ...; (None, En)] + - [(~L1:E1, ..., ~Ln:En)] + when [el] is [(Some L1, E1); ...; (Some Ln, En)] + - A mix, e.g., [(~L1:E1, E2)] + when [el] is [(Some L1, E1); (None, E2)] Invariant: [n >= 2] *) @@ -400,11 +429,8 @@ and expression_desc = values). *) | Pexp_object of class_structure (** [object ... end] *) | Pexp_newtype of string loc * expression (** [fun (type t) -> E] *) - | Pexp_pack of module_expr - (** [(module ME)]. - - [(module ME : S)] is represented as - [Pexp_constraint(Pexp_pack ME, Ptyp_package S)] *) + | Pexp_pack of module_expr * package_type option + (** [(module ME)] or [(module ME : S)]. *) | Pexp_open of open_declaration * expression (** - [M.(E)] - [let open M in E] diff --git a/parsing/pprintast.ml b/parsing/pprintast.ml index 48d96c8f..bbaf5b16 100644 --- a/parsing/pprintast.ml +++ b/parsing/pprintast.ml @@ -168,11 +168,11 @@ module Doc = struct let rec any_longident ~kind f = function | Lident s -> ident_of_name ~kind f s | Ldot(y,s) -> - protect_longident ~kind f (any_longident ~kind:Other) y s + protect_longident ~kind f (any_longident ~kind:Other) y.txt s.txt | Lapply (y,s) -> Format_doc.fprintf f "%a(%a)" - (any_longident ~kind:Other) y - (any_longident ~kind:Other) s + (any_longident ~kind:Other) y.txt + (any_longident ~kind:Other) s.txt let value_longident ppf l = any_longident ~kind:Other ppf l let longident = value_longident @@ -248,6 +248,7 @@ let type_variance = function | NoVariance -> "" | Covariant -> "+" | Contravariant -> "-" + | Bivariant -> "+-" let type_injectivity = function | NoInjectivity -> "" @@ -276,7 +277,7 @@ let view_expr x = (List.rev acc,true) | {pexp_desc= Pexp_construct ({txt=Lident "::";_}, - Some ({pexp_desc= Pexp_tuple([e1;e2]); + Some ({pexp_desc= Pexp_tuple([None, e1; None, e2]); pexp_attributes = []})); pexp_attributes = []} -> @@ -439,12 +440,20 @@ and core_type ctxt f x = sl (core_type ctxt) ct | _ -> pp f "@[<2>%a@]" (core_type1 ctxt) x +and tuple_type_component ctxt f (label, ty) = + begin match label with + | None -> () + | Some s -> pp f "%s:" s + end; + core_type1 ctxt f ty + and core_type1 ctxt f x = if x.ptyp_attributes <> [] then core_type ctxt f x else match x.ptyp_desc with | Ptyp_any -> pp f "_"; | Ptyp_var s -> tyvar f s; - | Ptyp_tuple l -> pp f "(%a)" (list (core_type1 ctxt) ~sep:"@;*@;") l + | Ptyp_tuple l -> + pp f "(%a)" (list (tuple_type_component ctxt) ~sep:"@;*@;") l | Ptyp_constr (li, l) -> pp f (* "%a%a@;" *) "%a%a" (fun f l -> match l with @@ -506,23 +515,25 @@ and core_type1 ctxt f x = pp f "@[%a#%a@]" (list (core_type ctxt) ~sep:"," ~first:"(" ~last:")") l (with_loc type_longident) li - | Ptyp_package (lid, cstrs) -> - let aux f (s, ct) = - pp f "type %a@ =@ %a" - (with_loc type_longident) s - (core_type ctxt) ct in - (match cstrs with - |[] -> pp f "@[(module@ %a)@]" (with_loc type_longident) lid - |_ -> - pp f "@[(module@ %a@ with@ %a)@]" - (with_loc type_longident) lid - (list aux ~sep:"@ and@ ") cstrs) + | Ptyp_package pck_ty -> + pp f "@[(module@ %a)@]" (package_type ctxt) pck_ty | Ptyp_open(li, ct) -> pp f "@[%a.(%a)@]" value_longident_loc li (core_type ctxt) ct | Ptyp_extension e -> extension ctxt f e | (Ptyp_arrow _ | Ptyp_alias _ | Ptyp_poly _) -> paren true (core_type ctxt) f x +and package_type ctxt f ptyp = + let aux f (s, ct) = + pp f "type %a@ =@ %a" (with_loc type_longident) s (core_type ctxt) ct + in + match ptyp.ppt_cstrs with + | [] -> with_loc type_longident f ptyp.ppt_path + | _ -> + pp f "%a@ with@ %a" + (with_loc type_longident) ptyp.ppt_path + (list aux ~sep:"@ and@ ") ptyp.ppt_cstrs + (********************pattern********************) (* be cautious when use [pattern], [pattern1] is preferred *) and pattern ctxt f x = @@ -548,39 +559,52 @@ and pattern_or ctxt f x = pp f "@[%a@]" (list ~sep:"@ | " (pattern1 ctxt)) orpats and pattern1 ctxt (f:Format.formatter) (x:pattern) : unit = - let rec pattern_list_helper f = function - | {ppat_desc = - Ppat_construct - ({ txt = Lident("::") ;_}, - Some ([], {ppat_desc = Ppat_tuple([pat1; pat2]);_})); - ppat_attributes = []} - - -> - pp f "%a::%a" (simple_pattern ctxt) pat1 pattern_list_helper pat2 (*RA*) - | p -> pattern1 ctxt f p - in if x.ppat_attributes <> [] then pattern ctxt f x else match x.ppat_desc with | Ppat_variant (l, Some p) -> pp f "@[<2>`%a@;%a@]" ident_of_name l (simple_pattern ctxt) p | Ppat_construct (({txt=Lident("()"|"[]"|"true"|"false");_}), _) -> simple_pattern ctxt f x - | Ppat_construct (({txt;_} as li), po) -> + | Ppat_construct ({txt=Lident("::");_}, Some ([], + {ppat_desc = Ppat_tuple([None, pat1; None, pat2], Closed);_})) -> + (* Right associative*) + pp f "%a::%a" (simple_pattern ctxt) pat1 (pattern1 ctxt) pat2 + | Ppat_construct (li, po) -> (* FIXME The third field always false *) - if txt = Lident "::" then - pp f "%a" pattern_list_helper x - else - (match po with - | Some ([], x) -> - (* [true] and [false] are handled above *) - pp f "%a@;%a" value_longident_loc li (simple_pattern ctxt) x - | Some (vl, x) -> - pp f "%a@ (type %a)@;%a" value_longident_loc li - (list ~sep:"@ " ident_of_name_loc) vl - (simple_pattern ctxt) x - | None -> pp f "%a" value_longident_loc li) + (match po with + | Some ([], x) -> + (* [true] and [false] are handled above *) + pp f "%a@;%a" value_longident_loc li (simple_pattern ctxt) x + | Some (vl, x) -> + pp f "%a@ (type %a)@;%a" value_longident_loc li + (list ~sep:"@ " ident_of_name_loc) vl + (simple_pattern ctxt) x + | None -> pp f "%a" value_longident_loc li) | _ -> simple_pattern ctxt f x +and tuple_pattern_component ctxt (f:Format.formatter) (label, x) : unit = + let simple_name = match x with + | {ppat_desc = Ppat_var { txt=s; _ }; ppat_attributes = []; _} -> Some s + | _ -> None + in + match label, simple_name with + (* Labeled component can be represented with pun *) + | Some lbl, Some simple_name when String.equal simple_name lbl -> + pp f "~%s" lbl + (* Labeled component general case *) + | Some lbl, _ -> pp f "~%s:%a" lbl (pattern1 ctxt) x + (* Unlabeled component *) + | None, _ -> pattern1 ctxt f x + +and tuple_pattern ctxt f l closed = + let closed_flag ppf = function + | Closed -> () + | Open -> pp ppf ",@;.." + in + pp f "@[<1>(%a%a)@]" + (list ~sep:",@;" (tuple_pattern_component ctxt)) l + closed_flag closed + and simple_pattern ctxt (f:Format.formatter) (x:pattern) : unit = if x.ppat_attributes <> [] then pattern ctxt f x else match x.ppat_desc with @@ -613,8 +637,7 @@ and simple_pattern ctxt (f:Format.formatter) (x:pattern) : unit = | _ -> pp f "@[<2>{@;%a;_}@]" (list longident_x_pattern ~sep:";@;") l end - | Ppat_tuple l -> - pp f "@[<1>(%a)@]" (list ~sep:",@;" (pattern1 ctxt)) l (* level1*) + | Ppat_tuple (l,c) -> tuple_pattern ctxt f l c | Ppat_constant (c) -> pp f "%a" constant c | Ppat_interval (c1, c2) -> pp f "%a..%a" constant c1 constant c2 | Ppat_variant (l,None) -> pp f "`%a" ident_of_name l @@ -689,7 +712,8 @@ and sugar_expr ctxt f e = match id, List.map snd args with | Lident "!", [e] -> pp f "@[!%a@]" (simple_expr ctxt) e; true - | Ldot (path, ("get"|"set" as func)), a :: other_args -> begin + | Ldot ({txt=path;_}, {txt=("get"|"set" as func);_}), a :: other_args -> + begin let assign = func = "set" in let print = print_indexop a None assign in match path, other_args with @@ -697,18 +721,20 @@ and sugar_expr ctxt f e = print ".(" "" ")" (expression ctxt) [i] rest | Lident "String", i :: rest -> print ".[" "" "]" (expression ctxt) [i] rest - | Ldot (Lident "Bigarray", "Array1"), i1 :: rest -> + | Ldot ({txt=Lident "Bigarray";_}, {txt="Array1";_}), i1 :: rest -> print ".{" "," "}" (simple_expr ctxt) [i1] rest - | Ldot (Lident "Bigarray", "Array2"), i1 :: i2 :: rest -> + | Ldot ({txt=Lident "Bigarray";_}, {txt="Array2";_}), + i1 :: i2 :: rest -> print ".{" "," "}" (simple_expr ctxt) [i1; i2] rest - | Ldot (Lident "Bigarray", "Array3"), i1 :: i2 :: i3 :: rest -> + | Ldot ({txt=Lident "Bigarray";_}, {txt="Array3";_}), + i1 :: i2 :: i3 :: rest -> print ".{" "," "}" (simple_expr ctxt) [i1; i2; i3] rest - | Ldot (Lident "Bigarray", "Genarray"), + | Ldot ({txt=Lident "Bigarray";_}, {txt="Genarray";_}), {pexp_desc = Pexp_array indexes; pexp_attributes = []} :: rest -> print ".{" "," "}" (simple_expr ctxt) indexes rest | _ -> false end - | (Lident s | Ldot(_,s)) , a :: i :: rest + | (Lident s | Ldot(_,{txt=s;_})) , a :: i :: rest when first_is '.' s -> (* extract operator: assignment operators end with [right_bracket ^ "<-"], @@ -730,7 +756,7 @@ and sugar_expr ctxt f e = | '}' -> '{', "}" | _ -> assert false in let path_prefix = match id with - | Ldot(m,_) -> Some m + | Ldot(m,_) -> Some m.txt | _ -> None in let left = String.sub s 0 (1+String.index s left) in print_indexop a path_prefix assign left ";" right @@ -976,10 +1002,12 @@ and simple_expr ctxt f x = (* |`Normal -> longident_loc f li *) (* | `Prefix _ | `Infix _ -> pp f "( %a )" longident_loc li) *) | Pexp_constant c -> constant f c; - | Pexp_pack me -> - pp f "(module@;%a)" (module_expr ctxt) me + | Pexp_pack (me, opty) -> + pp f "(module@;%a" (module_expr ctxt) me; + Option.iter (pp f " :@ %a" (package_type ctxt)) opty; + pp f ")" | Pexp_tuple l -> - pp f "@[(%a)@]" (list (simple_expr ctxt) ~sep:",@;") l + pp f "@[(%a)@]" (list (tuple_expr_component ctxt) ~sep:",@;") l | Pexp_constraint (e, ct) -> pp f "(%a : %a)" (expression ctxt) e (core_type ctxt) ct | Pexp_coerce (e, cto1, ct) -> @@ -991,7 +1019,7 @@ and simple_expr ctxt f x = let longident_x_expression f ( li, e) = match e with | {pexp_desc=Pexp_ident {txt;_}; - pexp_attributes=[]; _} when li.txt = txt -> + pexp_attributes=[]; _} when Longident.same li.txt txt -> pp f "@[%a@]" value_longident_loc li | _ -> pp f "@[%a@;=@;%a@]" @@ -1819,6 +1847,19 @@ and label_x_expression_param ctxt f (l,e) = else pp f "~%a:%a" ident_of_name lbl (simple_expr ctxt) e +and tuple_expr_component ctxt f (l,e) = + let simple_name = match e with + | {pexp_desc=Pexp_ident {txt=Lident l;_}; pexp_attributes=[]} -> Some l + | _ -> None + in match (simple_name, l) with + (* Labeled component can be represented with pun *) + | Some simple_name, Some lbl when String.equal simple_name lbl -> + pp f "~%s" lbl + (* Labeled component general case *) + | _, Some lbl -> pp f "~%s:%a" lbl (simple_expr ctxt) e + (* Unlabeled component *) + | _, None -> expression2 ctxt f e + and directive_argument f x = match x.pdira_desc with | Pdir_string (s) -> pp f "@ %S" s diff --git a/parsing/printast.ml b/parsing/printast.ml index 17f28836..2fb0cf4f 100644 --- a/parsing/printast.ml +++ b/parsing/printast.ml @@ -38,9 +38,9 @@ let fmt_location f loc = let rec fmt_longident_aux f x = match x with | Longident.Lident (s) -> fprintf f "%s" s - | Longident.Ldot (y, s) -> fprintf f "%a.%s" fmt_longident_aux y s + | Longident.Ldot (y, s) -> fprintf f "%a.%s" fmt_longident_aux y.txt s.txt | Longident.Lapply (y, z) -> - fprintf f "%a(%a)" fmt_longident_aux y fmt_longident_aux z + fprintf f "%a(%a)" fmt_longident_aux y.txt fmt_longident_aux z.txt let fmt_longident f x = fprintf f "\"%a\"" fmt_longident_aux x @@ -135,6 +135,10 @@ let arg_label i ppf = function let typevars ppf vs = List.iter (fun x -> fprintf ppf " %a" Pprintast.tyvar x.txt) vs +let labeled_tuple_element f i ppf (l, ct) = + option i string ppf l; + f i ppf ct + let rec core_type i ppf x = line i ppf "core_type %a\n" fmt_location x.ptyp_loc; attributes i ppf x.ptyp_attributes; @@ -149,7 +153,7 @@ let rec core_type i ppf x = core_type i ppf ct2; | Ptyp_tuple l -> line i ppf "Ptyp_tuple\n"; - list i core_type ppf l; + list i (labeled_tuple_element core_type) ppf l; | Ptyp_constr (li, l) -> line i ppf "Ptyp_constr %a\n" fmt_longident_loc li; list i core_type ppf l; @@ -179,9 +183,9 @@ let rec core_type i ppf x = | Ptyp_poly (sl, ct) -> line i ppf "Ptyp_poly%a\n" typevars sl; core_type i ppf ct; - | Ptyp_package (s, l) -> - line i ppf "Ptyp_package %a\n" fmt_longident_loc s; - list i package_with ppf l; + | Ptyp_package ptyp -> + line i ppf "Ptyp_package\n"; + package_type i ppf ptyp; | Ptyp_open (mod_ident, t) -> line i ppf "Ptyp_open \"%a\"\n" fmt_longident_loc mod_ident; core_type i ppf t @@ -189,6 +193,12 @@ let rec core_type i ppf x = line i ppf "Ptyp_extension \"%s\"\n" s.txt; payload i ppf arg +and package_type i ppf ptyp = + let i = i + 1 in + line i ppf "package_type %a\n" fmt_longident_loc ptyp.ppt_path; + list i package_with ppf ptyp.ppt_cstrs; + attributes i ppf ptyp.ppt_attrs + and package_with i ppf (s, t) = line i ppf "with type %a\n" fmt_longident_loc s; core_type i ppf t @@ -210,9 +220,9 @@ and pattern i ppf x = line i ppf "Ppat_interval\n"; fmt_constant i ppf c1; fmt_constant i ppf c2; - | Ppat_tuple (l) -> - line i ppf "Ppat_tuple\n"; - list i pattern ppf l; + | Ppat_tuple (l, c) -> + line i ppf "Ppat_tuple\n %a\n" fmt_closed_flag c; + list i (labeled_tuple_element pattern) ppf l; | Ppat_construct (li, po) -> line i ppf "Ppat_construct %a\n" fmt_longident_loc li; option i @@ -291,7 +301,7 @@ and expression i ppf x = list i case ppf l; | Pexp_tuple (l) -> line i ppf "Pexp_tuple\n"; - list i expression ppf l; + list i (labeled_tuple_element expression) ppf l; | Pexp_construct (li, eo) -> line i ppf "Pexp_construct %a\n" fmt_longident_loc li; option i expression ppf eo; @@ -376,9 +386,10 @@ and expression i ppf x = | Pexp_newtype (s, e) -> line i ppf "Pexp_newtype \"%s\"\n" s.txt; expression i ppf e - | Pexp_pack me -> + | Pexp_pack (me, optyp) -> line i ppf "Pexp_pack\n"; - module_expr i ppf me + module_expr i ppf me; + option i package_type ppf optyp | Pexp_open (o, e) -> line i ppf "Pexp_open %a\n" fmt_override_flag o.popen_override; module_expr i ppf o.popen_expr; diff --git a/parsing/printast.mli b/parsing/printast.mli index 5bc49618..87b87a56 100644 --- a/parsing/printast.mli +++ b/parsing/printast.mli @@ -27,6 +27,7 @@ val interface : formatter -> signature_item list -> unit val implementation : formatter -> structure_item list -> unit val top_phrase : formatter -> toplevel_phrase -> unit +val pattern: int -> formatter -> pattern -> unit val expression: int -> formatter -> expression -> unit val structure: int -> formatter -> structure -> unit val payload: int -> formatter -> payload -> unit diff --git a/parsing/unit_info.mli b/parsing/unit_info.mli index 04002b25..4117d243 100644 --- a/parsing/unit_info.mli +++ b/parsing/unit_info.mli @@ -37,7 +37,7 @@ val normalize: string -> string (** [lax_modname_from_source filename] is [modulize stem] where [stem] is the basename of the filename [filename] stripped from all its extensions. - For instance, [modname_from_source "/pa.th/x.ml.pp"] is ["X"]. *) + For instance, [lax_modname_from_source "/pa.th/x.ml.pp"] is ["X"]. *) val lax_modname_from_source: filename -> modname (** Same as {!lax_modname_from_source} but raises an {!error.Invalid_encoding} @@ -84,8 +84,8 @@ val kind: t -> intf_or_impl val check_unit_name : t -> unit (** [make ~check ~source_file kind prefix] associates both the - [source_file] and the module name {!modname_from_source}[ target_prefix] to - the prefix filesystem path [prefix]. + [source_file] and the module name {!lax_modname_from_source}[ target_prefix] + to the prefix filesystem path [prefix]. If [check_modname=true], this function emits a warning if the derived module name is not valid according to {!check_unit_name}. @@ -116,7 +116,8 @@ module Artifact: sig val modname: t -> modname (** [from_filename filename] reconstructs the module name - [modname_from_source filename] associated to the artifact [filename]. *) + [lax_modname_from_source filename] associated to the artifact + [filename]. *) val from_filename: filename -> t end diff --git a/release-info/calendar.md b/release-info/calendar.md index f0fae921..32b85c89 100644 --- a/release-info/calendar.md +++ b/release-info/calendar.md @@ -8,25 +8,32 @@ accident if this prospective calendar ever matches the real release calendar. # Main versions +(Last updated on 29th September 2025) -## OCaml 5.3.0 -(Last updated on 29th May 2024) +## OCaml 5.4.0 -| Phase | Expected (early) | Expected (late) | Actual | -|-----------------------|------------------|-----------------|---------------| -| Feature freeze | 15 August 2024 | (same) | | -| 1st beta release | 10th September | 15th October | 31st October | -| 1st release candidate | 1st October | 7th November | | -| Release | 7th October | 21st November | | +| Release | Expected (early) | Expected (late) | Actual | +|-----------------------|------------------|-----------------|--------------| +| Feature freeze | 15th April 2025 | (same) | | +| 1st beta release | 15th May | 15th June | 22nd July | +| 1st release candidate | 15th June | 15th July | 29 September | +| Release | 21st June | 1st August | | -## OCaml 5.4.0 +## OCaml 5.3.0 -| Release | Expected (early) | Expected (late) | Actual | -|-----------------------|------------------|------------------|-------------| -| Release | April 2025 | May 2025 | | +| Phase | Expected (early) | Expected (late) | Actual | +|-----------------------|------------------|-----------------|------------------| +| Feature freeze | 15 August 2024 | (same) | 25 August 2024 | +| 1st beta release | 10th September | 15th October | 7th November | +| 1st release candidate | 1st October | 7th November | 18th December | +| Release | 7th October | 21st November | 8 January 2025 | # LTS version ## OCaml 4.14.3 -- release: after July 2024 + +| Phase | Expected (early) | Expected (late) | Actual | +|-----------------------|------------------|-----------------|------------------| +| 1st release candidate | 2 May | 22 May | | +| Release | 9 May | 1 June | | diff --git a/release-info/howto.md b/release-info/howto.md index 3b67474a..4b4395f2 100644 --- a/release-info/howto.md +++ b/release-info/howto.md @@ -18,9 +18,9 @@ Send a mail on caml-devel to warn Gabriel (to make a pass on Changes; see the "Changes curation" appendix for more details) and the OCamlLabs folks (for OPAM testing). -## 0: release environment setup +## 0. Release environment setup -``` +```sh rm -f /tmp/env-$USER.sh cat >/tmp/env-$USER.sh < 4.07.0+dev9-2018-06-26 # for production releases: check and change the Changes header # (remove "next version" and add a date) -make -B configure +tools/autogen git commit -a -m "last commit before tagging $VERSION" # update build-aux/ocaml_version.m4 with the new release; for example, # 4.07.0+dev9-2018-06-26 => 4.07.0+rc2 # Update ocaml-variants.opam with new version. -make -B configure +tools/autogen # For a production release make coreboot -j5 make coreboot -j5 # must say "Fixpoint reached, bootstrap succeeded." @@ -144,29 +144,29 @@ git tag -m "release $VERSION" $TAGVERSION # for testing candidates, use N+dev(D+2) instead; for example, # 4.07.0+rc2 => 4.07.0+dev10-2018-06-26 # Revert ocaml-variants.opam to its "trunk" version. -make -B configure +tools/autogen git commit -m "increment version number after tagging $VERSION" build-aux/ocaml_version.m4 VERSION configure ocaml-variants.opam git push git push --tags ``` -## 5-bis: Alternative for branching +## 5-bis. Alternative for branching This needs to be more tested, tread with care. -``` +```sh # at this point, the build-aux/ocaml_version.m4 file contains N+devD # increment it into N+dev(D+1); for example, # 4.07.0+dev0-2018-06-19 => 4.07.0+dev1-2018-06-26 # Rename the "Working version" header in Changes # to "OCaml $BRANCH" -make -B configure +tools/autogen git commit -a -m "last commit before branching $BRANCH" git branch $BRANCH # update build-aux/ocaml_version.m4 with the new future branch, # 4.07.0+dev1-2018-06-26 => 4.08.0+dev0-2018-06-30 # Update ocaml-variants.opam with new version. -make -B configure +tools/autogen # Add a "Working version" section" to Changes # Add common subsections in Changes, see Changelog. git commit -m "first commit after branching $BRANCH" -a @@ -176,7 +176,7 @@ git push git checkout $BRANCH # increment VERSION, for instance # 4.07.0+dev1-2018-06-26 => 4.07.0+dev2-2018-06-30 -make -B configure +tools/autogen git commit -m "first commit on branch $BRANCH" -a git push --set-upstream origin $BRANCH ``` @@ -188,32 +188,32 @@ Go to and add a rule for protecting the new branch (copy the rights from the previous version) -## 5.1: create the release on github (only for a production release) +## 5.1. create the release on github (only for a production release) open https://github.com/ocaml/ocaml/releases # and click "Draft a new release" # for a minor release, the description is: Bug fixes. See [detailed list of changes](https://github.com/ocaml/ocaml/blob/$MAJOR.$MINOR/Changes). -## 5.3: Inria CI (for a new release branch) +## 5.3. Inria CI (for a new release branch) Add the new release branch to the Inria CI list. Remove the oldest branch from this list. -## 5.4 new badge in README.adoc (for a new release branch) +## 5.4. New badge in README.adoc (for a new release branch) Add a badge for the new branch in README.adoc. Remove the oldest badge. -## 6: create OPAM packages +## 6. Create OPAM packages Clone the opam-repository -``` +```sh git clone https://github.com/ocaml/opam-repository ``` Create a branch for the new release -``` +```sh git checkout -b OCaml_$VERSION ``` @@ -243,7 +243,7 @@ request. You can test the new opam package before sending a PR to the main opam-repository by using the local repository: -``` +```sh opam repo add local /path/to/your/opam-repository opam switch create --repo=local,beta=git+https://github.com/ocaml/ocaml-beta-repository.git ocaml-variants.$VERSION ``` @@ -252,7 +252,7 @@ The switch should build. For a production release, you also need to create new opam files for the ocaml-manual and ocaml-src packages. -## 6.1 Update OPAM dev packages after branching +## 6.1. Update OPAM dev packages after branching Create a new ocaml/ocaml.$NEXT/opam file. Copy the opam dev files from ocaml-variants/ocaml-variants.$VERSION+trunk* @@ -265,9 +265,9 @@ The "src" field should point to The synopsis should be "latest $VERSION development(,...)". -## 7: build the release archives +## 7. Build the release archives -``` +```sh cd $WORKTREE TMPDIR=/tmp/ocaml-release git checkout $TAGVERSION @@ -279,16 +279,16 @@ gzip -9 ocaml-$VERSION.tar.gz xz ocaml-$VERSION.tar.xz ``` -## 8: upload the archives and compute checksums +## 8. Upload the archives and compute checksums For the first beta of a major version, create the distribution directory on the server: -``` +```sh ssh $ARCHIVE_HOST "mkdir -p $DIST" ``` Upload the archives: -``` +```sh scp ocaml-$VERSION.tar.{xz,gz} $ARCHIVE_HOST:$DIST ``` @@ -296,13 +296,13 @@ To update the checksum files on the remote host, we first upload the release environment. (note: this assumes the user name is the same on the two machines) -``` +```sh scp /tmp/env-$USER.sh $ARCHIVE_HOST:/tmp/env-$USER.sh ``` and then login there to update the checksums (MD5SUM, SHA512SUM) -``` +```sh ssh $ARCHIVE_HOST source /tmp/env-$USER.sh cd $DIST @@ -326,9 +326,9 @@ exit ``` -## 9: update note files (technical documentation) +## 9. Update note files (technical documentation) -``` +```sh ssh $ARCHIVE_HOST "mkdir -p $DIST/notes" cd ocaml-$VERSION scp INSTALL.adoc LICENSE README.adoc README.win32.adoc Changes \ @@ -336,13 +336,13 @@ scp INSTALL.adoc LICENSE README.adoc README.win32.adoc Changes \ ``` -## 10: upload the reference manual +## 10. Upload the reference manual You don't need to do this if the previous release had the same $MAJOR.$MINOR ($BRANCH) value and the exact same manual -- this is frequent if it was a release candidate. -``` +```sh cd $WORKTREE make cd manual @@ -363,7 +363,7 @@ ssh $ARCHIVE_HOST "cd $DIST; sha512sum ocaml-$BRANCH-refman* >>SHA512SUM" Releasing the manual online happens on another machine: Do this ONLY FOR A PRODUCTION RELEASE -``` +```sh scp /tmp/env-$USER.sh $ARCHIVE_HOST:/tmp/env-$USER.sh ssh $ARCHIVE_HOST source /tmp/env-$USER.sh @@ -386,7 +386,7 @@ ln -sf manual-ocaml-$BRANCH manual-ocaml ``` -## 11: prepare web announce for the release +## 11. Prepare web announce for the release For production releases, you should get in touch with ocaml.org to organize the webpage for the new release. See @@ -394,11 +394,23 @@ organize the webpage for the new release. See -## 13: announce the release on caml-list, caml-announce, and discuss.ocaml.org +## 12. Announce the release on caml-list, caml-announce, and discuss.ocaml.org See the email announce templates in the `templates/` directory. +## 13. External tools + +Try to propagate the new compiler to external open source tools + +### Godbold CE (https://godbolt.org) + +- Send a PR to both https://github.com/compiler-explorer/infra + and https://github.com/compiler-explorer/compiler-explorer + +See https://github.com/compiler-explorer/compiler-explorer/pull/6735 +and https://github.com/compiler-explorer/infra/pull/1359 as examples. +This should be expanded, once we have more experince with the process # Appendix @@ -406,9 +418,9 @@ See the email announce templates in the `templates/` directory. See -- templates/beta.md for alpha and beta releases -- templates/rc.md for release candidate -- templates/production.md for the production release +- [templates/beta.md](templates/beta.md) for alpha and beta releases +- [templates/rc.md](templates/rc.md) for release candidate +- [templates/production.md](templates/production.md) for the production release ## Changelog template for a new version diff --git a/release-info/introduction.md b/release-info/introduction.md index b2499603..2847b132 100644 --- a/release-info/introduction.md +++ b/release-info/introduction.md @@ -156,9 +156,9 @@ User feedback is welcome on which fixes from OCaml 5 should be also included in 4.14. Once OCaml 5 is stabilized, this extended support of OCaml 4.14 will stop. -Currently, we expect to support OCaml 4.14 until OCaml 5.4 (around April 2025). +Currently, we expect to support OCaml 4.14 until at least OCaml 5.5 (around January 2026). # How are new versions of OCaml released? -The release process is documented in [the release howto](https://github.com/ocaml/ocaml/release-info/howto.md) +The release process is documented at [howto.md](howto.md). diff --git a/runtime/addrmap.c b/runtime/addrmap.c index 9a3ef7bc..a60ea7ae 100644 --- a/runtime/addrmap.c +++ b/runtime/addrmap.c @@ -30,7 +30,7 @@ Caml_inline uintnat pos_initial(struct addrmap* t, value key) return pos & (t->size - 1); } -Caml_inline uintnat pos_next(struct addrmap* t, uintnat pos) +Caml_inline uintnat pos_next(const struct addrmap* t, uintnat pos) { return (pos + 1) & (t->size - 1); } diff --git a/runtime/afl.c b/runtime/afl.c index d5673f28..8d56ad18 100644 --- a/runtime/afl.c +++ b/runtime/afl.c @@ -85,7 +85,7 @@ static uint32_t afl_read(void) CAMLexport value caml_setup_afl(value unit) { - char* shm_id_str; + const char* shm_id_str; char* shm_id_end; long int shm_id; uint32_t startup_msg = 0; diff --git a/runtime/alloc.c b/runtime/alloc.c index d7a08a8e..7522f4b3 100644 --- a/runtime/alloc.c +++ b/runtime/alloc.c @@ -278,101 +278,6 @@ CAMLexport int caml_convert_flag_list(value list, const int *flags) return res; } -/* For compiling let rec over values */ - -/* [size] is a [value] representing number of words (fields) */ -CAMLprim value caml_alloc_dummy(value size) -{ - mlsize_t wosize = Long_val(size); - return caml_alloc (wosize, 0); -} - -/* [size] is a [value] representing number of words (fields) */ -CAMLprim value caml_alloc_dummy_function(value size,value arity) -{ - /* the arity argument is used by the js_of_ocaml runtime */ - return caml_alloc_dummy(size); -} - -/* [size] is a [value] representing number of floats. */ -CAMLprim value caml_alloc_dummy_float (value size) -{ - mlsize_t wosize = Long_val(size) * Double_wosize; - return caml_alloc (wosize, 0); -} - -CAMLprim value caml_alloc_dummy_infix(value vsize, value voffset) -{ - mlsize_t wosize = Long_val(vsize), offset = Long_val(voffset); - value v = caml_alloc(wosize, Closure_tag); - /* The following choice of closure info causes the GC to skip - the whole block contents. This is correct since the dummy - block contains no pointers into the heap. However, the block - cannot be marshaled or hashed, because not all closinfo fields - and infix header fields are correctly initialized. */ - Closinfo_val(v) = Make_closinfo(0, wosize); - if (offset > 0) { - v += Bsize_wsize(offset); - (((header_t *) (v)) [-1]) = Make_header(offset, Infix_tag, 0); - } - return v; -} - -CAMLprim value caml_update_dummy(value dummy, value newval) -{ - mlsize_t size; - tag_t tag; - - tag = Tag_val (newval); - - if (Wosize_val(dummy) == 0) { - /* Size-0 blocks are statically-allocated atoms. We cannot - mutate them, but there is no need: - - All atoms used in the runtime to represent OCaml values - have tag 0 --- including empty flat float arrays, or other - types that use a non-0 tag for non-atom blocks. - - The dummy was already created with tag 0. - So doing nothing suffices. */ - CAMLassert(Wosize_val(newval) == 0); - CAMLassert(Tag_val(dummy) == Tag_val(newval)); - } else if (tag == Double_array_tag){ - CAMLassert (Wosize_val(newval) == Wosize_val(dummy)); - CAMLassert (Tag_val(dummy) != Infix_tag); - Unsafe_store_tag_val(dummy, Double_array_tag); - size = Wosize_val (newval) / Double_wosize; - for (mlsize_t i = 0; i < size; i++) { - Store_double_flat_field (dummy, i, Double_flat_field (newval, i)); - } - } else if (tag == Infix_tag) { - value clos = newval - Infix_offset_hd(Hd_val(newval)); - CAMLassert (Tag_val(clos) == Closure_tag); - CAMLassert (Tag_val(dummy) == Infix_tag); - CAMLassert (Infix_offset_val(dummy) == Infix_offset_val(newval)); - dummy = dummy - Infix_offset_val(dummy); - size = Wosize_val(clos); - CAMLassert (size == Wosize_val(dummy)); - /* It is safe to use [caml_modify] to copy code pointers - from [clos] to [dummy], because the value being overwritten is - an integer, and the new "value" is a pointer outside the minor - heap. */ - for (mlsize_t i = 0; i < size; i++) { - caml_modify (&Field(dummy, i), Field(clos, i)); - } - } else { - CAMLassert (tag < No_scan_tag); - CAMLassert (Tag_val(dummy) != Infix_tag); - Unsafe_store_tag_val(dummy, tag); - size = Wosize_val(newval); - CAMLassert (size == Wosize_val(dummy)); - /* See comment above why this is safe even if [tag == Closure_tag] - and some of the "values" being copied are actually code pointers. */ - for (mlsize_t i = 0; i < size; i++){ - caml_modify (&Field(dummy, i), Field(newval, i)); - } - } - return Val_unit; -} - CAMLexport value caml_alloc_some(value v) { CAMLparam1(v); diff --git a/runtime/amd64.S b/runtime/amd64.S index c646f944..0166e267 100644 --- a/runtime/amd64.S +++ b/runtime/amd64.S @@ -19,9 +19,11 @@ /* PIC mode support based on contribution by Paul Stravers (see PR#4795) */ #include "caml/m.h" +#include "caml/asm.h" #if defined(SYS_macosx) +#define CAMLSEP(x,y) caml_##x##$##y #define LBL(x) L##x #define G(r) _##r #define GREL(r) _##r@GOTPCREL @@ -31,12 +33,13 @@ #define EIGHT_ALIGN 3 #define SIXTEEN_ALIGN 4 #define FUNCTION(name) \ - .globl name; \ + .globl G(name); \ .align FUNCTION_ALIGN; \ - name: +G(name): #elif defined(SYS_mingw64) || defined(SYS_cygwin) +#define CAMLSEP(x,y) caml_##x##$##y #define LBL(x) .L##x #define G(r) r #undef GREL @@ -46,13 +49,14 @@ #define EIGHT_ALIGN 8 #define SIXTEEN_ALIGN 16 #define FUNCTION(name) \ - TEXT_SECTION(name); \ - .globl name; \ + TEXT_SECTION(G(name)); \ + .globl G(name); \ .align FUNCTION_ALIGN; \ - name: +G(name): #else /* Unix-like operating systems using ELF binaries */ +#define CAMLSEP(x,y) caml_##x##.##y #define LBL(x) .L##x #define G(r) r #define GREL(r) r@GOTPCREL @@ -66,22 +70,24 @@ #define EIGHT_ALIGN 8 #define SIXTEEN_ALIGN 16 #define FUNCTION(name) \ - TEXT_SECTION(name); \ - .globl name; \ - .type name,@function; \ + TEXT_SECTION(G(name)); \ + .globl G(name); \ + TYPE_DIRECTIVE(G(name),@function); \ .align FUNCTION_ALIGN; \ - name: +G(name): #endif -#if defined(SYS_linux) || defined(SYS_gnu) -#define ENDFUNCTION(name) \ - .size name, . - name -#else -#define ENDFUNCTION(name) -#endif +#define OBJECT(name) \ + .globl G(name); \ + .align EIGHT_ALIGN; \ +G(name): -#include "../runtime/caml/asm.h" +#define END_FUNCTION(name) \ + SIZE_DIRECTIVE(G(name)) +#define END_OBJECT(name) \ + TYPE_DIRECTIVE(G(name),@object) \ + SIZE_DIRECTIVE(G(name)) #ifdef WITH_FRAME_POINTERS #define FRAME_POINTER_SIZE 8 @@ -151,7 +157,7 @@ Version 1.0 https://github.com/hjl-tools/x86-psABI/wiki/x86-64-psABI-1.0.pdf */ -#define DW_REG_rbx 3 +#define DW_REG_rbp 6 #define DW_REG_rsp 7 #define DW_REG_r13 13 @@ -160,7 +166,7 @@ /******************************************************************************/ #define CAML_CONFIG_H_NO_TYPEDEFS -#include "../runtime/caml/config.h" +#include "../runtime/caml/config.h" /* for caml_assert_stack_invariants */ .set domain_curr_field, 0 #define DOMAIN_STATE(c_type, name) \ @@ -184,7 +190,12 @@ /* Stack switching operations */ /******************************************************************************/ -/* Switch from OCaml to C stack. Clobbers %r10, %r11. */ +/* Switch from OCaml to C stack. Clobbers %r10, %r11. + + If a C function is called which might call back into OCaml, + then nothing may be pushed to the C stack between SWITCH_OCAML_TO_C + and the next C call. (This is to ensure frame pointers are correctly + maintained if the stack is reallocated) */ #ifdef ASM_CFI_SUPPORTED #define SWITCH_OCAML_TO_C_CFI \ CFI_REMEMBER_STATE; \ @@ -397,19 +408,22 @@ .text #if defined(FUNCTION_SECTIONS) - TEXT_SECTION(caml_hot.code_begin) - .globl G(caml_hot.code_begin) -G(caml_hot.code_begin): + TEXT_SECTION(CAMLSEP(hot,code_begin)) + .globl G(CAMLSEP(hot,code_begin)) +G(CAMLSEP(hot,code_begin)): - TEXT_SECTION(caml_hot.code_end) - .globl G(caml_hot.code_end) -G(caml_hot.code_end): + TEXT_SECTION(CAMLSEP(hot,code_end)) + .globl G(CAMLSEP(hot,code_end)) +G(CAMLSEP(hot,code_end)): #endif /******************************************************************************/ /* text section */ /******************************************************************************/ +/* Allocation functions and GC interface. + Referenced from C code in runtime/startup_nat.c */ + TEXT_SECTION(caml_system__code_begin) .globl G(caml_system__code_begin) G(caml_system__code_begin): @@ -565,7 +579,7 @@ G(caml_system__code_begin): #define TSAN_RESTORE_CALLER_REGS #endif -FUNCTION(G(caml_call_realloc_stack)) +FUNCTION(caml_call_realloc_stack) CFI_STARTPROC CFI_SIGNAL_FRAME ENTER_FUNCTION @@ -584,9 +598,9 @@ CFI_STARTPROC add $16, %rsp /* pop argument, retaddr */ jmp GCALL(caml_raise_exn) CFI_ENDPROC -ENDFUNCTION(G(caml_call_realloc_stack)) +END_FUNCTION(caml_call_realloc_stack) -FUNCTION(G(caml_call_gc)) +FUNCTION(caml_call_gc) CFI_STARTPROC CFI_SIGNAL_FRAME ENTER_FUNCTION @@ -603,9 +617,9 @@ LBL(caml_call_gc): LEAVE_FUNCTION ret CFI_ENDPROC -ENDFUNCTION(G(caml_call_gc)) +END_FUNCTION(caml_call_gc) -FUNCTION(G(caml_alloc1)) +FUNCTION(caml_alloc1) CFI_STARTPROC ENTER_FUNCTION subq $16, %r15 @@ -614,9 +628,9 @@ CFI_STARTPROC LEAVE_FUNCTION ret CFI_ENDPROC -ENDFUNCTION(G(caml_alloc1)) +END_FUNCTION(caml_alloc1) -FUNCTION(G(caml_alloc2)) +FUNCTION(caml_alloc2) CFI_STARTPROC ENTER_FUNCTION subq $24, %r15 @@ -625,9 +639,9 @@ CFI_STARTPROC LEAVE_FUNCTION ret CFI_ENDPROC -ENDFUNCTION(G(caml_alloc2)) +END_FUNCTION(caml_alloc2) -FUNCTION(G(caml_alloc3)) +FUNCTION(caml_alloc3) CFI_STARTPROC ENTER_FUNCTION subq $32, %r15 @@ -636,9 +650,9 @@ CFI_STARTPROC LEAVE_FUNCTION ret CFI_ENDPROC -ENDFUNCTION(G(caml_alloc3)) +END_FUNCTION(caml_alloc3) -FUNCTION(G(caml_allocN)) +FUNCTION(caml_allocN) CFI_STARTPROC ENTER_FUNCTION cmpq Caml_state(young_limit), %r15 @@ -646,7 +660,7 @@ CFI_STARTPROC LEAVE_FUNCTION ret CFI_ENDPROC -ENDFUNCTION(G(caml_allocN)) +END_FUNCTION(caml_allocN) /******************************************************************************/ /* Call a C function from OCaml */ @@ -678,7 +692,7 @@ ENDFUNCTION(G(caml_allocN)) 1: movq $-1, Caml_state(young_limit); \ ret -FUNCTION(G(caml_c_call)) +FUNCTION(caml_c_call) CFI_STARTPROC CFI_SIGNAL_FRAME ENTER_FUNCTION @@ -713,9 +727,9 @@ LBL(caml_c_call): /* Return to OCaml caller */ RET_FROM_C_CALL CFI_ENDPROC -ENDFUNCTION(G(caml_c_call)) +END_FUNCTION(caml_c_call) -FUNCTION(G(caml_c_call_stack_args)) +FUNCTION(caml_c_call_stack_args) CFI_STARTPROC CFI_SIGNAL_FRAME ENTER_FUNCTION @@ -725,49 +739,60 @@ CFI_STARTPROC C stack args : begin=%r13 end=%r12 */ /* Switch from OCaml to C */ SWITCH_OCAML_TO_C - /* we use %rbx (otherwise unused) to enable backtraces */ - movq %rsp, %rbx -#ifdef ASM_CFI_SUPPORTED - .cfi_escape DW_CFA_def_cfa_expression, 5, \ - /* %rbp points to the c_stack_link structure */ \ - DW_OP_breg + DW_REG_rbx, Cstack_sp, DW_OP_deref, \ - DW_OP_plus_uconst, RETADDR_ENTRY_SIZE -#endif /* Make the alloc ptr available to the C code */ movq %r15, Caml_state(young_ptr) + /* Copy the arguments and call */ + C_call (GCALL(caml_c_call_copy_stack_args)) + /* Prepare for return to OCaml */ + movq Caml_state(young_ptr), %r15 + /* Load ocaml stack and restore global variables */ + SWITCH_C_TO_OCAML + /* Return to OCaml caller */ + LEAVE_FUNCTION + RET_FROM_C_CALL +CFI_ENDPROC +END_FUNCTION(caml_c_call_stack_args) + +/* To correctly maintain frame pointers during stack reallocation, + the runtime assumes that the caml_c_call stub does not push + anything to the stack before the first frame pointer on the C stack. + To guarantee this when stack arguments are used, the actual pushing + of arguments is done by this separate function */ +FUNCTION(caml_c_call_copy_stack_args) +CFI_STARTPROC + /* Set up a frame pointer even without WITH_FRAME_POINTERS, + which we use to pop an unknown number of arguments later */ + pushq %rbp; CFI_ADJUST(8) + movq %rsp, %rbp + CFI_DEF_CFA_REGISTER(DW_REG_rbp) /* Copy arguments from OCaml to C stack */ -#if defined(SYS_mingw64) || defined (SYS_cygwin) - addq $32, %rsp -#endif LBL(105): subq $8, %r12 cmpq %r13,%r12 jb LBL(106) - push (%r12); CFI_ADJUST(8) + push (%r12) jmp LBL(105) LBL(106): #if defined(SYS_mingw64) || defined (SYS_cygwin) + /* Allocate the shadow store on Windows (the c_stack_link store was used + in calling caml_c_call_copy_stack_args) */ subq $32, %rsp #endif /* Call the function (address in %rax) */ C_call (*%rax) /* Pop arguments back off the stack */ - movq Caml_state(c_stack), %rsp - /* Prepare for return to OCaml */ - movq Caml_state(young_ptr), %r15 - /* Load ocaml stack and restore global variables */ - SWITCH_C_TO_OCAML - /* Return to OCaml caller */ - LEAVE_FUNCTION - RET_FROM_C_CALL + movq %rbp, %rsp + CFI_DEF_CFA_REGISTER(DW_REG_rsp) + popq %rbp; CFI_ADJUST(-8) + ret CFI_ENDPROC -ENDFUNCTION(G(caml_c_call_stack_args)) +END_FUNCTION(caml_c_call_copy_stack_args) /******************************************************************************/ /* Start the OCaml program */ /******************************************************************************/ -FUNCTION(G(caml_start_program)) +FUNCTION(caml_start_program) CFI_STARTPROC CFI_SIGNAL_FRAME /* Save callee-save registers */ @@ -875,7 +900,7 @@ LBL(109): movq %rsp, %r10 jmp 1b CFI_ENDPROC -ENDFUNCTION(G(caml_start_program)) +END_FUNCTION(caml_start_program) /******************************************************************************/ /* Exceptions */ @@ -883,7 +908,7 @@ ENDFUNCTION(G(caml_start_program)) /* Raise an exception from OCaml */ -FUNCTION(G(caml_raise_exn)) +FUNCTION(caml_raise_exn) CFI_STARTPROC ENTER_FUNCTION LBL(caml_raise_exn): @@ -906,7 +931,7 @@ LBL(117): RESTORE_EXN_HANDLER_OCAML ret CFI_ENDPROC -ENDFUNCTION(G(caml_raise_exn)) +END_FUNCTION(caml_raise_exn) #if defined(WITH_THREAD_SANITIZER) /* When TSan support is enabled, this routine should be called just before @@ -914,7 +939,7 @@ ENDFUNCTION(G(caml_raise_exn)) to be exited due to the exception. Takes no arguments, clobbers C_ARG_1, C_ARG_2, C_ARG_3 and potentially all caller-saved registers of the C calling convention. */ -FUNCTION(G(caml_tsan_exit_on_raise_asm)) +FUNCTION(caml_tsan_exit_on_raise_asm) CFI_STARTPROC ENTER_FUNCTION movq STACK_RETADDR(%rsp), C_ARG_1 /* arg 1: pc of raise */ @@ -926,10 +951,10 @@ CFI_STARTPROC LEAVE_FUNCTION ret CFI_ENDPROC -ENDFUNCTION(G(caml_tsan_exit_on_raise_asm)) +END_FUNCTION(caml_tsan_exit_on_raise_asm) #endif -FUNCTION(G(caml_reraise_exn)) +FUNCTION(caml_reraise_exn) CFI_STARTPROC ENTER_FUNCTION testq $1, Caml_state(backtrace_active) @@ -937,11 +962,11 @@ CFI_STARTPROC RESTORE_EXN_HANDLER_OCAML ret CFI_ENDPROC -ENDFUNCTION(G(caml_reraise_exn)) +END_FUNCTION(caml_reraise_exn) /* Raise an exception from C */ -FUNCTION(G(caml_raise_exception)) +FUNCTION(caml_raise_exception) CFI_STARTPROC ENTER_FUNCTION movq C_ARG_1, %r14 /* Caml_state */ @@ -965,13 +990,13 @@ CFI_STARTPROC #endif jmp LBL(caml_raise_exn) CFI_ENDPROC -ENDFUNCTION(G(caml_raise_exception)) +END_FUNCTION(caml_raise_exception) /******************************************************************************/ /* Callback from C to OCaml */ /******************************************************************************/ -FUNCTION(G(caml_callback_asm)) +FUNCTION(caml_callback_asm) CFI_STARTPROC #if defined(WITH_THREAD_SANITIZER) /* Save non-callee-saved registers C_ARG_1, C_ARG_2, C_ARG_3 before C call @@ -996,9 +1021,9 @@ CFI_STARTPROC movq $0, %rsi /* dummy */ jmp LBL(caml_start_program) CFI_ENDPROC -ENDFUNCTION(G(caml_callback_asm)) +END_FUNCTION(caml_callback_asm) -FUNCTION(G(caml_callback2_asm)) +FUNCTION(caml_callback2_asm) CFI_STARTPROC #if defined(WITH_THREAD_SANITIZER) /* Save non-callee-saved registers C_ARG_1, C_ARG_2, C_ARG_3 before C call @@ -1023,9 +1048,9 @@ CFI_STARTPROC movq $0, %rsi /* dummy */ jmp LBL(caml_start_program) CFI_ENDPROC -ENDFUNCTION(G(caml_callback2_asm)) +END_FUNCTION(caml_callback2_asm) -FUNCTION(G(caml_callback3_asm)) +FUNCTION(caml_callback3_asm) CFI_STARTPROC #if defined(WITH_THREAD_SANITIZER) /* Save non-callee-saved registers C_ARG_1, C_ARG_2, C_ARG_3 before C call @@ -1050,7 +1075,7 @@ CFI_STARTPROC LEA_VAR(caml_apply3, %r12) /* code pointer */ jmp LBL(caml_start_program) CFI_ENDPROC -ENDFUNCTION(G(caml_callback3_asm)) +END_FUNCTION(caml_callback3_asm) /******************************************************************************/ /* Fibers */ @@ -1062,7 +1087,7 @@ ENDFUNCTION(G(caml_callback3_asm)) */ /******************************************************************************/ -FUNCTION(G(caml_perform)) +FUNCTION(caml_perform) CFI_STARTPROC /* %rax: effect to perform %rbx: freshly allocated continuation */ @@ -1141,9 +1166,9 @@ LBL(112): LEA_VAR(caml_raise_unhandled_effect, %rax) jmp LBL(caml_c_call) CFI_ENDPROC -ENDFUNCTION(G(caml_perform)) +END_FUNCTION(caml_perform) -FUNCTION(G(caml_reperform)) +FUNCTION(caml_reperform) CFI_STARTPROC /* %rax: effect to reperform %rbx: continuation @@ -1157,9 +1182,9 @@ CFI_STARTPROC UPDATE_BASE_POINTER(%r10) jmp LBL(do_perform) CFI_ENDPROC -ENDFUNCTION(G(caml_reperform)) +END_FUNCTION(caml_reperform) -FUNCTION(G(caml_resume)) +FUNCTION(caml_resume) CFI_STARTPROC /* %rax -> fiber, %rbx -> fun, %rdi -> arg, %rsi -> last_fiber */ leaq -1(%rax), %r10 /* %r10 (new stack) = Ptr_val(%rax) */ @@ -1206,11 +1231,11 @@ CFI_STARTPROC LEA_VAR(caml_raise_continuation_already_resumed, %rax) jmp LBL(caml_c_call) CFI_ENDPROC -ENDFUNCTION(G(caml_resume)) +END_FUNCTION(caml_resume) /* Run a function on a new stack, then invoke either the value or exception handler */ -FUNCTION(G(caml_runstack)) +FUNCTION(caml_runstack) CFI_STARTPROC CFI_SIGNAL_FRAME ENTER_FUNCTION @@ -1290,9 +1315,9 @@ LBL(fiber_exn_handler): movq Handler_exception(%r11), %rbx jmp 1b CFI_ENDPROC -ENDFUNCTION(G(caml_runstack)) +END_FUNCTION(caml_runstack) -FUNCTION(G(caml_ml_array_bound_error)) +FUNCTION(caml_ml_array_bound_error) CFI_STARTPROC ENTER_FUNCTION /* No registers require saving before C call to TSan */ @@ -1300,9 +1325,9 @@ CFI_STARTPROC LEA_VAR(caml_array_bound_error_asm, %rax) jmp LBL(caml_c_call) CFI_ENDPROC -ENDFUNCTION(G(caml_ml_array_bound_error)) +END_FUNCTION(caml_ml_array_bound_error) -FUNCTION(G(caml_assert_stack_invariants)) +FUNCTION(caml_assert_stack_invariants) CFI_STARTPROC movq Caml_state(current_stack), %r11 movq %rsp, %r10 @@ -1313,16 +1338,16 @@ CFI_STARTPROC int3 1: ret CFI_ENDPROC -ENDFUNCTION(G(caml_assert_stack_invariants)) +END_FUNCTION(caml_assert_stack_invariants) TEXT_SECTION(caml_system__code_end) .globl G(caml_system__code_end) G(caml_system__code_end): +/* Frametable - GC roots for callback */ +/* Uses the same naming convention as ocamlopt generated modules. */ .data - .globl G(caml_system.frametable) - .align EIGHT_ALIGN -G(caml_system.frametable): +OBJECT(CAMLSEP(system,frametable)) .quad 2 /* two descriptors */ .quad LBL(108) /* return address into callback */ .value -1 /* negative frame size => use callback link */ @@ -1331,6 +1356,7 @@ G(caml_system.frametable): .quad LBL(frame_runstack) /* return address into fiber_val_handler */ .value -1 /* negative frame size => use callback link */ .value 0 /* no roots here */ +END_OBJECT(CAMLSEP(system,frametable)) #if defined(SYS_macosx) .literal16 @@ -1348,7 +1374,4 @@ G(caml_negf_mask): G(caml_absf_mask): .quad 0x7FFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF -#if defined(SYS_linux) || defined(SYS_freebsd) - /* Mark stack as non-executable, PR#4564 */ - .section .note.GNU-stack,"",%progbits -#endif + NONEXECSTACK_NOTE diff --git a/runtime/amd64nt.asm b/runtime/amd64nt.asm index efc6a5aa..e4db256c 100644 --- a/runtime/amd64nt.asm +++ b/runtime/amd64nt.asm @@ -211,6 +211,8 @@ ENDM .CODE +; Allocation functions and GC interface. +; Referenced from C code in runtime/startup_nat.c PUBLIC caml_system__code_begin caml_system__code_begin: ret ; just one instruction, so that debuggers don't display @@ -337,12 +339,30 @@ caml_c_call_stack_args: ; C stack args : begin=r13 end=r12 ; Switch from OCaml to C SWITCH_OCAML_TO_C - ; we use rbx (otherwise unused) to enable backtraces - mov rbx, rsp ; Make the alloc ptr available to the C code mov Caml_state(young_ptr), r15 + ; Copy the arguments and call + call caml_c_call_copy_stack_args + ; Prepare for return to OCaml + mov r15, Caml_state(young_ptr) + ; Load ocaml stack and restore global variables + SWITCH_C_TO_OCAML + ; Return to OCaml caller + RET_FROM_C_CALL + +; To correctly maintain frame pointers during stack reallocation, +; the runtime assumes that the caml_c_call stub does not push +; anything to the stack before the first frame pointer on the C stack. +; To guarantee this when stack arguments are used, the actual pushing +; of arguments is done by this separate function + PUBLIC caml_c_call_copy_stack_args + ALIGN 4 +caml_c_call_copy_stack_args: + ; Set up a frame pointer even without WITH_FRAME_POINTERS, + ; which we use to pop an unknown number of arguments later + push rbp + mov rbp, rsp ; Copy arguments from OCaml to C stack - add rsp, 32 L105: sub r12, 8 cmp r12,r13 @@ -350,17 +370,15 @@ L105: push qword ptr [r12] jmp L105 L210: + ; Allocate the shadow store on Windows (the c_stack_link store was used + ; in calling caml_c_call_copy_stack_args) sub rsp, 32 ; Call the function (address in %rax) call rax ; Pop arguments back off the stack - mov rsp, Caml_state(c_stack) - ; Prepare for return to OCaml - mov r15, Caml_state(young_ptr) - ; Load ocaml stack and restore global variables - SWITCH_C_TO_OCAML - ; Return to OCaml caller - RET_FROM_C_CALL + mov rsp, rbp + pop rbp + ret ; Start the OCaml program @@ -665,6 +683,8 @@ L310: PUBLIC caml_system__code_end caml_system__code_end: +; Frametable - GC roots for callback +; Uses the same naming convention as ocamlopt generated modules. .DATA PUBLIC caml_system$frametable caml_system$frametable LABEL QWORD diff --git a/runtime/arm64.S b/runtime/arm64.S index b3a47545..a4bcc266 100644 --- a/runtime/arm64.S +++ b/runtime/arm64.S @@ -19,6 +19,7 @@ /* Must be preprocessed by cpp */ #include "caml/m.h" +#include "caml/asm.h" /* Special registers */ @@ -47,6 +48,7 @@ */ #define DW_REG_x21 21 +#define DW_REG_x29 29 #define DW_REG_sp 31 @@ -69,9 +71,11 @@ /* Globals and labels */ #if defined(SYS_macosx) +#define CAMLSEP(x,y) caml_##x##$##y #define G(sym) _##sym #define L(lbl) L##lbl #else +#define CAMLSEP(x,y) caml_##x##.##y #define G(sym) sym #define L(lbl) .L##lbl #endif @@ -102,13 +106,13 @@ #endif #if defined(FUNCTION_SECTIONS) - TEXT_SECTION(caml_hot.code_begin) - .globl G(caml_hot.code_begin) -G(caml_hot.code_begin): + TEXT_SECTION(CAMLSEP(hot,code_begin)) + .globl G(CAMLSEP(hot,code_begin)) +G(CAMLSEP(hot,code_begin)): - TEXT_SECTION(caml_hot.code_end) - .globl G(caml_hot.code_end) -G(caml_hot.code_end): + TEXT_SECTION(CAMLSEP(hot,code_end)) + .globl G(CAMLSEP(hot,code_end)) +G(CAMLSEP(hot,code_end)): #endif #if defined(SYS_macosx) @@ -137,23 +141,21 @@ G(\name): TEXT_SECTION(name); \ .align 2; \ .globl G(name); \ - .type G(name), %function; \ + TYPE_DIRECTIVE(G(name),%function) \ G(name): #define END_FUNCTION(name) \ - .size G(name), .-G(name) + SIZE_DIRECTIVE(G(name)) #define OBJECT(name) \ .data; \ .align 3; \ .globl G(name); \ - .type G(name), %object; \ + TYPE_DIRECTIVE(G(name),%object) \ G(name): #define END_OBJECT(name) \ - .size G(name), .-G(name) + SIZE_DIRECTIVE(G(name)) #endif -#include "../runtime/caml/asm.h" - /* Function prologue and epilogue */ .macro ENTER_FUNCTION @@ -191,7 +193,12 @@ G(name): #define Handler_parent(reg) [reg, #24] #define Handler_parent_offset 24 -/* Switch from OCaml to C stack. */ +/* Switch from OCaml to C stack. + + If a C function is called which might call back into OCaml, + then nothing may be pushed to the C stack between SWITCH_OCAML_TO_C + and the next C call. (This is to ensure frame pointers are correctly + maintained if the stack is reallocated) */ .macro SWITCH_OCAML_TO_C /* Fill in Caml_state->current_stack->sp */ ldr TMP, Caml_state(current_stack) @@ -303,6 +310,32 @@ G(name): ldr TRAP_PTR, Caml_state(exn_handler) .endm +/* Updates the oldest saved frame pointer in the target fiber. + + A fiber stack may need to grow, causing the reallocation of the entire fiber, + including stack_info and stack_handler structures. + caml_try_realloc_stack will not be able to update the linked list of + frame-pointers if it has been split (i.e., in a continuation). + caml_resume and caml_reperform use this macro to update the oldest saved x29 + (highest one in the stack) in case the fiber was reallocated to reattach the + frame-pointer linked list. + + REG: Stack_handler(target_fiber) + + The frame pointer will be pushed into the stack immediately after these + instructions. The offset of the oldest saved x29 in a fiber from the stack + handler is 48 = 4 words (caml_runstack) + 2 words (x30 and x29). + */ +#ifdef WITH_FRAME_POINTERS +.macro UPDATE_BASE_POINTER reg + sub TMP2, sp, 16 + str TMP2, [\reg, -48] +.endm +#else +.macro UPDATE_BASE_POINTER reg +.endm +#endif + #if defined(WITH_THREAD_SANITIZER) /* { */ /* Push the current value of the link register to the stack. */ @@ -427,7 +460,9 @@ G(name): #endif /* } WITH_THREAD_SANITIZER */ -/* Allocation functions and GC interface */ +/* Allocation functions and GC interface. + Referenced from C code in runtime/startup_nat.c + */ TEXT_SECTION(caml_system__code_begin) .globl G(caml_system__code_begin) G(caml_system__code_begin): @@ -584,30 +619,46 @@ FUNCTION(caml_c_call_stack_args) /* Make the exception handler alloc ptr available to the C code */ str ALLOC_PTR, Caml_state(young_ptr) str TRAP_PTR, Caml_state(exn_handler) - /* Store sp to restore after call */ - mov x19, sp + /* Copy the arguments and call */ + bl G(caml_c_call_copy_stack_args) + /* Reload new allocation pointer & exn handler */ + ldr ALLOC_PTR, Caml_state(young_ptr) + ldr TRAP_PTR, Caml_state(exn_handler) + /* Switch from C to OCaml */ + SWITCH_C_TO_OCAML + /* Return */ + LEAVE_FUNCTION + RET_FROM_C_CALL + CFI_ENDPROC +END_FUNCTION(caml_c_call_stack_args) + +/* To correctly maintain frame pointers during stack reallocation, + the runtime assumes that the caml_c_call stub does not push + anything to the stack before the first frame pointer on the C stack. + To guarantee this when stack arguments are used, the actual pushing + of arguments is done by this separate function */ +FUNCTION(caml_c_call_copy_stack_args) + CFI_STARTPROC + ENTER_FUNCTION + CFI_DEF_CFA_REGISTER(DW_REG_x29) /* Copy arguments from OCaml to C stack NB: STACK_ARG_{BEGIN,END} are 16-byte aligned */ 1: sub STACK_ARG_END, STACK_ARG_END, 16 cmp STACK_ARG_END, STACK_ARG_BEGIN b.lo 2f ldp TMP, TMP2, [STACK_ARG_END] - stp TMP, TMP2, [sp, -16]!; CFI_ADJUST(16) + stp TMP, TMP2, [sp, -16]! b 1b 2: /* Call the function */ blr ADDITIONAL_ARG /* Restore stack */ - mov sp, x19 - /* Reload new allocation pointer & exn handler */ - ldr ALLOC_PTR, Caml_state(young_ptr) - ldr TRAP_PTR, Caml_state(exn_handler) - /* Switch from C to OCaml */ - SWITCH_C_TO_OCAML - /* Return */ + mov sp, x29 + CFI_DEF_CFA_REGISTER(DW_REG_sp) LEAVE_FUNCTION - RET_FROM_C_CALL + ret CFI_ENDPROC -END_FUNCTION(caml_c_call_stack_args) +END_FUNCTION(caml_c_call_copy_stack_args) + /* Start the OCaml program */ @@ -643,7 +694,7 @@ L(jump_to_caml): CFI_OFFSET(30, -152) stp x29, x30, [sp, -160]! CFI_ADJUST(160) - add x29, sp, #0 + mov x29, sp stp x19, x20, [sp, 16] stp x21, x22, [sp, 32] stp x23, x24, [sp, 48] @@ -962,7 +1013,6 @@ END_FUNCTION(caml_callback3_asm) LEAVE_FUNCTION .endm - /* * A continuation is a one word object that points to a fiber. A fiber [f] will * point to its parent at Handler_parent(Stack_handler(f)). In the following, @@ -1048,13 +1098,16 @@ END_FUNCTION(caml_perform) FUNCTION(caml_reperform) CFI_STARTPROC - /* x0: effect to perform + /* x0: effect to reperform x1: continuation x2: last_fiber */ ldr TMP, Stack_handler_from_cont(x2) ldr x2, Caml_state(current_stack) /* x2 := old stack */ str x2, Handler_parent(TMP) /* Append to last_fiber */ add x3, x2, 1 /* x3 (last_fiber) := Val_ptr(old stack) */ + /* Need to update the oldest saved frame pointer here as the execution of + the handler may have caused the current fiber stack to reallocate. */ + UPDATE_BASE_POINTER TMP b L(do_perform) CFI_ENDPROC END_FUNCTION(caml_reperform) @@ -1102,6 +1155,10 @@ FUNCTION(caml_resume) ldr x8, Stack_handler(x3) ldr x9, Caml_state(current_stack) str x9, Handler_parent(x8) + /* Need to update the oldest saved frame pointer here as the current fiber + stack may have been reallocated or we may be resuming a computation + that was not originally run here. */ + UPDATE_BASE_POINTER x8 SWITCH_OCAML_STACKS x9, x0 mov x0, x2 br x4 @@ -1221,9 +1278,9 @@ END_FUNCTION(caml_ml_array_bound_error) .globl G(caml_system__code_end) G(caml_system__code_end): -/* GC roots for callback */ - -OBJECT(caml_system.frametable) +/* Frametable - GC roots for callback */ +/* Uses the same naming convention as ocamlopt generated modules. */ +OBJECT(CAMLSEP(system,frametable)) .quad 2 /* two descriptors */ .quad L(caml_retaddr) /* return address into callback */ .short -1 /* negative frame size => use callback link */ @@ -1233,9 +1290,6 @@ OBJECT(caml_system.frametable) .short -1 /* negative frame size => use callback link */ .short 0 /* no roots here */ .align 3 - END_OBJECT(caml_system.frametable) + END_OBJECT(CAMLSEP(system,frametable)) -#if !defined(SYS_macosx) -/* Mark stack as non-executable */ - .section .note.GNU-stack,"",%progbits -#endif + NONEXECSTACK_NOTE diff --git a/runtime/array.c b/runtime/array.c index d08289d9..3c67a856 100644 --- a/runtime/array.c +++ b/runtime/array.c @@ -64,7 +64,7 @@ CAMLprim value caml_floatarray_get(value array, value index) double d; value res; - CAMLassert (Tag_val(array) == Double_array_tag); + CAMLassert (Wosize_val(array) == 0 || Tag_val(array) == Double_array_tag); if (idx < 0 || idx >= Wosize_val(array) / Double_wosize) caml_array_bound_error(); d = Double_flat_field(array, idx); @@ -99,7 +99,7 @@ CAMLprim value caml_floatarray_set(value array, value index, value newval) { intnat idx = Long_val(index); double d = Double_val (newval); - CAMLassert (Tag_val(array) == Double_array_tag); + CAMLassert (Wosize_val(array) == 0 || Tag_val(array) == Double_array_tag); if (idx < 0 || idx >= Wosize_val(array) / Double_wosize) caml_array_bound_error(); Store_double_flat_field(array, idx, d); @@ -125,7 +125,7 @@ CAMLprim value caml_floatarray_unsafe_get(value array, value index) double d; value res; - CAMLassert (Tag_val(array) == Double_array_tag); + CAMLassert (Wosize_val(array) == 0 || Tag_val(array) == Double_array_tag); d = Double_flat_field(array, idx); Alloc_small(res, Double_wosize, Double_tag, Alloc_small_enter_GC); Store_double_val(res, d); @@ -161,6 +161,7 @@ CAMLprim value caml_floatarray_unsafe_set(value array, value index,value newval) { intnat idx = Long_val(index); double d = Double_val (newval); + CAMLassert (Wosize_val(array) == 0 || Tag_val(array) == Double_array_tag); Store_double_flat_field(array, idx, d); return Val_unit; } @@ -458,6 +459,32 @@ CAMLprim value caml_array_blit(value a1, value ofs1, value a2, value ofs2, /* generic [gather] functions for extraction and concatenation of sub-arrays */ +/* [wo_memcpy] copies [nvals] values from [src] to [dst], assuming no + overlapping. If there is a single domain running, then we use [memcpy]. + Otherwise, we copy one word at a time. + + Since the [memcpy] implementation does not guarantee that the reads are + always word-sized, we explicitly perform word-sized reads of the relaxed + kind to avoid tearing (see #13950). Performing relaxed reads should be + sufficient to prevent smart compilers from coalescing the reads into vector + reads, and hence prevent tearing. + + Note that unlike [wo_memmove], the writes are plain writes and no acquire + fence is emitted; to comply with OCaml's memory model, this should only be + used to write into unpublished values. [MM] + */ +static void wo_memcpy(value * const dst, + atomic_value * const src, + mlsize_t nvals) +{ + if (caml_domain_alone ()) { + memcpy((value*)dst, (value*)src, nvals * sizeof (value)); + } else { + for (mlsize_t i = 0; i < nvals; i++) + dst[i] = atomic_load_relaxed(&src[i]); + } +} + /* The lengths are specified in number of floats, as returned by [caml_array_length]. */ static value caml_floatarray_gather(intnat num_arrays, @@ -517,16 +544,15 @@ static value caml_uniform_array_gather(intnat num_arrays, res = Atom(0); } else if (size <= Max_young_wosize) { - /* Array of values, small enough to fit in young generation. - We can use memcpy directly. */ + /* Array of values, small enough to fit in young generation. */ res = caml_alloc_small(size, 0); mlsize_t pos = 0; for (mlsize_t i = 0; i < num_arrays; i++) { - /* [res] is freshly allocated, and no other domain has a reference to it. - Hence, a plain [memcpy] is sufficient. */ - memcpy((value*)&Field(res, pos), - (value*)&Field(arrays[i], offsets[i]), - lengths[i] * sizeof(value)); + /* Here we can do a direct copy since this cannot create old-to-young + pointers, nor mess up with the incremental major GC. */ + value *dst = (value *) &Field(res, pos); + atomic_value *src = (atomic_value *) &Field(arrays[i], offsets[i]); + wo_memcpy(dst, src, lengths[i]); pos += lengths[i]; } CAMLassert(pos == size); @@ -631,7 +657,13 @@ CAMLprim value caml_array_append(value a1, value a2) return caml_array_gather(2, arrays, offsets, lengths); } -CAMLprim value caml_array_concat(value al) +/* Function pointer type for the [caml_*_gather] functions. */ +typedef value (*gather_impl)(intnat num_arrays, + value arrays[/*num_arrays*/], + intnat offsets[/*num_arrays*/], + intnat lengths[/*num_arrays*/]); + +static value generic_array_concat(gather_impl gather, value al) { #define STATIC_SIZE 16 value static_arrays[STATIC_SIZE], * arrays; @@ -654,21 +686,21 @@ CAMLprim value caml_array_concat(value al) caml_stat_free(arrays); caml_raise_out_of_memory(); } - lengths = caml_stat_alloc_noexc(n * sizeof(value)); + lengths = caml_stat_alloc_noexc(n * sizeof(intnat)); if (lengths == NULL) { caml_stat_free(offsets); caml_stat_free(arrays); caml_raise_out_of_memory(); } } - /* Build the parameters to caml_array_gather */ + /* Build the parameters for the [gather] function. */ for (i = 0, l = al; l != Val_emptylist; l = Field(l, 1), i++) { arrays[i] = Field(l, 0); offsets[i] = 0; lengths[i] = caml_array_length(Field(l, 0)); } - /* Do the concatenation */ - res = caml_array_gather(n, arrays, offsets, lengths); + /* Call the [gather] function. */ + res = (*gather)(n, arrays, offsets, lengths); /* Free the extra storage if needed */ if (n > STATIC_SIZE) { caml_stat_free(arrays); @@ -678,6 +710,21 @@ CAMLprim value caml_array_concat(value al) return res; } +CAMLprim value caml_floatarray_concat(value al) +{ + return generic_array_concat(&caml_floatarray_gather, al); +} + +CAMLprim value caml_uniform_array_concat(value al) +{ + return generic_array_concat(&caml_uniform_array_gather, al); +} + +CAMLprim value caml_array_concat(value al) +{ + return generic_array_concat(&caml_array_gather, al); +} + CAMLprim value caml_floatarray_fill_unboxed( value array, intnat ofs, intnat len, double d) { diff --git a/runtime/backtrace.c b/runtime/backtrace.c index 85c3dda6..cbb63a30 100644 --- a/runtime/backtrace.c +++ b/runtime/backtrace.c @@ -61,10 +61,10 @@ CAMLprim value caml_backtrace_status(value vunit) 0, then li->loc_is_raise is always 1, so the latter test is useless. We kept it to keep code identical to the runtime/ implementation. */ -static void print_location(struct caml_loc_info * li, int index) +static void print_location(const struct caml_loc_info * li, int index) { - char * info; - char * inlined; + const char * info; + const char * inlined; /* Ignore compiler-inserted raise */ if (!li->loc_valid && li->loc_is_raise) return; diff --git a/runtime/backtrace_byt.c b/runtime/backtrace_byt.c index e8cb4b39..13d2c759 100644 --- a/runtime/backtrace_byt.c +++ b/runtime/backtrace_byt.c @@ -23,7 +23,7 @@ #include #include "caml/config.h" -#ifdef HAS_UNISTD +#ifndef _WIN32 #include #endif #ifdef _WIN32 diff --git a/runtime/backtrace_nat.c b/runtime/backtrace_nat.c index c6e32af9..2a285155 100644 --- a/runtime/backtrace_nat.c +++ b/runtime/backtrace_nat.c @@ -101,7 +101,7 @@ static debuginfo debuginfo_extract(frame_descr *d, ptrdiff_t alloc_idx); TODO: Consider rewriting this to use get_callstack, so we only have one body of code capturing callstacks. */ -void caml_stash_backtrace(value exn, uintnat pc, char * sp, char* trapsp) +void caml_stash_backtrace(value exn, uintnat pc, char * sp, const char* trapsp) { caml_domain_state* domain_state = Caml_state; caml_frame_descrs* fds; @@ -336,7 +336,7 @@ debuginfo caml_debuginfo_next(debuginfo dbg) so it is referenced as an offset instead of stored inline */ struct name_info { int32_t filename_offs; - char name[1]; + char name[]; /* flexible array member */ }; /* Extended version of name_info including location fields which didn't fit @@ -346,7 +346,7 @@ struct name_and_loc_info { uint16_t start_chr; uint16_t end_chr; int32_t end_offset; /* End character position relative to start bol */ - char name[1]; + char name[]; /* flexible array member */ }; /* Extract location information for the given frame descriptor */ diff --git a/runtime/bigarray.c b/runtime/bigarray.c index 0fa0c808..bd3ce896 100644 --- a/runtime/bigarray.c +++ b/runtime/bigarray.c @@ -28,7 +28,7 @@ #include "caml/memory.h" #include "caml/mlvalues.h" #include "caml/signals.h" -#include "caml/atomic_refcount.h" +#include "caml/camlatomic.h" #define int8 caml_ba_int8 #define uint8 caml_ba_uint8 @@ -182,7 +182,7 @@ CAMLexport uintnat caml_ba_num_elts(struct caml_ba_array * b) /* Size in bytes of a bigarray element, indexed by bigarray kind */ -CAMLexport int caml_ba_element_size[] = +CAMLexport const int caml_ba_element_size[] = { 4 /*FLOAT32*/, 8 /*FLOAT64*/, 1 /*SINT8*/, 1 /*UINT8*/, 2 /*SINT16*/, 2 /*UINT16*/, @@ -292,7 +292,7 @@ CAMLexport void caml_ba_finalize(value v) if (b->proxy == NULL) { free(b->data); } else { - if (caml_atomic_refcount_decr(&b->proxy->refcount) == 1) { + if (caml_atomic_counter_decr(&b->proxy->refcount) == 0) { free(b->proxy->data); free(b->proxy); } @@ -329,7 +329,7 @@ CAMLexport int caml_ba_compare(value v1, value v2) num_elts = caml_ba_num_elts(b1); #define DO_INTEGER_COMPARISON(type) \ - { type * p1 = b1->data; type * p2 = b2->data; \ + { const type * p1 = b1->data; const type * p2 = b2->data; \ for (uintnat n = 0; n < num_elts; n++) { \ type e1 = *p1++; type e2 = *p2++; \ if (e1 < e2) return -1; \ @@ -338,7 +338,7 @@ CAMLexport int caml_ba_compare(value v1, value v2) return 0; \ } #define DO_GENERIC_UNORDERED_COMPARISON(ptype, etype, conv) \ - { ptype * p1 = b1->data; ptype * p2 = b2->data; \ + { const ptype * p1 = b1->data; const ptype * p2 = b2->data; \ for (uintnat n = 0; n < num_elts; n++) { \ etype e1 = conv(*p1++); etype e2 = conv(*p2++); \ if (e1 < e2) return -1; \ @@ -747,10 +747,10 @@ value caml_ba_get_N(value vb, volatile value * vind, int nind) case CAML_BA_CAML_INT: return Val_long(((intnat *) b->data)[offset]); case CAML_BA_COMPLEX32: - { float * p = ((float *) b->data) + offset * 2; + { const float * p = ((float *) b->data) + offset * 2; return copy_two_doubles((double) p[0], (double) p[1]); } case CAML_BA_COMPLEX64: - { double * p = ((double *) b->data) + offset * 2; + { const double * p = ((double *) b->data) + offset * 2; return copy_two_doubles(p[0], p[1]); } case CAML_BA_CHAR: return Val_int(((unsigned char *) b->data)[offset]); @@ -1077,12 +1077,12 @@ static void caml_ba_update_proxy(struct caml_ba_array * b1, /* If b1 is already a proxy for a larger array, increment refcount of proxy */ b2->proxy = b1->proxy; - caml_atomic_refcount_incr(&b1->proxy->refcount); + (void)caml_atomic_counter_incr(&b1->proxy->refcount); } else { /* Otherwise, create proxy and attach it to both b1 and b2 */ proxy = malloc(sizeof(struct caml_ba_proxy)); if (proxy == NULL) caml_raise_out_of_memory(); - caml_atomic_refcount_init(&proxy->refcount, 2); + caml_atomic_counter_init(&proxy->refcount, 2); /* initial refcount: 2 = original array + sub array */ proxy->data = b1->data; proxy->size = diff --git a/runtime/callback.c b/runtime/callback.c index 6e9d3dd4..3832bada 100644 --- a/runtime/callback.c +++ b/runtime/callback.c @@ -368,7 +368,7 @@ CAMLexport value caml_callbackN (value closure, int narg, value args[]) struct named_value { value val; struct named_value * next; - char name[1]; + char name[]; /* flexible array member */ }; #define Named_value_size 13 @@ -386,37 +386,39 @@ static unsigned int hash_value_name(char const *name) CAMLprim value caml_register_named_value(value vname, value val) { + CAMLparam2(vname, val); const char * name = String_val(vname); - size_t namelen = strlen(name); unsigned int h = hash_value_name(name); int found = 0; - caml_plat_lock_blocking(&named_value_lock); + caml_plat_lock_non_blocking(&named_value_lock); + name = NULL; /* block may have moved while we waited for the lock. */ for (struct named_value *nv = named_value_table[h]; nv != NULL; nv = nv->next) { - if (strcmp(name, nv->name) == 0) { + if (strcmp(String_val(vname), nv->name) == 0) { caml_modify_generational_global_root(&nv->val, val); found = 1; break; } } if (!found) { - struct named_value * nv = (struct named_value *) - caml_stat_alloc(sizeof(struct named_value) + namelen); - memcpy(nv->name, name, namelen + 1); + size_t namelen = strlen(String_val(vname)); + struct named_value * nv = + caml_stat_alloc(sizeof(struct named_value) + namelen + 1); + memcpy(nv->name, String_val(vname), namelen + 1); nv->val = val; nv->next = named_value_table[h]; named_value_table[h] = nv; caml_register_generational_global_root(&nv->val); } caml_plat_unlock(&named_value_lock); - return Val_unit; + CAMLreturn(Val_unit); } CAMLexport const value* caml_named_value(char const *name) { - caml_plat_lock_blocking(&named_value_lock); + caml_plat_lock_non_blocking(&named_value_lock); for (struct named_value *nv = named_value_table[hash_value_name(name)]; nv != NULL; nv = nv->next) { @@ -431,7 +433,7 @@ CAMLexport const value* caml_named_value(char const *name) CAMLexport void caml_iterate_named_values(caml_named_action f) { - caml_plat_lock_blocking(&named_value_lock); + caml_plat_lock_non_blocking(&named_value_lock); for (int i = 0; i < Named_value_size; i++){ for (struct named_value *nv = named_value_table[i]; nv != NULL; diff --git a/runtime/caml/alloc.h b/runtime/caml/alloc.h index f4a6837d..0e17f17c 100644 --- a/runtime/caml/alloc.h +++ b/runtime/caml/alloc.h @@ -56,7 +56,7 @@ CAMLextern value caml_copy_nativeint (intnat); /* defined in [ints.c] */ CAMLextern value caml_alloc_array (value (*funct) (char const *), char const * const * array); CAMLextern value caml_alloc_sprintf(const char * format, ...) -#ifdef __GNUC__ +#if __has_attribute(format) || defined(__GNUC__) __attribute__ ((format (printf, 1, 2))) #endif ; diff --git a/runtime/caml/asm.h b/runtime/caml/asm.h index b3c9b2b2..77372ea1 100644 --- a/runtime/caml/asm.h +++ b/runtime/caml/asm.h @@ -45,6 +45,26 @@ #define CFI_STARTPROC #endif +/* .size and .type directives, with explicit end-of-directive semi-colons */ + +#ifdef ASM_SIZE_TYPE_DIRECTIVES +#define SIZE_DIRECTIVE(name) \ + .size name, . - name; +#define TYPE_DIRECTIVE(name,ty) \ + .type name, ty; +#else +#define SIZE_DIRECTIVE(name) +#define TYPE_DIRECTIVE(name,ty) +#endif + +/* Non-executable stack note */ + +#ifdef WITH_NONEXECSTACK_NOTE +#define NONEXECSTACK_NOTE .section .note.GNU-stack,"",%progbits +#else +#define NONEXECSTACK_NOTE +#endif + /******************************************************************************/ /* DWARF */ /******************************************************************************/ diff --git a/runtime/caml/atomic_refcount.h b/runtime/caml/atomic_refcount.h deleted file mode 100644 index aba5ce7f..00000000 --- a/runtime/caml/atomic_refcount.h +++ /dev/null @@ -1,37 +0,0 @@ -/**************************************************************************/ -/* */ -/* OCaml */ -/* */ -/* Florian Angeletti, projet Cambium, Inria */ -/* */ -/* Copyright 2022 Institut National de Recherche en Informatique et */ -/* en Automatique. */ -/* */ -/* All rights reserved. This file is distributed under the terms of */ -/* the GNU Lesser General Public License version 2.1, with the */ -/* special exception on linking described in the file LICENSE. */ -/* */ -/**************************************************************************/ - -#ifndef CAML_ATOMIC_REFCOUNT_H -#define CAML_ATOMIC_REFCOUNT_H - -#ifdef CAML_INTERNALS - -#include "camlatomic.h" - -Caml_inline void caml_atomic_refcount_init(atomic_uintnat* refc, uintnat n){ - atomic_store_release(refc, n); -} - -Caml_inline uintnat caml_atomic_refcount_decr(atomic_uintnat* refcount){ - return atomic_fetch_add (refcount, -1); -} - -Caml_inline uintnat caml_atomic_refcount_incr(atomic_uintnat* refcount){ - return atomic_fetch_add (refcount, 1); -} - -#endif /* CAML_INTERNALS */ - -#endif // CAML_ATOMIC_REFCOUNT_H diff --git a/runtime/caml/bigarray.h b/runtime/caml/bigarray.h index 53d12e33..98ce6edb 100644 --- a/runtime/caml/bigarray.h +++ b/runtime/caml/bigarray.h @@ -18,6 +18,7 @@ #include "config.h" #include "mlvalues.h" +#include "camlatomic.h" typedef signed char caml_ba_int8; typedef unsigned char caml_ba_uint8; @@ -82,7 +83,7 @@ struct caml_ba_array { intnat num_dims; /* Number of dimensions */ intnat flags; /* Kind of element array + memory layout + allocation status */ struct caml_ba_proxy * proxy; /* The proxy for sub-arrays, or NULL */ - intnat dim[] /*[num_dims]*/; /* Size in each dimension */ + intnat dim[/* num_dims */]; /* Size in each dimension */ }; /* Size of struct caml_ba_array, in bytes, without [dim] array */ @@ -109,7 +110,7 @@ CAMLextern uintnat caml_ba_num_elts(struct caml_ba_array * b); #ifdef CAML_INTERNALS -CAMLextern int caml_ba_element_size[]; +CAMLextern const int caml_ba_element_size[]; CAMLextern void caml_ba_finalize(value v); CAMLextern int caml_ba_compare(value v1, value v2); CAMLextern intnat caml_ba_hash(value v); diff --git a/runtime/caml/camlatomic.h b/runtime/caml/camlatomic.h index ea4f91bd..3347d20e 100644 --- a/runtime/caml/camlatomic.h +++ b/runtime/caml/camlatomic.h @@ -18,30 +18,20 @@ #define CAML_ATOMIC_H #include "config.h" +#include "misc.h" /* * C11 atomics types and utility macros. */ #ifdef __cplusplus - extern "C++" { -#include -typedef std::atomic atomic_uintnat; -typedef std::atomic atomic_intnat; using std::memory_order_relaxed; using std::memory_order_acquire; using std::memory_order_release; using std::memory_order_acq_rel; using std::memory_order_seq_cst; } - -#else - -#include -typedef _Atomic uintnat atomic_uintnat; -typedef _Atomic intnat atomic_intnat; - #endif #ifdef CAML_INTERNALS @@ -57,6 +47,40 @@ typedef _Atomic intnat atomic_intnat; #define atomic_store_relaxed(p, v) \ atomic_store_explicit((p), (v), memory_order_relaxed) +/* Atomic counters, abstracted here for use across the runtime. */ + +Caml_inline void caml_atomic_counter_init(atomic_uintnat* counter, uintnat n) +{ + atomic_store_release(counter, n); +} + +/* Atomically get the current value of an atomic uintnat counter */ + +Caml_inline uintnat caml_atomic_counter_value(atomic_uintnat* counter) +{ + return atomic_load_acquire(counter); +} + +/* Decrement an atomic uintnat counter. Assertion check for + * underflow. Returns the new value. */ + +Caml_inline uintnat caml_atomic_counter_decr(atomic_uintnat* counter) +{ + uintnat old = atomic_fetch_sub(counter, 1); + CAMLassert (old > 0); + return old-1; +} + +/* Increment an atomic uintnat counter. Assertion check for + * overflow. Returns the new value. */ + +Caml_inline uintnat caml_atomic_counter_incr(atomic_uintnat* counter) +{ + uintnat old = atomic_fetch_add(counter, 1); + CAMLassert (old+1 != 0); + return old+1; +} + #endif /* CAML_INTERNALS */ #endif /* CAML_ATOMIC_H */ diff --git a/runtime/caml/compatibility.h b/runtime/caml/compatibility.h index 5cfc12fa..103170f1 100644 --- a/runtime/caml/compatibility.h +++ b/runtime/caml/compatibility.h @@ -28,4 +28,9 @@ # define HAS_NANOSECOND_STAT 3 #endif +#ifndef _WIN32 +/* unistd.h is assumed to be available */ +#define HAS_UNISTD 1 +#endif + #endif /* CAML_COMPATIBILITY_H */ diff --git a/runtime/caml/custom.h b/runtime/caml/custom.h index cea9d3ae..f3044705 100644 --- a/runtime/caml/custom.h +++ b/runtime/caml/custom.h @@ -51,7 +51,7 @@ struct custom_operations { extern "C" { #endif -CAMLextern uintnat caml_custom_major_ratio; +CAMLextern atomic_uintnat caml_custom_major_ratio; CAMLextern value caml_alloc_custom(const struct custom_operations * ops, uintnat size, /*size in bytes*/ diff --git a/runtime/caml/domain.h b/runtime/caml/domain.h index 7d3337e4..c7d6c113 100644 --- a/runtime/caml/domain.h +++ b/runtime/caml/domain.h @@ -19,6 +19,8 @@ #ifdef CAML_INTERNALS +#include + #include "camlatomic.h" #include "config.h" #include "mlvalues.h" @@ -90,6 +92,20 @@ CAMLextern uintnat caml_minor_heap_max_wsz; CAMLextern atomic_uintnat caml_num_domains_running; +/* When [caml_domain_alone()] is true, there is a single domain + running. In particular, if the test passes while holding the domain + lock, then we know that no other domain is running concurrently, + and we can use fast paths with fewer synchronization operations. + + // if you hold the domain lock: + if (caml_domain_alone()) { + // sequential fast path + ... + } else { + // slower concurrent version + ... + } +*/ Caml_inline intnat caml_domain_alone(void) { return atomic_load_acquire(&caml_num_domains_running) == 1; @@ -113,6 +129,7 @@ int caml_domain_is_in_stw(void); int caml_domain_terminating(caml_domain_state *); int caml_domain_is_terminating(void); +void caml_domain_terminate(bool last); int caml_try_run_on_all_domains_with_spin_work( int sync, @@ -230,6 +247,17 @@ void caml_global_barrier_release_as_final(barrier_status status); caml_global_barrier_release_as_final(CAML_GENSYM(b))), \ CAML_GENSYM(continue) = 0)) +/* + * Termination helpers. + */ + +/* Force all other domains to stop their operation. */ +void caml_stop_all_domains(void); + +/* Try and release all synchronisation resources set up by + caml_init_domains(). Returns whether all resources could be released. */ +bool caml_free_domains(void); + #endif /* CAML_INTERNALS */ #endif /* CAML_DOMAIN_H */ diff --git a/runtime/caml/domain_state.h b/runtime/caml/domain_state.h index 89d62f33..392c3dea 100644 --- a/runtime/caml/domain_state.h +++ b/runtime/caml/domain_state.h @@ -50,7 +50,7 @@ enum { CAMLextern CAMLthread_local caml_domain_state* caml_state; #define Caml_state_opt caml_state #else -#ifdef __GNUC__ +#if __has_attribute(pure) || defined(__GNUC__) __attribute__((pure)) #endif CAMLextern caml_domain_state* caml_get_domain_state(void); diff --git a/runtime/caml/domain_state.tbl b/runtime/caml/domain_state.tbl index bbb956f2..b18e0aac 100644 --- a/runtime/caml/domain_state.tbl +++ b/runtime/caml/domain_state.tbl @@ -74,15 +74,48 @@ DOMAIN_STATE(uintnat, sweeping_done) /* Is sweeping done for the current major cycle. */ DOMAIN_STATE(uintnat, allocated_words) -/* Number of words promoted or allocated directly to the major heap since - latest slice. */ +/* Number of words allocated in the major heap (by promotion or + direct allocation) since the latest slice. */ DOMAIN_STATE(uintnat, allocated_words_direct) -/* Number of words allocated directly to the major heap since the latest - slice. (subset of allocated_words) */ +/* Subset of [allocated_words] that was allocated directly to the + major heap since the latest slice. */ + +DOMAIN_STATE(uintnat, allocated_words_suspended) +/* Subset of [allocated_words] that were allocated in ramp-up + phases since the latest slice. + + The corresponding deallocation work is "suspended" for later + ramp-down phases, instead of being performed in the next slice. */ + +DOMAIN_STATE(uintnat, allocated_words_resumed) +/* A number of allocated words (disjoint from [allocated_words]) + whose deallocation work was suspended by a previous ramp-up phase, + and was resumed during a ramp-down phase since the latest slice. */ + +DOMAIN_STATE(intnat, current_ramp_up_allocated_words_diff) +/* The total number of suspended deallocation words for the current ramp-up + phase is [allocated_suspended + current_ramp_up_allocated_words_diff]. + + When [current_ramp_up_allocated_words_diff] is positive, it adds + allocations that happened during the current ramp-up phase but + before the latest slice. + + When [current_ramp_up_allocated_words_diff] is negative, it + subtracts allocations that happened since the latest slice but + during a previous ramp-up phase. + + (Instead of tracking a difference, we could count the total + number of suspended deallocation of the ramp_up phase, but + this would require additional work to increment this value + in [caml_update_major_allocated_words].) +*/ DOMAIN_STATE(uintnat, swept_words) +DOMAIN_STATE(caml_gc_policy, gc_policy) +/* Domain-local GC policy setting. */ + DOMAIN_STATE(uintnat, major_slice_epoch) DOMAIN_STATE(struct caml__roots_block*, local_roots) diff --git a/runtime/caml/dynlink.h b/runtime/caml/dynlink.h index d5f7170e..016a35cc 100644 --- a/runtime/caml/dynlink.h +++ b/runtime/caml/dynlink.h @@ -42,7 +42,7 @@ extern void caml_build_primitive_table_builtin(void); extern void caml_free_shared_libs(void); /* Return the effective location of the standard library */ -extern char_os * caml_get_stdlib_location(void); +extern const char_os * caml_get_stdlib_location(void); /* Parse ld.conf and add the lines read to caml_shared_libs_path */ extern char_os * caml_parse_ld_conf(void); diff --git a/runtime/caml/fail.h b/runtime/caml/fail.h index 4389240d..113f6251 100644 --- a/runtime/caml/fail.h +++ b/runtime/caml/fail.h @@ -73,6 +73,9 @@ struct caml_exception_context { int caml_is_special_exception(value exn); +/* from runtime/sync.c */ +CAMLextern void caml_check_error(int err, char const * msg); + #endif /* CAML_INTERNALS */ #ifdef __cplusplus diff --git a/runtime/caml/fiber.h b/runtime/caml/fiber.h index b01d1cde..9b16ba17 100644 --- a/runtime/caml/fiber.h +++ b/runtime/caml/fiber.h @@ -239,7 +239,8 @@ struct c_stack_link { * handle_exception function is executed on the parent stack. */ -/* The table of global identifiers */ +/* The table of global identifiers. Val_unit initially and replaced with a block + during bytecode startup. */ extern value caml_global_data; #define Trap_pc(tp) (((code_t *)(tp))[0]) diff --git a/runtime/caml/finalise.h b/runtime/caml/finalise.h index 3ecb23fc..489c1716 100644 --- a/runtime/caml/finalise.h +++ b/runtime/caml/finalise.h @@ -45,7 +45,7 @@ struct finalisable { struct final_todo { struct final_todo *next; int size; - struct final item[1]; /* variable size */ + struct final item[/* size */]; /* flexible array member */ }; /* diff --git a/runtime/caml/frame_descriptors.h b/runtime/caml/frame_descriptors.h index 67a407e7..354e0e10 100644 --- a/runtime/caml/frame_descriptors.h +++ b/runtime/caml/frame_descriptors.h @@ -31,7 +31,7 @@ * * - frame_return_to_C(): Whether the return is to C from OCaml, in * which case there is no actual stack frame, GC roots, allocation - * sizes, or debug info. See caml_system.frametable in the various + * sizes, or debug info. See caml_system$frametable in the various * architecture-specific OCaml/C interfaces. * * - frame_size(): The stack frame size, in bytes. All stack frames @@ -63,7 +63,7 @@ typedef struct { uintnat retaddr; uint16_t frame_data; /* frame size and various flags */ uint16_t num_live; - uint16_t live_ofs[1 /* num_live */]; + uint16_t live_ofs[/* num_live */]; /* flexible array member */ /* If frame_has_allocs(), alloc lengths follow: uint8_t num_allocs; @@ -119,7 +119,8 @@ void* caml_copy_and_register_frametable(void *table, int size); /* The unregistered frametables can still be in use after calling this function. Thus, you should not free their memory. - Note: it may reorder the content of the array 'tables' */ + Note: it may reorder the content of the array 'tables'. + This can be called from a custom block finalizer. */ void caml_unregister_frametables(void **tables, int ntables); void caml_unregister_frametable(void *table); diff --git a/runtime/caml/gc_ctrl.h b/runtime/caml/gc_ctrl.h index 223bd505..af160f3f 100644 --- a/runtime/caml/gc_ctrl.h +++ b/runtime/caml/gc_ctrl.h @@ -43,6 +43,12 @@ value caml_gc_major(value); void caml_heap_check (void); #endif +/* See the documentation of [Gc.ramp_up] in the standard library. */ +caml_result caml_gc_ramp_up(value callback, uintnat *out_suspended_work); + +/* See the documentation of [Gc.ramp_down] in the standard library. */ +void caml_gc_ramp_down(uintnat suspended_ramp_up_words); + #endif /* CAML_INTERNALS */ #endif /* CAML_GC_CTRL_H */ diff --git a/runtime/caml/gc_stats.h b/runtime/caml/gc_stats.h index 8aff709b..5adb2836 100644 --- a/runtime/caml/gc_stats.h +++ b/runtime/caml/gc_stats.h @@ -85,6 +85,8 @@ void caml_compute_gc_stats(struct gc_stats* buf); void caml_init_gc_stats (uintnat max_domains); +void caml_free_gc_stats(void); + #endif /* CAML_INTERNALS */ #endif /* CAML_GC_STATS_H */ diff --git a/runtime/caml/intext.h b/runtime/caml/intext.h index 3b1288f1..8eef3f89 100644 --- a/runtime/caml/intext.h +++ b/runtime/caml/intext.h @@ -207,7 +207,7 @@ CAMLextern void caml_deserialize_block_4(void * data, intnat len); CAMLextern void caml_deserialize_block_8(void * data, intnat len); CAMLextern void caml_deserialize_block_float_8(void * data, intnat len); -CAMLnoret CAMLextern void caml_deserialize_error(char * msg); +CAMLnoret CAMLextern void caml_deserialize_error(const char * msg); #ifdef __cplusplus } diff --git a/runtime/caml/io.h b/runtime/caml/io.h index 4ff505d0..6d4abb2d 100644 --- a/runtime/caml/io.h +++ b/runtime/caml/io.h @@ -36,10 +36,6 @@ typedef intptr_t caml_plat_mutex; #endif -#ifndef IO_BUFFER_SIZE -#define IO_BUFFER_SIZE 65536 -#endif - #if defined(_WIN32) typedef __int64 file_offset; #else @@ -63,8 +59,12 @@ struct channel { enum { CHANNEL_FLAG_FROM_SOCKET = 1, /* For Windows */ - CHANNEL_FLAG_MANAGED_BY_GC = 4, /* Free and close using GC finalization */ - CHANNEL_TEXT_MODE = 8, /* "Text mode" for Windows and Cygwin */ + CHANNEL_FLAG_MANAGED_BY_GC = 4, /* Free and close using GC finalization. */ + /* Note: For backwards-compatibility, channels without the flag + CHANNEL_FLAG_MANAGED_BY_GC can be used inside single-threaded + programs without locking. As a consequence, using such a channel + from an asynchronous callback can result in deadlocks. */ + CHANNEL_TEXT_MODE = 8, /* "Text mode" for Windows and Cygwin */ CHANNEL_FLAG_UNBUFFERED = 16 /* Unbuffered (for output channels only) */ }; @@ -76,9 +76,11 @@ enum { /* Creating and closing channels from C */ +CAMLextern void caml_close_channel (struct channel *); +CAMLalloc(caml_close_channel, 1) CAMLreturns_nonnull() CAMLextern struct channel * caml_open_descriptor_in (int); +CAMLalloc(caml_close_channel, 1) CAMLreturns_nonnull() CAMLextern struct channel * caml_open_descriptor_out (int); -CAMLextern void caml_close_channel (struct channel *); CAMLextern file_offset caml_channel_size (struct channel *); CAMLextern void caml_seek_in (struct channel *, file_offset); CAMLextern void caml_seek_out (struct channel *, file_offset); @@ -96,8 +98,8 @@ CAMLextern void caml_flush (struct channel *); CAMLextern void caml_flush_if_unbuffered (struct channel *); CAMLextern void caml_putch(struct channel *, int); CAMLextern void caml_putword (struct channel *, uint32_t); -CAMLextern int caml_putblock (struct channel *, char *, intnat); -CAMLextern void caml_really_putblock (struct channel *, char *, intnat); +CAMLextern int caml_putblock (struct channel *, const char *, intnat); +CAMLextern void caml_really_putblock (struct channel *, const char *, intnat); CAMLextern unsigned char caml_refill (struct channel *); CAMLextern unsigned char caml_getch(struct channel *); diff --git a/runtime/caml/lf_skiplist.h b/runtime/caml/lf_skiplist.h index 3fd4a830..51321fba 100644 --- a/runtime/caml/lf_skiplist.h +++ b/runtime/caml/lf_skiplist.h @@ -100,7 +100,7 @@ extern void caml_lf_skiplist_free_garbage(struct lf_skiplist *sk); [var] designates the current element. [action] can refer to [var->key] and [var->data]. [action] can safely remove the current element, i.e. call - [caml_skiplist_remove] on [var->key]. The traversal will + [caml_lf_skiplist_remove] on [var->key]. The traversal will continue with the skiplist element following the removed element. Other operations performed over the skiplist during its traversal have unspecified effects on the traversal. */ diff --git a/runtime/caml/m.h.in b/runtime/caml/m.h.in index 3e9ef4b0..d771d260 100644 --- a/runtime/caml/m.h.in +++ b/runtime/caml/m.h.in @@ -64,6 +64,11 @@ #undef ASM_CFI_SUPPORTED +#undef ASM_SIZE_TYPE_DIRECTIVES + +/* Define ASM_SIZE_TYPE_DIRECTIVES when the ".size" and ".type" assembler + directives can be used */ + #undef WITH_FRAME_POINTERS #define NO_NAKED_POINTERS 1 @@ -81,3 +86,8 @@ #undef SUPPORTS_TREE_VECTORIZE #undef USE_MMAP_MAP_STACK + +#undef WITH_NONEXECSTACK_NOTE + +/* Define WITH_NONEXECSTACK_NOTE when an explicit ".note.GNU-stack" section + is to be added to indicate the stack should not be executable */ diff --git a/runtime/caml/major_gc.h b/runtime/caml/major_gc.h index b5127ef5..6e32934d 100644 --- a/runtime/caml/major_gc.h +++ b/runtime/caml/major_gc.h @@ -42,25 +42,33 @@ void caml_darken_cont(value); void caml_mark_root(value, value*); void caml_empty_mark_stack(void); void caml_finish_major_cycle(int force_compaction); +/* Reset any internal accounting the GC uses to set collection pacing. + * For use at times when we have disturbed the usual pacing, for + * example, after any synchronous major collection. + */ +void caml_reset_major_pacing(void); #ifdef DEBUG int caml_mark_stack_is_empty(void); #endif void caml_orphan_ephemerons(caml_domain_state*); void caml_orphan_finalisers(caml_domain_state*); -/* Forces finalisation of all heap-allocated values, - disregarding both local and global roots. - - Warning: finalisation is performed by means of forced sweeping, which may - result in pointers referencing nonexistent values; therefore the function - should only be used on runtime shutdown. -*/ -void caml_finalise_heap (void); - /* This variable is only written with the world stopped, so it need not be atomic */ extern uintnat caml_major_cycles_completed; +Caml_inline void caml_update_major_allocated_words( + caml_domain_state *self, intnat words, int direct +) { + self->allocated_words += words; + if (direct) { + self->allocated_words_direct += words; + } + if (self->gc_policy & CAML_GC_RAMP_UP) { + self->allocated_words_suspended += words; + } +} + #endif /* CAML_INTERNALS */ #endif /* CAML_MAJOR_GC_H */ diff --git a/runtime/caml/memory.h b/runtime/caml/memory.h index 1c3ef483..085c5bd5 100644 --- a/runtime/caml/memory.h +++ b/runtime/caml/memory.h @@ -43,7 +43,7 @@ CAMLextern void caml_alloc_dependent_memory (mlsize_t bsz); CAMLextern void caml_free_dependent_memory (mlsize_t bsz); CAMLextern void caml_modify (volatile value *, value); CAMLextern void caml_initialize (volatile value *, value); -CAMLextern int caml_atomic_cas_field (value, intnat, value, value); +CAMLextern value caml_atomic_cas_field (value, value, value, value); CAMLextern value caml_check_urgent_gc (value); /* [caml_stat_*] functions below provide an interface to the static memory @@ -79,16 +79,21 @@ CAMLextern void caml_stat_destroy_pool(void); #endif /* CAML_INTERNALS */ +/* [caml_stat_free(block)] deallocates the provided [block]. */ +CAMLextern void caml_stat_free(caml_stat_block); + /* [caml_stat_alloc(size)] allocates a memory block of the requested [size] (in bytes) and returns a pointer to it. It throws an OCaml exception in case the request fails, and so requires the runtime lock to be held. */ +CAMLmalloc(caml_stat_free, 1, 1) CAMLreturns_nonnull() CAMLextern caml_stat_block caml_stat_alloc(asize_t); /* [caml_stat_alloc_noexc(size)] allocates a memory block of the requested [size] (in bytes) and returns a pointer to it, or NULL in case the request fails. */ +CAMLmalloc(caml_stat_free, 1, 1) CAMLextern caml_stat_block caml_stat_alloc_noexc(asize_t); /* [caml_stat_alloc_aligned(size, modulo, block*)] allocates a memory block of @@ -97,12 +102,14 @@ CAMLextern caml_stat_block caml_stat_alloc_noexc(asize_t); well as the unaligned [block] (as an output parameter). It throws an OCaml exception in case the request fails, and so requires the runtime lock. */ +CAMLaligned_alloc(caml_stat_free, 1, 1, 2) CAMLreturns_nonnull() CAMLextern void* caml_stat_alloc_aligned(asize_t, int modulo, caml_stat_block*); /* [caml_stat_alloc_aligned_noexc] is a variant of [caml_stat_alloc_aligned] that returns NULL in case the request fails, and doesn't require the runtime lock to be held. */ +CAMLaligned_alloc(caml_stat_free, 1, 1, 2) CAMLextern void* caml_stat_alloc_aligned_noexc(asize_t, int modulo, caml_stat_block*); @@ -111,11 +118,9 @@ CAMLextern void* caml_stat_alloc_aligned_noexc(asize_t, int modulo, bits to zero, effectively allocating a zero-initialized memory block of [num * size] bytes. It returns NULL in case the request fails. */ +CAMLcalloc(caml_stat_free, 1, 1, 2) CAMLextern caml_stat_block caml_stat_calloc_noexc(asize_t, asize_t); -/* [caml_stat_free(block)] deallocates the provided [block]. */ -CAMLextern void caml_stat_free(caml_stat_block); - /* [caml_stat_resize(block, size)] changes the size of the provided [block] to [size] bytes. The function may move the memory block to a new location (whose address is returned by the function). The content of the [block] is preserved @@ -124,11 +129,13 @@ CAMLextern void caml_stat_free(caml_stat_block); portion is indeterminate. The function throws an OCaml exception in case the request fails, and so requires the runtime lock to be held. */ +CAMLrealloc(2) CAMLreturns_nonnull() CAMLextern caml_stat_block caml_stat_resize(caml_stat_block, asize_t); /* [caml_stat_resize_noexc] is a variant of [caml_stat_resize] that returns NULL in case the request fails, and doesn't require the runtime lock. */ +CAMLrealloc(2) CAMLextern caml_stat_block caml_stat_resize_noexc(caml_stat_block, asize_t); @@ -139,11 +146,13 @@ typedef char* caml_stat_string; copy of the null-terminated string [s]. It throws an OCaml exception in case the request fails, and so requires the runtime lock to be held. */ +CAMLalloc(caml_stat_free, 1) CAMLreturns_nonnull() CAMLextern caml_stat_string caml_stat_strdup(const char *s); /* [caml_stat_strdup_noexc] is a variant of [caml_stat_strdup] that returns NULL in case the request fails, and doesn't require the runtime lock. */ +CAMLalloc(caml_stat_free, 1) CAMLextern caml_stat_string caml_stat_strdup_noexc(const char *s); #ifdef _WIN32 @@ -151,17 +160,31 @@ CAMLextern caml_stat_string caml_stat_strdup_noexc(const char *s); * obvious equivalents of [caml_stat_strdup] and * [caml_stat_strdup_noexc] for wide characters. */ +CAMLalloc(caml_stat_free, 1) CAMLreturns_nonnull() CAMLextern wchar_t* caml_stat_wcsdup(const wchar_t *s); +CAMLalloc(caml_stat_free, 1) CAMLextern wchar_t* caml_stat_wcsdup_noexc(const wchar_t *s); #endif +/* [caml_stat_memdup(s, size, &out_size)] returns a copy of the first [size] + bytes of [s] (which may include NUL characters). If [out_size] is not [NULL], + then [size] is stored in [*out_size]. This function is the "dummy" Unix + implementation of the Windows-only functions + caml_stat_char_array_{to,from}_utf16. +*/ +CAMLmalloc(caml_stat_free, 1, 2) CAMLreturns_nonnull() +CAMLextern caml_stat_string caml_stat_memdup(const char *s, asize_t size, + asize_t *out_size); + /* [caml_stat_strconcat(nargs, strings)] concatenates null-terminated [strings] (an array of [char*] of size [nargs]) into a new string, dropping all NULs, except for the very last one. It throws an OCaml exception in case the request fails, and so requires the runtime lock to be held. */ +CAMLalloc(caml_stat_free, 1) CAMLreturns_nonnull() CAMLextern caml_stat_string caml_stat_strconcat(int n, ...); #ifdef _WIN32 +CAMLalloc(caml_stat_free, 1) CAMLreturns_nonnull() CAMLextern wchar_t* caml_stat_wcsconcat(int n, ...); #endif @@ -262,9 +285,10 @@ struct caml__roots_block { Your function may raise an exception or return a [value] with the [CAMLreturn] macro. Its argument is simply the [value] returned by your function. Do NOT directly return a [value] with the [return] - keyword. If your function returns void, use [CAMLreturn0]. If you - un-register the local roots (i.e. undo the effects of the [CAMLparam*] - and [CAMLlocal] macros) without returning immediately, use [CAMLdrop]. + keyword. If your function returns void, use [CAMLreturn0]. If your + function is Noreturn, use [CAMLnoreturn]. If you un-register the + local roots (i.e. undo the effects of the [CAMLparam*] and + [CAMLlocal] macros) without returning immediately, use [CAMLdrop]. All the identifiers beginning with "caml__" are reserved by OCaml. Do not use them for anything (local or global variables, struct or diff --git a/runtime/caml/memprof.h b/runtime/caml/memprof.h index 23e7153f..492c50bd 100644 --- a/runtime/caml/memprof.h +++ b/runtime/caml/memprof.h @@ -28,7 +28,9 @@ enum { CAML_MEMPROF_SRC_NORMAL = 0, CAML_MEMPROF_SRC_MARSHAL = 1, /* interning */ - CAML_MEMPROF_SRC_CUSTOM = 2 /* custom memory */ }; + CAML_MEMPROF_SRC_CUSTOM = 2, /* custom memory */ + CAML_MEMPROF_SRC_MAP_FILE = 3, /* mmapped file */ + CAML_MEMPROF_NUM_SOURCE_KINDS}; /* Respond to the allocation of any block. Does not call callbacks. * `block` is the allocated block, to be tracked by memprof if @@ -39,8 +41,8 @@ enum { CAML_MEMPROF_SRC_NORMAL = 0, * but may not be for out-of-heap memory). `source` is one of the * `CAML_MEMPROF_SRC_* constants above. */ -void caml_memprof_sample_block(value block, size_t allocated_words, - size_t sampled_words, int source); +CAMLextern void caml_memprof_sample_block(value block, size_t allocated_words, + size_t sampled_words, int source); /* Sample a minor heap "Comballoc" (combined allocation). Called when * the memprof trigger is hit (before the allocation is actually diff --git a/runtime/caml/minor_gc.h b/runtime/caml/minor_gc.h index 2a86e16a..3b89b955 100644 --- a/runtime/caml/minor_gc.h +++ b/runtime/caml/minor_gc.h @@ -55,6 +55,7 @@ struct caml_ref_table CAML_TABLE_STRUCT(value *); struct caml_ephe_ref_elt { value ephe; /* an ephemeron in major heap */ mlsize_t offset; /* the offset that points in the minor heap */ + value locked; /* only used during minor GC; see minor_gc.c */ }; struct caml_ephe_ref_table CAML_TABLE_STRUCT(struct caml_ephe_ref_elt); @@ -121,6 +122,7 @@ Caml_inline void add_to_ephe_ref_table (struct caml_ephe_ref_table *tbl, ephe_ref = tbl->ptr++; ephe_ref->ephe = ar; ephe_ref->offset = offset; + ephe_ref->locked = Val_unit; CAMLassert(ephe_ref->offset < Wosize_val(ephe_ref->ephe)); } diff --git a/runtime/caml/misc.h b/runtime/caml/misc.h index 8325cd8c..0f8f7f0f 100644 --- a/runtime/caml/misc.h +++ b/runtime/caml/misc.h @@ -27,8 +27,6 @@ #include #include -#include "camlatomic.h" - /* Detection of available C attributes and compiler extensions */ #ifndef __has_c_attribute @@ -45,7 +43,7 @@ /* Deprecation warnings */ -#if defined(__GNUC__) || defined(__clang__) +#if __has_attribute(deprecated) || defined(__GNUC__) /* Supported since at least GCC 3.1 */ #define CAMLdeprecated_typedef(name, type) \ typedef type name __attribute__ ((deprecated)) @@ -56,9 +54,7 @@ #define CAMLdeprecated_typedef(name, type) typedef type name #endif -#if defined(__GNUC__) \ - && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L \ - || defined(_MSC_VER) && _MSC_VER >= 1925 +#if defined(__GNUC__) || defined(__llvm__) || defined(_MSC_VER) #define CAML_STRINGIFY(x) #x #ifdef _MSC_VER @@ -81,6 +77,17 @@ /* Basic types and constants */ typedef size_t asize_t; +#ifdef __cplusplus +extern "C++" { +#include +typedef std::atomic atomic_uintnat; +typedef std::atomic atomic_intnat; +} +#else +#include +typedef _Atomic uintnat atomic_uintnat; +typedef _Atomic intnat atomic_intnat; +#endif #ifndef NULL #define NULL 0 @@ -159,7 +166,9 @@ CAMLdeprecated_typedef(addr, char *); #endif #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202311L || \ - defined(__cplusplus) + defined(__cplusplus) && !defined(__CYGWIN__) + /* #14220: flexlink does not support C++11 's thread_local, + so prefer _Thread_local on Cygwin systems. */ #define CAMLthread_local thread_local #else #define CAMLthread_local _Thread_local @@ -168,9 +177,7 @@ CAMLdeprecated_typedef(addr, char *); /* Prefetching */ #ifdef CAML_INTERNALS -#if (__has_builtin(__builtin_prefetch) || defined(__GNUC__)) && \ - (defined(__i386__) || defined(__x86_64__) || \ - defined(_M_IX86) || defined(_M_AMD64)) +#if (__has_builtin(__builtin_prefetch) || defined(__GNUC__)) #define caml_prefetch(p) __builtin_prefetch((p), 1, 3) /* 1 = intent to write; 3 = all cache levels */ #elif defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_AMD64)) @@ -220,11 +227,79 @@ CAMLdeprecated_typedef(addr, char *); #endif #endif /* CAML_INTERNALS */ +/* Function attributes to give hints to the C compiler about optimizations and + static analysis. Intended for functions allocating and deallocating memory, + or opening and closing resources. + https://clang.llvm.org/docs/AttributeReference.html#function-attributes + https://gcc.gnu.org/onlinedocs/gcc-14.2.0/gcc/Common-Function-Attributes.html +*/ +#if __has_attribute(malloc) && __has_attribute(warn_unused_result) && \ + __has_attribute(alloc_size) && __has_attribute(alloc_align) && \ + __has_attribute(returns_nonnull) && \ + ((defined(__GNUC__) && __GNUC__ >= 14) || /* false-positives in GCC<14 */ \ + defined(__llvm__)) + +/* Indicates that a particular function always returns a non-null pointer. */ +#define CAMLreturns_nonnull() __attribute__ ((returns_nonnull)) + +/* [CAMLrealloc(n)] indicates that the function is [realloc]-like, and implies + that the [n]-th argument number equals the number of available bytes at the + returned pointer. */ +#define CAMLrealloc(alloc_size_N) \ + __attribute__ ((warn_unused_result,alloc_size(alloc_size_N))) + +/* [CAMLalloc(dealloc, p)] indicates that the function allocates a resource, + which must be deallocated by passing it as the [p]-th argument of the + function [dealloc]. */ +#if defined(__GNUC__) && !defined(__llvm__) +#define CAMLalloc(deallocator,ptr_index) \ + __attribute__ ((malloc,malloc(deallocator,ptr_index),warn_unused_result)) +#else +#define CAMLalloc(deallocator,ptr_index) \ + __attribute__ ((malloc,warn_unused_result)) +#endif + +/* [CAMLmalloc(dealloc, p, n)] indicates that the function is [malloc]-like, and + implies that it allocates a memory block whose size is set by the function's + [n]-th argument, and which must be deallocated by passing it as the [p]-th + argument of the function [dealloc]. */ +#define CAMLmalloc(deallocator,ptr_index,alloc_size_N) \ + CAMLalloc(deallocator,ptr_index) \ + __attribute__ ((alloc_size(alloc_size_N))) + +/* [CAMLcalloc(dealloc, p, n, m)] indicates that the function is [calloc]-like, + and implies that it allocates a memory block whose size is set by the product + of the function's [n]-th and [m]-th arguments, and which must be deallocated + by passing it as the [p]-th argument of the function [dealloc]. */ +#define CAMLcalloc(deallocator,ptr_index,alloc_size_N,alloc_size_M) \ + CAMLalloc(deallocator,ptr_index) \ + __attribute__ ((alloc_size(alloc_size_N,alloc_size_M))) + +/* [CAMLaligned_alloc(dealloc, p, n, a)] indicates that the function is + [aligned_alloc]-like, and implies that it allocates a memory block whose size + is set by the function's [n]-th argument, aligned on a boundary given by the + function's [a]-th argument, and which must be deallocated by passing it as + the [p]-th argument of the function [dealloc]. */ +#define CAMLaligned_alloc(deallocator,ptr_index,alloc_size_N,alloc_align_) \ + CAMLmalloc(deallocator,ptr_index,alloc_size_N) \ + __attribute__ ((alloc_align(alloc_align_))) + +#else +#define CAMLreturns_nonnull() +#define CAMLrealloc(asN) +#define CAMLalloc(d,pi) +#define CAMLmalloc(d,pi,asN) +#define CAMLcalloc(d,pi,asN,asM) +#define CAMLaligned_alloc(d,pi,asN,aa) +#endif + /* GC timing hooks. These can be assigned by the user. These hooks must not allocate, change any heap value, nor call OCaml code. They can obtain the domain id with Caml_state->id. These functions must be reentrant. */ #ifndef __cplusplus +#include + typedef void (*caml_timing_hook) (void); extern _Atomic caml_timing_hook caml_major_slice_begin_hook; extern _Atomic caml_timing_hook caml_major_slice_end_hook; @@ -279,7 +354,7 @@ typedef char char_os; from the callsite, making debuggers able to see it. */ #define CAMLassert(x) \ (CAMLlikely(x) ? (void) 0 : caml_failed_assert ( #x , __OSFILE__, __LINE__)) -CAMLextern void caml_failed_assert (char *, char_os *, int) +CAMLextern void caml_failed_assert (const char *, const char_os *, int) #if defined(__has_feature) /* However, we do inform clang-analyzer that this function never returns, since that improves analysis without breaking debugging */ @@ -293,14 +368,25 @@ CAMLextern void caml_failed_assert (char *, char_os *, int) #endif #if __has_builtin(__builtin_trap) || defined(__GNUC__) - #define CAMLunreachable() (__builtin_trap()) + CAMLnoret Caml_inline void caml_abort(void) { + __builtin_trap(); + } #elif defined(_MSC_VER) #include - CAMLnoret Caml_inline void caml_fastfail(unsigned int); - void caml_fastfail(unsigned int i) { __fastfail(i); } - #define CAMLunreachable() (caml_fastfail(7 /* FAST_FAIL_FATAL_APP_EXIT */)) + CAMLnoret Caml_inline void caml_abort(void) { + __fastfail(7 /* FAST_FAIL_FATAL_APP_EXIT */); + } +#else + CAMLnoret Caml_inline void caml_abort(void) { + abort(); + } +#endif + +#ifdef DEBUG +CAMLnoret CAMLextern void caml_debug_abort(const char_os *, int); +#define CAMLunreachable() (caml_debug_abort(__OSFILE__, __LINE__)) #else - #define CAMLunreachable() (CAMLassert(0)) +#define CAMLunreachable() (caml_abort()) #endif #if __has_builtin(__builtin_expect) || defined(__GNUC__) @@ -346,11 +432,11 @@ void caml_alloc_point_here(void); This function must be reentrant. */ #ifndef __cplusplus -typedef void (*fatal_error_hook) (char *msg, va_list args); +typedef void (*fatal_error_hook) (const char *msg, va_list args); extern _Atomic fatal_error_hook caml_fatal_error_hook; #endif -CAMLnoret CAMLextern void caml_fatal_error (char *, ...) +CAMLnoret CAMLextern void caml_fatal_error (const char *, ...) #if __has_attribute(format) || defined(__GNUC__) __attribute__ ((format (printf, 1, 2))) #endif @@ -448,8 +534,11 @@ extern double caml_log1p(double); #define caml_stat_strconcat_os caml_stat_wcsconcat #define caml_stat_strdup_to_os caml_stat_strdup_to_utf16 +#define caml_stat_strdup_noexc_to_os caml_stat_strdup_noexc_to_utf16 #define caml_stat_strdup_of_os caml_stat_strdup_of_utf16 #define caml_stat_strdup_noexc_of_os caml_stat_strdup_noexc_of_utf16 +#define caml_stat_char_array_to_os caml_stat_char_array_to_utf16 +#define caml_stat_char_array_of_os caml_stat_char_array_of_utf16 #define caml_copy_string_of_os caml_copy_string_of_utf16 #else /* _WIN32 */ @@ -490,8 +579,11 @@ extern double caml_log1p(double); #define caml_stat_strconcat_os caml_stat_strconcat #define caml_stat_strdup_to_os caml_stat_strdup +#define caml_stat_strdup_noexc_to_os caml_stat_strdup_noexc #define caml_stat_strdup_of_os caml_stat_strdup #define caml_stat_strdup_noexc_of_os caml_stat_strdup_noexc +#define caml_stat_char_array_to_os caml_stat_memdup +#define caml_stat_char_array_of_os caml_stat_memdup #define caml_copy_string_of_os caml_copy_string #endif /* _WIN32 */ @@ -538,25 +630,76 @@ CAMLextern int caml_read_directory(char_os * dirname, #ifdef CAML_INTERNALS -/* GC flags and messages */ +/* runtime message flags. Settable with v= in OCAMLRUNPARAM */ extern atomic_uintnat caml_verb_gc; -void caml_gc_log (char *, ...) +/* Bits which may be set in caml_verb_gc. The quotations are from the + * OCaml manual. */ + +/* "Start and end of major GC cycle" (unused) */ +#define CAML_GC_MSG_MAJOR 0x0001 +/* "Minor collection and major GC slice" (unused) */ +#define CAML_GC_MSG_MINOR 0x0002 +/* "Growing and shrinking of the heap" */ +#define CAML_GC_MSG_HEAPSIZE 0x0004 +/* "Resizing of stacks and memory manager tables" */ +#define CAML_GC_MSG_STACKSIZE 0x0008 +/* "Heap compaction" (unused) */ +#define CAML_GC_MSG_COMPACT 0x0010 +/* "Change of GC parameters" */ +#define CAML_GC_MSG_PARAMS 0x0020 +/* "Computation of major GC slice size" */ +#define CAML_GC_MSG_SLICESIZE 0x0040 +/* "Calling of finalization functions" */ +#define CAML_GC_MSG_FINALIZE 0x0080 +/* "Startup messages" */ +#define CAML_GC_MSG_STARTUP 0x0100 +/* "Computation of compaction-triggering condition" (unused) */ +#define CAML_GC_MSG_COMPACT_TRIGGER 0x0200 +/* "Output GC statistics at program exit" */ +#define CAML_GC_MSG_STATS 0x0400 +/* "GC debugging messages */ +#define CAML_GC_MSG_DEBUG 0x0800 +/* "Address space reservation changes" */ +#define CAML_GC_MSG_ADDRSPACE 0x1000 + +/* Default set of messages when runtime invoked with -v */ + +#define CAML_GC_MSG_VERBOSE (CAML_GC_MSG_MAJOR | \ + CAML_GC_MSG_HEAPSIZE | \ + CAML_GC_MSG_STACKSIZE | \ + CAML_GC_MSG_COMPACT | \ + CAML_GC_MSG_PARAMS) + +/* Use to control messages which should be output at any non-zero verbosity */ + +#define CAML_GC_MSG_ANY (-1) + +/* output message if caml_verb_gc includes any bits in `category`. */ + +void caml_gc_message (int category, const char *, ...) #if __has_attribute(format) || defined(__GNUC__) - __attribute__ ((format (printf, 1, 2))) + __attribute__ ((format (printf, 2, 3))) #endif ; -void caml_gc_message (int, char *, ...) +/* Short-hand for calls to `caml_gc_message` */ + +#define CAML_GC_MESSAGE(category, ...) \ + caml_gc_message(CAML_GC_MSG_ ## category, __VA_ARGS__) + +/* Output message if CAML_GC_MSG_DEBUG is set */ + +void caml_gc_log (const char *, ...) #if __has_attribute(format) || defined(__GNUC__) - __attribute__ ((format (printf, 2, 3))) + __attribute__ ((format (printf, 1, 2))) #endif ; /* Runtime warnings */ extern uintnat caml_runtime_warnings; -int caml_runtime_warnings_active(void); +CAMLextern int caml_runtime_warnings_active(void); #ifdef DEBUG #ifdef ARCH_SIXTYFOUR @@ -618,8 +761,10 @@ CAMLextern int caml_snwprintf(wchar_t * buf, /* Macro used to deactivate address sanitizer on some functions. */ #define CAMLno_asan -/* __has_feature is Clang-specific, but GCC defines __SANITIZE_ADDRESS__ and - * __SANITIZE_THREAD__. */ +/* `__has_feature` is present in Clang and recent GCCs (14 and later). Older + GCCs define `__SANITIZE_ADDRESS__`. In addition, starting from version 14 + GCC supports the Clang-originating syntax `no_sanitize("address")`. + This should select the right attribute in all circumstances. */ #if defined(__has_feature) # if __has_feature(address_sanitizer) # undef CAMLno_asan @@ -637,6 +782,27 @@ CAMLextern int caml_snwprintf(wchar_t * buf, #define CAML_GENSYM_2(name, l) CAML_GENSYM_3(name, l) #define CAML_GENSYM(name) CAML_GENSYM_2(name, __LINE__) +#define MSEC_PER_SEC UINT64_C(1000) +#define USEC_PER_MSEC UINT64_C(1000) +#define USEC_PER_SEC UINT64_C(1000000) +#define NSEC_PER_USEC UINT64_C(1000) +#define NSEC_PER_MSEC UINT64_C(1000000) +#define NSEC_PER_SEC UINT64_C(1000000000) + +#include + +Caml_inline struct timespec caml_timespec_of_nsec(uint64_t nsec) +{ + return (struct timespec) + { .tv_sec = (time_t) (nsec / NSEC_PER_SEC), +#if __STDC_VERSION__ >= 202311L + .tv_nsec = (typeof((struct timespec){0}.tv_nsec)) +#else + .tv_nsec = (long) +#endif + (nsec % NSEC_PER_SEC) }; +} + #endif /* CAML_INTERNALS */ /* The [backtrace_slot] type represents values stored in @@ -649,6 +815,14 @@ CAMLextern int caml_snwprintf(wchar_t * buf, */ typedef void * backtrace_slot; +#ifndef IO_BUFFER_SIZE +#define IO_BUFFER_SIZE 65536 +#endif + +/* GC policy settings */ +typedef intnat caml_gc_policy; +#define CAML_GC_RAMP_UP 0x0001 + #ifdef __cplusplus } #endif diff --git a/runtime/caml/mlvalues.h b/runtime/caml/mlvalues.h index 184fd904..73eea54b 100644 --- a/runtime/caml/mlvalues.h +++ b/runtime/caml/mlvalues.h @@ -19,6 +19,7 @@ #include "config.h" #include "misc.h" #include "tsan.h" +#include "camlatomic.h" #ifdef __cplusplus extern "C" { diff --git a/runtime/caml/osdeps.h b/runtime/caml/osdeps.h index 7215668c..0f563648 100644 --- a/runtime/caml/osdeps.h +++ b/runtime/caml/osdeps.h @@ -55,15 +55,16 @@ CAMLextern char_os * caml_search_exe_in_path(const char_os * name); extern char_os * caml_search_dll_in_path(struct ext_table * path, const char_os * name); +/* Close a shared library handle */ +extern void caml_dlclose(void * handle); + /* Open a shared library and return a handle on it. If [global] is true, symbols from the shared library can be used to resolve for other libraries to be opened later on. Return [NULL] on error. */ +CAMLalloc(caml_dlclose, 1) extern void * caml_dlopen(char_os * libname, int global); -/* Close a shared library handle */ -extern void caml_dlclose(void * handle); - /* Look up the given symbol in the given shared library. Return [NULL] if not found, or symbol value if found. */ extern void * caml_dlsym(void * handle, const char * name); @@ -135,6 +136,8 @@ CAMLextern clock_t caml_win32_clock(void); CAMLextern value caml_win32_xdg_defaults(void); +CAMLextern value caml_win32_get_temp_path(void); + #endif /* _WIN32 */ /* Returns the current value of a counter that increments once per nanosecond. @@ -144,7 +147,7 @@ CAMLextern value caml_win32_xdg_defaults(void); millisecond). This makes it useful for benchmarking and timeouts, but not for telling the time. The units are always nanoseconds, but the achieved resolution may be less. The starting point is unspecified. */ -extern uint64_t caml_time_counter(void); +CAMLextern uint64_t caml_time_counter(void); extern void caml_init_os_params(void); @@ -161,38 +164,99 @@ extern unsigned short caml_win32_minor; extern unsigned short caml_win32_build; extern unsigned short caml_win32_revision; -/* [caml_stat_strdup_to_utf16(s)] returns a null-terminated copy of [s], +/* [caml_stat_strdup_noexc_to_utf16(s)] returns a NUL-terminated copy of [s], re-encoded in UTF-16. The encoding of [s] is assumed to be UTF-8 if [caml_windows_unicode_runtime_enabled] is non-zero **and** [s] is valid UTF-8, or the current Windows code page otherwise. - The returned string is allocated with [caml_stat_alloc], so it should be free - using [caml_stat_free]. + The returned string is allocated with [caml_stat_alloc_noexc], so it should + be freed using [caml_stat_free]. + + If allocation fails, this returns NULL. This function never raises any + exceptions when [s] is valid UTF-8 but may raise [Sys_error] if it is not. */ +CAMLalloc(caml_stat_free, 1) +CAMLextern wchar_t* caml_stat_strdup_noexc_to_utf16(const char *s); + +/* [caml_stat_strdup_to_utf16(s)] returns a NUL-terminated copy of [s], + re-encoded in UTF-16. The encoding of [s] is assumed to be UTF-8 if + [caml_windows_unicode_runtime_enabled] is non-zero **and** [s] is valid + UTF-8, or the current Windows code page otherwise. + + The returned string is allocated with [caml_stat_alloc], so it should be + freed using [caml_stat_free]. + + If allocation fails, this raises Out_of_memory. This function may also raise + [Sys_error] if [s] is not valid UTF-8. +*/ +CAMLalloc(caml_stat_free, 1) CAMLreturns_nonnull() CAMLextern wchar_t* caml_stat_strdup_to_utf16(const char *s); -/* [caml_stat_strdup_noexc_of_utf16(s)] returns a null-terminated copy of [s], +/* [caml_stat_strdup_noexc_of_utf16(s)] returns a NUL-terminated copy of [s], re-encoded in UTF-8 if [caml_windows_unicode_runtime_enabled] is non-zero or the current Windows code page otherwise. - The returned string is allocated with [caml_stat_alloc_noexc], so - it should be freed using [caml_stat_free]. + The returned string is allocated with [caml_stat_alloc_noexc], so it should + be freed using [caml_stat_free]. - If allocation fails, this returns NULL. + If allocation fails, this returns NULL. This function never raises any + exceptions when [s] is valid UTF-16 but may raise [Sys_error] if it is not. */ +CAMLalloc(caml_stat_free, 1) CAMLextern char* caml_stat_strdup_noexc_of_utf16(const wchar_t *s); -/* [caml_stat_strdup_of_utf16(s)] returns a null-terminated copy of [s], +/* [caml_stat_strdup_of_utf16(s)] returns a NUL-terminated copy of [s], re-encoded in UTF-8 if [caml_windows_unicode_runtime_enabled] is non-zero or the current Windows code page otherwise. - The returned string is allocated with [caml_stat_alloc_noexc], so - it should be freed using [caml_stat_free]. + The returned string is allocated with [caml_stat_alloc], so it should be + freed using [caml_stat_free]. - If allocation fails, this raises Out_of_memory. + If allocation fails, this raises Out_of_memory. This function may also raise + [Sys_error] if [s] is not valid UTF-16. */ +CAMLalloc(caml_stat_free, 1) CAMLreturns_nonnull() CAMLextern char* caml_stat_strdup_of_utf16(const wchar_t *s); +/* [caml_stat_char_array_to_utf16(s, size, &out_size)] returns a copy of the + first [size] bytes of [s] re-encoded in UTF-16. [s] does not have to be NUL- + terminated and may contain embedded NUL characters. The encoding of [s] is + assumed to be UTF-8 if [caml_windows_unicode_runtime_enabled] is non-zero + **and** [s] is valid UTF-8, or the current Windows code page otherwise. If + [out_size] is not [NULL], then the number of UTF-16 code units in the result + is recorded in [*out_size]. + + [size] must be greater than zero. + + The returned buffer is allocated with [caml_stat_alloc], so it should be + freed using [caml_stat_free]. + + If allocation fails, this raises Out_of_memory. This function may also raise + [Sys_error] if [s] is not valid UTF-8. +*/ +CAMLmalloc(caml_stat_free, 1, 2) CAMLreturns_nonnull() +CAMLextern wchar_t *caml_stat_char_array_to_utf16(const char *s, size_t size, + size_t *out_size); + +/* [caml_stat_char_array_of_utf16(s, size, &out_size)] returns a copy of the + first [size] UTF-16 code units of [s] re-encoded in UTF-8 if + [caml_windows_unicode_runtime_enabled] is non-zero or the current Windows + code page otherwise. [s] does not have to be NUL-terminated and may contain + embedded NUL characters. If [out_size] is not [NULL], then the size of the + result in bytes recorded in [*out_size]. + + [size] must be greater than zero. + + The returned buffer is allocated with [caml_stat_alloc], so it should be + freed using [caml_stat_free]. + + If allocation fails, this raises Out_of_memory. This function may also raise + [Sys_error] if [s] is not valid UTF-16. +*/ +CAMLalloc(caml_stat_free, 1) CAMLreturns_nonnull() +CAMLextern char *caml_stat_char_array_of_utf16(const wchar_t *s, size_t size, + size_t *out_size); + /* [caml_copy_string_of_utf16(s)] returns an OCaml string containing a copy of [s] re-encoded in UTF-8 if [caml_windows_unicode_runtime_enabled] is non-zero or in the current code page otherwise. diff --git a/runtime/caml/platform.h b/runtime/caml/platform.h index c8f654fd..a282f8b0 100644 --- a/runtime/caml/platform.h +++ b/runtime/caml/platform.h @@ -66,14 +66,6 @@ Caml_inline void cpu_relax(void) { } -/* Atomic read-modify-write instructions, with full fences */ - -Caml_inline uintnat atomic_fetch_add_verify_ge0(atomic_uintnat* p, intnat v) { - uintnat result = atomic_fetch_add(p,v); - CAMLassert ((intnat)result > 0); - return result; -} - /* Warning: blocking functions. Blocking functions are for use in the runtime outside of the @@ -98,6 +90,12 @@ Caml_inline uintnat atomic_fetch_add_verify_ge0(atomic_uintnat* p, intnat v) { The domain lock must be held in order to call [caml_plat_lock_non_blocking]. + It is possible to combine calls to [caml_plat_lock_non_blocking] on + a mutex from the mutator holding the domain lock with calls to + [caml_plat_lock_blocking] on another mutator that has released + their domain lock, but not with calls to [caml_plat_lock_blocking] + from a STW section or a custom block finaliser. + These functions never raise exceptions; errors are fatal. Thus, for usages where bugs are susceptible to be introduced by users, the functions from caml/sync.h should be used instead. @@ -113,6 +111,7 @@ void caml_plat_assert_locked(caml_plat_mutex*); void caml_plat_assert_all_locks_unlocked(void); Caml_inline void caml_plat_unlock(caml_plat_mutex*); void caml_plat_mutex_free(caml_plat_mutex*); +CAMLextern void caml_plat_mutex_reinit(caml_plat_mutex*); typedef pthread_cond_t caml_plat_cond; #define CAML_PLAT_COND_INITIALIZER PTHREAD_COND_INITIALIZER void caml_plat_cond_init(caml_plat_cond*); diff --git a/runtime/caml/runtime_events.h b/runtime/caml/runtime_events.h index e64e6ef8..7fb28108 100644 --- a/runtime/caml/runtime_events.h +++ b/runtime/caml/runtime_events.h @@ -119,7 +119,9 @@ typedef enum { EV_COMPACT, EV_COMPACT_EVACUATE, EV_COMPACT_FORWARD, - EV_COMPACT_RELEASE + EV_COMPACT_RELEASE, + EV_EMPTY_MINOR, + EV_MINOR_EPHE_CLEAN, } ev_runtime_phase; typedef enum { diff --git a/runtime/caml/s.h.in b/runtime/caml/s.h.in index bc6ced45..ca5c510c 100644 --- a/runtime/caml/s.h.in +++ b/runtime/caml/s.h.in @@ -108,9 +108,15 @@ #undef HAS_PTHREAD_NP_H -#undef HAS_UNISTD +#undef HAS_PRCTL -/* Define HAS_UNISTD if you have /usr/include/unistd.h. */ +#undef HAS_PTHREAD_SETNAME_NP + +#undef HAS_PTHREAD_SET_NAME_NP + +#undef HAS_SETTHREADDESCRIPTION + +#undef HAS_DECL_SETTHREADDESCRIPTION #undef HAS_DIRENT @@ -295,8 +301,6 @@ #undef HAS_POSIX_SPAWN -#undef HAS_SIGWAIT - #undef HAS_HUGE_PAGES #undef HUGE_PAGE_SIZE diff --git a/runtime/caml/shared_heap.h b/runtime/caml/shared_heap.h index 9f7ec1dd..898e9a53 100644 --- a/runtime/caml/shared_heap.h +++ b/runtime/caml/shared_heap.h @@ -31,7 +31,15 @@ struct caml_heap_state; struct pool; struct caml_heap_state* caml_init_shared_heap(void); -void caml_teardown_shared_heap(struct caml_heap_state* heap); +void caml_adopt_all_orphan_heaps(struct caml_heap_state* heap); +void caml_assert_shared_heap_is_empty(struct caml_heap_state *heap); + +// ensures that the shared heap is empty +void caml_orphan_shared_heap(struct caml_heap_state* heap); + +// requires that the shared heap is empty +void caml_free_shared_heap(struct caml_heap_state* heap); + value* caml_shared_try_alloc(struct caml_heap_state*, mlsize_t, tag_t, reserved_t); @@ -106,6 +114,15 @@ void caml_cycle_heap(struct caml_heap_state*); /* Heap invariant verification (for debugging) */ void caml_verify_heap_from_stw(caml_domain_state *domain); +/* Forces finalisation of all heap-allocated values, + disregarding both local and global roots. + + Warning: this function should only be used on runtime shutdown. +*/ +void caml_finalise_heap(void); + +void caml_finalise_freelist(void); + #ifdef DEBUG /* [is_garbage(v)] returns true if [v] is a garbage value */ int is_garbage (value); diff --git a/runtime/caml/skiplist.h b/runtime/caml/skiplist.h index ba03ced7..14ab95cf 100644 --- a/runtime/caml/skiplist.h +++ b/runtime/caml/skiplist.h @@ -39,7 +39,7 @@ struct skiplist { struct skipcell { uintnat key; uintnat data; - struct skipcell * forward[]; /* flexible array member */ + struct skipcell * forward[]; /* flexible array member */ }; /* Initialize a skip list, statically */ @@ -54,6 +54,12 @@ extern void caml_skiplist_init(struct skiplist * sk); extern int caml_skiplist_find(struct skiplist * sk, uintnat key, /*out*/ uintnat * data); +/* Search a skip list. + If [key] is found, return a pointer to its associated data. + If [key] is not found, return NULL. */ +extern uintnat* caml_skiplist_find_ptr(struct skiplist * sk, uintnat key); + + /* Search the entry of the skip list that has the largest key less than or equal to [k]. If such an entry exists, store its key in [*key], the associated data in diff --git a/runtime/caml/startup.h b/runtime/caml/startup.h index 14f81e61..49fc5b9d 100644 --- a/runtime/caml/startup.h +++ b/runtime/caml/startup.h @@ -44,9 +44,9 @@ extern int caml_attempt_open(char_os **name, struct exec_trailer *trail, extern int caml_read_trailer(int fd, struct exec_trailer *trail); extern void caml_read_section_descriptors(int fd, struct exec_trailer *trail); extern int32_t caml_seek_optional_section(int fd, struct exec_trailer *trail, - char *name); + const char *name); extern int32_t caml_seek_section(int fd, struct exec_trailer *trail, - char *name); + const char *name); enum caml_byte_program_mode { diff --git a/runtime/caml/sys.h b/runtime/caml/sys.h index b2fe25a1..563ffd4b 100644 --- a/runtime/caml/sys.h +++ b/runtime/caml/sys.h @@ -29,7 +29,7 @@ CAMLnoret CAMLextern void caml_sys_error (value); CAMLnoret CAMLextern void caml_sys_io_error (value); CAMLextern double caml_sys_time_unboxed(value); -CAMLextern void caml_sys_init (char_os * exe_name, char_os ** argv); +CAMLextern void caml_sys_init (const char_os * exe_name, char_os ** argv); CAMLnoret CAMLextern void caml_do_exit (int); diff --git a/runtime/caml/tsan.h b/runtime/caml/tsan.h index eb1bf9fa..b9898346 100644 --- a/runtime/caml/tsan.h +++ b/runtime/caml/tsan.h @@ -21,8 +21,13 @@ extern "C" { /* Macro used to deactivate thread sanitizer on some functions. */ #define CAMLno_tsan -/* __has_feature is Clang-specific, but GCC defines __SANITIZE_ADDRESS__ and - * __SANITIZE_THREAD__. */ +/* `__has_feature` is present in Clang and recent GCCs (14 and later). Older + GCCs define `__SANITIZE_THREAD__`. In addition, starting from version 14 + GCC supports the Clang-originating syntax `no_sanitize("thread")`. + With Clang, `no_sanitize("thread")` does not seem to disable instrumentation + entirely, so we need to use the stronger, Clang-specific attribute + `disable_sanitizer_instrumentation`. + This should select the right attribute in all circumstances. */ #if defined(__has_feature) # if __has_feature(thread_sanitizer) # undef CAMLno_tsan diff --git a/runtime/caml/weak.h b/runtime/caml/weak.h index 4569d143..8e4bd457 100644 --- a/runtime/caml/weak.h +++ b/runtime/caml/weak.h @@ -24,7 +24,7 @@ extern "C" { #endif -extern value caml_ephe_none; +extern value caml_ephe_none, caml_ephe_locked; #ifdef __cplusplus } @@ -36,13 +36,13 @@ struct caml_ephe_info { value todo; /* These are ephemerons which need to be marked and swept in the current cycle. If the ephemeron is alive, after marking, they go into the live - list after cleaning them off the unreachable keys and releasing the data + list after cleaning off the unreachable keys and releasing the data if any of the keys are unreachable. */ value live; - /* These are ephemerons are alive (marked). The keys of these ephemerons may - be unmarked if these ephemerons were the target of a blit operation. The - data field is never unmarked. */ + /* These are ephemerons which are alive (marked). The keys of these ephemerons + may be unmarked if these ephemerons were the target of a blit operation. + The data field is never unmarked. */ int must_sweep_ephe; /* At the beginning of [Phase_sweep_ephe] the [live] list is moved to the @@ -66,8 +66,6 @@ struct caml_ephe_info { A weak pointer is an ephemeron with the data at caml_ephe_none If fields are added, don't forget to update weak.ml, [additional_values], and obj.ml, [Ephemeron.additional_values]. - - */ #define CAML_EPHE_LINK_OFFSET 0 @@ -78,6 +76,17 @@ struct caml_ephe_info { #define Ephe_link(e) (*(Op_val(e) + CAML_EPHE_LINK_OFFSET)) #define Ephe_data(e) (*(Op_val(e) + CAML_EPHE_DATA_OFFSET)) +value caml_ephe_await_key(value ephe, uintnat i); + +Caml_inline value Ephe_key(value ephe, uintnat i) +{ + value v = atomic_load_acquire(Op_atomic_val(ephe) + i); + if (v == caml_ephe_locked) + return caml_ephe_await_key(ephe, i); + else + return v; +} + struct caml_ephe_info* caml_alloc_ephe_info (void); void caml_ephe_clean(value e); diff --git a/runtime/codefrag.c b/runtime/codefrag.c index 6014fb49..c43142f1 100644 --- a/runtime/codefrag.c +++ b/runtime/codefrag.c @@ -130,7 +130,14 @@ unsigned char *caml_digest_of_code_fragment(struct code_fragment *cf) { /* Note: this approach is a bit heavy-handed as we take a lock in all cases. It would be possible to take a lock only in the DIGEST_LATER case, which occurs at most once per fragment, by - using double-checked locking -- see #11791. */ + using double-checked locking -- see #11791. + + Note: we use [caml_plat_lock_blocking] despite holding the domain + lock because this is called by intern.c and extern.c, both of + which share state between threads of the same domain. The + critical section must therefore remain short and not allocate + (nor cause other potential STW). + */ caml_plat_lock_blocking(&cf->mutex); { if (cf->digest_status == DIGEST_IGNORE) { @@ -152,7 +159,7 @@ struct code_fragment * caml_find_code_fragment_by_digest(unsigned char digest[16]) { FOREACH_LF_SKIPLIST_ELEMENT(e, &code_fragments_by_pc, { struct code_fragment *cf = (struct code_fragment *)e->data; - unsigned char *d = caml_digest_of_code_fragment(cf); + const unsigned char *d = caml_digest_of_code_fragment(cf); if (d != NULL && memcmp(digest, d, 16) == 0) return cf; }) diff --git a/runtime/compare.c b/runtime/compare.c index cda5100a..1ec7dd34 100644 --- a/runtime/compare.c +++ b/runtime/compare.c @@ -51,14 +51,14 @@ static void compare_free_stack(struct compare_stack* stk) /* Same, then raise Out_of_memory */ CAMLnoret static void compare_stack_overflow(struct compare_stack* stk) { - caml_gc_message (0x04, "Stack overflow in structural comparison\n"); + CAML_GC_MESSAGE(HEAPSIZE, "Stack overflow in structural comparison\n"); compare_free_stack(stk); caml_raise_out_of_memory(); } /* Grow the compare stack */ -static struct compare_item * compare_resize_stack(struct compare_stack* stk, - struct compare_item * sp) +static struct compare_item * +compare_resize_stack(struct compare_stack* stk, const struct compare_item * sp) { asize_t newsize; asize_t sp_offset = sp - stk->stack; @@ -97,7 +97,7 @@ static intnat compare_val(value v1, value v2, int total) } static void run_pending_actions(struct compare_stack* stk, - struct compare_item* sp) + const struct compare_item* sp) { caml_result result; value* roots_start = (value*)(stk->stack); diff --git a/runtime/custom.c b/runtime/custom.c index 7c9251d1..9a2a75db 100644 --- a/runtime/custom.c +++ b/runtime/custom.c @@ -28,9 +28,9 @@ #include "caml/signals.h" #include "caml/memprof.h" -uintnat caml_custom_major_ratio = Custom_major_ratio_def; -uintnat caml_custom_minor_ratio = Custom_minor_ratio_def; -uintnat caml_custom_minor_max_bsz = Custom_minor_max_bsz_def; +_Atomic uintnat caml_custom_major_ratio = Custom_major_ratio_def; +_Atomic uintnat caml_custom_minor_ratio = Custom_minor_ratio_def; +_Atomic uintnat caml_custom_minor_max_bsz = Custom_minor_max_bsz_def; mlsize_t caml_custom_get_max_major (void) { @@ -45,7 +45,7 @@ mlsize_t caml_custom_get_max_major (void) allocated during the previous cycle. [heap_size / 150] is really [heap_size * (2/3) / 100] (but faster). */ return caml_heap_size(Caml_state->shared_heap) / 150 - * caml_custom_major_ratio; + * atomic_load_relaxed(&caml_custom_major_ratio); } /* [mem] is an amount of out-of-heap resources, in the same units as @@ -70,7 +70,8 @@ static value alloc_custom_gen (const struct custom_operations * ops, CAMLlocal1(result); wosize = 1 + (bsz + sizeof(value) - 1) / sizeof(value); - if (wosize <= Max_young_wosize && mem <= caml_custom_minor_max_bsz) { + if (wosize <= Max_young_wosize + && mem <= atomic_load_relaxed(&caml_custom_minor_max_bsz)) { result = caml_alloc_small(wosize, Custom_tag); Custom_ops_val(result) = ops; if (ops->finalize != NULL || mem != 0) { @@ -95,7 +96,8 @@ static value alloc_custom_gen (const struct custom_operations * ops, Caml_inline mlsize_t get_max_minor (void) { return - Bsize_wsize (Caml_state->minor_heap_wsz) / 100 * caml_custom_minor_ratio; + Bsize_wsize (Caml_state->minor_heap_wsz) / 100 + * atomic_load_relaxed(&caml_custom_minor_ratio); } CAMLexport value caml_alloc_custom(const struct custom_operations * ops, diff --git a/runtime/debugger.c b/runtime/debugger.c index 45ba7a6c..4d098b97 100644 --- a/runtime/debugger.c +++ b/runtime/debugger.c @@ -43,6 +43,16 @@ void caml_debugger_init(void) { } +opcode_t caml_debugger_saved_instruction(code_t pc) +{ + /* Raise a fatal error in the should-not-happen case where this function + * would be called without a socket, so that the execution does not branch + * to opcode 0 */ + caml_fatal_error("cannot execute debugger instructions" + " without a debugger connection socket\n"); + return 0; +} + void caml_debugger(enum event_kind event, value param) { } @@ -53,7 +63,7 @@ CAMLexport void caml_debugger_cleanup_fork(void) #else -#ifdef HAS_UNISTD +#ifndef _WIN32 #include #endif #include diff --git a/runtime/domain.c b/runtime/domain.c index fff28b50..221c66e9 100644 --- a/runtime/domain.c +++ b/runtime/domain.c @@ -22,7 +22,7 @@ #include "caml/config.h" #include #include -#ifdef HAS_UNISTD +#ifndef _WIN32 #include #endif #include @@ -112,8 +112,8 @@ static_assert( When the main C-stack for a domain enters a blocking call, a 'backup thread' becomes responsible for servicing the STW sections on behalf of the domain. Care is needed to hand off duties - for servicing STW sections between the main pthread and the backup - pthread when caml_enter_blocking_section and + for servicing STW sections between the main thread and the backup + thread when caml_enter_blocking_section and caml_leave_blocking_section are called. When the state for the backup thread is BT_IN_BLOCKING_SECTION @@ -125,26 +125,26 @@ static_assert( BT_INIT <---------------------------------------+ | | (install_backup_thread) | - [main pthread] | + [main thread] | | | v | BT_ENTERING_OCAML <-----------------+ | | | | (caml_enter_blocking_section) | | - [main pthread] | | + [main thread] | | | | | | | | | (caml_leave_blocking_section) | - | [main pthread] | + | [main thread] | v | | BT_IN_BLOCKING_SECTION ----------------+ | | | - (domain_terminate) | - [main pthread] | + (caml_domain_terminate) | + [main thread] | | | v | BT_TERMINATE (backup_thread_func) - | [backup pthread] + | [backup thread] | | +---------------------------------------------+ @@ -182,15 +182,16 @@ Caml_inline void interruptor_set_pending(struct interruptor *s) struct dom_internal { /* readonly fields, initialised and never modified */ int id; + pthread_t tid; caml_domain_state* state; struct interruptor interruptor; /* backup thread */ - int backup_thread_running; pthread_t backup_thread; atomic_uintnat backup_thread_msg; caml_plat_mutex domain_lock; caml_plat_cond domain_cond; + bool domain_canceled; /* modified only during STW sections */ uintnat minor_heap_area_start; @@ -235,8 +236,9 @@ static atomic_uintnat /* dom_internal* */ stw_leader = 0; static uintnat stw_requests_suspended = 0; /* protected by all_domains_lock */ static caml_plat_cond requests_suspended_cond = CAML_PLAT_COND_INITIALIZER; static dom_internal* all_domains; +static atomic_intnat domains_exiting = 0; -CAMLexport atomic_uintnat caml_num_domains_running; +CAMLexport atomic_uintnat caml_num_domains_running = 0; /* size of the virtual memory reservation for the minor heap, per domain */ uintnat caml_minor_heap_max_wsz; @@ -339,6 +341,13 @@ int caml_incoming_interrupts_queued(void) return interruptor_has_pending(&domain_self->interruptor); } +static void terminate_backup_thread(dom_internal *di); + +static inline bool backup_thread_running(dom_internal *di) +{ + return (atomic_load_acquire(&di->backup_thread_msg) != BT_INIT); +} + /* must NOT be called with s->lock held */ static void stw_handler(caml_domain_state* domain); static int handle_incoming(struct interruptor* s) @@ -624,10 +633,15 @@ static void domain_create(uintnat initial_minor_heap_wsize, /* Note: until we take d->domain_lock, the domain_state may still be * shared with a domain which is terminating (see - * domain_terminate). */ + * caml_domain_terminate). */ caml_plat_lock_blocking(&d->domain_lock); + /* This is the first thing we do after acquiring the domain lock, + so that [caml_domain_alone()] returns accurate result even + during domain initialization. */ + atomic_fetch_add(&caml_num_domains_running, 1); + /* Set domain_self if we have successfully allocated the * caml_domain_state. Otherwise domain_self will be NULL and it's up * to the caller to deal with that. */ @@ -711,7 +725,6 @@ static void domain_create(uintnat initial_minor_heap_wsize, s->unique_id = fresh_domain_unique_id(); domain_state->unique_id = s->unique_id; s->running = 1; - atomic_fetch_add(&caml_num_domains_running, 1); domain_state->c_stack = NULL; domain_state->exn_handler = NULL; @@ -723,6 +736,9 @@ static void domain_create(uintnat initial_minor_heap_wsize, domain_state->allocated_words = 0; domain_state->allocated_words_direct = 0; + domain_state->allocated_words_suspended = 0; + domain_state->allocated_words_resumed = 0; + domain_state->current_ramp_up_allocated_words_diff = 0; domain_state->swept_words = 0; domain_state->local_roots = NULL; @@ -762,7 +778,9 @@ create_stack_cache_failure: reallocate_minor_heap_failure: caml_teardown_major_gc(); init_major_gc_failure: - caml_teardown_shared_heap(d->state->shared_heap); + caml_orphan_shared_heap(d->state->shared_heap); + caml_free_shared_heap(d->state->shared_heap); + domain_state->shared_heap = NULL; init_shared_heap_failure: caml_free_minor_tables(domain_state->minor_tables); domain_state->minor_tables = NULL; @@ -771,6 +789,7 @@ alloc_minor_tables_failure: init_memprof_failure: domain_self = NULL; + atomic_fetch_add(&caml_num_domains_running, -1); domain_init_complete: caml_gc_log("domain init complete"); @@ -794,7 +813,7 @@ CAMLexport void caml_reset_domain_lock(void) portability on POSIX the lock should be released and destroyed prior to calling fork and then init afterwards in both parent and child. */ - caml_plat_mutex_init(&self->domain_lock); + caml_plat_mutex_reinit(&self->domain_lock); caml_plat_cond_init(&self->domain_cond); return; @@ -938,6 +957,9 @@ void caml_update_minor_heap_max(uintnat requested_wsz) { void caml_init_domains(uintnat max_domains, uintnat minor_heap_wsz) { + atomic_store_relaxed(&domains_exiting, 0); + atomic_store_relaxed(&caml_num_domains_running, 0); + /* Use [caml_stat_calloc_noexc] to zero initialize [all_domains]. */ all_domains = caml_stat_calloc_noexc(max_domains, sizeof(dom_internal)); if (all_domains == NULL) @@ -973,8 +995,8 @@ void caml_init_domains(uintnat max_domains, uintnat minor_heap_wsz) caml_plat_mutex_init(&dom->domain_lock); caml_plat_cond_init(&dom->domain_cond); - dom->backup_thread_running = 0; dom->backup_thread_msg = BT_INIT; + dom->domain_canceled = false; } domain_create(minor_heap_wsz, NULL); @@ -1059,7 +1081,7 @@ static void* backup_thread_func(void* v) } } /* Wait safely if there is nothing to do. Will be woken from - * caml_send_interrupt and domain_terminate. + * caml_send_interrupt and caml_domain_terminate. */ caml_plat_lock_blocking(&s->lock); msg = atomic_load_acquire (&di->backup_thread_msg); @@ -1069,9 +1091,9 @@ static void* backup_thread_func(void* v) caml_plat_unlock(&s->lock); break; case BT_ENTERING_OCAML: - /* Main thread wants to enter OCaml + /* Main thread wants to enter OCaml. * Will be woken from caml_bt_exit_ocaml - * or domain_terminate + * or caml_domain_terminate. */ caml_plat_lock_blocking(&di->domain_lock); msg = atomic_load_acquire (&di->backup_thread_msg); @@ -1099,37 +1121,43 @@ static void install_backup_thread (dom_internal* di) sigset_t mask, old_mask; #endif - if (di->backup_thread_running == 0) { - uintnat msg; - msg = atomic_load_acquire(&di->backup_thread_msg); - CAMLassert (msg == BT_INIT || /* Using fresh domain */ - msg == BT_TERMINATE); /* Reusing domain */ - - while (msg != BT_INIT) { - /* Give a chance for backup thread on this domain to terminate */ - caml_plat_unlock (&di->domain_lock); - cpu_relax (); - caml_plat_lock_blocking(&di->domain_lock); - msg = atomic_load_acquire(&di->backup_thread_msg); - } + /* If the backup thread is running, but has been instructed to terminate, + we need to wait for it to stop until we can spawn another. */ + while (backup_thread_running(di)) { + /* Give a chance for backup thread on this domain to terminate */ + caml_plat_unlock (&di->domain_lock); + cpu_relax (); + caml_plat_lock_blocking(&di->domain_lock); + } + + CAMLassert(!backup_thread_running(di)); #ifndef _WIN32 - /* No signals on the backup thread */ - sigfillset(&mask); - pthread_sigmask(SIG_BLOCK, &mask, &old_mask); + /* No signals on the backup thread */ + sigfillset(&mask); + pthread_sigmask(SIG_BLOCK, &mask, &old_mask); #endif - atomic_store_release(&di->backup_thread_msg, BT_ENTERING_OCAML); - err = pthread_create(&di->backup_thread, 0, backup_thread_func, (void*)di); + atomic_store_release(&di->backup_thread_msg, BT_ENTERING_OCAML); + err = pthread_create(&di->backup_thread, 0, backup_thread_func, (void*)di); + caml_check_error(err, "failed to create domain backup thread"); #ifndef _WIN32 - pthread_sigmask(SIG_SETMASK, &old_mask, NULL); + pthread_sigmask(SIG_SETMASK, &old_mask, NULL); #endif - if (err) - caml_failwith("failed to create domain backup thread"); - di->backup_thread_running = 1; - pthread_detach(di->backup_thread); + pthread_detach(di->backup_thread); +} + +static void terminate_backup_thread(dom_internal *di) +{ + CAMLassert(!caml_bt_is_self()); + + if (backup_thread_running(di)) { + atomic_store_release(&di->backup_thread_msg, BT_TERMINATE); + /* Wakeup backup thread if it is sleeping */ + caml_plat_broadcast(&di->interruptor.cond); + caml_plat_signal(&di->domain_cond); } } @@ -1160,8 +1188,6 @@ CAMLexport void (*caml_domain_external_interrupt_hook)(void) = CAMLexport _Atomic caml_timing_hook caml_domain_terminated_hook = (caml_timing_hook)NULL; -static void domain_terminate(void); - static value make_finished(caml_result result) { CAMLparam0(); @@ -1211,6 +1237,8 @@ static void* domain_thread_func(void* v) #endif domain_create(caml_params->init_minor_heap_wsz, p->parent->state); + if (domain_self) + domain_self->tid = pthread_self(); /* this domain is now part of the STW participant set */ p->newdom = domain_self; @@ -1246,11 +1274,11 @@ static void* domain_thread_func(void* v) sync_result(ml_values->term_sync, res); sync_mutex mut = Mutex_val(*Term_mutex(ml_values->term_sync)); - domain_terminate(); + caml_domain_terminate(false); /* This domain currently holds [mut], and has signaled all the waiting domains to be woken up. We unlock [mut] to release the - joining domains. The unlock is done after [domain_terminate] to + joining domains. The unlock is done after [caml_domain_terminate] to ensure that this domain has released all of its runtime state. We call [caml_mutex_unlock] directly instead of [caml_ml_mutex_unlock] because the domain no longer exists at @@ -1272,6 +1300,27 @@ static void* domain_thread_func(void* v) return 0; } +/* Note: [caml_domain_spawn] and [caml_domain_alone()]. + + The use of [caml_domain_alone()] to implement sequential fast-path + requires that no other domain is operating in parallel. This is + indeed the case when [caml_domain_alone()] is observed while + holding the domain lock: + + 1. When a domain exits, it is careful to decrement + [caml_num_domains_running] as the very last step, so that + [caml_domain_alone()] does not return [true] while its mutator + or domain-termination cleanup logic are still in progress. + + 2. When a domain starts, it increments [caml_num_domains_running] + immediately after taking the domain lock, and its parent domain + blocks waiting for the child set the [Dom_started] flag, which + happens after this increment. Neither the parent nor the child + can wrongly observe [caml_domain_alone()] while the other may be + running code with its domain lock held. +*/ + + CAMLprim value caml_domain_spawn(value callback, value term_sync) { CAMLparam2 (callback, term_sync); @@ -1279,6 +1328,10 @@ CAMLprim value caml_domain_spawn(value callback, value term_sync) pthread_t th; int err; + if (atomic_load_relaxed(&domains_exiting) != 0) { + caml_failwith("domain creation not allowed during shutdown"); + } + #ifndef NATIVE_CODE if (caml_debugger_in_use) caml_fatal_error("ocamldebug does not support spawning multiple domains"); @@ -1292,10 +1345,7 @@ CAMLprim value caml_domain_spawn(value callback, value term_sync) init_domain_ml_values(p.ml_values, callback, term_sync); err = pthread_create(&th, 0, domain_thread_func, (void*)&p); - - if (err) { - caml_failwith("failed to create domain thread"); - } + caml_check_error(err, "failed to create domain thread: pthread_create"); /* While waiting for the child thread to start up, we need to service any stop-the-world requests as they come in. */ @@ -1325,7 +1375,9 @@ CAMLprim value caml_domain_spawn(value callback, value term_sync) } /* When domain 0 first spawns a domain, the backup thread is not active, we ensure it is started here. */ - install_backup_thread(domain_self); + domain_self->tid = pthread_self(); + if (!backup_thread_running(domain_self)) + install_backup_thread(domain_self); CAMLreturn (Val_long(p.unique_id)); } @@ -1534,9 +1586,9 @@ int caml_domain_is_in_stw(void) { - Domain cleanup code runs after the terminating domain may run in parallel to a STW section, but only after that domain has safely removed itself from the STW participant set: the - [domain_terminate] function is careful to only leave the STW set - when (1) it has the [all_domains_lock] and (2) it hasn't received - any request to participate in a STW section. + [caml_domain_terminate] function is careful to only leave the STW + set when (1) it has the [all_domains_lock] and (2) it hasn't + received any request to participate in a STW section. Each domain leaves the section as soon as it is finished running the STW section callback. In particular, a mutator may resume while @@ -1552,11 +1604,11 @@ int caml_domain_is_in_stw(void) { but additional synchronization would be required to update it during domain cleanup. - Note: in the case of both [domain_create] and [domain_terminate] it - is important that the loops (waiting for STW sections to finish) + Note: in the case of both [domain_create] and [caml_domain_terminate] + it is important that the loops (waiting for STW sections to finish) regularly release [all_domains_lock], to avoid deadlocks scenario with in-progress STW sections. - - For [domain_terminate] we release the lock and join + - For [caml_domain_terminate] we release the lock and join the STW section before resuming. - For [domain_create] we wait until the end of the section using the condition variable [all_domains_cond] over @@ -1922,8 +1974,8 @@ CAMLexport int caml_bt_is_self(void) CAMLexport intnat caml_domain_is_multicore (void) { - dom_internal *self = domain_self; - return (!caml_domain_alone() || self->backup_thread_running); + return (!caml_domain_alone() + || backup_thread_running(domain_self)); } CAMLexport void caml_acquire_domain_lock(void) @@ -1936,10 +1988,10 @@ CAMLexport void caml_acquire_domain_lock(void) CAMLexport void caml_bt_enter_ocaml(void) { dom_internal* self = domain_self; + bool bt_running = backup_thread_running(self); + CAMLassert(caml_domain_alone() || bt_running); - CAMLassert(caml_domain_alone() || self->backup_thread_running); - - if (self->backup_thread_running) { + if (bt_running) { atomic_store_release(&self->backup_thread_msg, BT_ENTERING_OCAML); } } @@ -1954,10 +2006,11 @@ CAMLexport void caml_release_domain_lock(void) CAMLexport void caml_bt_exit_ocaml(void) { dom_internal* self = domain_self; + bool bt_running = backup_thread_running(self); - CAMLassert(caml_domain_alone() || self->backup_thread_running); + CAMLassert(caml_domain_alone() || bt_running); - if (self->backup_thread_running) { + if (bt_running) { atomic_store_release(&self->backup_thread_msg, BT_IN_BLOCKING_SECTION); /* Wakeup backup thread if it is sleeping */ caml_plat_signal(&self->domain_cond); @@ -1990,7 +2043,13 @@ int caml_domain_is_terminating (void) return domain_terminating(domain_self); } -static void domain_terminate (void) +static bool marking_and_sweeping_done(caml_domain_state *domain_state) +{ + return (domain_state->marking_done + && domain_state->sweeping_done); +} + +void caml_domain_terminate(bool last) { caml_domain_state* domain_state = domain_self->state; struct interruptor* s = &domain_self->interruptor; @@ -2012,13 +2071,36 @@ static void domain_terminate (void) /* Note: [caml_empty_minor_heaps_once] will also join any ongoing STW sections that has sent an interrupt to this domain. */ + if (last) + caml_finish_major_cycle(0); + caml_finish_marking(); caml_orphan_ephemerons(domain_state); caml_orphan_finalisers(domain_state); - /* take the all_domains_lock to try and exit the STW participant set - without racing with a STW section being triggered */ + /* Orphaning ephemerons and finalizers may create new marking or + sweeping work, so we may need to mark and/or sweep again. */ + + /* No need to check for interrupts if we are the last domain running. */ + if (last) { + CAML_EV_LIFECYCLE(EV_DOMAIN_TERMINATE, getpid()); + break; + } + + /* If new marking or sweeping work appeared during orphaning, + run a new loop iteration. */ + if (!marking_and_sweeping_done(domain_state)) + continue; + + /* Orphan the local shared heap. + This is only valid when [sweeping_done], and does + not create any new major GC work. */ + caml_orphan_shared_heap(domain_state->shared_heap); + CAMLassert(marking_and_sweeping_done(domain_state)); + + /* Take the all_domains_lock to try and exit the STW participant set + without racing with a STW section being triggered. */ caml_plat_lock_blocking(&all_domains_lock); /* The interaction of termination and major GC is quite subtle. @@ -2028,30 +2110,23 @@ static void domain_terminate (void) require this domain to participate, which in turn could involve a major GC cycle. This would then require finish marking and sweeping again in order to decrement the globals [num_domains_to_mark] and - [num_domains_to_sweep] (see major_gc.c). + [num_domains_to_sweep] (see major_gc.c). We do this by running a new + loop iteration. */ - - if (!caml_incoming_interrupts_queued() && - domain_state->marking_done && - domain_state->sweeping_done) { - + if (!caml_incoming_interrupts_queued()) { finished = 1; s->terminating = 0; s->running = 0; - /* Remove this domain from stw_domains */ + /* Remove this domain from stw_domains. */ remove_from_stw_domains(domain_self); - /* signal the interruptor condition variable - * because the backup thread may be waiting on it - */ + /* Signal the interruptor condition variable + because the backup thread may be waiting on it. */ caml_plat_lock_blocking(&s->lock); caml_plat_broadcast(&s->cond); caml_plat_unlock(&s->lock); - CAMLassert (domain_self->backup_thread_running); - domain_self->backup_thread_running = 0; - /* We must signal domain termination before releasing [all_domains_lock]: after that, this domain will no longer take part in STWs and emitting an event could race with runtime events teardown. */ @@ -2060,19 +2135,22 @@ static void domain_terminate (void) caml_plat_unlock(&all_domains_lock); } - /* domain_state may be re-used by a fresh domain here (now that we - * have done remove_from_stw_domains and released the - * all_domains_lock). However, domain_create() won't touch it until - * it has claimed the domain_lock, so we hang onto that while we are - * tearing down the state. */ + if (!last) caml_assert_shared_heap_is_empty(domain_state->shared_heap); + + /* [domain_state] may be re-used by a fresh domain here, now that we + have done [remove_from_stw_domains] and released the + [all_domains_lock]. In particular, we cannot touch + [domain_self->interruptor] after here because it may be reused. + + However, [domain_create()] won't touch the domain state until + it has claimed the [domain_lock], so we hang onto that while we are + tearing down the state. */ /* Delete the domain state from statmemprof after any promotion * (etc) done by this domain: any remaining memprof state will be * handed over to surviving domains. */ caml_memprof_delete_domain(domain_state); - /* We can not touch domain_self->interruptor after here - because it may be reused */ caml_remove_generational_global_root(&domain_state->dls_root); caml_remove_generational_global_root(&domain_state->backtrace_last_exn); caml_stat_free(domain_state->final_info); @@ -2081,18 +2159,33 @@ static void domain_terminate (void) caml_free_extern_state(); caml_teardown_major_gc(); - caml_teardown_shared_heap(domain_state->shared_heap); - domain_state->shared_heap = 0; - caml_free_minor_tables(domain_state->minor_tables); - domain_state->minor_tables = 0; + /* At this point, we know that the shared heap has been orphaned, + except if [last], if we are the last domain. In that case we + finalise all unswept objects and orphan the shared heap now. */ + if (last) { + /* First adopt all orphan pools, to avoid missing unswept objects. */ + caml_adopt_all_orphan_heaps(domain_state->shared_heap); + + /* Call all custom finalisers of unswept objects. */ + caml_finalise_heap(); - caml_orphan_alloc_stats(domain_state); - /* Heap stats were orphaned by [caml_teardown_shared_heap] above. - At this point, the stats of the domain must be empty. + /* Then orphan all pools again. */ + caml_orphan_shared_heap(domain_state->shared_heap); + } + caml_assert_shared_heap_is_empty(domain_state->shared_heap); - The sampled copy was also cleared by the minor collection(s) - performed above at [caml_empty_minor_heaps_once()], see the - termination-specific logic in [caml_collect_gc_stats_sample_stw]. + caml_free_shared_heap(domain_state->shared_heap); + domain_state->shared_heap = NULL; + caml_free_minor_tables(domain_state->minor_tables); + domain_state->minor_tables = NULL; + + /* At this point, the stats of the domain must be empty. + - heap stats were orphaned by [caml_orphan_shared_heap] + - alloc stats were orphaned by [caml_orphan_alloc_stats] + - the sampled copy in [sampled_gc_stats] was cleared by the minor + collection performed by [caml_empty_minor_heaps_once()], see + the termination-specific logic in + [caml_collect_gc_stats_sample_stw]. */ /* TODO: can this ever be NULL? can we remove this check? */ @@ -2105,15 +2198,98 @@ static void domain_terminate (void) /* signal the domain termination to the backup thread NB: for a program with no additional domains, the backup thread will not have been started */ - atomic_store_release(&domain_self->backup_thread_msg, BT_TERMINATE); - caml_plat_signal(&domain_self->domain_cond); + terminate_backup_thread(domain_self); caml_plat_unlock(&domain_self->domain_lock); caml_plat_assert_all_locks_unlocked(); /* This is the last thing we do because we need to be able to rely on caml_domain_alone (which uses caml_num_domains_running) in at least - the shared_heap lockfree fast paths */ - atomic_fetch_add(&caml_num_domains_running, -1); + the shared_heap lockfree fast paths. Also, we don't want to decrement + it back to zero when the last domain exits, for caml_domain_alone() + to remain accurate. */ + if (!last) + atomic_fetch_add(&caml_num_domains_running, -1); +} + +/* Try and terminate the currently running domain. + This is only invoked when extra domains are left running while the + main one is terminating. In this case, we are not in a state where + we can safely release resources. The best we can do is cancel the + extra running threads. */ +static void stw_terminate_domain(caml_domain_state *domain, void *data, + int participating_count, + caml_domain_state **participating) +{ + if (!pthread_equal(domain_self->tid, *(pthread_t *)data)) { + if (caml_bt_is_self()) { + /* If this STW request is handled by the backup thread, the + domain thread is currently running C code. */ + domain_self->domain_canceled = true; + (void)pthread_cancel(domain_self->tid); + /* We are intentionally not waiting for the thread to terminate here, + and not decrementing the number of running domains either, since + we don't know the state of the various locks and condition + variables in this state. */ + atomic_store_release(&domain_self->backup_thread_msg, BT_INIT); + } else { + /* Domain threads forced to exit here will not have a chance to + run caml_domain_terminate() on their own, so we need to ask + the backup thread to terminate here. */ + terminate_backup_thread(domain_self); + caml_plat_unlock(&domain_self->domain_lock); + /* No particular memory resource cleanup is attempted here, for we + have no idea which state each domain is in. */ + } + pthread_exit(0); + } +} + +void caml_stop_all_domains(void) +{ + atomic_store_relaxed(&domains_exiting, 1); + + pthread_t myself = pthread_self(); + do {} while (!caml_try_run_on_all_domains( + &stw_terminate_domain, &myself, NULL)); + + terminate_backup_thread(domain_self); + caml_plat_unlock(&domain_self->domain_lock); + + caml_plat_assert_all_locks_unlocked(); +} + +bool caml_free_domains(void) +{ + bool result = true; + + for (int i = 0; i < caml_params->max_domains; i++) { + struct dom_internal* dom = &all_domains[i]; + + /* Give the backup thread time to terminate gracefully, if needed */ + while (backup_thread_running(dom)) { + cpu_relax(); + } + + dom->interruptor.interrupt_word = NULL; + caml_plat_mutex_free(&dom->interruptor.lock); + caml_plat_cond_free(&dom->interruptor.cond); + + if (dom->domain_canceled) + result = false; + else + caml_plat_mutex_free(&dom->domain_lock); + caml_plat_cond_free(&dom->domain_cond); + } + +#ifdef WITH_THREAD_SANITIZER + /* When running with TSan, there will be reports of races between + freeing the all_domains synchronization objects and domain threads + accessing them, even though we wait first for the domain threads to + have terminated in the above loop. */ + result = false; +#endif + + return result; } CAMLprim value caml_ml_domain_cpu_relax(value t) diff --git a/runtime/dynlink.c b/runtime/dynlink.c index c06f8adb..d3e6b1b5 100644 --- a/runtime/dynlink.c +++ b/runtime/dynlink.c @@ -23,7 +23,7 @@ #include #include #include "caml/config.h" -#ifdef HAS_UNISTD +#ifndef _WIN32 #include #endif #ifdef _WIN32 @@ -63,7 +63,7 @@ struct ext_table caml_shared_libs_path; /* Look up the given primitive name in the built-in primitive table, then in the opened shared libraries (shared_libs) */ -static c_primitive lookup_primitive(char * name) +static c_primitive lookup_primitive(const char * name) { void * res; @@ -83,9 +83,9 @@ static c_primitive lookup_primitive(char * name) #define LD_CONF_NAME T("ld.conf") -CAMLexport char_os * caml_get_stdlib_location(void) +CAMLexport const char_os * caml_get_stdlib_location(void) { - char_os * stdlib; + const char_os * stdlib; stdlib = caml_secure_getenv(T("OCAMLLIB")); if (stdlib == NULL) stdlib = caml_secure_getenv(T("CAMLLIB")); if (stdlib == NULL) stdlib = OCAML_STDLIB_DIR; @@ -94,7 +94,8 @@ CAMLexport char_os * caml_get_stdlib_location(void) CAMLexport char_os * caml_parse_ld_conf(void) { - char_os * stdlib, * ldconfname, * wconfig, * p, * q; + const char_os * stdlib; + char_os * ldconfname, * wconfig, * p, * q; char * config; #ifdef _WIN32 struct _stati64 st; @@ -146,7 +147,7 @@ static void open_shared_lib(char_os * name) realname = caml_search_dll_in_path(&caml_shared_libs_path, name); u8 = caml_stat_strdup_of_os(realname); - caml_gc_message(0x100, "Loading shared library %s\n", u8); + CAML_GC_MESSAGE(STARTUP, "Loading shared library %s\n", u8); caml_stat_free(u8); caml_enter_blocking_section(); handle = caml_dlopen(realname, 1); @@ -306,7 +307,7 @@ CAMLprim value caml_dynlink_open_lib(value filename) value result; char_os * p; - caml_gc_message(0x100, "Opening shared library %s\n", + CAML_GC_MESSAGE(STARTUP, "Opening shared library %s\n", String_val(filename)); p = caml_stat_strdup_to_os(String_val(filename)); caml_enter_blocking_section(); diff --git a/runtime/dynlink_nat.c b/runtime/dynlink_nat.c index bec1904a..3daea527 100644 --- a/runtime/dynlink_nat.c +++ b/runtime/dynlink_nat.c @@ -39,11 +39,10 @@ CAMLexport void (*caml_natdynlink_hook)(void* handle, const char* unit) = NULL; #include #include -/* This should match the value of Compilenv.symbol_separator */ -#ifdef _MSC_VER -#define CAML_SYM_SEPARATOR "$" +#if defined (_WIN32) || defined (__CYGWIN__) || defined (__APPLE__) + #define CAML_SYM_SEPARATOR "$" #else -#define CAML_SYM_SEPARATOR "." + #define CAML_SYM_SEPARATOR "." #endif #define Handle_val(v) (*((void **) Data_abstract_val(v))) @@ -79,7 +78,7 @@ CAMLprim value caml_natdynlink_open(value filename, value global) { CAMLparam2 (filename, global); CAMLlocal3 (res, handle, header); - void *sym; + const void *sym; void *dlhandle; char_os *p; int global_dup; diff --git a/runtime/extern.c b/runtime/extern.c index a0374e9c..dcb86095 100644 --- a/runtime/extern.c +++ b/runtime/extern.c @@ -170,9 +170,11 @@ _Bool (*caml_extern_compress_output)(struct caml_output_block **) = NULL; CAMLnoret static void extern_out_of_memory(struct caml_extern_state* s); CAMLnoret static -void extern_invalid_argument(struct caml_extern_state* s, char *msg); +void extern_invalid_argument(struct caml_extern_state* s, + const char *msg); -CAMLnoret static void extern_failwith(struct caml_extern_state* s, char *msg); +CAMLnoret static void extern_failwith(struct caml_extern_state* s, + const char *msg); CAMLnoret static void extern_stack_overflow(struct caml_extern_state* s); @@ -188,7 +190,7 @@ static void extern_free_stack(struct caml_extern_state* s) } static struct extern_item * extern_resize_stack(struct caml_extern_state* s, - struct extern_item * sp) + const struct extern_item * sp) { asize_t newsize = 2 * (s->extern_stack_limit - s->extern_stack); asize_t sp_offset = sp - s->extern_stack; @@ -441,13 +443,14 @@ static void extern_out_of_memory(struct caml_extern_state* s) caml_raise_out_of_memory(); } -static void extern_invalid_argument(struct caml_extern_state *s, char *msg) +static void extern_invalid_argument(struct caml_extern_state *s, + const char *msg) { free_extern_output(s); caml_invalid_argument(msg); } -static void extern_failwith(struct caml_extern_state* s, char *msg) +static void extern_failwith(struct caml_extern_state* s, const char *msg) { free_extern_output(s); caml_failwith(msg); @@ -455,7 +458,8 @@ static void extern_failwith(struct caml_extern_state* s, char *msg) static void extern_stack_overflow(struct caml_extern_state* s) { - caml_gc_message (0x04, "Stack overflow in marshaling value\n"); + CAML_GC_MESSAGE(HEAPSIZE, + "Stack overflow in marshaling value\n"); free_extern_output(s); caml_raise_out_of_memory(); } diff --git a/runtime/fail_byt.c b/runtime/fail_byt.c index 19e7a6b0..c9e33119 100644 --- a/runtime/fail_byt.c +++ b/runtime/fail_byt.c @@ -67,7 +67,7 @@ CAMLexport void caml_raise(value v) */ static void check_global_data(char const *exception_name) { - if (caml_global_data == 0 || !Is_block(caml_global_data)) { + if (!Is_block(caml_global_data)) { fprintf(stderr, "Fatal error: exception %s during initialisation\n", exception_name); exit(2); @@ -76,7 +76,7 @@ static void check_global_data(char const *exception_name) static void check_global_data_param(char const *exception_name, char const *msg) { - if (caml_global_data == 0 || !Is_block(caml_global_data)) { + if (!Is_block(caml_global_data)) { fprintf(stderr, "Fatal error: exception %s(\"%s\")\n", exception_name, msg); exit(2); } @@ -173,7 +173,7 @@ int caml_is_special_exception(value exn) { value f; - if (caml_global_data == 0 || !Is_block(caml_global_data)) { + if (!Is_block(caml_global_data)) { return 0; } diff --git a/runtime/fiber.c b/runtime/fiber.c index 72135404..98abb236 100644 --- a/runtime/fiber.c +++ b/runtime/fiber.c @@ -20,7 +20,7 @@ #include "caml/config.h" #include -#ifdef HAS_UNISTD +#ifndef _WIN32 #include #endif #include @@ -150,7 +150,7 @@ Caml_inline int stack_cache_bucket (mlsize_t wosize) { ++bucket; size_bucket_wsz += size_bucket_wsz; } - + CAMLassert(wosize>=size_bucket_wsz/2); return -1; } @@ -332,7 +332,7 @@ void caml_maybe_expand_stack (void) #else /* End NATIVE_CODE, begin BYTE_CODE */ -value caml_global_data; +value caml_global_data = Val_unit; CAMLprim value caml_alloc_stack(value hval, value hexn, value heff) { @@ -445,63 +445,6 @@ void caml_rewrite_exception_stack(struct stack_info *old_stack, fiber_debug_log ("exn_ptr is null"); } } - -#ifdef WITH_FRAME_POINTERS -/* Update absolute base pointers for new stack */ -static void rewrite_frame_pointers(struct stack_info *old_stack, - struct stack_info *new_stack) -{ - struct frame_walker { - struct frame_walker *base_addr; - uintnat return_addr; - }; - ptrdiff_t delta; - - delta = (char*)Stack_high(new_stack) - (char*)Stack_high(old_stack); - - /* Walk the frame-pointers linked list */ - for (struct frame_walker *frame = __builtin_frame_address(0), *next; - frame; - frame = next) { - void *top, **p; - - top = (char*)&frame->return_addr - + 1 * sizeof(value) /* return address */ - + 2 * sizeof(value) /* trap frame */ - + 2 * sizeof(value); /* DWARF pointer & gc_regs */ - - /* Detect top of the fiber and bail out */ - /* It also avoid to dereference invalid base pointer at main */ - if (top == Stack_high(old_stack)) - break; - - /* Save the base address since it may be adjusted */ - next = frame->base_addr; - - if (!(Stack_base(old_stack) <= (value*)frame->base_addr - && (value*)frame->base_addr < Stack_high(old_stack))) { - /* No need to adjust base pointers that don't point into the reallocated - * fiber */ - continue; - } - - if (Stack_base(old_stack) <= (value*)&frame->base_addr - && (value*)&frame->base_addr < Stack_high(old_stack)) { - /* The base pointer itself is located inside the reallocated fiber - * and needs to be adjusted on the new fiber */ - p = (void**)((char*)Stack_high(new_stack) - (char*)Stack_high(old_stack) - + (char*)&frame->base_addr); - CAMLassert(*p == frame->base_addr); - *p += delta; - } - else { - /* Base pointers on other stacks are adjusted in place */ - frame->base_addr = (struct frame_walker*)((char*)frame->base_addr - + delta); - } - } -} -#endif #endif int caml_try_realloc_stack(asize_t required_space) @@ -515,6 +458,7 @@ int caml_try_realloc_stack(asize_t required_space) stack_used = Stack_high(old_stack) - (value*)old_stack->sp; wsize = Stack_high(old_stack) - Stack_base(old_stack); uintnat max_stack_wsize = caml_max_stack_wsize; + wsize = wsize & (~1); // zero alignment bit do { if (wsize >= max_stack_wsize) return 0; wsize *= 2; @@ -545,9 +489,6 @@ int caml_try_realloc_stack(asize_t required_space) #ifdef NATIVE_CODE caml_rewrite_exception_stack(old_stack, (value**)&Caml_state->exn_handler, new_stack); -#ifdef WITH_FRAME_POINTERS - rewrite_frame_pointers(old_stack, new_stack); -#endif #endif /* Update stack pointers in Caml_state->c_stack. It is possible to have @@ -558,9 +499,29 @@ int caml_try_realloc_stack(asize_t required_space) link != NULL; link = link->prev) { if (link->stack == old_stack) { + ptrdiff_t delta = + (char*)Stack_high(new_stack) - (char*)Stack_high(old_stack); +#ifdef WITH_FRAME_POINTERS + struct stack_frame { + struct stack_frame* prev; + void* retaddr; + }; + + /* Frame pointer is pushed just below the c_stack_link. + This is somewhat tricky to guarantee when there are stack + arguments to C calls: see caml_c_call_copy_stack_args */ + struct stack_frame* fp = ((struct stack_frame*)link) - 1; + CAMLassert(fp->prev == link->sp); + + /* Rewrite OCaml frame pointers above this C frame */ + while (Stack_base(old_stack) <= (value*)fp->prev && + (value*)fp->prev < Stack_high(old_stack)) { + fp->prev = (struct stack_frame*)((char*)fp->prev + delta); + fp = fp->prev; + } +#endif link->stack = new_stack; - link->sp = (void*)((char*)Stack_high(new_stack) - - ((char*)Stack_high(old_stack) - (char*)link->sp)); + link->sp = (char*)link->sp + delta; } } } @@ -665,7 +626,7 @@ CAMLprim value caml_continuation_use_and_update_handler_noexc /* The continuation has already been taken */ return stack; } - while (Stack_parent(stk) != NULL) stk = Stack_parent(stk); + stk = Ptr_val(Field(cont, 1)); Stack_handle_value(stk) = hval; Stack_handle_exception(stk) = hexn; Stack_handle_effect(stk) = heff; diff --git a/runtime/finalise.c b/runtime/finalise.c index fd8bdc55..2ac24c85 100644 --- a/runtime/finalise.c +++ b/runtime/finalise.c @@ -151,7 +151,8 @@ caml_result caml_final_do_calls_res(void) if (fi->running_finalisation_function) return Result_unit; if (fi->todo_head != NULL) { call_timing_hook(&caml_finalise_begin_hook); - caml_gc_message (0x80, "Calling finalisation functions.\n"); + CAML_GC_MESSAGE(FINALIZE, + "Calling finalisation functions.\n"); while (1) { while (fi->todo_head != NULL && fi->todo_head->size == 0) { struct final_todo *next_head = fi->todo_head->next; @@ -168,7 +169,8 @@ caml_result caml_final_do_calls_res(void) fi->running_finalisation_function = 0; if (caml_result_is_exception(res)) return res; } - caml_gc_message (0x80, "Done calling finalisation functions.\n"); + CAML_GC_MESSAGE(FINALIZE, + "Done calling finalisation functions.\n"); call_timing_hook(&caml_finalise_end_hook); } return Result_unit; diff --git a/runtime/fix_code.c b/runtime/fix_code.c index baefff88..b6e5fde3 100644 --- a/runtime/fix_code.c +++ b/runtime/fix_code.c @@ -19,7 +19,7 @@ #include "caml/config.h" -#ifdef HAS_UNISTD +#ifndef _WIN32 #include #else #include @@ -127,7 +127,7 @@ int* caml_init_opcode_nargs(void) void caml_thread_code (code_t code, asize_t len) { code_t p; - int* l = caml_init_opcode_nargs(); + const int* l = caml_init_opcode_nargs(); len /= sizeof(opcode_t); for (p = code; p < code + len; /*nothing*/) { opcode_t instr = *p; diff --git a/runtime/floats.c b/runtime/floats.c index 827b064c..0bc58e42 100644 --- a/runtime/floats.c +++ b/runtime/floats.c @@ -230,7 +230,7 @@ CAMLprim value caml_hexstring_of_float(value arg, value vprec, value vstyle) } /* Treat special cases */ if (exp == 0x7FF) { - char * txt; + const char * txt; if (m == 0) txt = "infinity"; else txt = "nan"; memcpy(p, txt, strlen(txt)); p[strlen(txt)] = 0; diff --git a/runtime/frame_descriptors.c b/runtime/frame_descriptors.c index a248cd20..c280bb3c 100644 --- a/runtime/frame_descriptors.c +++ b/runtime/frame_descriptors.c @@ -237,7 +237,7 @@ static void add_frame_descriptors( /* protected by STW sections */ static caml_frame_descrs current_frame_descrs = - { 0, -1, NULL, NULL, NULL, PTHREAD_MUTEX_INITIALIZER }; + { 0, -1, NULL, NULL, NULL, CAML_PLAT_MUTEX_INITIALIZER }; static caml_frametable_list *cons( intnat *frametable, caml_frametable_list *tl) @@ -326,6 +326,7 @@ static void remove_frame_descriptors( void *frametable; caml_frametable_list ** previous; + /* cannot release the domain lock here (e.g. custom block finaliser) */ caml_plat_lock_blocking(&table->mutex); previous = &table->frametables; diff --git a/runtime/gc_ctrl.c b/runtime/gc_ctrl.c index 7cdafacf..2a2f4dbc 100644 --- a/runtime/gc_ctrl.c +++ b/runtime/gc_ctrl.c @@ -38,14 +38,15 @@ #include "caml/signals.h" #include "caml/startup.h" #include "caml/fail.h" +#include "caml/callback.h" atomic_uintnat caml_max_stack_wsize; uintnat caml_fiber_wsz; -extern uintnat caml_percent_free; /* see major_gc.c */ -extern uintnat caml_custom_major_ratio; /* see custom.c */ -extern uintnat caml_custom_minor_ratio; /* see custom.c */ -extern uintnat caml_custom_minor_max_bsz; /* see custom.c */ +extern _Atomic uintnat caml_percent_free; /* see major_gc.c */ +extern _Atomic uintnat caml_custom_major_ratio; /* see custom.c */ +extern _Atomic uintnat caml_custom_minor_ratio; /* see custom.c */ +extern _Atomic uintnat caml_custom_minor_max_bsz; /* see custom.c */ extern uintnat caml_minor_heap_max_wsz; /* see domain.c */ CAMLprim value caml_gc_quick_stat(value v) @@ -126,12 +127,16 @@ CAMLprim value caml_gc_get(value v) res = caml_alloc_tuple (11); Store_field (res, 0, Val_long (Caml_state->minor_heap_wsz)); /* s */ - Store_field (res, 2, Val_long (caml_percent_free)); /* o */ + Store_field (res, 2, + Val_long (atomic_load_relaxed(&caml_percent_free))); /* o */ Store_field (res, 3, Val_long (atomic_load_relaxed(&caml_verb_gc))); /* v */ Store_field (res, 5, Val_long (caml_max_stack_wsize)); /* l */ - Store_field (res, 8, Val_long (caml_custom_major_ratio)); /* M */ - Store_field (res, 9, Val_long (caml_custom_minor_ratio)); /* m */ - Store_field (res, 10, Val_long (caml_custom_minor_max_bsz)); /* n */ + Store_field (res, 8, + Val_long (atomic_load_relaxed(&caml_custom_major_ratio))); /* M */ + Store_field (res, 9, + Val_long (atomic_load_relaxed(&caml_custom_minor_ratio))); /* m */ + Store_field (res, 10, + Val_long (atomic_load_relaxed(&caml_custom_minor_max_bsz))); /* n */ CAMLreturn (res); } @@ -166,41 +171,42 @@ CAMLprim value caml_gc_set(value v) caml_change_max_stack_size (new_max_stack_size); - if (newpf != caml_percent_free){ - caml_percent_free = newpf; - caml_gc_message (0x20, "New space overhead: %" - ARCH_INTNAT_PRINTF_FORMAT "u%%\n", caml_percent_free); + if (newpf != atomic_load_relaxed(&caml_percent_free)){ + atomic_store_relaxed(&caml_percent_free, newpf); + CAML_GC_MESSAGE(PARAMS, + "New space overhead: %" ARCH_INTNAT_PRINTF_FORMAT "u%%\n", + caml_percent_free); } atomic_store_relaxed(&caml_verb_gc, new_verb_gc); /* These fields were added in 4.08.0. */ if (Wosize_val (v) >= 11){ - if (new_custom_maj != caml_custom_major_ratio){ - caml_custom_major_ratio = new_custom_maj; - caml_gc_message (0x20, "New custom major ratio: %" - ARCH_INTNAT_PRINTF_FORMAT "u%%\n", - caml_custom_major_ratio); + if (new_custom_maj != atomic_load_relaxed(&caml_custom_major_ratio)){ + atomic_store_relaxed(&caml_custom_major_ratio, new_custom_maj); + CAML_GC_MESSAGE(PARAMS, "New custom major ratio: %" + ARCH_INTNAT_PRINTF_FORMAT "u%%\n", + caml_custom_major_ratio); } - if (new_custom_min != caml_custom_minor_ratio){ - caml_custom_minor_ratio = new_custom_min; - caml_gc_message (0x20, "New custom minor ratio: %" - ARCH_INTNAT_PRINTF_FORMAT "u%%\n", - caml_custom_minor_ratio); + if (new_custom_min != atomic_load_relaxed(&caml_custom_minor_ratio)){ + atomic_store_relaxed(&caml_custom_minor_ratio, new_custom_min); + CAML_GC_MESSAGE(PARAMS, "New custom minor ratio: %" + ARCH_INTNAT_PRINTF_FORMAT "u%%\n", + caml_custom_minor_ratio); } - if (new_custom_sz != caml_custom_minor_max_bsz){ - caml_custom_minor_max_bsz = new_custom_sz; - caml_gc_message (0x20, "New custom minor size limit: %" - ARCH_INTNAT_PRINTF_FORMAT "u%%\n", - caml_custom_minor_max_bsz); + if (new_custom_sz != atomic_load_relaxed(&caml_custom_minor_max_bsz)){ + atomic_store_relaxed(&caml_custom_minor_max_bsz, new_custom_sz); + CAML_GC_MESSAGE(PARAMS, "New custom minor size limit: %" + ARCH_INTNAT_PRINTF_FORMAT "u%%\n", + caml_custom_minor_max_bsz); } } /* Minor heap size comes last because it will trigger a minor collection (thus invalidating [v]) and it can raise [Out_of_memory]. */ if (newminwsz != Caml_state->minor_heap_wsz) { - caml_gc_message (0x20, "New minor heap size: %" - ARCH_INTNAT_PRINTF_FORMAT "uk words\n", newminwsz / 1024); + CAML_GC_MESSAGE(PARAMS, "New minor heap size: %" + ARCH_INTNAT_PRINTF_FORMAT "uk words\n", newminwsz / 1024); } if (newminwsz > caml_minor_heap_max_wsz) { @@ -242,6 +248,7 @@ static caml_result gc_major_res(int force_compaction) caml_gc_log ("Major GC cycle requested"); caml_empty_minor_heaps_once(); caml_finish_major_cycle(force_compaction); + caml_reset_major_pacing(); caml_result result = caml_process_pending_actions_res(); CAML_EV_END(EV_EXPLICIT_GC_MAJOR); return result; @@ -262,6 +269,7 @@ static caml_result gc_full_major_res(void) currently-unreachable object to be collected. */ for (int i = 0; i < 3; i++) { caml_finish_major_cycle(0); + caml_reset_major_pacing(); caml_result res = caml_process_pending_actions_res(); if (caml_result_is_exception(res)) return res; } @@ -297,6 +305,7 @@ CAMLprim value caml_gc_compaction(value v) why this needs three iterations. */ for (int i = 0; i < 3; i++) { caml_finish_major_cycle(i == 2); + caml_reset_major_pacing(); result = caml_process_pending_actions_res(); if (caml_result_is_exception(result)) break; } @@ -330,16 +339,18 @@ void caml_init_gc (void) caml_max_stack_wsize = caml_params->init_max_stack_wsz; caml_fiber_wsz = (Stack_threshold * 2) / sizeof(value); - caml_percent_free = norm_pfree (caml_params->init_percent_free); + atomic_store_relaxed(&caml_percent_free, + norm_pfree (caml_params->init_percent_free)); caml_gc_log ("Initial stack limit: %" ARCH_INTNAT_PRINTF_FORMAT "uk bytes", caml_params->init_max_stack_wsz / 1024 * sizeof (value)); - caml_custom_major_ratio = - norm_custom_maj (caml_params->init_custom_major_ratio); - caml_custom_minor_ratio = - norm_custom_min (caml_params->init_custom_minor_ratio); - caml_custom_minor_max_bsz = caml_params->init_custom_minor_max_bsz; + atomic_store_relaxed(&caml_custom_major_ratio, + norm_custom_maj (caml_params->init_custom_major_ratio)); + atomic_store_relaxed(&caml_custom_minor_ratio, + norm_custom_min (caml_params->init_custom_minor_ratio)); + atomic_store_relaxed(&caml_custom_minor_max_bsz, + caml_params->init_custom_minor_max_bsz); caml_gc_phase = Phase_sweep_and_mark_main; #ifdef NATIVE_CODE @@ -407,3 +418,84 @@ CAMLprim value caml_ml_runtime_warnings_enabled(value unit) CAMLassert (unit == Val_unit); return Val_bool(caml_runtime_warnings); } + + +/* Ramp-up phase. */ + +static uintnat get_ramp_up_suspended_words(void) { + return (Caml_state->current_ramp_up_allocated_words_diff + + Caml_state->allocated_words_suspended); +} + +static void set_ramp_up_suspended_words(uintnat suspended_words) { + Caml_state->current_ramp_up_allocated_words_diff = + suspended_words - Caml_state->allocated_words_suspended; +} + +caml_result caml_gc_ramp_up(value callback, uintnat *out_suspended_words) { + /* Calls to [caml_gc_ramp_up] could be nested, so we are careful + to save the current setting beforehand and restore it afterwards. + + When nesting an inner ramp-up phase within an outer ramp-up + phase, the allocations suspended during the inner phase should + be returned as the suspended count of the inner call, and + should not be double-counted as suspended allocations of the + outer phase. */ + + CAML_GC_MESSAGE(SLICESIZE, "Entering a GC ramp-up phase.\n"); + + intnat ramp_up_already = (Caml_state->gc_policy & CAML_GC_RAMP_UP); + if (!ramp_up_already) + Caml_state->gc_policy = (Caml_state->gc_policy | CAML_GC_RAMP_UP); + + /* Save the suspended words of a potential outer phase, + and start a new ramp_up phase. */ + uintnat suspended_words_outer = get_ramp_up_suspended_words(); + if (!ramp_up_already) CAMLassert(suspended_words_outer == 0); + set_ramp_up_suspended_words(0); + + caml_result res = caml_callback_res(callback, Val_unit); + + /* Write the suspended words of the inner phase, + restore the suspended words of the outer phase. */ + uintnat suspended_words_inner = get_ramp_up_suspended_words(); + *out_suspended_words = suspended_words_inner; + set_ramp_up_suspended_words(suspended_words_outer); + + CAML_GC_MESSAGE(SLICESIZE, + "Leaving a GC ramp-up phase; " + "suspended words: %"ARCH_INTNAT_PRINTF_FORMAT"u\n", + suspended_words_inner); + + if (!ramp_up_already) + Caml_state->gc_policy = (Caml_state->gc_policy & ~CAML_GC_RAMP_UP); + + return res; +} + +void caml_gc_ramp_down(uintnat ramp_up_words) { + Caml_state->allocated_words_resumed += ramp_up_words; +} + +CAMLprim value caml_ml_gc_ramp_up(value callback) { + CAMLparam1(callback); + CAMLlocal1(v); + uintnat deferred_words; + caml_result res = caml_gc_ramp_up(callback, &deferred_words); + if (caml_result_is_exception(res)) { + // We will re-raise the exception below; before that, + // we ramp_down to avoid discarding the deferred work. + caml_gc_ramp_down(deferred_words); + } + v = caml_get_value_or_raise(res); + CAMLreturn (caml_alloc_2(0, v, Val_long(deferred_words))); +} + +CAMLprim value caml_ml_gc_ramp_down(value work) { + uintnat resumed_words = Long_val(work); + CAML_GC_MESSAGE(SLICESIZE, + "GC ramp-down; resumed words: %"ARCH_INTNAT_PRINTF_FORMAT"u\n", + resumed_words); + caml_gc_ramp_down(resumed_words); + return Val_unit; +} diff --git a/runtime/gc_stats.c b/runtime/gc_stats.c index 4bff32a4..f4ef4ba0 100644 --- a/runtime/gc_stats.c +++ b/runtime/gc_stats.c @@ -83,7 +83,9 @@ void caml_reset_domain_alloc_stats(caml_domain_state *local) static caml_plat_mutex orphan_lock = CAML_PLAT_MUTEX_INITIALIZER; static struct alloc_stats orphaned_alloc_stats = {0,}; -void caml_accum_orphan_alloc_stats(struct alloc_stats *acc) { +void caml_accum_orphan_alloc_stats(struct alloc_stats *acc) +{ + /* This is called from the collector as well as from the mutator. */ caml_plat_lock_blocking(&orphan_lock); caml_accum_alloc_stats(acc, &orphaned_alloc_stats); caml_plat_unlock(&orphan_lock); @@ -97,6 +99,7 @@ void caml_orphan_alloc_stats(caml_domain_state *domain) { caml_reset_domain_alloc_stats(domain); /* push them into the orphan stats */ + /* This is called from the collector as well as from the mutator. */ caml_plat_lock_blocking(&orphan_lock); caml_accum_alloc_stats(&orphaned_alloc_stats, &alloc_stats); caml_plat_unlock(&orphan_lock); @@ -117,6 +120,13 @@ void caml_init_gc_stats (uintnat max_domains) caml_fatal_error("Failed to allocate sampled_gc_stats"); } +void caml_free_gc_stats(void) +{ + if (sampled_gc_stats != NULL) + caml_stat_free(sampled_gc_stats); + sampled_gc_stats = NULL; +} + /* Update the sampled stats for the given domain during a STW section. */ void caml_collect_gc_stats_sample_stw(caml_domain_state* domain) { diff --git a/runtime/globroots.c b/runtime/globroots.c index 47d65afb..18aaec2b 100644 --- a/runtime/globroots.c +++ b/runtime/globroots.c @@ -25,11 +25,23 @@ #include "caml/skiplist.h" #include "caml/stack.h" +/* This mutex must be locked with [caml_plat_lock_blocking] from the + mutator, because caml_{register,remove}_{generational_}roots can be + called in places where the domain lock is not safe to be + released. */ static caml_plat_mutex roots_mutex = CAML_PLAT_MUTEX_INITIALIZER; +/* Greater than zero when the current thread is scanning the roots */ +static CAMLthread_local int iterating_roots = 0; + +enum { ROOT_PRESENT = 0, ROOT_DELETED = 1 }; + /* The three global root lists. Each is represented by a skip list with the key being the address - of the root. (The associated data field is unused.) */ + of the root. + The associated data is usually ROOT_PRESENT, but is changed to + ROOT_DELETED if a root is deleted while iteration in progress. + Such entries are removed during the current or next iteration */ struct skiplist caml_global_roots = SKIPLIST_STATIC_INITIALIZER; /* mutable roots, don't know whether old or young */ @@ -52,15 +64,23 @@ struct skiplist caml_global_roots_old = SKIPLIST_STATIC_INITIALIZER; Caml_inline void caml_insert_global_root(struct skiplist * list, value * r) { caml_plat_lock_blocking(&roots_mutex); - caml_skiplist_insert(list, (uintnat) r, 0); + caml_skiplist_insert(list, (uintnat) r, ROOT_PRESENT); caml_plat_unlock(&roots_mutex); } Caml_inline void caml_delete_global_root(struct skiplist * list, value * r) { - caml_plat_lock_blocking(&roots_mutex); - caml_skiplist_remove(list, (uintnat) r); - caml_plat_unlock(&roots_mutex); + if (iterating_roots > 0) { + /* We hold the roots_mutex because we are iterating */ + uintnat* p = caml_skiplist_find_ptr(list, (uintnat) r); + if (p != NULL) { + *p = ROOT_DELETED; + } + } else { + caml_plat_lock_blocking(&roots_mutex); + caml_skiplist_remove(list, (uintnat) r); + caml_plat_unlock(&roots_mutex); + } } /* Register a global C root of the mutable kind */ @@ -215,20 +235,28 @@ static void scan_native_globals(scanning_action f, void* fdata) /* Iterate a GC scanning action over a global root list */ Caml_inline void caml_iterate_global_roots(scanning_action f, - struct skiplist * rootlist, void* fdata) + struct skiplist * rootlist, + void* fdata) { + CAMLassert(iterating_roots > 0); FOREACH_SKIPLIST_ELEMENT(e, rootlist, { - value * r = (value *) (e->key); - f(fdata, *r, r); + if (e->data == ROOT_DELETED) { + caml_skiplist_remove(rootlist, e->key); + } else { + value * r = (value *) (e->key); + f(fdata, *r, r); + } }) } /* Scan all global roots */ void caml_scan_global_roots(scanning_action f, void* fdata) { caml_plat_lock_blocking(&roots_mutex); + iterating_roots ++; caml_iterate_global_roots(f, &caml_global_roots, fdata); caml_iterate_global_roots(f, &caml_global_roots_young, fdata); caml_iterate_global_roots(f, &caml_global_roots_old, fdata); + iterating_roots --; caml_plat_unlock(&roots_mutex); #ifdef NATIVE_CODE @@ -240,6 +268,7 @@ void caml_scan_global_roots(scanning_action f, void* fdata) { void caml_scan_global_young_roots(scanning_action f, void* fdata) { caml_plat_lock_blocking(&roots_mutex); + iterating_roots ++; caml_iterate_global_roots(f, &caml_global_roots, fdata); caml_iterate_global_roots(f, &caml_global_roots_young, fdata); @@ -251,5 +280,6 @@ void caml_scan_global_young_roots(scanning_action f, void* fdata) }); caml_skiplist_empty(&caml_global_roots_young); + iterating_roots --; caml_plat_unlock(&roots_mutex); } diff --git a/runtime/instrtrace.c b/runtime/instrtrace.c index df5709ca..272ac1a1 100644 --- a/runtime/instrtrace.c +++ b/runtime/instrtrace.c @@ -42,9 +42,6 @@ void caml_stop_here (void) { } -char * caml_instr_string (code_t pc); - - void caml_event_trace(code_t pc) { @@ -91,8 +88,13 @@ void caml_disasm_instr(code_t pc) snprintf(buf, sizeof(buf), "%s %d, %d\n", opbuf, pc[0], pc[1]); break; /* Instructions with a C primitive as operand */ case C_CALLN: - snprintf(buf, sizeof(buf), "%s %d,", opbuf, pc[0]); pc++; - fallthrough; + if (pc[1] < 0 || pc[1] >= caml_prim_name_table.size) + snprintf(buf, sizeof(buf), "%s %d, unknown primitive %d\n", opbuf, pc[0], + pc[1]); + else + snprintf(buf, sizeof(buf), "%s %d, %s\n", opbuf, pc[0], + (char *) caml_prim_name_table.contents[pc[1]]); + break; case C_CALL1: case C_CALL2: case C_CALL3: case C_CALL4: case C_CALL5: if (pc[0] < 0 || pc[0] >= caml_prim_name_table.size) snprintf(buf, sizeof(buf), "%s unknown primitive %d\n", opbuf, pc[0]); diff --git a/runtime/intern.c b/runtime/intern.c index f99f5f0c..5baceb26 100644 --- a/runtime/intern.c +++ b/runtime/intern.c @@ -337,13 +337,13 @@ static void readfloats(struct caml_intern_state* s, CAMLnoret static void intern_stack_overflow(struct caml_intern_state* s) { - caml_gc_message (0x04, "Stack overflow in un-marshaling value\n"); + CAML_GC_MESSAGE(HEAPSIZE, "Stack overflow in un-marshaling value\n"); intern_cleanup(s); caml_raise_out_of_memory(); } static struct intern_item * intern_resize_stack(struct caml_intern_state* s, - struct intern_item * sp) + const struct intern_item * sp) { asize_t newsize = 2 * (s->intern_stack_limit - s->intern_stack); asize_t sp_offset = sp - s->intern_stack; @@ -438,8 +438,8 @@ static value intern_alloc_obj(struct caml_intern_state* s, caml_domain_state* d, intern_cleanup (s); caml_raise_out_of_memory(); } - d->allocated_words += Whsize_wosize(wosize); - d->allocated_words_direct += Whsize_wosize(wosize); + caml_update_major_allocated_words( + d, Whsize_wosize(wosize), 1 /* direct */); Hd_hp(p) = Make_header (wosize, tag, caml_global_heap_state.MARKED); caml_memprof_sample_block(Val_hp(p), wosize, Whsize_wosize(wosize), @@ -862,7 +862,6 @@ value caml_input_val(struct channel *chan) char header[MAX_INTEXT_HEADER_SIZE]; struct marshal_header h; char * block; - value res; struct caml_intern_state* s = init_intern_state (); if (! caml_channel_binary_mode(chan)) @@ -907,9 +906,10 @@ value caml_input_val(struct channel *chan) intern_init(s, block, block); intern_decompress_input(s, "input_value", &h); intern_alloc_storage(s, h.whsize, h.num_objects); - /* Fill it in */ - intern_rec(s, "input_value", &res); - return intern_end(s, res); + /* Fill it in - obj must NOT be registered as a GC root */ + value obj; + intern_rec(s, "input_value", &obj); + return intern_end(s, obj); } CAMLprim value caml_input_value(value vchan) @@ -935,7 +935,6 @@ CAMLprim value caml_input_value_to_outside_heap(value vchan) CAMLexport value caml_input_val_from_bytes(value str, intnat ofs) { CAMLparam1 (str); - CAMLlocal1 (obj); struct marshal_header h; struct caml_intern_state* s = init_intern_state (); @@ -949,7 +948,8 @@ CAMLexport value caml_input_val_from_bytes(value str, intnat ofs) s->intern_src = &Byte_u(str, ofs + h.header_len); /* If a GC occurred */ /* Decompress if needed */ intern_decompress_input(s, "input_val_from_string", &h); - /* Fill it in */ + /* Fill it in - obj must NOT be registered as a GC root */ + value obj; intern_rec(s, "input_val_from_string", &obj); CAMLreturn (intern_end(s, obj)); } @@ -962,12 +962,12 @@ CAMLprim value caml_input_value_from_bytes(value str, value ofs) static value input_val_from_block(struct caml_intern_state* s, struct marshal_header * h) { - value obj; /* Decompress if needed */ intern_decompress_input(s, "input_val_from_block", h); /* Allocate result */ intern_alloc_storage(s, h->whsize, h->num_objects); - /* Fill it in */ + /* Fill it in - obj must NOT be registered as a GC root */ + value obj; intern_rec(s, "input_val_from_block", &obj); return (intern_end(s, obj)); } @@ -1052,7 +1052,7 @@ CAMLprim value caml_marshal_data_size(value buff, value ofs) static char * intern_resolve_code_pointer(unsigned char digest[16], asize_t offset) { - struct code_fragment * cf = caml_find_code_fragment_by_digest(digest); + const struct code_fragment * cf = caml_find_code_fragment_by_digest(digest); if (cf != NULL && cf->code_start + offset < cf->code_end) return cf->code_start + offset; else @@ -1207,7 +1207,7 @@ CAMLexport void caml_deserialize_block_float_8(void * data, intnat len) #endif } -CAMLexport void caml_deserialize_error(char * msg) +CAMLexport void caml_deserialize_error(const char * msg) { struct caml_intern_state* s = get_intern_state (); intern_cleanup(s); diff --git a/runtime/interp.c b/runtime/interp.c index ae146f25..270b2861 100644 --- a/runtime/interp.c +++ b/runtime/interp.c @@ -47,7 +47,7 @@ Caml_state->trap_sp_off offset to the current trap frame extra_args number of extra arguments provided by the caller -sp is a local copy of the global variable Caml_state->extern_sp. */ +sp is a local copy of the global variable Caml_state->current_stack->sp. */ /* Instruction decoding */ @@ -156,7 +156,8 @@ Caml_inline void check_trap_barrier_for_effect if (parent_stack != NULL && parent_stack->id == domain_state->trap_barrier_block && parent_stack->sp + 2 - Stack_high (parent_stack) - /* Note: +2 is the same constant as in debugger.c:552 */ + /* Note: +2 is the same constant as in the REQ_UP_FRAME + case in caml_debugger() in debugger.c */ == domain_state->trap_barrier_off){ caml_debugger(TRAP_BARRIER, Val_unit); } @@ -264,9 +265,9 @@ value caml_bytecode_interpreter(code_t prog, asize_t prog_size, #endif #if defined(THREADED_CODE) && defined(ARCH_SIXTYFOUR) && !defined(ARCH_CODE32) #ifdef JUMPTBL_BASE_REG - register char * jumptbl_base JUMPTBL_BASE_REG; + register const char * jumptbl_base JUMPTBL_BASE_REG; #else - register char * jumptbl_base; + register const char * jumptbl_base; #endif #endif value env; @@ -311,7 +312,6 @@ value caml_bytecode_interpreter(code_t prog, asize_t prog_size, Closinfo_val(raise_unhandled_effect_closure) = Make_closinfo(0, 2); raise_unhandled_effect = raise_unhandled_effect_closure; caml_register_generational_global_root(&raise_unhandled_effect); - caml_global_data = Val_unit; caml_register_generational_global_root(&caml_global_data); caml_init_callbacks(); return Val_unit; diff --git a/runtime/ints.c b/runtime/ints.c index 3db3de6b..4281beef 100644 --- a/runtime/ints.c +++ b/runtime/ints.c @@ -142,7 +142,7 @@ CAMLprim value caml_int_of_string(value s) #define FORMAT_BUFFER_SIZE 32 static char parse_format(value fmt, - char * suffix, + const char * suffix, char format_string[FORMAT_BUFFER_SIZE]) { char * p; diff --git a/runtime/io.c b/runtime/io.c index 5401af2d..3330c4e3 100644 --- a/runtime/io.c +++ b/runtime/io.c @@ -24,7 +24,7 @@ #include #include #include "caml/config.h" -#ifdef HAS_UNISTD +#ifndef _WIN32 #include #endif #ifdef __CYGWIN__ @@ -247,11 +247,19 @@ CAMLexport int caml_channel_binary_mode(struct channel *channel) end of the flush, or false if some data remains in the buffer. */ -CAMLexport int caml_flush_partial(struct channel *channel) +static bool flush_partial(struct channel *channel, bool exn_if_closed) { int towrite, written; again: check_pending(channel); + if (channel->fd == -1) { + if (exn_if_closed) { + errno = EBADF; + caml_sys_io_error(NO_ARG); + } else { + return true; + } + } towrite = channel->curr - channel->buff; CAMLassert (towrite >= 0); @@ -277,6 +285,11 @@ CAMLexport int caml_flush_partial(struct channel *channel) return (channel->curr == channel->buff); } +CAMLexport int caml_flush_partial(struct channel *channel) +{ + return flush_partial(channel, true); +} + /* Flush completely the buffer. */ CAMLexport void caml_flush(struct channel *channel) @@ -311,7 +324,7 @@ CAMLexport void caml_putword(struct channel *channel, uint32_t w) caml_putch(channel, w); } -CAMLexport int caml_putblock(struct channel *channel, char *p, intnat len) +CAMLexport int caml_putblock(struct channel *channel, const char *p, intnat len) { int n, free; @@ -333,7 +346,7 @@ CAMLexport int caml_putblock(struct channel *channel, char *p, intnat len) } CAMLexport void caml_really_putblock(struct channel *channel, - char *p, intnat len) + const char *p, intnat len) { int written; while (len > 0) { @@ -578,8 +591,8 @@ void caml_finalize_channel(value vchan) static int compare_channel(value vchan1, value vchan2) { - struct channel * chan1 = Channel(vchan1); - struct channel * chan2 = Channel(vchan2); + const struct channel * chan1 = Channel(vchan1); + const struct channel * chan2 = Channel(vchan2); return (chan1 == chan2) ? 0 : (chan1 < chan2) ? -1 : 1; } @@ -663,6 +676,12 @@ CAMLprim value caml_ml_out_channels_list (value unit) struct channel_list *channel_list = NULL, *cl_tmp; mlsize_t num_channels = 0; + /* We cannot use [caml_plat_lock_non_blocking] inside + [caml_finalize_channel], so instead we must be careful here not + to trigger a STW while holding [caml_all_opened_channels_mutex]. + This is why we allocate a temporary list with malloc. This is + unsatisfactory because the critical section inside + caml_ml_out_channels_list is not guaranteed to be short.*/ caml_plat_lock_blocking(&caml_all_opened_channels_mutex); for (struct channel *channel = caml_all_opened_channels; channel != NULL; @@ -819,8 +838,7 @@ CAMLprim value caml_ml_flush(value vchannel) struct channel * channel = Channel(vchannel); caml_channel_lock(channel); - if (channel->fd != -1) - caml_flush(channel); + while (! flush_partial(channel, false)) continue; caml_channel_unlock(channel); CAMLreturn (Val_unit); } @@ -843,7 +861,7 @@ CAMLprim value caml_ml_set_buffered(value vchannel, value mode) CAMLprim value caml_ml_is_buffered(value vchannel) { - struct channel * channel = Channel(vchannel); + const struct channel * channel = Channel(vchannel); return Val_bool( ! (channel->flags & CHANNEL_FLAG_UNBUFFERED)); } diff --git a/runtime/lexing.c b/runtime/lexing.c index c3e7a5fc..16776869 100644 --- a/runtime/lexing.c +++ b/runtime/lexing.c @@ -143,7 +143,7 @@ static void run_mem(char *pc, value mem, value curr_pos) { } } -static void run_tag(char *pc, value mem) { +static void run_tag(const char *pc, value mem) { for (;;) { unsigned char dst, src ; diff --git a/runtime/lf_skiplist.c b/runtime/lf_skiplist.c index 473b8cd6..29bb2915 100644 --- a/runtime/lf_skiplist.c +++ b/runtime/lf_skiplist.c @@ -96,15 +96,19 @@ void caml_lf_skiplist_init(struct lf_skiplist *sk) { /* This concurrent skip list has two sentinel nodes, the first [head] is less than any possible key in the data structure and the second [tail] is greater than any key. */ - sk->head = caml_stat_alloc(SIZEOF_LF_SKIPCELL + - NUM_LEVELS * sizeof(struct lf_skipcell *)); + sk->head = caml_stat_alloc_noexc(SIZEOF_LF_SKIPCELL + + NUM_LEVELS * sizeof(struct lf_skipcell *)); + if (sk->head == NULL) + caml_fatal_error("caml_lf_skiplist_init: out of memory"); sk->head->key = 0; sk->head->data = 0; sk->head->garbage_next = NULL; sk->head->top_level = NUM_LEVELS - 1; - sk->tail = caml_stat_alloc(SIZEOF_LF_SKIPCELL + - NUM_LEVELS * sizeof(struct lf_skipcell *)); + sk->tail = caml_stat_alloc_noexc(SIZEOF_LF_SKIPCELL + + NUM_LEVELS * sizeof(struct lf_skipcell *)); + if (sk->tail == NULL) + caml_fatal_error("caml_lf_skiplist_init: out of memory"); sk->tail->key = CAML_UINTNAT_MAX; sk->tail->data = 0; sk->tail->garbage_next = NULL; @@ -288,7 +292,7 @@ static struct lf_skipcell *lf_skiplist_lookup(struct lf_skiplist *sk, /* Search a skip list */ int caml_lf_skiplist_find(struct lf_skiplist *sk, uintnat key, uintnat *data) { - struct lf_skipcell *found_cell = lf_skiplist_lookup(sk, key, NULL); + const struct lf_skipcell *found_cell = lf_skiplist_lookup(sk, key, NULL); if (found_cell->key == key) { if (data) { @@ -304,7 +308,7 @@ int caml_lf_skiplist_find_below(struct lf_skiplist *sk, uintnat k, uintnat *key, uintnat *data) { struct lf_skipcell *pred; struct lf_skipcell *curr = lf_skiplist_lookup(sk, k, &pred); - struct lf_skipcell *found_cell; + const struct lf_skipcell *found_cell; if (curr->key == k) { found_cell = curr; @@ -352,12 +356,11 @@ int caml_lf_skiplist_insert(struct lf_skiplist *sk, uintnat key, uintnat data) { * [top_level] and goes to 0. Each entry will point to the successors in the [succ] array for that level. */ int top_level = random_level(); - /* attentive readers will have noticed that we assume memory is aligned to - * atleast even addresses. This is certainly the case on glibc amd64 and - * Visual C++ on Windows though I can find no guarantees for other - platforms. */ - struct lf_skipcell *new_cell = caml_stat_alloc( + /* sufficiently aligned for LF_SK_MARK/UNMARK */ + struct lf_skipcell *new_cell = caml_stat_alloc_noexc( SIZEOF_LF_SKIPCELL + (top_level + 1) * sizeof(struct lf_skipcell *)); + if (new_cell == NULL) + caml_fatal_error("caml_lf_skiplist_insert: out of memory"); new_cell->top_level = top_level; new_cell->key = key; new_cell->data = data; @@ -372,7 +375,7 @@ int caml_lf_skiplist_insert(struct lf_skiplist *sk, uintnat key, uintnat data) { must end up at this level and so as long as the node is present, it will be found - regardless of whether it has been added to the level above. Consider the staircasing referred to in [skiplist_find] earlier, - the final step in finding a node is following the reference from it's + the final step in finding a node is following the reference from its predecessor at the bottom level. */ pred = preds[0]; succ = succs[0]; @@ -486,7 +489,7 @@ int caml_lf_skiplist_remove(struct lf_skiplist *sk, uintnat key) { void caml_lf_skiplist_free_garbage(struct lf_skiplist *sk) { struct lf_skipcell *curr = atomic_load_acquire(&sk->garbage_head); - struct lf_skipcell *head = sk->head; + const struct lf_skipcell *head = sk->head; while (curr != head) { struct lf_skipcell *next = atomic_load_relaxed(&curr->garbage_next); // acquire not useful, if executed in STW diff --git a/runtime/major_gc.c b/runtime/major_gc.c index d8ca191b..1f0e4cdd 100644 --- a/runtime/major_gc.c +++ b/runtime/major_gc.c @@ -40,40 +40,8 @@ #include "caml/startup_aux.h" #include "caml/weak.h" -/* NB the MARK_STACK_INIT_SIZE must be larger than the number of objects - that can be in a pool, see POOL_WSIZE */ -#define MARK_STACK_INIT_SIZE (1 << 12) - -/* The mark stack consists of two parts: - 1. the stack - a dynamic array of spans of fields that need to be marked, and - 2. the compressed stack - a bitset of fields that need to be marked. - - The stack is bounded relative to the heap size. When the stack - overflows the bound, then entries from the stack are compressed and - transferred into the compressed stack, expect for "large" entries, - spans of more than BITS_PER_WORD entries, that are more compactly - represented as spans and remain on the uncompressed stack. - - When the stack is empty, the compressed stack is processed. - The compressed stack iterator marks the point up to which - compressed stack entries have already been processed. -*/ - -typedef struct { - value_ptr start; - value_ptr end; -} mark_entry; /* represents fields in the span [start, end) */ - -struct mark_stack { - mark_entry* stack; - uintnat count; - uintnat size; - struct addrmap compressed_stack; - addrmap_iterator compressed_stack_iter; -}; - /* Default speed setting for the major GC. */ -uintnat caml_percent_free = Percent_free_def; +_Atomic uintnat caml_percent_free = Percent_free_def; /* This variable is only written with the world stopped, so it need not be atomic */ @@ -138,20 +106,6 @@ static atomic_uintnat num_domains_to_final_update_last; (finalise first) finalisers are processed. */ static atomic_uintnat num_domains_orphaning_finalisers = 0; -/* These two counters keep track of how much work the GC is supposed to - do in order to keep up with allocation. Both are in GC work units. - `alloc_counter` increases when we allocate: the number of words allocated - is converted to GC work units and added to this counter. - `work_counter` increases when the GC has done some work. - The difference between the two is how much the GC is lagging behind - (or in advance of) allocations. - These counters can wrap around (see function `diffmod`) as long as they - don't get too far apart, which is guaranteed by the limited size of - memory. -*/ -static atomic_uintnat alloc_counter; -static atomic_uintnat work_counter; - enum global_roots_status{ WORK_UNSTARTED, WORK_STARTED @@ -167,7 +121,7 @@ gc_phase_t caml_gc_phase; We know of two situations in the runtime that could run in parallel with a phase update, and cannot safely access the gc phase: - - The domain_terminate logic runs after the thread has un-registered + - The caml_domain_terminate logic runs after the thread has un-registered itself as a STW participant, so it may race with a STW section. - Opportunistic collections may happen while a domain is waiting on @@ -193,25 +147,9 @@ Caml_inline char caml_gc_phase_char(int may_access_gc_phase) { } } -extern value caml_ephe_none; /* See weak.c */ - -static struct ephe_cycle_info_t { - atomic_uintnat num_domains_todo; - /* Number of domains that need to scan their ephemerons in the current major - * GC cycle. This field is decremented when ephe_info->todo list at a domain - * becomes empty. */ - atomic_uintnat ephe_cycle; - /* Ephemeron cycle count */ - atomic_uintnat num_domains_done; - /* Number of domains that have marked their ephemerons in the current - * ephemeron cycle. */ -} ephe_cycle_info; - /* In the first major cycle, there is no ephemeron marking to be done. */ - -/* ephe_cycle_info is always updated with the critical section protected by - * ephe_lock or in the global barrier. However, the fields may be read without - * the lock. */ -static caml_plat_mutex ephe_lock = CAML_PLAT_MUTEX_INITIALIZER; +/******************************************************************************* + * Prefetching + ******************************************************************************/ #define PREFETCH_BUFFER_SIZE (1 << 8) #define PREFETCH_BUFFER_MIN 64 /* keep pb at least this full */ @@ -292,14 +230,38 @@ Caml_inline void prefetch_block(value v) caml_prefetch((const void *)&Field(v, 3)); } +/******************************************************************************* + * Ephemerons + ******************************************************************************/ + +extern value caml_ephe_none; /* See weak.c */ + +static struct ephe_cycle_info_t { + atomic_uintnat num_domains_todo; + /* Number of domains that need to scan their ephemerons in the current major + * GC cycle. This field is decremented when ephe_info->todo list at a domain + * becomes empty. */ + atomic_uintnat ephe_cycle; + /* Ephemeron cycle count */ + atomic_uintnat num_domains_done; + /* Number of domains that have marked their ephemerons in the current + * ephemeron cycle. */ +} ephe_cycle_info; + /* In the first major cycle, there is no ephemeron marking to be done. */ + +/* ephe_cycle_info is always updated with the critical section protected by + * ephe_lock or in the global barrier. However, the fields may be read without + * the lock. */ +static caml_plat_mutex ephe_lock = CAML_PLAT_MUTEX_INITIALIZER; + static void ephe_next_cycle (void) { caml_plat_lock_blocking(&ephe_lock); - atomic_fetch_add(&ephe_cycle_info.ephe_cycle, +1); - CAMLassert(atomic_load_acquire(&ephe_cycle_info.num_domains_done) <= - atomic_load_acquire(&ephe_cycle_info.num_domains_todo)); - atomic_store(&ephe_cycle_info.num_domains_done, 0); + (void)caml_atomic_counter_incr(&ephe_cycle_info.ephe_cycle); + CAMLassert(caml_atomic_counter_value(&ephe_cycle_info.num_domains_done) <= + caml_atomic_counter_value(&ephe_cycle_info.num_domains_todo)); + caml_atomic_counter_init(&ephe_cycle_info.num_domains_done, 0); caml_plat_unlock(&ephe_lock); } @@ -311,14 +273,14 @@ static void ephe_todo_list_emptied (void) /* Force next ephemeron marking cycle in order to avoid reasoning about * whether the domain has already incremented * [ephe_cycle_info.num_domains_done] counter. */ - atomic_store(&ephe_cycle_info.num_domains_done, 0); - atomic_fetch_add(&ephe_cycle_info.ephe_cycle, +1); + caml_atomic_counter_init(&ephe_cycle_info.num_domains_done, 0); + (void)caml_atomic_counter_incr(&ephe_cycle_info.ephe_cycle); /* Since the todo list is empty, this domain does not need to participate in * further ephemeron cycles. */ - atomic_fetch_sub(&ephe_cycle_info.num_domains_todo, 1); - CAMLassert(atomic_load_acquire(&ephe_cycle_info.num_domains_done) <= - atomic_load_acquire(&ephe_cycle_info.num_domains_todo)); + (void)caml_atomic_counter_decr(&ephe_cycle_info.num_domains_todo); + CAMLassert(caml_atomic_counter_value(&ephe_cycle_info.num_domains_done) <= + caml_atomic_counter_value(&ephe_cycle_info.num_domains_todo)); caml_plat_unlock(&ephe_lock); } @@ -326,22 +288,152 @@ static void ephe_todo_list_emptied (void) /* Record that ephemeron marking was done for the given ephemeron cycle. */ static void record_ephe_marking_done (uintnat ephe_cycle) { - CAMLassert (ephe_cycle <= atomic_load_acquire(&ephe_cycle_info.ephe_cycle)); + CAMLassert (ephe_cycle <= + caml_atomic_counter_value(&ephe_cycle_info.ephe_cycle)); CAMLassert (Caml_state->marking_done); - if (ephe_cycle < atomic_load_acquire(&ephe_cycle_info.ephe_cycle)) + if (ephe_cycle < caml_atomic_counter_value(&ephe_cycle_info.ephe_cycle)) return; caml_plat_lock_blocking(&ephe_lock); - if (ephe_cycle == atomic_load(&ephe_cycle_info.ephe_cycle)) { + if (ephe_cycle == caml_atomic_counter_value(&ephe_cycle_info.ephe_cycle)) { Caml_state->ephe_info->cycle = ephe_cycle; - atomic_fetch_add(&ephe_cycle_info.num_domains_done, +1); - CAMLassert(atomic_load_acquire(&ephe_cycle_info.num_domains_done) <= - atomic_load_acquire(&ephe_cycle_info.num_domains_todo)); + (void)caml_atomic_counter_incr(&ephe_cycle_info.num_domains_done); + CAMLassert(caml_atomic_counter_value(&ephe_cycle_info.num_domains_done) <= + caml_atomic_counter_value(&ephe_cycle_info.num_domains_todo)); } caml_plat_unlock(&ephe_lock); } +#define EPHE_MARK_DEFAULT 0 +#define EPHE_MARK_FORCE_ALIVE 1 + +static intnat ephe_mark (intnat budget, uintnat for_cycle, + /* Forces ephemerons and their data to be alive */ + int force_alive) +{ + value v, data, key, f, todo; + value* prev_linkp; + header_t hd; + mlsize_t size, i; + caml_domain_state* domain_state = Caml_state; + int alive_data; + intnat marked = 0, trivial_data = 0, made_live = 0; + + if (domain_state->ephe_info->cursor.cycle == for_cycle && + !force_alive) { + prev_linkp = domain_state->ephe_info->cursor.todop; + todo = *prev_linkp; + } else { + todo = domain_state->ephe_info->todo; + prev_linkp = &domain_state->ephe_info->todo; + } + while (todo != 0 && budget > 0) { + v = todo; + todo = Ephe_link(v); + CAMLassert (Tag_val(v) == Abstract_tag); + hd = Hd_val(v); + data = Ephe_data(v); + alive_data = 1; + + if (force_alive) + caml_darken (domain_state, v, 0); + + /* If ephemeron is unmarked, data is dead */ + if (is_unmarked(v)) alive_data = 0; + + size = Wosize_hd(hd); + for (i = CAML_EPHE_FIRST_KEY; alive_data && i < size; i++) { + key = Ephe_key(v, i); + ephemeron_again: + if (key != caml_ephe_none && Is_block(key)) { + if (Tag_val(key) == Forward_tag) { + f = Forward_val(key); + if (Is_block(f)) { + if (Tag_val(f) == Forward_tag || Tag_val(f) == Lazy_tag || + Tag_val(f) == Forcing_tag || Tag_val(f) == Double_tag) { + /* Do not short-circuit the pointer */ + } else { + Field(v, i) = key = f; + goto ephemeron_again; + } + } + } + else { + if (Tag_val (key) == Infix_tag) key -= Infix_offset_val (key); + if (is_unmarked (key)) + alive_data = 0; + } + } + } + budget -= Whsize_wosize(i); + + bool keep; + if (data == caml_ephe_none || Is_long(data)) { + /* Not yet known whether this ephemeron's keys/block will be marked, + but since the data is trivial nothing will happen if they are, + so remove it from the todo list */ + trivial_data++; + keep = false; + } else if (force_alive || alive_data) { + /* This ephemeron's keys & block are marked, so mark the data, + and remove it from the todo list */ + caml_darken (domain_state, data, 0); + made_live++; + keep = false; + } else { + /* Leave this ephemeron on the todo list */ + keep = true; + } + + if (keep) { + prev_linkp = &Ephe_link(v); + } else { + Ephe_link(v) = domain_state->ephe_info->live; + domain_state->ephe_info->live = v; + *prev_linkp = todo; + } + marked++; + } + + caml_gc_log + ("Mark Ephemeron: %s. Ephemeron cycle=%"ARCH_INTNAT_PRINTF_FORMAT"d " + "examined=%"ARCH_INTNAT_PRINTF_FORMAT"d " + "trivial_data=%"ARCH_INTNAT_PRINTF_FORMAT"d " + "marked=%"ARCH_INTNAT_PRINTF_FORMAT"d", + domain_state->ephe_info->cursor.cycle == for_cycle ? + "Continued from cursor" : "Discarded cursor", + for_cycle, marked, trivial_data, made_live); + + domain_state->ephe_info->cursor.cycle = for_cycle; + domain_state->ephe_info->cursor.todop = prev_linkp; + + return budget; +} + +static intnat ephe_sweep (caml_domain_state* domain_state, intnat budget) +{ + value v; + CAMLassert (caml_gc_phase == Phase_sweep_ephe); + + while (domain_state->ephe_info->todo != 0 && budget > 0) { + v = domain_state->ephe_info->todo; + domain_state->ephe_info->todo = Ephe_link(v); + CAMLassert (Tag_val(v) == Abstract_tag); + + if (is_unmarked(v)) { + /* The whole array is dead, drop this ephemeron */ + budget -= 1; + } else { + caml_ephe_clean(v); + Ephe_link(v) = domain_state->ephe_info->live; + domain_state->ephe_info->live = v; + budget -= Whsize_val(v); + } + } + return budget; +} + /******************************************************************************* * Orphaning and adoption ******************************************************************************/ @@ -377,23 +469,19 @@ Caml_inline value ephe_list_tail(value e) #ifdef DEBUG static void orph_ephe_list_verify_status (int status) { - value v; + caml_plat_lock_blocking(&orphaned_lock); - v = orph_structs.ephe_list_live; + value v = orph_structs.ephe_list_live; while (v) { CAMLassert (Tag_val(v) == Abstract_tag); CAMLassert (Has_status_val(v, status)); v = Ephe_link(v); } + caml_plat_unlock(&orphaned_lock); } #endif -#define EPHE_MARK_DEFAULT 0 -#define EPHE_MARK_FORCE_ALIVE 1 - -static intnat ephe_mark (intnat budget, uintnat for_cycle, int force_alive); - void caml_orphan_ephemerons (caml_domain_state* domain_state) { struct caml_ephe_info* ephe_info = domain_state->ephe_info; @@ -424,7 +512,7 @@ void caml_orphan_ephemerons (caml_domain_state* domain_state) if (ephe_info->must_sweep_ephe) { ephe_info->must_sweep_ephe = 0; - atomic_fetch_add_verify_ge0(&num_domains_to_ephe_sweep, -1); + (void)caml_atomic_counter_decr(&num_domains_to_ephe_sweep); } CAMLassert (ephe_info->must_sweep_ephe == 0); CAMLassert (ephe_info->live == 0); @@ -437,7 +525,7 @@ void caml_orphan_finalisers (caml_domain_state* domain_state) if (f->todo_head != NULL || f->first.size != 0 || f->last.size != 0) { /* have some final structures */ - atomic_fetch_add(&num_domains_orphaning_finalisers, +1); + (void)caml_atomic_counter_incr(&num_domains_orphaning_finalisers); if (caml_gc_phase != Phase_sweep_and_mark_main) { /* Force a major GC cycle to simplify constraints for orphaning finalisers. See note attached to the declaration of @@ -456,18 +544,19 @@ void caml_orphan_finalisers (caml_domain_state* domain_state) /* Create a dummy final info */ f = domain_state->final_info = caml_alloc_final_info(); - atomic_fetch_add_verify_ge0(&num_domains_orphaning_finalisers, -1); + (void)caml_atomic_counter_decr(&num_domains_orphaning_finalisers); } - /* [caml_orphan_finalisers] is called in a while loop in [domain_terminate]. + /* [caml_orphan_finalisers] is called in a while loop in + [caml_domain_terminate]. We take care to decrement the [num_domains_to_final_update*] counters only if we have not already decremented it for the current cycle. */ if(!f->updated_first) { - atomic_fetch_add_verify_ge0(&num_domains_to_final_update_first, -1); + (void)caml_atomic_counter_decr(&num_domains_to_final_update_first); f->updated_first = 1; } if(!f->updated_last) { - atomic_fetch_add_verify_ge0(&num_domains_to_final_update_last, -1); + (void)caml_atomic_counter_decr(&num_domains_to_final_update_last); f->updated_last = 1; } } @@ -539,6 +628,24 @@ static void adopt_orphaned_work (void) } } +/******************************************************************************* + * Pacing + ******************************************************************************/ + +/* These two counters keep track of how much work the GC is supposed to + do in order to keep up with allocation. Both are in GC work units. + `alloc_counter` increases when we allocate: the number of words allocated + is converted to GC work units and added to this counter. + `work_counter` increases when the GC has done some work. + The difference between the two is how much the GC is lagging behind + (or in advance of) allocations. + These counters can wrap around (see function `diffmod`) as long as they + don't get too far apart, which is guaranteed by the limited size of + memory. +*/ +static atomic_uintnat alloc_counter; +static atomic_uintnat work_counter; + static inline intnat max2 (intnat a, intnat b) { if (a > b){ @@ -576,6 +683,30 @@ static inline intnat diffmod (uintnat x1, uintnat x2) return (intnat) (x1 - x2); } +/* Reset the work and alloc counters to be equal to each other, by + * setting them both equal to the "larger" (in the wrapping-around + * sense we are using here for work_counter and alloc_counter). + * + * For use at times when we have disturbed the major GC from its usual + * pacing and tempo, for example, after any synchronous major + * collection. + */ + +void caml_reset_major_pacing(void) +{ + bool res; + do { + uintnat alloc = atomic_load(&alloc_counter); + uintnat work = atomic_load(&work_counter); + uintnat target = alloc; + if (diffmod(work, alloc) > 0) { + target = work; + } + res = (atomic_compare_exchange_strong(&alloc_counter, &alloc, target) && + atomic_compare_exchange_strong(&work_counter, &work, target)); + } while (!res); +} + /* The [log_events] parameter is used to disable writing to the ring for two reasons: 1. To prevent spamming the ring with numerous events generated during @@ -591,19 +722,30 @@ update_major_slice_work(intnat howmuch, { intnat alloc_work, dependent_work, extra_work, new_work; intnat my_alloc_count, my_alloc_direct_count, my_dependent_count; + intnat my_alloc_suspended_count, my_alloc_resumed_count; double my_extra_count; caml_domain_state *dom_st = Caml_state; uintnat heap_words, heap_size, heap_sweep_words, total_cycle_work; + uintnat percent_free; my_alloc_count = dom_st->allocated_words; my_alloc_direct_count = dom_st->allocated_words_direct; + my_alloc_suspended_count = dom_st->allocated_words_suspended; + my_alloc_resumed_count = dom_st->allocated_words_resumed; my_dependent_count = dom_st->dependent_allocated; my_extra_count = dom_st->extra_heap_resources; + dom_st->stat_major_words += dom_st->allocated_words; + dom_st->current_ramp_up_allocated_words_diff += + dom_st->allocated_words_suspended; + dom_st->allocated_words = 0; dom_st->allocated_words_direct = 0; + dom_st->allocated_words_suspended = 0; + dom_st->allocated_words_resumed = 0; dom_st->dependent_allocated = 0; dom_st->extra_heap_resources = 0.0; + /* Free memory at the start of the GC cycle (garbage + free list) (assumed): FM = heap_words * caml_percent_free @@ -641,17 +783,21 @@ update_major_slice_work(intnat howmuch, heap_size = caml_heap_size(dom_st->shared_heap); heap_words = Wsize_bsize(heap_size); heap_sweep_words = heap_words; + percent_free = atomic_load(&caml_percent_free); total_cycle_work = heap_sweep_words - + (uintnat) ((double) heap_words * 100.0 / (100.0 + caml_percent_free)); + + (uintnat) ((double) heap_words * 100.0 / (100.0 + percent_free)); if (heap_words > 0) { double alloc_ratio = total_cycle_work - * 3.0 * (100 + caml_percent_free) - / heap_words / caml_percent_free / 2.0; - alloc_work = (intnat) (my_alloc_count * alloc_ratio); + * 3.0 * (100 + percent_free) + / heap_words / percent_free / 2.0; + intnat current_alloc_count = + my_alloc_count - my_alloc_suspended_count + my_alloc_resumed_count; + CAMLassert (current_alloc_count >= 0); + alloc_work = (intnat) (current_alloc_count * alloc_ratio); } else { alloc_work = 0; } @@ -659,8 +805,8 @@ update_major_slice_work(intnat howmuch, if (dom_st->dependent_size > 0) { double dependent_ratio = total_cycle_work - * (100 + caml_percent_free) - / (double)dom_st->dependent_size / (double)caml_percent_free; + * (100 + percent_free) + / (double)dom_st->dependent_size / (double)percent_free; dependent_work = (intnat) (my_dependent_count * dependent_ratio); }else{ dependent_work = 0; @@ -668,30 +814,37 @@ update_major_slice_work(intnat howmuch, extra_work = (intnat) (my_extra_count * (double) total_cycle_work); - caml_gc_message (0x40, "heap_words = %" - ARCH_INTNAT_PRINTF_FORMAT "u\n", - (uintnat)heap_words); - caml_gc_message (0x40, "allocated_words = %" - ARCH_INTNAT_PRINTF_FORMAT "u\n", + CAML_GC_MESSAGE(SLICESIZE, + "heap_words = %" ARCH_INTNAT_PRINTF_FORMAT "u\n", + (uintnat)heap_words); + CAML_GC_MESSAGE(SLICESIZE, + "allocated_words = %" ARCH_INTNAT_PRINTF_FORMAT "u\n", my_alloc_count); - caml_gc_message (0x40, "allocated_words_direct = %" - ARCH_INTNAT_PRINTF_FORMAT "u\n", + CAML_GC_MESSAGE(SLICESIZE, + "allocated_words_direct = %" ARCH_INTNAT_PRINTF_FORMAT "u\n", my_alloc_direct_count); - caml_gc_message (0x40, "alloc work-to-do = %" - ARCH_INTNAT_PRINTF_FORMAT "d\n", + CAML_GC_MESSAGE(SLICESIZE, + "allocated_words_suspended = " + "%" ARCH_INTNAT_PRINTF_FORMAT "u\n", + my_alloc_suspended_count); + CAML_GC_MESSAGE(SLICESIZE, + "allocated_words_resumed = %" ARCH_INTNAT_PRINTF_FORMAT "u\n", + my_alloc_resumed_count); + CAML_GC_MESSAGE(SLICESIZE, + "alloc work-to-do = %" ARCH_INTNAT_PRINTF_FORMAT "d\n", alloc_work); - caml_gc_message (0x40, "dependent_words = %" - ARCH_INTNAT_PRINTF_FORMAT "u\n", + CAML_GC_MESSAGE(SLICESIZE, + "dependent_words = %" ARCH_INTNAT_PRINTF_FORMAT "u\n", my_dependent_count); - caml_gc_message (0x40, "dependent work-to-do = %" - ARCH_INTNAT_PRINTF_FORMAT "d\n", - dependent_work); - caml_gc_message (0x40, "extra_heap_resources = %" - ARCH_INTNAT_PRINTF_FORMAT "uu\n", - (uintnat) (my_extra_count * 1000000)); - caml_gc_message (0x40, "extra work-to-do = %" - ARCH_INTNAT_PRINTF_FORMAT "d\n", - extra_work); + CAML_GC_MESSAGE(SLICESIZE, + "dependent work-to-do = %" ARCH_INTNAT_PRINTF_FORMAT "d\n", + dependent_work); + CAML_GC_MESSAGE(SLICESIZE, + "extra_heap_resources = %" ARCH_INTNAT_PRINTF_FORMAT "uu\n", + (uintnat) (my_extra_count * 1000000)); + CAML_GC_MESSAGE(SLICESIZE, + "extra work-to-do = %" ARCH_INTNAT_PRINTF_FORMAT "d\n", + extra_work); new_work = max3 (alloc_work, dependent_work, extra_work); atomic_fetch_add (&work_counter, dom_st->major_work_done_between_slices); @@ -710,6 +863,9 @@ update_major_slice_work(intnat howmuch, caml_gc_log("Updated major work: [%c] " " %"ARCH_INTNAT_PRINTF_FORMAT "u heap_words, " " %"ARCH_INTNAT_PRINTF_FORMAT "u allocated, " + " %"ARCH_INTNAT_PRINTF_FORMAT "u allocated (direct), " + " %"ARCH_INTNAT_PRINTF_FORMAT "u allocated (suspended), " + " %"ARCH_INTNAT_PRINTF_FORMAT "u allocated (resumed), " " %"ARCH_INTNAT_PRINTF_FORMAT "d alloc_work, " " %"ARCH_INTNAT_PRINTF_FORMAT "d dependent_work, " " %"ARCH_INTNAT_PRINTF_FORMAT "d extra_work, " @@ -719,7 +875,9 @@ update_major_slice_work(intnat howmuch, " %"ARCH_INTNAT_PRINTF_FORMAT "d slice budget" , caml_gc_phase_char(may_access_gc_phase), - (uintnat)heap_words, my_alloc_count, + (uintnat)heap_words, + my_alloc_count, my_alloc_direct_count, + my_alloc_suspended_count, my_alloc_resumed_count, alloc_work, dependent_work, extra_work, atomic_load (&work_counter), atomic_load (&work_counter) > atomic_load (&alloc_counter) @@ -731,6 +889,7 @@ update_major_slice_work(intnat howmuch, if (log_events) { CAML_EV_COUNTER(EV_C_MAJOR_HEAP_WORDS, (uintnat)heap_words); CAML_EV_COUNTER(EV_C_MAJOR_ALLOCATED_WORDS, my_alloc_count); + /* TODO: add counters for direct, suspended, resumed allocs. */ CAML_EV_COUNTER(EV_C_MAJOR_ALLOCATED_WORK, alloc_work); CAML_EV_COUNTER(EV_C_MAJOR_DEPENDENT_WORK, dependent_work); CAML_EV_COUNTER(EV_C_MAJOR_EXTRA_WORK, extra_work); @@ -779,17 +938,143 @@ static void commit_major_slice_work(intnat words_done) { domains. */ dom_st->requested_global_major_slice = 0; } -} +} + +/******************************************************************************* + * Marking + ******************************************************************************/ + +/* NB the MARK_STACK_INIT_SIZE must be larger than the number of objects + that can be in a pool, see POOL_WSIZE */ +#define MARK_STACK_INIT_SIZE (1 << 12) + +/* The mark stack consists of two parts: + 1. the stack - a dynamic array of spans of fields that need to be marked, and + 2. the compressed stack - a bitset of fields that need to be marked. + + The stack is bounded relative to the heap size. When the stack + overflows the bound, then entries from the stack are compressed and + transferred into the compressed stack, expect for "large" entries, + spans of more than BITS_PER_WORD entries, that are more compactly + represented as spans and remain on the uncompressed stack. + + When the stack is empty, the compressed stack is processed. + The compressed stack iterator marks the point up to which + compressed stack entries have already been processed. +*/ + +typedef struct { + value_ptr start; + value_ptr end; +} mark_entry; /* represents fields in the span [start, end) */ + +struct mark_stack { + mark_entry* stack; + uintnat count; + uintnat size; + struct addrmap compressed_stack; + addrmap_iterator compressed_stack_iter; +}; + +#ifdef DEBUG +#define Is_markable(v) \ + (CAMLassert (v != Debug_free_major), \ + Is_block(v) && !Is_young(v)) +#else +#define Is_markable(v) (Is_block(v) && !Is_young(v)) +#endif + +/* Compressed mark stack + + We use a bitset, implemented as a hashtable storing word-sized + integers (uintnat). Each integer represents a "chunk" of addresses + that may or may not be present in the stack. + */ +static const uintnat chunk_mask = ~(uintnat)(BITS_PER_WORD-1); +static inline uintnat ptr_to_chunk(value_ptr ptr) { + return ((uintnat)(ptr) / sizeof(value)) & chunk_mask; +} +static inline uintnat ptr_to_chunk_offset(value_ptr ptr) { + return ((uintnat)(ptr) / sizeof(value)) & ~chunk_mask; +} +static inline value_ptr chunk_and_offset_to_ptr(uintnat chunk, uintnat offset) { + return (value_ptr)((chunk + offset) * sizeof(value)); +} + +Caml_inline int add_addr(struct addrmap* amap, value_ptr ptr) { + uintnat chunk = ptr_to_chunk(ptr); + uintnat offset = ptr_to_chunk_offset(ptr); + uintnat flag = (uintnat)1 << offset; + int new_entry = 0; + + value* amap_pos = caml_addrmap_insert_pos(amap, chunk); + + if (*amap_pos == ADDRMAP_NOT_PRESENT) { + new_entry = 1; + *amap_pos = 0; + } + + CAMLassert(ptr == chunk_and_offset_to_ptr(chunk, offset)); + + if (!(*amap_pos & flag)) { + *amap_pos |= flag; + } + + return new_entry; +} + +static void mark_stack_prune(struct mark_stack* stk) +{ + /* Since addrmap is (currently) using open address hashing, we cannot insert + new compressed stack entries into an existing, partially-processed + compressed stack. Thus, we create a new compressed stack and insert the + unprocessed entries of the existing compressed stack into the new one. */ + uintnat old_compressed_entries = 0; + struct addrmap new_compressed_stack = ADDRMAP_INIT; + for (addrmap_iterator it = stk->compressed_stack_iter; + caml_addrmap_iter_ok(&stk->compressed_stack, it); + it = caml_addrmap_next(&stk->compressed_stack, it)) { + value k = caml_addrmap_iter_key(&stk->compressed_stack, it); + value v = caml_addrmap_iter_value(&stk->compressed_stack, it); + caml_addrmap_insert(&new_compressed_stack, k, v); + ++old_compressed_entries; + } + if (old_compressed_entries > 0) { + caml_gc_log("Preserved %"ARCH_INTNAT_PRINTF_FORMAT "d compressed entries", + old_compressed_entries); + } + caml_addrmap_clear(&stk->compressed_stack); + stk->compressed_stack = new_compressed_stack; + + /* scan mark stack and compress entries */ + uintnat new_stk_count = 0, compressed_entries = 0, total_words = 0; + for (uintnat i = 0; i < stk->count; i++) { + mark_entry me = stk->stack[i]; + total_words += me.end - me.start; + if (me.end - me.start > BITS_PER_WORD) { + /* keep entry in the stack as more efficient and move to front */ + stk->stack[new_stk_count++] = me; + } else { + while(me.start < me.end) { + compressed_entries += add_addr(&stk->compressed_stack, + me.start); + me.start++; + } + } + } + + caml_gc_log("Compressed %"ARCH_INTNAT_PRINTF_FORMAT "d mark stack words into " + "%"ARCH_INTNAT_PRINTF_FORMAT "d mark stack entries and " + "%"ARCH_INTNAT_PRINTF_FORMAT "d compressed entries", + total_words, new_stk_count, + compressed_entries+old_compressed_entries); -static void mark_stack_prune(struct mark_stack* stk); + stk->count = new_stk_count; + CAMLassert(stk->count < stk->size); -#ifdef DEBUG -#define Is_markable(v) \ - (CAMLassert (v != Debug_free_major), \ - Is_block(v) && !Is_young(v)) -#else -#define Is_markable(v) (Is_block(v) && !Is_young(v)) -#endif + /* setup the compressed stack iterator */ + stk->compressed_stack_iter = caml_addrmap_iterator(&stk->compressed_stack); +} static void realloc_mark_stack (struct mark_stack* stk) { @@ -835,6 +1120,19 @@ static void realloc_mark_stack (struct mark_stack* stk) mark_stack_prune(stk); } +/* This function is used for reads that may race with a concurrent `caml_modify` + from the mutator. Without this, TSan would flag it as a race (see section + 3.2 of comment in tsan.c); however, we have decided that these races are + benign. We therefore use this function instead, ensuring that the read is + not seen by TSan. */ +static CAMLno_tsan +#if defined(WITH_THREAD_SANITIZER) +Caml_noinline +#endif +value volatile_load_uninstrumented(volatile value* p) { + return *p; +} + Caml_inline void mark_stack_push_range(struct mark_stack* stk, value_ptr start, value_ptr end) { @@ -875,7 +1173,7 @@ static intnat mark_stack_push_block(struct mark_stack* stk, value block) end = (block_wsz < 8 ? block_wsz : 8); for (i = offset; i < end; i++) { - value v = Field(block, i); + value v = volatile_load_uninstrumented(&Field(block, i)); if (Is_markable(v)) break; @@ -967,14 +1265,6 @@ static void mark_slice_darken(struct mark_stack* stk, value child, } } -static CAMLno_tsan -#if defined(WITH_THREAD_SANITIZER) -Caml_noinline -#endif -value volatile_load_uninstrumented(volatile value* p) { - return *p; -} - Caml_noinline static intnat do_some_marking(struct mark_stack* stk, intnat budget) { prefetch_buffer_t pb = { .enqueued = 0, .dequeued = 0, @@ -1073,10 +1363,6 @@ again: for (; me.start < scan_end; me.start++) { CAMLassert(budget >= 0); - /* This load may race with a concurrent caml_modify. It does not - constitute a data race as this is a volatile load. However, TSan will - wrongly see a race here (see section 3.2 of comment in tsan.c). We - therefore make sure it is never TSan-instrumented. */ value child = volatile_load_uninstrumented(me.start); budget--; @@ -1107,23 +1393,6 @@ again: return budget; } -/* Compressed mark stack - - We use a bitset, implemented as a hashtable storing word-sized - integers (uintnat). Each integer represents a "chunk" of addresses - that may or may not be present in the stack. - */ -static const uintnat chunk_mask = ~(uintnat)(BITS_PER_WORD-1); -static inline uintnat ptr_to_chunk(value_ptr ptr) { - return ((uintnat)(ptr) / sizeof(value)) & chunk_mask; -} -static inline uintnat ptr_to_chunk_offset(value_ptr ptr) { - return ((uintnat)(ptr) / sizeof(value)) & ~chunk_mask; -} -static inline value_ptr chunk_and_offset_to_ptr(uintnat chunk, uintnat offset) { - return (value_ptr)((chunk + offset) * sizeof(value)); -} - /* mark until the budget runs out or marking is done */ static intnat mark(intnat budget) { caml_domain_state *domain_state = Caml_state; @@ -1151,7 +1420,7 @@ static intnat mark(intnat budget) { } else { ephe_next_cycle (); domain_state->marking_done = 1; - atomic_fetch_add_verify_ge0(&num_domains_to_mark, -1); + (void)caml_atomic_counter_decr(&num_domains_to_mark); } } } @@ -1202,7 +1471,7 @@ void caml_darken(void* state, value v, volatile value* ignored) { if (Has_status_hd(hd, caml_global_heap_state.UNMARKED)) { caml_domain_state* domain_state = (caml_domain_state*)state; if (domain_state->marking_done) { - atomic_fetch_add(&num_domains_to_mark, 1); + (void)caml_atomic_counter_incr(&num_domains_to_mark); domain_state->marking_done = 0; } if (Tag_hd(hd) == Cont_tag) { @@ -1218,117 +1487,9 @@ void caml_darken(void* state, value v, volatile value* ignored) { } } -static intnat ephe_mark (intnat budget, uintnat for_cycle, - /* Forces ephemerons and their data to be alive */ - int force_alive) -{ - value v, data, key, f, todo; - value* prev_linkp; - header_t hd; - mlsize_t size, i; - caml_domain_state* domain_state = Caml_state; - int alive_data; - intnat marked = 0, made_live = 0; - - if (domain_state->ephe_info->cursor.cycle == for_cycle && - !force_alive) { - prev_linkp = domain_state->ephe_info->cursor.todop; - todo = *prev_linkp; - } else { - todo = domain_state->ephe_info->todo; - prev_linkp = &domain_state->ephe_info->todo; - } - while (todo != 0 && budget > 0) { - v = todo; - todo = Ephe_link(v); - CAMLassert (Tag_val(v) == Abstract_tag); - hd = Hd_val(v); - data = Ephe_data(v); - alive_data = 1; - - if (force_alive) - caml_darken (domain_state, v, 0); - - /* If ephemeron is unmarked, data is dead */ - if (is_unmarked(v)) alive_data = 0; - - size = Wosize_hd(hd); - for (i = CAML_EPHE_FIRST_KEY; alive_data && i < size; i++) { - key = Field(v, i); - ephemeron_again: - if (key != caml_ephe_none && Is_block(key)) { - if (Tag_val(key) == Forward_tag) { - f = Forward_val(key); - if (Is_block(f)) { - if (Tag_val(f) == Forward_tag || Tag_val(f) == Lazy_tag || - Tag_val(f) == Forcing_tag || Tag_val(f) == Double_tag) { - /* Do not short-circuit the pointer */ - } else { - Field(v, i) = key = f; - goto ephemeron_again; - } - } - } - else { - if (Tag_val (key) == Infix_tag) key -= Infix_offset_val (key); - if (is_unmarked (key)) - alive_data = 0; - } - } - } - budget -= Whsize_wosize(i); - - if (force_alive || alive_data) { - if (data != caml_ephe_none && Is_block(data)) { - caml_darken (domain_state, data, 0); - } - Ephe_link(v) = domain_state->ephe_info->live; - domain_state->ephe_info->live = v; - *prev_linkp = todo; - made_live++; - } else { - /* Leave this ephemeron on the todo list */ - prev_linkp = &Ephe_link(v); - } - marked++; - } - - caml_gc_log - ("Mark Ephemeron: %s. Ephemeron cycle=%"ARCH_INTNAT_PRINTF_FORMAT"d " - "examined=%"ARCH_INTNAT_PRINTF_FORMAT"d " - "marked=%"ARCH_INTNAT_PRINTF_FORMAT"d", - domain_state->ephe_info->cursor.cycle == for_cycle ? - "Continued from cursor" : "Discarded cursor", - for_cycle, marked, made_live); - - domain_state->ephe_info->cursor.cycle = for_cycle; - domain_state->ephe_info->cursor.todop = prev_linkp; - - return budget; -} - -static intnat ephe_sweep (caml_domain_state* domain_state, intnat budget) -{ - value v; - CAMLassert (caml_gc_phase == Phase_sweep_ephe); - - while (domain_state->ephe_info->todo != 0 && budget > 0) { - v = domain_state->ephe_info->todo; - domain_state->ephe_info->todo = Ephe_link(v); - CAMLassert (Tag_val(v) == Abstract_tag); - - if (is_unmarked(v)) { - /* The whole array is dead, drop this ephemeron */ - budget -= 1; - } else { - caml_ephe_clean(v); - Ephe_link(v) = domain_state->ephe_info->live; - domain_state->ephe_info->live = v; - budget -= Whsize_val(v); - } - } - return budget; -} +/******************************************************************************* + * Major GC cycle + ******************************************************************************/ static void cycle_major_heap_from_stw_single( caml_domain_state* domain, @@ -1342,9 +1503,9 @@ static void cycle_major_heap_from_stw_single( (long unsigned int)caml_major_cycles_completed); caml_major_cycles_completed++; - caml_gc_message(0x40, "Starting major GC cycle\n"); + CAML_GC_MESSAGE(SLICESIZE, "Starting major GC cycle\n"); - if (atomic_load_relaxed(&caml_verb_gc) & 0x400) { + if (atomic_load_relaxed(&caml_verb_gc) & CAML_GC_MSG_STATS) { struct gc_stats s; intnat heap_words, not_garbage_words, swept_words; @@ -1388,22 +1549,23 @@ static void cycle_major_heap_from_stw_single( domain->swept_words = 0; - atomic_store_release(&num_domains_to_sweep, num_domains_in_stw); - atomic_store_release(&num_domains_to_mark, num_domains_in_stw); + caml_atomic_counter_init(&num_domains_to_sweep, num_domains_in_stw); + caml_atomic_counter_init(&num_domains_to_mark, num_domains_in_stw); caml_gc_phase = Phase_sweep_and_mark_main; - atomic_store(&ephe_cycle_info.num_domains_todo, num_domains_in_stw); - atomic_store(&ephe_cycle_info.ephe_cycle, 1); - atomic_store(&ephe_cycle_info.num_domains_done, 0); + caml_atomic_counter_init(&ephe_cycle_info.num_domains_todo, + num_domains_in_stw); + caml_atomic_counter_init(&ephe_cycle_info.ephe_cycle, 1); + caml_atomic_counter_init(&ephe_cycle_info.num_domains_done, 0); - atomic_store_release(&num_domains_to_ephe_sweep, 0); + caml_atomic_counter_init(&num_domains_to_ephe_sweep, 0); /* Will be set to the correct number when switching to [Phase_sweep_ephe] */ - atomic_store_release(&num_domains_to_final_update_first, - num_domains_in_stw); - atomic_store_release(&num_domains_to_final_update_last, - num_domains_in_stw); + caml_atomic_counter_init(&num_domains_to_final_update_first, + num_domains_in_stw); + caml_atomic_counter_init(&num_domains_to_final_update_last, + num_domains_in_stw); atomic_store(&domain_global_roots_started, WORK_UNSTARTED); @@ -1436,11 +1598,11 @@ static void stw_cycle_all_domains( CAML_EV_BEGIN(EV_MAJOR_GC_CYCLE_DOMAINS); CAMLassert(domain == Caml_state); - CAMLassert(atomic_load_acquire(&ephe_cycle_info.num_domains_todo) == - atomic_load_acquire(&ephe_cycle_info.num_domains_done)); - CAMLassert(atomic_load(&num_domains_to_mark) == 0); - CAMLassert(atomic_load(&num_domains_to_sweep) == 0); - CAMLassert(atomic_load(&num_domains_to_ephe_sweep) == 0); + CAMLassert(caml_atomic_counter_value(&ephe_cycle_info.num_domains_todo) == + caml_atomic_counter_value(&ephe_cycle_info.num_domains_done)); + CAMLassert(caml_atomic_counter_value(&num_domains_to_mark) == 0); + CAMLassert(caml_atomic_counter_value(&num_domains_to_sweep) == 0); + CAMLassert(caml_atomic_counter_value(&num_domains_to_ephe_sweep) == 0); caml_empty_minor_heap_no_major_slice_from_stw (domain, (void*)0, participating_count, participating); @@ -1516,7 +1678,7 @@ static void stw_cycle_all_domains( !caml_addrmap_iter_ok(&domain->mark_stack->compressed_stack, domain->mark_stack->compressed_stack_iter) ) { - atomic_fetch_add_verify_ge0(&num_domains_to_mark, -1); + (void)caml_atomic_counter_decr(&num_domains_to_mark); domain->marking_done = 1; } @@ -1555,20 +1717,24 @@ static void stw_cycle_all_domains( CAML_EV_END(EV_MAJOR_GC_CYCLE_DOMAINS); } +/******************************************************************************* + * Major GC phases + ******************************************************************************/ + static int is_complete_phase_sweep_and_mark_main (void) { return /* Marking is done */ caml_gc_phase == Phase_sweep_and_mark_main && - atomic_load_acquire (&num_domains_to_sweep) == 0 && - atomic_load_acquire (&num_domains_to_mark) == 0 && + caml_atomic_counter_value (&num_domains_to_sweep) == 0 && + caml_atomic_counter_value (&num_domains_to_mark) == 0 && /* No domains are orphaning finalisers. */ - atomic_load_acquire (&num_domains_orphaning_finalisers) == 0 && + caml_atomic_counter_value (&num_domains_orphaning_finalisers) == 0 && /* Ephemeron marking is done */ - atomic_load_acquire(&ephe_cycle_info.num_domains_todo) == - atomic_load_acquire(&ephe_cycle_info.num_domains_done) && + caml_atomic_counter_value(&ephe_cycle_info.num_domains_todo) == + caml_atomic_counter_value(&ephe_cycle_info.num_domains_done) && /* All orphaned ephemerons have been adopted */ no_orphaned_work(); @@ -1579,14 +1745,14 @@ static int is_complete_phase_mark_final (void) return /* updated finalise first values */ caml_gc_phase == Phase_mark_final && - atomic_load_acquire (&num_domains_to_final_update_first) == 0 && + caml_atomic_counter_value (&num_domains_to_final_update_first) == 0 && /* Marking is done */ - atomic_load_acquire (&num_domains_to_mark) == 0 && + caml_atomic_counter_value (&num_domains_to_mark) == 0 && /* Ephemeron marking is done */ - atomic_load_acquire(&ephe_cycle_info.num_domains_todo) == - atomic_load_acquire(&ephe_cycle_info.num_domains_done) && + caml_atomic_counter_value(&ephe_cycle_info.num_domains_todo) == + caml_atomic_counter_value(&ephe_cycle_info.num_domains_done) && /* All orphaned ephemerons have been adopted */ no_orphaned_work(); @@ -1597,10 +1763,10 @@ static int is_complete_phase_sweep_ephe (void) return /* All domains have swept their ephemerons */ caml_gc_phase == Phase_sweep_ephe && - atomic_load_acquire (&num_domains_to_ephe_sweep) == 0 && + caml_atomic_counter_value (&num_domains_to_ephe_sweep) == 0 && /* All domains have updated finalise last values */ - atomic_load_acquire (&num_domains_to_final_update_last) == 0 && + caml_atomic_counter_value (&num_domains_to_final_update_last) == 0 && /* All orphaned structures have been adopted */ no_orphaned_work(); @@ -1618,7 +1784,7 @@ static void stw_try_complete_gc_phase( caml_gc_phase = Phase_mark_final; } else if (is_complete_phase_mark_final()) { caml_gc_phase = Phase_sweep_ephe; - atomic_store_release(&num_domains_to_ephe_sweep, participant_count); + caml_atomic_counter_init(&num_domains_to_ephe_sweep, participant_count); for (int i = 0; i < participant_count; i++) participating[i]->ephe_info->must_sweep_ephe = 1; } @@ -1627,6 +1793,10 @@ static void stw_try_complete_gc_phase( CAML_EV_END(EV_MAJOR_GC_PHASE_CHANGE); } +/******************************************************************************* + * Major GC slices + ******************************************************************************/ + intnat caml_opportunistic_major_work_available (caml_domain_state* domain_state) { return !domain_state->sweeping_done || !domain_state->marking_done; @@ -1663,7 +1833,8 @@ static void major_collection_slice(intnat howmuch, int may_access_gc_phase = (mode != Slice_opportunistic); int log_events = mode != Slice_opportunistic || - (atomic_load_relaxed(&caml_verb_gc) & 0x40); + (atomic_load_relaxed(&caml_verb_gc) & + CAML_GC_MSG_SLICESIZE); update_major_slice_work(howmuch, may_access_gc_phase, log_events); @@ -1694,7 +1865,7 @@ static void major_collection_slice(intnat howmuch, commit_major_slice_work (work_done); if (work_done == 0) { domain_state->sweeping_done = 1; - atomic_fetch_add_verify_ge0(&num_domains_to_sweep, -1); + (void)caml_atomic_counter_decr(&num_domains_to_sweep); } } @@ -1723,7 +1894,7 @@ mark_again: get_major_slice_work(mode) > 0 && caml_final_update_first(domain_state)) { /* This domain has updated finalise first values */ - atomic_fetch_add_verify_ge0(&num_domains_to_final_update_first, -1); + (void)caml_atomic_counter_decr(&num_domains_to_final_update_first); if (!domain_state->marking_done && get_major_slice_work(mode) > 0) goto mark_again; @@ -1733,7 +1904,7 @@ mark_again: get_major_slice_work(mode) > 0 && caml_final_update_last(domain_state)) { /* This domain has updated finalise last values */ - atomic_fetch_add_verify_ge0(&num_domains_to_final_update_last, -1); + (void)caml_atomic_counter_decr(&num_domains_to_final_update_last); /* Nothing has been marked while updating last */ } @@ -1745,7 +1916,7 @@ mark_again: /* Ephemerons */ if (caml_gc_phase != Phase_sweep_ephe) { /* Ephemeron Marking */ - saved_ephe_cycle = atomic_load_acquire(&ephe_cycle_info.ephe_cycle); + saved_ephe_cycle = caml_atomic_counter_value(&ephe_cycle_info.ephe_cycle); if (domain_state->ephe_info->todo != (value) NULL && saved_ephe_cycle > domain_state->ephe_info->cycle && get_major_slice_work(mode) > 0) { @@ -1803,7 +1974,7 @@ mark_again: /* If the todo list is empty, then the ephemeron has no sweeping work * to do. */ if (domain_state->ephe_info->todo == 0) { - atomic_fetch_add_verify_ge0(&num_domains_to_ephe_sweep, -1); + (void)caml_atomic_counter_decr(&num_domains_to_ephe_sweep); } } @@ -1821,7 +1992,7 @@ mark_again: CAML_EV_END(EV_MAJOR_EPHE_SWEEP); if (domain_state->ephe_info->todo == 0) { - atomic_fetch_add_verify_ge0(&num_domains_to_ephe_sweep, -1); + (void)caml_atomic_counter_decr(&num_domains_to_ephe_sweep); } } } @@ -1909,6 +2080,10 @@ void caml_major_collection_slice(intnat howmuch) Caml_state->major_slice_epoch = major_slice_epoch; } +/******************************************************************************* + * Major GC API + ******************************************************************************/ + struct finish_major_cycle_params { uintnat saved_major_cycles; int force_compaction; @@ -1983,8 +2158,12 @@ void caml_finish_marking (void) caml_empty_mark_stack(); caml_shrink_mark_stack(); Caml_state->stat_major_words += Caml_state->allocated_words; + Caml_state->current_ramp_up_allocated_words_diff += + Caml_state->allocated_words_suspended; Caml_state->allocated_words = 0; Caml_state->allocated_words_direct = 0; + Caml_state->allocated_words_suspended = 0; + Caml_state->allocated_words_resumed = 0; CAML_EV_END(EV_MAJOR_FINISH_MARKING); } } @@ -1998,7 +2177,7 @@ void caml_finish_sweeping (void) /* just finished sweeping */ CAMLassert(Caml_state->sweeping_done == 0); Caml_state->sweeping_done = 1; - atomic_fetch_add_verify_ge0(&num_domains_to_sweep, -1); + (void)caml_atomic_counter_decr(&num_domains_to_sweep); break; } caml_handle_incoming_interrupts(); @@ -2006,81 +2185,6 @@ void caml_finish_sweeping (void) CAML_EV_END(EV_MAJOR_FINISH_SWEEPING); } -Caml_inline int add_addr(struct addrmap* amap, value_ptr ptr) { - uintnat chunk = ptr_to_chunk(ptr); - uintnat offset = ptr_to_chunk_offset(ptr); - uintnat flag = (uintnat)1 << offset; - int new_entry = 0; - - value* amap_pos = caml_addrmap_insert_pos(amap, chunk); - - if (*amap_pos == ADDRMAP_NOT_PRESENT) { - new_entry = 1; - *amap_pos = 0; - } - - CAMLassert(ptr == chunk_and_offset_to_ptr(chunk, offset)); - - if (!(*amap_pos & flag)) { - *amap_pos |= flag; - } - - return new_entry; -} - -static void mark_stack_prune(struct mark_stack* stk) -{ - /* Since addrmap is (currently) using open address hashing, we cannot insert - new compressed stack entries into an existing, partially-processed - compressed stack. Thus, we create a new compressed stack and insert the - unprocessed entries of the existing compressed stack into the new one. */ - uintnat old_compressed_entries = 0; - struct addrmap new_compressed_stack = ADDRMAP_INIT; - for (addrmap_iterator it = stk->compressed_stack_iter; - caml_addrmap_iter_ok(&stk->compressed_stack, it); - it = caml_addrmap_next(&stk->compressed_stack, it)) { - value k = caml_addrmap_iter_key(&stk->compressed_stack, it); - value v = caml_addrmap_iter_value(&stk->compressed_stack, it); - caml_addrmap_insert(&new_compressed_stack, k, v); - ++old_compressed_entries; - } - if (old_compressed_entries > 0) { - caml_gc_log("Preserved %"ARCH_INTNAT_PRINTF_FORMAT "d compressed entries", - old_compressed_entries); - } - caml_addrmap_clear(&stk->compressed_stack); - stk->compressed_stack = new_compressed_stack; - - /* scan mark stack and compress entries */ - uintnat new_stk_count = 0, compressed_entries = 0, total_words = 0; - for (uintnat i = 0; i < stk->count; i++) { - mark_entry me = stk->stack[i]; - total_words += me.end - me.start; - if (me.end - me.start > BITS_PER_WORD) { - /* keep entry in the stack as more efficient and move to front */ - stk->stack[new_stk_count++] = me; - } else { - while(me.start < me.end) { - compressed_entries += add_addr(&stk->compressed_stack, - me.start); - me.start++; - } - } - } - - caml_gc_log("Compressed %"ARCH_INTNAT_PRINTF_FORMAT "d mark stack words into " - "%"ARCH_INTNAT_PRINTF_FORMAT "d mark stack entries and " - "%"ARCH_INTNAT_PRINTF_FORMAT "d compressed entries", - total_words, new_stk_count, - compressed_entries+old_compressed_entries); - - stk->count = new_stk_count; - CAMLassert(stk->count < stk->size); - - /* setup the compressed stack iterator */ - stk->compressed_stack_iter = caml_addrmap_iterator(&stk->compressed_stack); -} - int caml_init_major_gc(caml_domain_state* d) { d->mark_stack = caml_stat_alloc_noexc(sizeof(struct mark_stack)); if(d->mark_stack == NULL) { @@ -2118,8 +2222,8 @@ int caml_init_major_gc(caml_domain_state* d) { d->mark_stack = NULL; return -1; } - atomic_fetch_add(&num_domains_to_final_update_first, 1); - atomic_fetch_add(&num_domains_to_final_update_last, 1); + (void)caml_atomic_counter_incr(&num_domains_to_final_update_first); + (void)caml_atomic_counter_incr(&num_domains_to_final_update_last); return 0; } @@ -2143,8 +2247,3 @@ void caml_teardown_major_gc(void) { caml_stat_free(d->mark_stack); d->mark_stack = NULL; } - -void caml_finalise_heap (void) -{ - return; -} diff --git a/runtime/memory.c b/runtime/memory.c index dd5b082d..8722335f 100644 --- a/runtime/memory.c +++ b/runtime/memory.c @@ -314,104 +314,97 @@ CAMLexport CAMLweakdef void caml_initialize (volatile value *fp, value val) Ref_table_add(&Caml_state->minor_tables->major_ref, fp); } -CAMLexport int caml_atomic_cas_field ( - value obj, intnat field, value oldval, value newval) +CAMLprim value caml_atomic_load_field (value obj, value vfield) { + intnat field = Long_val(vfield); if (caml_domain_alone()) { - /* non-atomic CAS since only this thread can access the object */ - volatile value* p = &Field(obj, field); - if (*p == oldval) { - *p = newval; - write_barrier(obj, field, oldval, newval); - return 1; - } else { - return 0; - } + return Field(obj, field); } else { - /* need a real CAS */ - atomic_value* p = &Op_atomic_val(obj)[field]; - int cas_ret = atomic_compare_exchange_strong(p, &oldval, newval); - atomic_thread_fence(memory_order_release); /* generates `dmb ish` on Arm64*/ - if (cas_ret) { - write_barrier(obj, field, oldval, newval); - return 1; - } else { - return 0; - } + /* See Note [MM] above */ + atomic_thread_fence(memory_order_acquire); + return atomic_load(&Op_atomic_val(obj)[field]); } } - - CAMLprim value caml_atomic_load (value ref) { - if (caml_domain_alone()) { - return Field(ref, 0); - } else { - value v; - /* See Note [MM] above */ - atomic_thread_fence(memory_order_acquire); - v = atomic_load(Op_atomic_val(ref)); - return v; - } + return caml_atomic_load_field(ref, Val_long(0)); } /* stores are implemented as exchanges */ -CAMLprim value caml_atomic_exchange (value ref, value v) +CAMLprim value caml_atomic_exchange_field (value obj, value vfield, value v) { value ret; + intnat field = Long_val(vfield); if (caml_domain_alone()) { - ret = Field(ref, 0); - Field(ref, 0) = v; + ret = Field(obj, field); + Field(obj, field) = v; } else { /* See Note [MM] above */ atomic_thread_fence(memory_order_acquire); - ret = atomic_exchange(Op_atomic_val(ref), v); + ret = atomic_exchange(&Op_atomic_val(obj)[field], v); atomic_thread_fence(memory_order_release); /* generates `dmb ish` on Arm64*/ } - write_barrier(ref, 0, ret, v); + write_barrier(obj, field, ret, v); return ret; } +CAMLprim value caml_atomic_exchange (value ref, value v) +{ + return caml_atomic_exchange_field(ref, Val_long(0), v); +} -CAMLprim value caml_atomic_cas (value ref, value oldv, value newv) +CAMLprim value caml_atomic_cas_field ( + value obj, value vfield, value oldval, value newval) { + intnat field = Long_val(vfield); if (caml_domain_alone()) { - value* p = Op_val(ref); - if (*p == oldv) { - *p = newv; - write_barrier(ref, 0, oldv, newv); - return Val_int(1); + /* non-atomic CAS since only this thread can access the object */ + volatile value* p = &Field(obj, field); + if (*p == oldval) { + *p = newval; + write_barrier(obj, field, oldval, newval); + return Val_true; } else { - return Val_int(0); + return Val_false; } } else { - atomic_value* p = &Op_atomic_val(ref)[0]; - int cas_ret = atomic_compare_exchange_strong(p, &oldv, newv); + /* need a real CAS */ + atomic_value* p = &Op_atomic_val(obj)[field]; + int cas_ret = atomic_compare_exchange_strong(p, &oldval, newval); atomic_thread_fence(memory_order_release); /* generates `dmb ish` on Arm64*/ if (cas_ret) { - write_barrier(ref, 0, oldv, newv); - return Val_int(1); + write_barrier(obj, field, oldval, newval); + return Val_true; } else { - return Val_int(0); + return Val_false; } } } +CAMLprim value caml_atomic_cas (value ref, value oldval, value newval) +{ + return caml_atomic_cas_field(ref, Val_long(0), oldval, newval); +} -CAMLprim value caml_atomic_fetch_add (value ref, value incr) +CAMLprim value caml_atomic_fetch_add_field (value obj, value vfield, value incr) { + intnat field = Long_val(vfield); value ret; if (caml_domain_alone()) { - value* p = Op_val(ref); - CAMLassert(Is_long(*p)); + value* p = &Op_val(obj)[field]; ret = *p; + CAMLassert(Is_long(ret)); *p = Val_long(Long_val(ret) + Long_val(incr)); /* no write barrier needed, integer write */ } else { - atomic_value *p = &Op_atomic_val(ref)[0]; - ret = atomic_fetch_add(p, 2*Long_val(incr)); + atomic_value *p = &Op_atomic_val(obj)[field]; + ret = atomic_fetch_add(p, 2 * Long_val(incr)); atomic_thread_fence(memory_order_release); /* generates `dmb ish` on Arm64*/ } return ret; } +CAMLprim value caml_atomic_fetch_add (value ref, value incr) +{ + return caml_atomic_fetch_add_field(ref, Val_long(0), incr); +} CAMLexport void caml_set_fields (value obj, value v) { @@ -436,8 +429,8 @@ Caml_inline value alloc_shr(mlsize_t wosize, tag_t tag, reserved_t reserved, return (value)NULL; } - dom_st->allocated_words += Whsize_wosize(wosize); - dom_st->allocated_words_direct += Whsize_wosize(wosize); + caml_update_major_allocated_words( + dom_st, Whsize_wosize(wosize), 1 /* direct */); if (dom_st->allocated_words_direct > dom_st->minor_heap_wsz / 5) { CAML_EV_COUNTER (EV_C_REQUEST_MAJOR_ALLOC_SHR, 1); caml_request_major_slice(1); @@ -729,6 +722,17 @@ CAMLexport caml_stat_string caml_stat_strdup(const char *s) return result; } +CAMLexport caml_stat_string caml_stat_memdup(const char *s, asize_t size, + asize_t *out_size) +{ + CAMLassert(size > 0); + caml_stat_block result = caml_stat_alloc(size); + memcpy(result, s, size); + if (out_size != NULL) + *out_size = size; + return result; +} + #ifdef _WIN32 CAMLexport wchar_t * caml_stat_wcsdup_noexc(const wchar_t *s) diff --git a/runtime/memprof.c b/runtime/memprof.c index c385c2fd..8795b3a9 100644 --- a/runtime/memprof.c +++ b/runtime/memprof.c @@ -17,6 +17,7 @@ #include #include +#include #include "caml/alloc.h" #include "caml/backtrace.h" #include "caml/backtrace_prim.h" @@ -447,6 +448,10 @@ typedef struct memprof_orphan_table_s memprof_orphan_table_s, /* the mask for a given callback index */ #define CB_MASK(cb) (1 << ((cb) - 1)) +/* How many bits required for an allocation source */ +#define SRC_TYPE_BITS 2 +static_assert((1 << SRC_TYPE_BITS) >= CAML_MEMPROF_NUM_SOURCE_KINDS, ""); + /* Structure for each tracked allocation. Six words (with many spare * bits in the final word). */ @@ -474,7 +479,7 @@ struct entry_s { /* The source of the allocation: normal allocations, interning, * or custom_mem (CAML_MEMPROF_SRC_*). */ - unsigned int source : 2; + unsigned int source : SRC_TYPE_BITS; /* Is `block` actually an offset? */ bool offset : 1; @@ -1700,23 +1705,6 @@ static value capture_callstack_GC(memprof_domain_t domain, int alloc_idx) return res; } -/* Given a stashed callstack, copy it to the Caml heap and free the - * stash. Given a non-stashed callstack, simply return it. */ - -static value unstash_callstack(value callstack) -{ - CAMLparam1(callstack); - if (Is_long(callstack)) { /* stashed on C heap */ - callstack_stash_t stash = Ptr_val(callstack); - callstack = caml_alloc(stash->frames, 0); - for (size_t i = 0; i < stash->frames; ++i) { - Field(callstack, i) = Val_backtrace_slot(stash->stack[i]); - } - caml_stat_free(stash); - } - CAMLreturn(callstack); -} - /**** Running callbacks ****/ /* Runs a single callback, in thread `thread`, for entry number `i` in @@ -1805,12 +1793,26 @@ static caml_result run_alloc_callback_res( entry_t e = &es->t[i]; CAMLassert(e->deallocated || e->offset || Is_block(e->block)); - e->user_data = unstash_callstack(e->user_data); value sample_info = caml_alloc_small(4, 0); Field(sample_info, 0) = Val_long(e->samples); Field(sample_info, 1) = Val_long(e->wosize); Field(sample_info, 2) = Val_long(e->source); Field(sample_info, 3) = e->user_data; + + if (Is_long(e->user_data)) { + /* Callstack stashed on C heap, so copy it to OCaml heap */ + CAMLparam1(sample_info); + CAMLlocal1(callstack); + callstack_stash_t stash = Ptr_val(e->user_data); + callstack = caml_alloc(stash->frames, 0); + for (size_t i = 0; i < stash->frames; ++i) { + Field(callstack, i) = Val_backtrace_slot(stash->stack[i]); + } + caml_stat_free(stash); + Store_field(sample_info, 3, callstack); + CAMLdrop; + } + value callback = e->alloc_young ? Alloc_minor(es->config) : Alloc_major(es->config); return run_callback_res(thread, es, i, callback, sample_info, CB_ALLOC); diff --git a/runtime/meta.c b/runtime/meta.c index c3023fe0..ae19074e 100644 --- a/runtime/meta.c +++ b/runtime/meta.c @@ -139,7 +139,7 @@ CAMLprim value caml_realloc_global(value size) actual_size = Wosize_val(old_global_data); if (requested_size >= actual_size) { requested_size = (requested_size + 0x100) & 0xFFFFFF00; - caml_gc_message (0x08, "Growing global data to %" + CAML_GC_MESSAGE(STACKSIZE, "Growing global data to %" ARCH_INTNAT_PRINTF_FORMAT "u entries\n", requested_size); new_global_data = caml_alloc_shr(requested_size, 0); diff --git a/runtime/minor_gc.c b/runtime/minor_gc.c index 875471ae..6c34ee08 100644 --- a/runtime/minor_gc.c +++ b/runtime/minor_gc.c @@ -42,7 +42,6 @@ #include "caml/startup_aux.h" #include "caml/weak.h" -extern value caml_ephe_none; /* See weak.c */ struct generic_table CAML_TABLE_STRUCT(char); CAMLexport atomic_uintnat caml_minor_collections_count; @@ -154,7 +153,8 @@ static value alloc_shared(caml_domain_state* d, { void* mem = caml_shared_try_alloc(d->shared_heap, wosize, tag, reserved); - d->allocated_words += Whsize_wosize(wosize); + caml_update_major_allocated_words( + d, Whsize_wosize(wosize), 0 /* promoted, not direct */); if (mem == NULL) { caml_fatal_error("allocation failure during minor GC"); } @@ -162,8 +162,8 @@ static value alloc_shared(caml_domain_state* d, } /* in progress updates are zeros except for the lowest color bit set to 1 - that is a header with: wosize == 0 && color == 1 && tag == 0 */ -#define In_progress_update_val ((header_t)0x100) + that is, reserved == wosize == tag == 0, color == 1 */ +#define In_progress_update_val Make_header(0, 0, 1 << HEADER_COLOR_SHIFT) #define Is_update_in_progress(hd) ((hd) == In_progress_update_val) static void spin_on_header(value v) { @@ -380,12 +380,16 @@ static void oldify_one (void* st_v, value v, volatile value *p) } } +typedef struct { + bool locked_ephemerons; +} promote_result; + /* Finish the work that was put off by [oldify_one]. Note that [oldify_one] itself is called by oldify_mopup, so we have to be careful to remove the first entry from the list before oldifying its fields. */ CAMLno_tsan_for_perf -static void oldify_mopup (struct oldify_state* st, int do_ephemerons) +static promote_result oldify_mopup (struct oldify_state* st, int do_ephemerons) { value v, new_v, f; caml_domain_state* domain_state = st->domain; @@ -393,6 +397,7 @@ static void oldify_mopup (struct oldify_state* st, int do_ephemerons) domain_state->minor_tables->ephe_ref; struct caml_ephe_ref_elt *re; int redo; + promote_result result = { .locked_ephemerons = false }; again: redo = 0; @@ -420,31 +425,59 @@ again: CAMLassert (Wosize_val(new_v)); } - /* Oldify the key and data in the minor heap of all ephemerons touched in this - cycle. We are doing this to avoid introducing a barrier for the end of all - domains promoting reachable objects and having to handle the complexity - of determining which ephemerons are dead when they link across domains */ + /* Oldify any ephemeron data fields pointing to the minor heap, and some keys. + + In theory the data need only be promoted if the ephemeron and all keys are + live, but determining this requires a multi-round synchronisation (consider + the case where the keys are live, but from different domains). So, we do it + unconditionally here, and leave the hard cases for the major GC. + + We try to avoid promoting ephemeron keys unnecessarily. If an ephemeron + key points to the current domain's minor heap, then we lock the key + (see caml_ephe_await_key in weak.c) and check whether it got promoted + after minor GC has completed. In all other cases we promote, leaving it to + the major GC to sort out. + + The condition that it must be our *own* minor heap is important: checking + whether a block was promoted after minor GC completes is safe only on our + own heap, because other domains will immediately begin reusing theirs. */ if( do_ephemerons ) { + /* Limits of *this* minor heap, not other domains' */ + value young_start = (value)Caml_state->young_start; + value young_end = (value)Caml_state->young_end; for (re = ephe_ref_table.base; re < ephe_ref_table.ptr; re++) { - volatile value *data = re->offset == CAML_EPHE_DATA_OFFSET - ? &Ephe_data(re->ephe) - : &Field(re->ephe, re->offset); - value v = *data; - if (v != caml_ephe_none && Is_block(v) && Is_young(v) ) { - mlsize_t offs = Tag_val(v) == Infix_tag ? Infix_offset_val(v) : 0; - v -= offs; - if (get_header_val(v) == 0) { /* Value copied to major heap */ - *data = Field(v, 0) + offs; - } else { - oldify_one(st, *data, data); - redo = 1; /* oldify_todo_list can still be 0 */ + if (re->locked != Val_unit) + continue; /* we locked it on a prior iteration */ + atomic_value* data = Op_atomic_val(re->ephe) + re->offset; + value v = atomic_load_relaxed(data); + header_t hd; + if (v != caml_ephe_none && /* occupied field */ + v != caml_ephe_locked && /* not already locked */ + re->offset != CAML_EPHE_DATA_OFFSET && /* ephe key (not data) */ + Is_block(v) && /* a block */ + young_start <= v && v < young_end && /* on *this* minor heap */ + (hd = Hd_val(v)) != 0 && /* not already promoted */ + Tag_hd(hd) != Infix_tag && /* not Infix_tag */ + atomic_compare_exchange_strong(data, &v, caml_ephe_locked)) { + /* locked, clean it later */ + re->locked = v; + result.locked_ephemerons = true; + } else { + value new_v; + oldify_one(st, v, &new_v); + if (new_v != v) { + /* atomic CAS, because another domain might be trying to lock it. + (We don't care who wins the race, so result not checked) */ + atomic_compare_exchange_strong(data, &v, new_v); + redo = 1; /* may have found new oldify_todo_list */ } } } } if (redo) goto again; + return result; } void caml_empty_minor_heap_domain_clear(caml_domain_state* domain) @@ -469,11 +502,12 @@ int caml_do_opportunistic_major_slice static void minor_gc_leave_barrier (caml_domain_state* domain, int participating_count); -void caml_empty_minor_heap_promote(caml_domain_state* domain, - int participating_count, - caml_domain_state** participating) +static promote_result +caml_empty_minor_heap_promote(caml_domain_state* domain, + int participating_count, + caml_domain_state** participating) { - struct caml_minor_tables *self_minor_tables = domain->minor_tables; + const struct caml_minor_tables *self_minor_tables = domain->minor_tables; value* young_ptr = domain->young_ptr; value* young_end = domain->young_end; uintnat minor_allocated_bytes = (uintnat)young_end - (uintnat)young_ptr; @@ -600,7 +634,7 @@ void caml_empty_minor_heap_promote(caml_domain_state* domain, CAML_EV_END(EV_MINOR_MEMPROF_ROOTS); CAML_EV_BEGIN(EV_MINOR_REMEMBERED_SET_PROMOTE); - oldify_mopup (&st, 1); /* ephemerons promoted here */ + promote_result result = oldify_mopup (&st, 1); /* ephemerons promoted here */ CAML_EV_END(EV_MINOR_REMEMBERED_SET_PROMOTE); CAML_EV_END(EV_MINOR_REMEMBERED_SET); caml_gc_log("promoted %d roots, %" ARCH_INTNAT_PRINTF_FORMAT "u bytes", @@ -632,10 +666,6 @@ void caml_empty_minor_heap_promote(caml_domain_state* domain, CAML_EV_END(EV_MINOR_LOCAL_ROOTS_PROMOTE); CAML_EV_END(EV_MINOR_LOCAL_ROOTS); - CAML_EV_BEGIN(EV_MINOR_MEMPROF_CLEAN); - caml_memprof_after_minor_gc(domain); - CAML_EV_END(EV_MINOR_MEMPROF_CLEAN); - domain->young_ptr = domain->young_end; /* Trigger a GC poll when half of the minor heap is filled. At that point, a * major slice is scheduled. */ @@ -697,6 +727,37 @@ void caml_empty_minor_heap_promote(caml_domain_state* domain, minor_gc_leave_barrier(domain, participating_count); CAML_EV_END(EV_MINOR_LEAVE_BARRIER); } + return result; +} + +static void ephe_clean_minor (caml_domain_state* domain) +{ + struct caml_ephe_ref_table table = + domain->minor_tables->ephe_ref; + for (struct caml_ephe_ref_elt* re = table.base; re < table.ptr; re++) { + value v = re->locked; + if (v == Val_unit) + continue; + /* This runs after the barrier: any promotion has completed, + so we don't need to get_header_val / spin_on_header */ + header_t hd = Hd_val(v); + mlsize_t infix_offset = 0; + if (Tag_hd(hd) == Infix_tag) { + infix_offset = Infix_offset_hd(hd); + v -= infix_offset; + hd = Hd_val(v); + } + CAMLassert(Tag_hd(hd) != Infix_tag); + if (hd == 0) { + /* promoted */ + v = Field(v, 0) + infix_offset; + } else { + /* collected */ + v = caml_ephe_none; + Ephe_data(re->ephe) = caml_ephe_none; + } + atomic_store_release(Op_atomic_val(re->ephe) + re->offset, v); + } } /* Finalize dead custom blocks and do the accounting for the live @@ -761,7 +822,8 @@ int caml_do_opportunistic_major_slice int work_available = caml_opportunistic_major_work_available(domain_state); if (work_available) { /* NB: need to put guard around the ev logs to prevent spam when we poll */ - uintnat log_events = atomic_load_relaxed(&caml_verb_gc) & 0x40; + uintnat log_events = + atomic_load_relaxed(&caml_verb_gc) & CAML_GC_MSG_SLICESIZE; if (log_events) CAML_EV_BEGIN(EV_MAJOR_MARK_OPPORTUNISTIC); caml_opportunistic_major_collection_slice(Major_slice_work_min); if (log_events) CAML_EV_END(EV_MAJOR_MARK_OPPORTUNISTIC); @@ -795,7 +857,20 @@ caml_stw_empty_minor_heap_no_major_slice(caml_domain_state* domain, } caml_gc_log("running stw empty_minor_heap_promote"); - caml_empty_minor_heap_promote(domain, participating_count, participating); + promote_result prom = + caml_empty_minor_heap_promote(domain, participating_count, participating); + + if (prom.locked_ephemerons) { + CAML_EV_BEGIN(EV_MINOR_EPHE_CLEAN); + caml_gc_log("cleaning minor ephemerons"); + ephe_clean_minor(domain); + CAML_EV_END(EV_MINOR_EPHE_CLEAN); + } + + CAML_EV_BEGIN(EV_MINOR_MEMPROF_CLEAN); + caml_gc_log("updating memprof"); + caml_memprof_after_minor_gc(domain); + CAML_EV_END(EV_MINOR_MEMPROF_CLEAN); CAML_EV_BEGIN(EV_MINOR_FINALIZED); caml_gc_log("finalizing dead minor custom blocks"); @@ -873,12 +948,16 @@ void caml_empty_minor_heaps_once (void) CAMLassert(!caml_domain_is_in_stw()); #endif + CAML_EV_BEGIN(EV_EMPTY_MINOR); + /* To handle the case where multiple domains try to execute a minor gc STW section */ do { caml_try_empty_minor_heap_on_all_domains(); } while (saved_minor_cycle == atomic_load_relaxed(&caml_minor_cycles_started)); + + CAML_EV_END(EV_EMPTY_MINOR); } /* Called by minor allocations when [Caml_state->young_ptr] reaches @@ -962,7 +1041,7 @@ CAMLexport value caml_check_urgent_gc (value extra_root) static void realloc_generic_table (struct generic_table *tbl, asize_t element_size, ev_runtime_counter ev_counter_name, - char *msg_threshold, char *msg_growing, char *msg_error) + const char *msg_threshold, const char *msg_growing, const char *msg_error) { CAMLassert (tbl->ptr == tbl->limit); CAMLassert (tbl->limit <= tbl->end); @@ -973,7 +1052,7 @@ static void realloc_generic_table element_size); }else if (tbl->limit == tbl->threshold){ CAML_EV_COUNTER (ev_counter_name, 1); - caml_gc_message (0x08, msg_threshold, 0); + CAML_GC_MESSAGE(STACKSIZE, msg_threshold, 0); tbl->limit = tbl->end; caml_request_minor_gc (); }else{ @@ -982,7 +1061,7 @@ static void realloc_generic_table tbl->size *= 2; sz = (tbl->size + tbl->reserve) * element_size; - caml_gc_message (0x08, msg_growing, (intnat) sz/1024); + CAML_GC_MESSAGE(STACKSIZE, msg_growing, (intnat) sz/1024); tbl->base = caml_stat_resize_noexc (tbl->base, sz); if (tbl->base == NULL){ caml_fatal_error ("%s", msg_error); diff --git a/runtime/misc.c b/runtime/misc.c index f674b97a..89e4e326 100644 --- a/runtime/misc.c +++ b/runtime/misc.c @@ -36,18 +36,26 @@ _Atomic caml_timing_hook caml_finalise_begin_hook = (caml_timing_hook)NULL; _Atomic caml_timing_hook caml_finalise_end_hook = (caml_timing_hook)NULL; #ifdef DEBUG +void caml_print_loc(const char_os *file_os, int line) { + char* file = caml_stat_strdup_of_os(file_os); + fprintf(stderr, "[%02d] file %s; line %d ### ", + (Caml_state_opt != NULL) ? Caml_state_opt->id : -1, file, line); + caml_stat_free(file); +} -void caml_failed_assert (char * expr, char_os * file_os, int line) +void caml_failed_assert (const char * expr, const char_os * file_os, int line) { - char* file = caml_stat_strdup_of_os(file_os); - fprintf(stderr, "[%02d] file %s; line %d ### Assertion failed: %s\n", - (Caml_state_opt != NULL) ? Caml_state_opt->id : -1, file, line, expr); + caml_print_loc(file_os, line); + fprintf(stderr, "Assertion failed: %s\n", expr); fflush(stderr); - caml_stat_free(file); -#if __has_builtin(__builtin_trap) || defined(__GNUC__) - __builtin_trap(); -#endif - abort(); + caml_abort(); +} + +CAMLnoret void caml_debug_abort(const char_os * file_os, int line) { + caml_print_loc(file_os, line); + fprintf(stderr, "Abort\n"); + fflush(stderr); + caml_abort(); } #endif @@ -72,9 +80,9 @@ void caml_alloc_point_here(void) atomic_uintnat caml_verb_gc = 0; -void caml_gc_log (char *msg, ...) +void caml_gc_log (const char *msg, ...) { - if ((atomic_load_relaxed(&caml_verb_gc) & 0x800) != 0) { + if ((atomic_load_relaxed(&caml_verb_gc) & CAML_GC_MSG_DEBUG) != 0) { char fmtbuf[GC_LOG_LENGTH]; va_list args; va_start (args, msg); @@ -86,7 +94,7 @@ void caml_gc_log (char *msg, ...) } } -void caml_gc_message (int level, char *msg, ...) +void caml_gc_message (int level, const char *msg, ...) { if ((atomic_load_relaxed(&caml_verb_gc) & level) != 0){ va_list ap; @@ -99,7 +107,7 @@ void caml_gc_message (int level, char *msg, ...) _Atomic fatal_error_hook caml_fatal_error_hook = (fatal_error_hook)NULL; -CAMLexport void caml_fatal_error (char *msg, ...) +CAMLexport void caml_fatal_error (const char *msg, ...) { va_list ap; fatal_error_hook hook; @@ -113,6 +121,9 @@ CAMLexport void caml_fatal_error (char *msg, ...) fprintf (stderr, "\n"); } va_end(ap); + /* We could use [caml_abort()] instead of [abort()], but misc.h + documents that we call [abort()] so we kept this version + for compatibility. */ abort(); } @@ -250,7 +261,7 @@ CAMLexport int caml_umul_overflow(uintnat a, uintnat b, uintnat * res) uintnat caml_runtime_warnings = 0; static int caml_runtime_warnings_first = 1; -int caml_runtime_warnings_active(void) +CAMLextern int caml_runtime_warnings_active(void) { if (!caml_runtime_warnings) return 0; if (caml_runtime_warnings_first) { diff --git a/runtime/obj.c b/runtime/obj.c index 83b6301d..0fc65d20 100644 --- a/runtime/obj.c +++ b/runtime/obj.c @@ -173,9 +173,9 @@ CAMLprim value caml_obj_add_offset (value v, value offset) CAMLprim value caml_obj_compare_and_swap (value v, value f, value oldv, value newv) { - int res = caml_atomic_cas_field(v, Int_val(f), oldv, newv); + value res = caml_atomic_cas_field(v, f, oldv, newv); caml_check_urgent_gc(Val_unit); - return Val_int(res); + return res; } CAMLprim value caml_obj_is_shared (value obj) @@ -300,3 +300,88 @@ struct queue_chunk { struct queue_chunk *next; value entries[ENTRIES_PER_QUEUE_CHUNK]; }; + + +/* For compiling let rec over values */ + +/* [size] is a [value] representing number of words (fields) */ +CAMLprim value caml_alloc_dummy(value size) +{ + mlsize_t wosize = Long_val(size); + return caml_alloc (wosize, 0); +} + +/* [size] is a [value] representing number of floats. */ +CAMLprim value caml_alloc_dummy_float (value size) +{ + mlsize_t wosize = Long_val(size) * Double_wosize; + return caml_alloc (wosize, 0); +} + +/* This is a specialized primitive despite being expressible in terms + of [caml_alloc_dummy], because lambda/Value_rec_compiler recognizes + calls to this function specifically -- the distinction lets us + reconstruct type information that is useful for compilation. */ +CAMLprim value caml_alloc_dummy_lazy (value unit) +{ + return caml_alloc(1, 0); +} + +CAMLprim value caml_update_dummy(value dummy, value newval) +{ + mlsize_t size; + tag_t tag; + + tag = Tag_val (newval); + + if (Wosize_val(dummy) == 0) { + /* Size-0 blocks are statically-allocated atoms. We cannot + mutate them, but there is no need: + - All atoms used in the runtime to represent OCaml values + have tag 0 --- including empty flat float arrays, or other + types that use a non-0 tag for non-atom blocks. + - The dummy was already created with tag 0. + So doing nothing suffices. */ + CAMLassert(Wosize_val(newval) == 0); + CAMLassert(Tag_val(dummy) == Tag_val(newval)); + } else if (tag == Double_array_tag){ + CAMLassert (Wosize_val(newval) == Wosize_val(dummy)); + CAMLassert (Tag_val(dummy) != Infix_tag); + Unsafe_store_tag_val(dummy, Double_array_tag); + size = Wosize_val (newval) / Double_wosize; + for (mlsize_t i = 0; i < size; i++) { + Store_double_flat_field (dummy, i, Double_flat_field (newval, i)); + } + } else { + CAMLassert (tag < No_scan_tag); + CAMLassert (Tag_val(dummy) != Infix_tag); + Unsafe_store_tag_val(dummy, tag); + size = Wosize_val(newval); + CAMLassert (size == Wosize_val(dummy)); + for (mlsize_t i = 0; i < size; i++){ + caml_modify (&Field(dummy, i), Field(newval, i)); + } + } + return Val_unit; +} + +CAMLprim value caml_update_dummy_lazy(value dummy, value newval) +{ + // Note: [obj_tag] works on immediates as well + int tag = obj_tag (newval); + switch (tag) { + case Lazy_tag: + case Forcing_tag: + case Forward_tag: + caml_update_dummy(dummy, newval); + break; + // If the tag of [newval] is not a lazy tag, + // it comes from a Forward block that was shortcut. + default: + CAMLassert (Wosize_val(dummy) == 1); + caml_modify(&Field(dummy, 0), newval); + Unsafe_store_tag_val(dummy, Forward_tag); + break; + } + return Val_unit; +} diff --git a/runtime/parsing.c b/runtime/parsing.c index f7687398..c50b96ae 100644 --- a/runtime/parsing.c +++ b/runtime/parsing.c @@ -103,7 +103,7 @@ enum input_codes { /* Auxiliary for printing token just read */ -static char * token_name(char * names, int number) +static const char * token_name(const char * names, int number) { for (/*nothing*/; number > 0; number--) { if (names[0] == 0) return ""; @@ -112,7 +112,8 @@ static char * token_name(char * names, int number) return names; } -static void print_token(struct parser_tables *tables, int state, value tok) +static void print_token(const struct parser_tables *tables, int state, + value tok) { value v; diff --git a/runtime/platform.c b/runtime/platform.c index eaa6e181..0c780aff 100644 --- a/runtime/platform.c +++ b/runtime/platform.c @@ -17,7 +17,7 @@ #include "caml/config.h" #include -#ifdef HAS_UNISTD +#ifndef _WIN32 #include #endif #include @@ -79,7 +79,9 @@ void caml_plat_assert_locked(caml_plat_mutex* m) #endif } +#ifdef DEBUG CAMLexport CAMLthread_local int caml_lockdepth = 0; +#endif void caml_plat_assert_all_locks_unlocked(void) { @@ -103,6 +105,24 @@ void caml_plat_mutex_free(caml_plat_mutex* m) check_err("mutex_free", pthread_mutex_destroy(m)); } +CAMLexport void caml_plat_mutex_reinit(caml_plat_mutex *m) +{ +#ifdef DEBUG + /* The following logic is needed to let caml_plat_assert_all_locks_unlocked() + behave correctly in child processes after a fork operation. */ + if (caml_plat_try_lock(m)) { + /* lock was not held at fork time */ + caml_plat_unlock(m); + } else { + /* lock was held at fork time, parent process still holds it, but we + don't and need to fix lock count */ + DEBUG_UNLOCK(m); + } +#endif + caml_plat_mutex_init(m); +} + +/* Condition variables */ static void caml_plat_cond_init_aux(caml_plat_cond *cond) { pthread_condattr_t attr; @@ -115,7 +135,6 @@ static void caml_plat_cond_init_aux(caml_plat_cond *cond) pthread_cond_init(cond, &attr); } -/* Condition variables */ void caml_plat_cond_init(caml_plat_cond* cond) { caml_plat_cond_init_aux(cond); @@ -398,13 +417,15 @@ void* caml_mem_map(uintnat size, int reserve_only) void* mem = caml_plat_mem_map(size, reserve_only); if (mem == 0) { - caml_gc_message(0x1000, "mmap %" ARCH_INTNAT_PRINTF_FORMAT "d bytes failed", - size); + CAML_GC_MESSAGE(ADDRSPACE, + "mmap %" ARCH_INTNAT_PRINTF_FORMAT "d bytes failed", + size); return 0; } - caml_gc_message(0x1000, "mmap %" ARCH_INTNAT_PRINTF_FORMAT "d" - " bytes at %p for heaps\n", size, mem); + CAML_GC_MESSAGE(ADDRSPACE, + "mmap %" ARCH_INTNAT_PRINTF_FORMAT "d" + " bytes at %p for heaps\n", size, mem); #ifdef DEBUG caml_lf_skiplist_insert(&mmap_blocks, (uintnat)mem, size); @@ -416,16 +437,18 @@ void* caml_mem_map(uintnat size, int reserve_only) void* caml_mem_commit(void* mem, uintnat size) { CAMLassert(Is_page_aligned(size)); - caml_gc_message(0x1000, "commit %" ARCH_INTNAT_PRINTF_FORMAT "d" - " bytes at %p for heaps\n", size, mem); + CAML_GC_MESSAGE(ADDRSPACE, + "commit %" ARCH_INTNAT_PRINTF_FORMAT "d" + " bytes at %p for heaps\n", size, mem); return caml_plat_mem_commit(mem, size); } void caml_mem_decommit(void* mem, uintnat size) { if (size) { - caml_gc_message(0x1000, "decommit %" ARCH_INTNAT_PRINTF_FORMAT "d" - " bytes at %p for heaps\n", size, mem); + CAML_GC_MESSAGE(ADDRSPACE, + "decommit %" ARCH_INTNAT_PRINTF_FORMAT "d" + " bytes at %p for heaps\n", size, mem); caml_plat_mem_decommit(mem, size); } } @@ -437,32 +460,36 @@ void caml_mem_unmap(void* mem, uintnat size) CAMLassert(caml_lf_skiplist_find(&mmap_blocks, (uintnat)mem, &data) != 0); CAMLassert(data == size); #endif - caml_gc_message(0x1000, "munmap %" ARCH_INTNAT_PRINTF_FORMAT "d" - " bytes at %p for heaps\n", size, mem); + CAML_GC_MESSAGE(ADDRSPACE, + "munmap %" ARCH_INTNAT_PRINTF_FORMAT "d" + " bytes at %p for heaps\n", size, mem); caml_plat_mem_unmap(mem, size); #ifdef DEBUG caml_lf_skiplist_remove(&mmap_blocks, (uintnat)mem); #endif } -#define Min_sleep_ns 10000 // 10 us -#define Slow_sleep_ns 1000000 // 1 ms -#define Max_sleep_ns 1000000000 // 1 s +#define Min_sleep_nsec (10 * NSEC_PER_USEC) /* 10 usec */ +#define Slow_sleep_nsec (1 * NSEC_PER_MSEC) /* 1 msec */ +#define Max_sleep_nsec (1 * NSEC_PER_SEC) /* 1 sec */ -unsigned caml_plat_spin_back_off(unsigned sleep_ns, +unsigned caml_plat_spin_back_off(unsigned sleep_nsec, const struct caml_plat_srcloc* loc) { - if (sleep_ns < Min_sleep_ns) sleep_ns = Min_sleep_ns; - if (sleep_ns > Max_sleep_ns) sleep_ns = Max_sleep_ns; - unsigned next_sleep_ns = sleep_ns + sleep_ns / 4; - if (sleep_ns < Slow_sleep_ns && Slow_sleep_ns <= next_sleep_ns) { + if (sleep_nsec < Min_sleep_nsec) sleep_nsec = Min_sleep_nsec; + if (sleep_nsec > Max_sleep_nsec) sleep_nsec = Max_sleep_nsec; + unsigned next_sleep_nsec = sleep_nsec + sleep_nsec / 4; + if (sleep_nsec < Slow_sleep_nsec && Slow_sleep_nsec <= next_sleep_nsec) { caml_gc_log("Slow spin-wait loop in %s at %s:%d", loc->function, loc->file, loc->line); } #ifdef _WIN32 - Sleep(sleep_ns/1000000); + Sleep(sleep_nsec / NSEC_PER_MSEC); +#elif defined (HAS_NANOSLEEP) + const struct timespec req = caml_timespec_of_nsec(sleep_nsec); + nanosleep(&req, NULL); #else - usleep(sleep_ns/1000); + usleep(sleep_nsec / NSEC_PER_USEC); #endif - return next_sleep_ns; + return next_sleep_nsec; } diff --git a/runtime/power.S b/runtime/power.S index e05a612f..6ebaa4b2 100644 --- a/runtime/power.S +++ b/runtime/power.S @@ -14,6 +14,7 @@ /**************************************************************************/ #include "caml/m.h" +#include "caml/asm.h" .abiversion 2 @@ -88,7 +89,7 @@ caml_hot.code_end: .macro FUNCTION name TEXT_SECTION \name .globl \name - .type \name, @function + TYPE_DIRECTIVE(\name,@function) \name: 0: addis 2, 12, .TOC.- 0b@ha addi 2, 2, .TOC.- 0b@l @@ -96,7 +97,17 @@ caml_hot.code_end: .endm .macro ENDFUNCTION name - .size \name, . - \name + SIZE_DIRECTIVE(\name) +.endm + +.macro OBJECT name + .globl \name + TYPE_DIRECTIVE(\name,@object) +\name: +.endm + +.macro ENDOBJECT name + SIZE_DIRECTIVE(\name) .endm /* Function prologue and epilogue */ @@ -383,6 +394,9 @@ caml_hot.code_end: #endif /* } WITH_THREAD_SANITIZER */ +/* Allocation functions and GC interface. + Referenced from C code in runtime/startup_nat.c +*/ TEXT_SECTION caml_system__code_begin .globl caml_system__code_begin caml_system__code_begin: @@ -1178,12 +1192,10 @@ ENDFUNCTION caml_ml_array_bound_error .globl caml_system__code_end caml_system__code_end: -/* Frame table */ - +/* Frametable - GC roots for callback */ +/* Uses the same naming convention as ocamlopt generated modules. */ .section ".data" - .globl caml_system.frametable - .type caml_system.frametable, @object -caml_system.frametable: +OBJECT caml_system.frametable .quad 2 /* two descriptors */ .quad .Lcaml_retaddr + 4 /* return address into callback */ .short -1 /* negative frame size => use callback link */ @@ -1193,6 +1205,7 @@ caml_system.frametable: .short -1 /* negative frame size => use callback link */ .short 0 /* no roots here */ .align 3 +ENDOBJECT caml_system.frametable /* TOC entries */ @@ -1211,5 +1224,4 @@ TOCENTRY(caml_array_bound_error_asm) TOCENTRYLABEL(fiber_exn_handler) TOCENTRYLABEL(trap_handler) -/* Mark stack as non-executable */ - .section .note.GNU-stack,"",%progbits + NONEXECSTACK_NOTE diff --git a/runtime/riscv.S b/runtime/riscv.S index a3b796bc..c7664c17 100644 --- a/runtime/riscv.S +++ b/runtime/riscv.S @@ -17,6 +17,7 @@ /* Must be preprocessed by cpp */ #include "caml/m.h" +#include "caml/asm.h" #define DOMAIN_STATE_PTR s11 #define TRAP_PTR s1 @@ -79,13 +80,13 @@ caml_hot.code_end: TEXT_SECTION(name); \ .align 2; \ .globl name; \ - .type name, @function; \ + TYPE_DIRECTIVE(name,@function) \ name:; \ CFI_STARTPROC #define END_FUNCTION(name) \ CFI_ENDPROC; \ - .size name, .-name + SIZE_DIRECTIVE(name) #if defined(__PIC__) .option pic @@ -99,12 +100,10 @@ name:; \ .data; \ .align 3; \ .globl name; \ - .type name, @object; \ + TYPE_DIRECTIVE(name,@object) \ name: #define END_OBJECT(name) \ - .size name, .-name - -#include "../runtime/caml/asm.h" + SIZE_DIRECTIVE(name) /* Function prologue and epilogue */ @@ -426,8 +425,9 @@ name: #endif /* } WITH_THREAD_SANITIZER */ -/* Invoke the garbage collector. */ - +/* Allocation functions and GC interface. + Referenced from C code in runtime/startup_nat.c + */ TEXT_SECTION(caml_system__code_begin) .globl caml_system__code_begin caml_system__code_begin: @@ -1244,8 +1244,8 @@ END_FUNCTION(caml_ml_array_bound_error) .globl caml_system__code_end caml_system__code_end: -/* GC roots for callback */ - +/* Frametable - GC roots for callback */ +/* Uses the same naming convention as ocamlopt generated modules. */ OBJECT(caml_system.frametable) .quad 2 /* two descriptors */ .quad L(caml_retaddr) /* return address into callback */ @@ -1258,5 +1258,4 @@ OBJECT(caml_system.frametable) .align 3 END_OBJECT(caml_system.frametable) -/* Mark stack as non-executable */ - .section .note.GNU-stack,"",%progbits + NONEXECSTACK_NOTE diff --git a/runtime/runtime_events.c b/runtime/runtime_events.c index 52c66d87..5b9578b7 100644 --- a/runtime/runtime_events.c +++ b/runtime/runtime_events.c @@ -40,10 +40,6 @@ #include #else #include -#endif - - -#if defined(HAS_UNISTD) #include #endif @@ -380,6 +376,7 @@ static void runtime_events_create_from_stw_single(void) { // at the same instant: snapshot user_events list and set // runtime_events_enabled to 1 + /* calling from STW */ caml_plat_lock_blocking(&user_events_lock); value current_user_event = user_events; atomic_store_release(&runtime_events_enabled, 1); @@ -488,18 +485,17 @@ CAMLprim value caml_ml_runtime_events_resume(value vunit) { CAMLprim value caml_ml_runtime_events_path(value vunit) { CAMLparam0(); - CAMLlocal1 (res); + CAMLlocal2 (res, str); res = Val_none; if (atomic_load_acquire(&runtime_events_enabled)) { - res = caml_alloc_small(1, Tag_some); /* The allocation might GC, which could allow another domain to - * nuke current_ring_loc, so we check again. */ - if (atomic_load_acquire(&runtime_events_enabled)) { - Field(res, 0) = caml_copy_string_of_os(current_ring_loc); - } else { - res = Val_none; - } + * nuke current_ring_loc, so we snapshot it first. */ + char_os *current_ring_loc_str = caml_stat_strdup_os(current_ring_loc); + str = caml_copy_string_of_os(current_ring_loc_str); + caml_stat_free(current_ring_loc_str); + res = caml_alloc_some(str); } + CAMLreturn(res); } @@ -596,11 +592,12 @@ static void write_to_ring(ev_category category, ev_message_type type, of event headers. */ - ring_ptr[ring_tail_offset++] = RUNTIME_EVENTS_HEADER( - length_with_header_ts, - category == EV_RUNTIME, - (type.runtime | type.user), - event_id); + ring_ptr[ring_tail_offset++] = + RUNTIME_EVENTS_HEADER( + length_with_header_ts, + category == EV_RUNTIME, + (category == EV_RUNTIME ? type.runtime : type.user), + event_id); ring_ptr[ring_tail_offset++] = timestamp; if (content != NULL) { @@ -720,6 +717,12 @@ CAMLprim value caml_runtime_events_user_register(value event_name, Field(event, 3) = event_tag; + /* Pre-allocate to avoid STW while holding [user_events_lock]. */ + list_item = caml_alloc_small(2, 0); + + /* [user_events_lock] can be acquired during STW, so we must use + caml_plat_lock_blocking and be careful to avoid triggering any + STW while holding it */ caml_plat_lock_blocking(&user_events_lock); // critical section: when we update the user_events list we need to make sure // it is not updated while we construct the pointer to the next element @@ -730,7 +733,6 @@ CAMLprim value caml_runtime_events_user_register(value event_name, } // event is added to the list of known events - list_item = caml_alloc_small(2, 0); Field(list_item, 0) = event; Field(list_item, 1) = user_events; caml_modify_generational_global_root(&user_events, list_item); diff --git a/runtime/s390x.S b/runtime/s390x.S index e67765bc..1046ee4a 100644 --- a/runtime/s390x.S +++ b/runtime/s390x.S @@ -16,6 +16,7 @@ /**************************************************************************/ #include "caml/m.h" +#include "caml/asm.h" /* Special registers */ @@ -59,10 +60,20 @@ caml_hot.code_end: #define FUNCTION(name) \ TEXT_SECTION(name); \ .globl name; \ - .type name,@function; \ + TYPE_DIRECTIVE(name,@function) \ name: -#define ENDFUNCTION(name) +#define ENDFUNCTION(name) \ + SIZE_DIRECTIVE(name) + +#define OBJECT(name) \ + .align 8; \ + .globl name; \ + TYPE_DIRECTIVE(name,@object) \ + name: + +#define ENDOBJECT(name) \ + SIZE_DIRECTIVE(name) /* Stack space to be reserved by the caller of a C function */ #define RESERVED_STACK 160 @@ -130,15 +141,10 @@ caml_hot.code_end: #define DW_REG_r12 12 #define DW_REG_r15 15 -#include "../runtime/caml/asm.h" - /******************************************************************************/ /* Access to the current domain state block. */ /******************************************************************************/ -#define CAML_CONFIG_H_NO_TYPEDEFS -#include "../runtime/caml/config.h" - .set domain_curr_field, 0 #define DOMAIN_STATE(c_type, name) \ .equ domain_field_caml_##name, domain_curr_field ; \ @@ -148,8 +154,9 @@ caml_hot.code_end: #define Caml_state(var) 8*domain_field_caml_##var(%r10) -/* Invoke the garbage collector. */ - +/* Allocation functions and GC interface. + Referenced from C code in runtime/startup_nat.c + */ TEXT_SECTION(caml_system__code_begin) .globl caml_system__code_begin caml_system__code_begin: @@ -1196,13 +1203,10 @@ ENDFUNCTION(G(caml_ml_array_bound_error)) .globl caml_system__code_end caml_system__code_end: -/* Frame table */ - +/* Frametable - GC roots for callback */ +/* Uses the same naming convention as ocamlopt generated modules. */ .section ".data" - .align 8 - .globl caml_system.frametable - .type caml_system.frametable, @object -caml_system.frametable: +OBJECT(caml_system.frametable) .quad 2 /* two descriptors */ .quad LBL(caml_retaddr) /* return address into callback */ .short -1 /* negative size count => use callback link */ @@ -1212,6 +1216,6 @@ caml_system.frametable: .short -1 /* negative size count => use callback link */ .short 0 /* no roots here */ .align 8 +ENDOBJECT(caml_system.frametable) -/* Mark stack as non-executable */ - .section .note.GNU-stack,"",%progbits + NONEXECSTACK_NOTE diff --git a/runtime/sak.c b/runtime/sak.c index 029ca525..f975bb1f 100644 --- a/runtime/sak.c +++ b/runtime/sak.c @@ -24,19 +24,22 @@ #define CAML_INTERNALS #include "caml/misc.h" +#include #include #include #include +#include /* Operations - - encode-C-literal. Used for the OCAML_STDLIB_DIR macro in - runtime/build_config.h to ensure the LIBDIR make variable is correctly - represented as a C string literal. + - encode-C-utf8-literal and encode-C-utf16-literal. Used for the + OCAML_STDLIB_DIR macro in runtime/build_config.h to ensure the LIBDIR make + variable is correctly represented as a C string literal. - On Unix, `sak encode-C-literal /usr/local/lib` returns `"/usr/local/lib"` + `sak encode-C-utf8-literal /usr/local/lib` returns `"/usr/local/lib"`, in a + format suitable for a Unix build. - On Windows, `sak encode-C-literal "C:\OCaml🐫\lib"` returns - `L"C:\\OCaml\xd83d\xdc2b\\lib"` + `sak encode-C-utf16-literal "C:\OCaml🐫\lib"` returns + `L"C:\\OCaml\xd83d\xdc2b\\lib"`, a format suitable for a Windows build. */ static void usage(void) @@ -45,43 +48,152 @@ static void usage(void) "OCaml Build System Swiss Army Knife\n" "Usage: sak command\n" "Commands:\n" - " * encode-C-literal path - encodes path as a C string literal\n" + " * encode-C-utf8-literal path - encodes path as a C UTF-8 string literal\n" + " * encode-C-utf16-literal path - encodes path as a C UTF-16 string " + "literal\n" ); } +#define printable(c) ((c) >= 0x20 && (c) < 0x7f) + +/* Some Unicode macros */ + +/* Whether a byte is a UTF-8 continuation byte */ +#define U8C(x) (((x) & 0xc0) == 0x80) +/* Incorporate data from a continuation byte */ +#define U8S(x,c) (((x) << 6) | ((c) & 0x3f)) +/* Build a UTF-8 continuation byte (n = 0 for the least significant) */ +#define U8B(uc,n) (0x80 | (((uc)>>(6*n)) & 0x3f)) + +/* Format strings for escaped UTF-8 and UTF-16 characters */ +/* For UTF-16, also use the older \x notation for increased compatibility, + rather than the newer \U */ +#define F8 "\\x%02x" +#define F16 "\\x%04x" + +/* Prints the (possibly multibyte) Unicode character c as Windows UTF-16 + Returns the number of bytes that composed the decoded character */ +unsigned print_utf8_as_utf16(const char *c) { + unsigned uc = 0, bytes = 0; + + /* Decode UTF8 */ + if ((c[0] & 0x80) == 0) { + bytes = 1; + uc = c[0]; + } else if ((c[0] & 0xe0) == 0xc0) { + bytes = 2; + assert(U8C(c[1])); + uc = U8S(c[0] & 0x1f, c[1]); + } else if ((c[0] & 0xf0) == 0xe0) { + bytes = 3; + assert(U8C(c[1]) && U8C(c[2])); + uc = U8S(U8S(c[0] & 0xf, c[1]), c[2]); + } else if ((c[0] & 0xf8) == 0xf0) { + bytes = 4; + assert(U8C(c[1]) && U8C(c[2]) && U8C(c[3])); + uc = U8S(U8S(U8S(c[0] & 0x7, c[1]), c[2]), c[3]); + } + + assert(bytes); + + /* Encode UTF16 */ + if (printable(uc)) { + printf("%c", uc); + } else { + if (uc <= 0xd7ff || (uc >= 0xe000 && uc <= 0xffff)) { + printf(F16, uc); + } else { + assert(uc >= 0x10000); /* otherwise we are in the prohibited range */ + uc -= 0x10000; + printf(F16 F16, 0xd800 | ((uc >> 10) & 0x3ff), 0xdc00 | (uc & 0x3ff)); + } + } + + return bytes; +} + +/* Prints the Unicode character c (possibly encoded as two wchar_t) as UTF-8 + Returns the number of wchar_t that composed the decoded character */ +unsigned print_utf16_as_utf8(const wchar_t *c) { + unsigned uc = 0, wchars = 0; + + /* Decode UTF-16 */ + if ((c[0] >= 0 && c[0] <= 0xd7ff) || (c[0] >= 0xe000 && c[0] <= 0xffff)) { + wchars = 1; + uc = c[0]; + } else { + wchars = 2; + assert(c[0] >= 0xd800 && c[0] <= 0xdbff && c[1] >= 0xdc00 + && c[1] <= 0xdfff); + uc = ((c[0] & 0x3ff) << 10 | (c[1] & 0x3ff)) + 0x10000; + } + + assert(wchars); + + /* Encode UTF-8 */ + /* All non-printable characters are encoded, this is easier to proof-read */ + if (printable(uc)) { + printf("%c", uc); + } else { + if (uc < 0x80) { + printf(F8, uc); + } else if (uc < 0x800) { + printf(F8 F8, 0xc0 | ((uc >> 6) & 0x1f), U8B(uc, 0)); + } else if (uc < 0x10000) { + printf(F8 F8 F8, 0xe0 | ((uc >> 12) & 0xf), U8B(uc, 1), U8B(uc, 0)); + } else { + assert(uc < 0x110000); + printf(F8 F8 F8 F8, 0xf0 | ((uc >> 18) & 0x7), U8B(uc, 2), U8B(uc, 1), + U8B(uc, 0)); + } + } + + return wchars; +} + /* Converts the supplied path (UTF-8 on Unix and UCS-2ish on Windows) to a valid C string literal. On Windows, this is always a wchar_t* (L"..."). */ -static void encode_C_literal(const char_os * path) +static void encode_C_literal(const char_os * path, bool utf8) { char_os c; -#ifdef _WIN32 - putchar('L'); -#endif + + if(!utf8) putchar('L'); putchar('"'); - while ((c = *path++) != 0) { - /* Escape \, " and \n */ + while ((c = *path) != 0) { + /* Escape \, ", \n and \r */ if (c == '\\') { printf("\\\\"); } else if (c == '"') { printf("\\\""); } else if (c == '\n') { printf("\\n"); -#ifndef _WIN32 - /* On Unix, nothing else needs escaping */ + } else if (c == '\r') { + printf("\\r"); } else { - putchar(c); +#ifndef _WIN32 + if (utf8) { + /* On Unix, nothing else needs escaping */ + putchar(c); + } else { + path += print_utf8_as_utf16(path) - 1; + } #else - /* On Windows, allow 7-bit printable characters to be displayed literally - and escape everything else (using the older \x notation for increased - compatibility, rather than the newer \U. */ - } else if (c < 0x80 && iswprint(c)) { - putwchar(c); - } else { - printf("\\x%04x", c); + if (utf8) { + path += print_utf16_as_utf8(path) - 1; + } else { + /* On Windows, allow 7-bit printable characters to be displayed + literally and escape everything else. */ + if (printable(c)) { + putwchar(c); + } else { + printf(F16, c); + } + } #endif } + path++; } putchar('"'); @@ -89,8 +201,10 @@ static void encode_C_literal(const char_os * path) int main_os(int argc, char_os **argv) { - if (argc == 3 && !strcmp_os(argv[1], T("encode-C-literal"))) { - encode_C_literal(argv[2]); + if (argc == 3 && !strcmp_os(argv[1], T("encode-C-utf8-literal"))) { + encode_C_literal(argv[2], true); + } else if (argc == 3 && !strcmp_os(argv[1], T("encode-C-utf16-literal"))) { + encode_C_literal(argv[2], false); } else { usage(); return 1; diff --git a/runtime/shared_heap.c b/runtime/shared_heap.c index 8398e559..278bbbb7 100644 --- a/runtime/shared_heap.c +++ b/runtime/shared_heap.c @@ -112,6 +112,8 @@ struct compact_pool_stat { static void orphan_heap_stats_with_lock(struct caml_heap_state *); static void adopt_pool_stats_with_lock(struct caml_heap_state *, pool *, sizeclass); +static void adopt_all_pool_stats_with_lock(struct caml_heap_state *adopter); + struct caml_heap_state* caml_init_shared_heap (void) { struct caml_heap_state* heap; @@ -146,8 +148,9 @@ static int move_all_pools(pool** src, _Atomic(pool*)* dst, return count; } -void caml_teardown_shared_heap(struct caml_heap_state* heap) { +void caml_orphan_shared_heap(struct caml_heap_state* heap) { int released = 0, released_large = 0; + caml_plat_lock_blocking(&pool_freelist.lock); for (int i = 0; i < NUM_SIZECLASSES; i++) { released += @@ -172,11 +175,57 @@ void caml_teardown_shared_heap(struct caml_heap_state* heap) { } orphan_heap_stats_with_lock(heap); caml_plat_unlock(&pool_freelist.lock); - caml_stat_free(heap); - caml_gc_log("Shutdown shared heap. Released %d active pools, %d large", + caml_gc_log("Orphan shared heap. Released %d active pools, %d large", released, released_large); } +void caml_adopt_all_orphan_heaps(struct caml_heap_state* local) { + int received_p = 0, received_l = 0; + caml_plat_lock_blocking(&pool_freelist.lock); + for (int i = 0; i < NUM_SIZECLASSES; i++) { + received_p += move_all_pools( + (pool**)&pool_freelist.global_avail_pools[i], + (_Atomic(pool*)*)&local->unswept_avail_pools[i], + local->owner); + received_p += move_all_pools( + (pool**)&pool_freelist.global_full_pools[i], + (_Atomic(pool*)*)&local->unswept_full_pools[i], + local->owner); + } + while (pool_freelist.global_large) { + large_alloc* a = pool_freelist.global_large; + pool_freelist.global_large = a->next; + a->owner = local->owner; + a->next = local->unswept_large; + local->unswept_large = a; + received_l++; + } + if (received_p || received_l) { + adopt_all_pool_stats_with_lock(local); + } + caml_plat_unlock(&pool_freelist.lock); + if (received_p || received_l) + caml_gc_log("Received %d new pools, %d new large allocs", + received_p, received_l); + local->next_to_sweep = 0; +} + +void caml_assert_shared_heap_is_empty(struct caml_heap_state* heap) { + for (int i = 0; i < NUM_SIZECLASSES; i++) { + CAMLassert(!heap->avail_pools[i]); + CAMLassert(!heap->full_pools[i]); + CAMLassert(!heap->unswept_avail_pools[i]); + CAMLassert(!heap->unswept_full_pools[i]); + } + CAMLassert(!heap->unswept_large); + CAMLassert(!heap->swept_large); +} + +void caml_free_shared_heap(struct caml_heap_state* heap) { + caml_assert_shared_heap_is_empty(heap); + caml_stat_free(heap); +} + /* Allocating and deallocating pools from the global freelist. */ @@ -289,8 +338,9 @@ Caml_inline void pool_initialize(pool* r, CAMLno_tsan_for_perf static intnat pool_sweep(struct caml_heap_state* local, pool**, - sizeclass sz , + sizeclass sz, int release_to_global_pool); +static void pool_finalise(struct caml_heap_state* local, pool**, sizeclass sz); /* Adopt pool from the pool_freelist avail and full pools to satisfy an allocation */ @@ -312,6 +362,7 @@ static pool* pool_global_adopt(struct caml_heap_state* local, sizeclass sz) if( r ) { atomic_store_relaxed(&pool_freelist.global_avail_pools[sz], r->next); r->next = 0; + r->owner = local->owner; local->avail_pools[sz] = r; adopt_pool_stats_with_lock(local, r, sz); @@ -336,6 +387,7 @@ static pool* pool_global_adopt(struct caml_heap_state* local, sizeclass sz) if( r ) { atomic_store_relaxed(&pool_freelist.global_full_pools[sz], r->next); r->next = local->full_pools[sz]; + r->owner = local->owner; local->full_pools[sz] = r; adopt_pool_stats_with_lock(local, r, sz); @@ -351,6 +403,8 @@ static pool* pool_global_adopt(struct caml_heap_state* local, sizeclass sz) pool_sweep(local, &local->full_pools[sz], sz, 0); r = local->avail_pools[sz]; } + + CAMLassert(r == NULL || r->owner == local->owner); return r; } @@ -484,6 +538,8 @@ static intnat pool_sweep(struct caml_heap_state* local, pool** plist, int all_used = 1; struct heap_stats* s = &local->stats; + CAMLassert(a->owner == local->owner); + /* conceptually, this is incremented by [wh] for every iteration below, however we can hoist these increments knowing that [p == end] on exit from the loop (as asserted) */ @@ -567,6 +623,24 @@ static intnat large_alloc_sweep(struct caml_heap_state* local) { return Whsize_hd(hd); } +static void large_alloc_finalise(struct caml_heap_state* local) { + value* p; + header_t hd; + large_alloc* a; + + while ((a = local->unswept_large) != 0) { + local->unswept_large = a->next; + + p = (value*)((char*)a + LARGE_ALLOC_HEADER_SZ); + hd = Hd_hp(p); + if (Tag_hd (hd) == Custom_tag) { + void (*final_fun)(value) = Custom_ops_val(Val_hp(p))->finalize; + if (final_fun != NULL) final_fun(Val_hp(p)); + } + free(a); + } +} + static void verify_swept(struct caml_heap_state*); intnat caml_sweep(struct caml_heap_state* local, intnat work) { @@ -603,6 +677,51 @@ intnat caml_sweep(struct caml_heap_state* local, intnat work) { return work; } +/* Purging */ + +static void pool_finalise(struct caml_heap_state* local, pool** plist, + sizeclass sz) { + pool *a; + while ((a = *plist) != 0) { + *plist = a->next; + + header_t* p = POOL_FIRST_BLOCK(a, sz); + header_t* end = POOL_END(a); + mlsize_t wh = wsize_sizeclass[sz]; + + while (p + wh <= end) { + header_t hd = (header_t)atomic_load_relaxed((atomic_uintnat*)p); + if (hd != 0) { + CAMLassert(Whsize_hd(hd) <= wh); + if (Tag_hd (hd) == Custom_tag) { + void (*final_fun)(value) = Custom_ops_val(Val_hp(p))->finalize; + if (final_fun != NULL) final_fun(Val_hp(p)); + } + atomic_store_relaxed((atomic_uintnat*)p, 0); + p[1] = (value)0; + } + p += wh; + } + + pool_release(local, a, sz); + } +} + +void caml_finalise_heap(void) { + struct caml_heap_state *local = Caml_state->shared_heap; + sizeclass sz; + + /* Finalise and release unswept local pools. */ + for (sz = 0; sz < NUM_SIZECLASSES; sz++) { + pool_finalise(local, &local->unswept_avail_pools[sz], sz); + pool_finalise(local, &local->unswept_full_pools[sz], sz); + } + + /* Finalise and free large unswept objects. */ + if (local->unswept_large) + large_alloc_finalise(local); +} + uintnat caml_heap_size(struct caml_heap_state* local) { return Bsize_wsize(local->stats.pool_words + local->stats.large_words); } @@ -924,6 +1043,9 @@ static void compact_update_pools(pool *cur_pool) static void compact_update_ephe_list(volatile value *ephe_p) { + /* Direct access to ephemeron fields instead of using Ephe_key/Ephe_data + is OK here, since the barrier at the start of compaction means no + domain can be doing minor GC at this time. */ while (*ephe_p) { compact_update_value_at(ephe_p); @@ -1184,6 +1306,10 @@ void caml_compact_heap(caml_domain_state* domain_state, if (final_fun) final_fun(Val_hp(p)); } + heap->stats.pool_live_blocks--; + heap->stats.pool_live_words -= Whsize_hd(hd); + heap->stats.pool_frag_words -= (wh - Whsize_hd(hd)); + /* In the DEBUG runtime, we should overwrite the fields of swept blocks. Note: this pool can't be allocated in to again and so we overwrite the header and first fields too. */ @@ -1410,8 +1536,6 @@ void caml_cycle_heap_from_stw_single (void) { } void caml_cycle_heap(struct caml_heap_state* local) { - int received_p = 0, received_l = 0; - caml_gc_log("Cycling heap [%02d]", local->owner->id); for (int i = 0; i < NUM_SIZECLASSES; i++) { CAMLassert(local->unswept_avail_pools[i] == NULL); @@ -1425,32 +1549,19 @@ void caml_cycle_heap(struct caml_heap_state* local) { local->unswept_large = local->swept_large; local->swept_large = NULL; + caml_adopt_all_orphan_heaps(local); +} + +void caml_finalise_freelist(void) { + int freed_large = 0; + caml_plat_lock_blocking(&pool_freelist.lock); - for (int i = 0; i < NUM_SIZECLASSES; i++) { - received_p += move_all_pools( - (pool**)&pool_freelist.global_avail_pools[i], - (_Atomic(pool*)*)&local->unswept_avail_pools[i], - local->owner); - received_p += move_all_pools( - (pool**)&pool_freelist.global_full_pools[i], - (_Atomic(pool*)*)&local->unswept_full_pools[i], - local->owner); - } while (pool_freelist.global_large) { large_alloc* a = pool_freelist.global_large; pool_freelist.global_large = a->next; - a->owner = local->owner; - a->next = local->unswept_large; - local->unswept_large = a; - received_l++; - } - if (received_p || received_l) { - adopt_all_pool_stats_with_lock(local); + free(a); + freed_large++; } caml_plat_unlock(&pool_freelist.lock); - if (received_p || received_l) - caml_gc_log("Received %d new pools, %d new large allocs", - received_p, received_l); - - local->next_to_sweep = 0; + caml_gc_log("Finalise freelist. Freed %d large", freed_large); } diff --git a/runtime/signals.c b/runtime/signals.c index ab6106be..b238f3c4 100644 --- a/runtime/signals.c +++ b/runtime/signals.c @@ -499,12 +499,18 @@ CAMLexport value caml_process_pending_actions_exn(void) #ifndef SIGXFSZ #define SIGXFSZ -1 #endif +#ifndef SIGIO +#define SIGIO -1 +#endif +#ifndef SIGWINCH +#define SIGWINCH -1 +#endif static const int posix_signals[] = { SIGABRT, SIGALRM, SIGFPE, SIGHUP, SIGILL, SIGINT, SIGKILL, SIGPIPE, SIGQUIT, SIGSEGV, SIGTERM, SIGUSR1, SIGUSR2, SIGCHLD, SIGCONT, SIGSTOP, SIGTSTP, SIGTTIN, SIGTTOU, SIGVTALRM, SIGPROF, SIGBUS, - SIGPOLL, SIGSYS, SIGTRAP, SIGURG, SIGXCPU, SIGXFSZ + SIGPOLL, SIGSYS, SIGTRAP, SIGURG, SIGXCPU, SIGXFSZ, SIGIO, SIGWINCH }; CAMLexport int caml_convert_signal_number(int signo) @@ -515,6 +521,11 @@ CAMLexport int caml_convert_signal_number(int signo) return signo; } +CAMLprim value caml_sys_convert_signal_number(value signo) +{ + return Val_int(caml_convert_signal_number(Int_val(signo))); +} + CAMLexport int caml_rev_convert_signal_number(int signo) { for (int i = 0; i < (int)(sizeof(posix_signals) / sizeof(int)); i++) @@ -522,6 +533,11 @@ CAMLexport int caml_rev_convert_signal_number(int signo) return signo; } +CAMLprim value caml_sys_rev_convert_signal_number(value signo) +{ + return Val_int(caml_rev_convert_signal_number(Int_val(signo))); +} + void * caml_init_signal_stack(void) { #ifdef POSIX_SIGNALS @@ -687,6 +703,8 @@ CAMLprim value caml_install_signal_handler(value signal_number, value action) act = 2; break; } + caml_plat_lock_non_blocking(&signal_install_mutex); + /* Note: no safepoint for calling signals in this critical section */ oldact = caml_set_signal_action(sig, act); switch (oldact) { case 0: /* was Signal_default */ @@ -700,24 +718,19 @@ CAMLprim value caml_install_signal_handler(value signal_number, value action) Field(res, 0) = Field(caml_signal_handlers, sig); break; default: /* error in caml_set_signal_action */ - caml_sys_error(NO_ARG); + goto err; } if (Is_block(action)) { - /* Speculatively allocate this so we don't hold the lock for - a GC */ - if (caml_signal_handlers == 0) { - tmp_signal_handlers = caml_alloc(NSIG, 0); - } - caml_plat_lock_blocking(&signal_install_mutex); if (caml_signal_handlers == 0) { - /* caml_alloc cannot raise asynchronous exceptions from signals - so this is safe */ - caml_signal_handlers = tmp_signal_handlers; + caml_signal_handlers = caml_alloc(NSIG, 0); caml_register_global_root(&caml_signal_handlers); } caml_modify(&Field(caml_signal_handlers, sig), Field(action, 0)); - caml_plat_unlock(&signal_install_mutex); } + caml_plat_unlock(&signal_install_mutex); caml_get_value_or_raise(caml_process_pending_signals_res()); CAMLreturn (res); + err: + caml_plat_unlock(&signal_install_mutex); + caml_sys_error(NO_ARG); } diff --git a/runtime/skiplist.c b/runtime/skiplist.c index 21d62a6f..8a1f590a 100644 --- a/runtime/skiplist.c +++ b/runtime/skiplist.c @@ -63,7 +63,7 @@ void caml_skiplist_init(struct skiplist * sk) /* Search a skip list */ -int caml_skiplist_find(struct skiplist * sk, uintnat key, uintnat * data) +uintnat* caml_skiplist_find_ptr(struct skiplist * sk, uintnat key) { struct skipcell ** e, * f; @@ -73,15 +73,26 @@ int caml_skiplist_find(struct skiplist * sk, uintnat key, uintnat * data) f = e[i]; if (f == NULL || f->key > key) break; if (f->key == key) { - *data = f->data; - return 1; + return &f->data; } e = f->forward; } } - return 0; + return NULL; } +int caml_skiplist_find(struct skiplist * sk, uintnat key, uintnat * data) +{ + uintnat* p = caml_skiplist_find_ptr(sk, key); + if (p == NULL) { + return 0; + } else { + *data = *p; + return 1; + } +} + + int caml_skiplist_find_below(struct skiplist * sk, uintnat k, uintnat * key, uintnat * data) { @@ -136,8 +147,10 @@ int caml_skiplist_insert(struct skiplist * sk, update[i] = &sk->forward[i]; sk->level = new_level; } - f = caml_stat_alloc(SIZEOF_SKIPCELL + - (new_level + 1) * sizeof(struct skipcell *)); + f = caml_stat_alloc_noexc(SIZEOF_SKIPCELL + + (new_level + 1) * sizeof(struct skipcell *)); + if (f == NULL) + caml_fatal_error("caml_skiplist_insert: out of memory"); f->key = key; f->data = data; for (int i = 0; i <= new_level; i++) { diff --git a/runtime/startup_aux.c b/runtime/startup_aux.c index 138f97da..e2256ed7 100644 --- a/runtime/startup_aux.c +++ b/runtime/startup_aux.c @@ -22,11 +22,14 @@ #include "caml/backtrace.h" #include "caml/memory.h" #include "caml/callback.h" +#include "caml/domain.h" #include "caml/major_gc.h" #ifndef NATIVE_CODE #include "caml/dynlink.h" #endif +#include "caml/gc_stats.h" #include "caml/osdeps.h" +#include "caml/shared_heap.h" #include "caml/startup_aux.h" #include "caml/prims.h" #include "caml/signals.h" @@ -56,7 +59,7 @@ static void init_startup_params(void) params.runtime_events_log_wsize = Default_runtime_events_log_wsize; #ifdef DEBUG - atomic_store_relaxed(&caml_verb_gc, 0x3F); + atomic_store_relaxed(&caml_verb_gc, CAML_GC_MSG_VERBOSE | CAML_GC_MSG_MINOR); #endif #ifndef NATIVE_CODE cds_file = caml_secure_getenv(T("CAML_DEBUG_FILE")); @@ -149,8 +152,8 @@ int caml_startup_aux(int pooling) #ifdef DEBUG /* Note this must be executed after the call to caml_parse_ocamlrunparam. */ - caml_gc_message (-1, "### OCaml runtime: debug mode ###\n"); - caml_gc_message (-1, "### set OCAMLRUNPARAM=v=0 to silence this message\n"); + CAML_GC_MESSAGE(ANY, "### OCaml runtime: debug mode ###\n"); + CAML_GC_MESSAGE(ANY, "### set OCAMLRUNPARAM=v=0 to silence this message\n"); #endif /* Second and subsequent calls are ignored, @@ -165,7 +168,7 @@ int caml_startup_aux(int pooling) return 1; } -static void call_registered_value(char* name) +static void call_registered_value(const char* name) { const value *f = caml_named_value(name); if (f != NULL) @@ -175,6 +178,7 @@ static void call_registered_value(char* name) CAMLexport void caml_shutdown(void) { Caml_check_caml_state(); + if (startup_count <= 0) caml_fatal_error("a call to caml_shutdown has no " "corresponding call to caml_startup"); @@ -186,12 +190,21 @@ CAMLexport void caml_shutdown(void) call_registered_value("Pervasives.do_at_exit"); call_registered_value("Thread.at_shutdown"); - caml_finalise_heap(); + if (!caml_domain_alone()) { + caml_gc_log("Some domains have not been joined prior to shutdown"); + caml_stop_all_domains(); + } else { + /* These calls are not safe to use if there are domains left running */ + caml_domain_terminate(true); + caml_finalise_freelist(); + } + caml_free_gc_stats(); caml_free_locale(); #ifndef NATIVE_CODE caml_free_shared_libs(); #endif - caml_stat_destroy_pool(); + if (caml_free_domains()) + caml_stat_destroy_pool(); caml_terminate_signals(); #if defined(_WIN32) && defined(NATIVE_CODE) caml_win32_unregister_overflow_detection(); diff --git a/runtime/startup_byt.c b/runtime/startup_byt.c index ffb4eb0b..ee9cfc63 100644 --- a/runtime/startup_byt.c +++ b/runtime/startup_byt.c @@ -23,7 +23,7 @@ #include #include #include "caml/config.h" -#ifdef HAS_UNISTD +#ifndef _WIN32 #include #endif #ifdef _WIN32 @@ -75,7 +75,7 @@ static char magicstr[EXEC_MAGIC_LENGTH+1]; /* Print the specified error message followed by an end-of-line and exit */ -static void error(char *msg, ...) +static void error(const char *msg, ...) { va_list ap; va_start(ap, msg); @@ -125,12 +125,12 @@ int caml_attempt_open(char_os **name, struct exec_trailer *trail, truename = caml_search_exe_in_path(*name); u8 = caml_stat_strdup_of_os(truename); - caml_gc_message(0x100, "Opening bytecode executable %s\n", u8); + CAML_GC_MESSAGE(STARTUP, "Opening bytecode executable %s\n", u8); caml_stat_free(u8); fd = open_os(truename, O_RDONLY | O_BINARY); if (fd == -1) { caml_stat_free(truename); - caml_gc_message(0x100, "Cannot open file\n"); + CAML_GC_MESSAGE(STARTUP, "Cannot open file\n"); if (errno == EMFILE) return NO_FDS; else @@ -141,7 +141,7 @@ int caml_attempt_open(char_os **name, struct exec_trailer *trail, if (err < 2 || (buf [0] == '#' && buf [1] == '!')) { close(fd); caml_stat_free(truename); - caml_gc_message(0x100, "Rejected #! script\n"); + CAML_GC_MESSAGE(STARTUP, "Rejected #! script\n"); return BAD_BYTECODE; } } @@ -149,7 +149,7 @@ int caml_attempt_open(char_os **name, struct exec_trailer *trail, if (err != 0) { close(fd); caml_stat_free(truename); - caml_gc_message(0x100, "Not a bytecode executable\n"); + CAML_GC_MESSAGE(STARTUP, "Not a bytecode executable\n"); return err; } *name = truename; @@ -177,7 +177,7 @@ void caml_read_section_descriptors(int fd, struct exec_trailer *trail) found with that name. */ int32_t caml_seek_optional_section(int fd, struct exec_trailer *trail, - char *name) + const char *name) { long ofs; @@ -195,7 +195,8 @@ int32_t caml_seek_optional_section(int fd, struct exec_trailer *trail, /* Position fd at the beginning of the section having the given name. Return the length of the section data in bytes. */ -int32_t caml_seek_section(int fd, struct exec_trailer *trail, char *name) +int32_t caml_seek_section(int fd, struct exec_trailer *trail, + const char *name) { int32_t len = caml_seek_optional_section(fd, trail, name); if (len == -1) @@ -206,13 +207,14 @@ int32_t caml_seek_section(int fd, struct exec_trailer *trail, char *name) /* Read and return the contents of the section having the given name. Add a terminating 0. Return NULL if no such section. */ -static char * read_section(int fd, struct exec_trailer *trail, char *name) +static char * read_section(int fd, struct exec_trailer *trail, + const char *name) { int32_t len; char * data; len = caml_seek_optional_section(fd, trail, name); - if (len == -1) return NULL; + if (len < 0) return NULL; // (len == -1) widened to (len < 0) to help gcc data = caml_stat_alloc(len + 1); if (read(fd, data, len) != len) caml_fatal_error("error reading section %s", name); @@ -223,7 +225,7 @@ static char * read_section(int fd, struct exec_trailer *trail, char *name) #ifdef _WIN32 static char_os * read_section_to_os(int fd, struct exec_trailer *trail, - char *name) + const char *name) { int32_t len, wlen; char * data; @@ -318,7 +320,7 @@ static int parse_command_line(char_os **argv) params->trace_level += 1; /* ignored unless DEBUG mode */ break; case 'v': - atomic_store_relaxed(&caml_verb_gc, 0x001+0x004+0x008+0x010+0x020); + atomic_store_relaxed(&caml_verb_gc, CAML_GC_MSG_VERBOSE); break; case 'p': for (int j = 0; caml_names_of_builtin_cprim[j] != NULL; j++) @@ -378,7 +380,7 @@ static int parse_command_line(char_os **argv) freed, since the runtime will terminate after calling this. */ static void do_print_config(void) { - char_os * dir; + const char_os * dir; /* Print the runtime configuration */ printf("version: %s\n", OCAML_VERSION_STRING); @@ -420,6 +422,8 @@ static void do_print_config(void) /* Parse ld.conf and print the effective search path */ puts("shared_libs_path:"); + caml_decompose_path(&caml_shared_libs_path, + caml_secure_getenv(T("CAML_LD_LIBRARY_PATH"))); caml_parse_ld_conf(); for (int i = 0; i < caml_shared_libs_path.size; i++) { dir = caml_shared_libs_path.contents[i]; diff --git a/runtime/startup_nat.c b/runtime/startup_nat.c index 61cb97b8..a789ec8b 100644 --- a/runtime/startup_nat.c +++ b/runtime/startup_nat.c @@ -42,7 +42,7 @@ extern char caml_system__code_begin, caml_system__code_end; /* The two symbols above are defined in runtime/$ARCH.S. They use the old `__` separator convention because the new convention - gives `caml_system.code_begin`, which is not a valid C identifier. */ + gives `caml_system$code_begin`, which is not a valid C identifier. */ /* Initialize the static data and code area limits. */ @@ -85,7 +85,7 @@ extern void caml_install_invalid_parameter_handler(void); value caml_startup_common(char_os **argv, int pooling) { - char_os * exe_name, * proc_self_exe; + const char_os * exe_name, * proc_self_exe; value res; /* Determine options */ diff --git a/runtime/sync.c b/runtime/sync.c index 0407ab1d..e118db1f 100644 --- a/runtime/sync.c +++ b/runtime/sync.c @@ -29,6 +29,27 @@ /* System-dependent part */ #include "sync_posix.h" +/* Reporting errors */ + +CAMLexport void caml_check_error(int retcode, char const * msg) +{ + char const * err; + char buf[1024]; + int errlen, msglen; + value str; + + if (retcode == 0) return; + if (retcode == ENOMEM) caml_raise_out_of_memory(); + err = caml_strerror(retcode, buf, sizeof(buf)); + msglen = strlen(msg); + errlen = strlen(err); + str = caml_alloc_string(msglen + 2 + errlen); + memcpy(&Byte(str, 0), msg, msglen); + memcpy(&Byte(str, msglen), ": ", 2); + memcpy(&Byte(str, msglen + 2), err, errlen); + caml_raise_sys_error(str); +} + /* Mutex operations */ static void caml_mutex_finalize(value wrapper) @@ -74,8 +95,8 @@ CAMLprim value caml_ml_mutex_new(value unit) sync_mutex mut = NULL; value wrapper; - sync_check_error(sync_mutex_create(&mut), "Mutex.create"); - wrapper = caml_alloc_custom(&caml_mutex_ops, sizeof(pthread_mutex_t *), + caml_check_error(sync_mutex_create(&mut), "Mutex.create"); + wrapper = caml_alloc_custom(&caml_mutex_ops, sizeof(sync_mutex *), 0, 1); Mutex_val(wrapper) = mut; return wrapper; @@ -93,7 +114,7 @@ CAMLprim value caml_ml_mutex_lock(value wrapper) caml_enter_blocking_section(); retcode = sync_mutex_lock(mut); caml_leave_blocking_section(); - sync_check_error(retcode, "Mutex.lock"); + caml_check_error(retcode, "Mutex.lock"); } CAMLreturn(Val_unit); } @@ -104,7 +125,7 @@ CAMLprim value caml_ml_mutex_unlock(value wrapper) sync_mutex mut = Mutex_val(wrapper); /* PR#4351: no need to release and reacquire master lock */ retcode = sync_mutex_unlock(mut); - sync_check_error(retcode, "Mutex.unlock"); + caml_check_error(retcode, "Mutex.unlock"); return Val_unit; } @@ -114,7 +135,7 @@ CAMLprim value caml_ml_mutex_try_lock(value wrapper) sync_retcode retcode; retcode = sync_mutex_trylock(mut); if (retcode == MUTEX_ALREADY_LOCKED) return Val_false; - sync_check_error(retcode, "Mutex.try_lock"); + caml_check_error(retcode, "Mutex.try_lock"); return Val_true; } @@ -153,7 +174,7 @@ CAMLprim value caml_ml_condition_new(value unit) value wrapper; sync_condvar cond = NULL; - sync_check_error(sync_condvar_create(&cond), "Condition.create"); + caml_check_error(sync_condvar_create(&cond), "Condition.create"); wrapper = caml_alloc_custom(&caml_condition_ops, sizeof(sync_condvar *), 0, 1); Condition_val(wrapper) = cond; @@ -171,7 +192,7 @@ CAMLprim value caml_ml_condition_wait(value wcond, value wmut) caml_enter_blocking_section(); retcode = sync_condvar_wait(cond, mut); caml_leave_blocking_section(); - sync_check_error(retcode, "Condition.wait"); + caml_check_error(retcode, "Condition.wait"); CAML_EV_END(EV_DOMAIN_CONDITION_WAIT); CAMLreturn(Val_unit); @@ -179,14 +200,14 @@ CAMLprim value caml_ml_condition_wait(value wcond, value wmut) CAMLprim value caml_ml_condition_signal(value wrapper) { - sync_check_error(sync_condvar_signal(Condition_val(wrapper)), + caml_check_error(sync_condvar_signal(Condition_val(wrapper)), "Condition.signal"); return Val_unit; } CAMLprim value caml_ml_condition_broadcast(value wrapper) { - sync_check_error(sync_condvar_broadcast(Condition_val(wrapper)), + caml_check_error(sync_condvar_broadcast(Condition_val(wrapper)), "Condition.broadcast"); return Val_unit; } diff --git a/runtime/sync_posix.h b/runtime/sync_posix.h index a3123146..aa25b5fa 100644 --- a/runtime/sync_posix.h +++ b/runtime/sync_posix.h @@ -116,25 +116,4 @@ Caml_inline int sync_condvar_wait(sync_condvar c, sync_mutex m) return pthread_cond_wait(c, m); } -/* Reporting errors */ - -static void sync_check_error(int retcode, char * msg) -{ - char * err; - char buf[1024]; - int errlen, msglen; - value str; - - if (retcode == 0) return; - if (retcode == ENOMEM) caml_raise_out_of_memory(); - err = caml_strerror(retcode, buf, sizeof(buf)); - msglen = strlen(msg); - errlen = strlen(err); - str = caml_alloc_string(msglen + 2 + errlen); - memcpy (&Byte(str, 0), msg, msglen); - memcpy (&Byte(str, msglen), ": ", 2); - memcpy (&Byte(str, msglen + 2), err, errlen); - caml_raise_sys_error(str); -} - #endif /* CAML_SYNC_POSIX_H */ diff --git a/runtime/sys.c b/runtime/sys.c index 3356664e..60df7828 100644 --- a/runtime/sys.c +++ b/runtime/sys.c @@ -33,7 +33,7 @@ #include #endif #include "caml/config.h" -#ifdef HAS_UNISTD +#ifndef _WIN32 #include #endif #ifdef HAS_TIMES @@ -137,7 +137,7 @@ CAMLexport void caml_do_exit(int retcode) caml_domain_state* domain_state = Caml_state; struct gc_stats s; - if ((atomic_load_relaxed(&caml_verb_gc) & 0x400) != 0) { + if ((atomic_load_relaxed(&caml_verb_gc) & CAML_GC_MSG_STATS) != 0) { caml_compute_gc_stats(&s); { /* cf caml_gc_counters */ @@ -160,27 +160,33 @@ CAMLexport void caml_do_exit(int retcode) top_heap_words = caml_top_heap_words(Caml_state->shared_heap); } - caml_gc_message(0x400, "allocated_words: %"ARCH_INTNAT_PRINTF_FORMAT"d\n", - (intnat)allocated_words); - caml_gc_message(0x400, "minor_words: %"ARCH_INTNAT_PRINTF_FORMAT"d\n", - (intnat) minwords); - caml_gc_message(0x400, "promoted_words: %"ARCH_INTNAT_PRINTF_FORMAT"d\n", - (intnat) s.alloc_stats.promoted_words); - caml_gc_message(0x400, "major_words: %"ARCH_INTNAT_PRINTF_FORMAT"d\n", - (intnat) majwords); - caml_gc_message(0x400, + CAML_GC_MESSAGE(STATS, + "allocated_words: %"ARCH_INTNAT_PRINTF_FORMAT"d\n", + (intnat)allocated_words); + CAML_GC_MESSAGE(STATS, + "minor_words: %"ARCH_INTNAT_PRINTF_FORMAT"d\n", + (intnat) minwords); + CAML_GC_MESSAGE(STATS, + "promoted_words: %"ARCH_INTNAT_PRINTF_FORMAT"d\n", + (intnat) s.alloc_stats.promoted_words); + CAML_GC_MESSAGE(STATS, + "major_words: %"ARCH_INTNAT_PRINTF_FORMAT"d\n", + (intnat) majwords); + CAML_GC_MESSAGE(STATS, "minor_collections: %"ARCH_INTNAT_PRINTF_FORMAT"d\n", (intnat) atomic_load(&caml_minor_collections_count)); - caml_gc_message(0x400, + CAML_GC_MESSAGE(STATS, "major_collections: %"ARCH_INTNAT_PRINTF_FORMAT"d\n", caml_major_cycles_completed); - caml_gc_message(0x400, + CAML_GC_MESSAGE(STATS, "forced_major_collections: %"ARCH_INTNAT_PRINTF_FORMAT"d\n", (intnat)s.alloc_stats.forced_major_collections); - caml_gc_message(0x400, "heap_words: %"ARCH_INTNAT_PRINTF_FORMAT"d\n", - heap_words); - caml_gc_message(0x400, "top_heap_words: %"ARCH_INTNAT_PRINTF_FORMAT"d\n", - top_heap_words); + CAML_GC_MESSAGE(STATS, + "heap_words: %"ARCH_INTNAT_PRINTF_FORMAT"d\n", + heap_words); + CAML_GC_MESSAGE(STATS, + "top_heap_words: %"ARCH_INTNAT_PRINTF_FORMAT"d\n", + top_heap_words); } } @@ -428,12 +434,15 @@ CAMLprim value caml_sys_unsafe_getenv(value var) return val; } -CAMLprim value caml_sys_getenv(value var) +/* Returns either a string or Val_none on error (i.e. the tag is used to encode + error conditions */ +static value sys_getenv(value var) { char_os * res, * p; value val; - if (! caml_string_is_c_safe(var)) caml_raise_not_found(); + if (! caml_string_is_c_safe(var)) + return Val_none; p = caml_stat_strdup_to_os(String_val(var)); #ifdef _WIN32 res = caml_win32_getenv(p); @@ -441,7 +450,8 @@ CAMLprim value caml_sys_getenv(value var) res = caml_secure_getenv(p); #endif caml_stat_free(p); - if (res == 0) caml_raise_not_found(); + if (res == 0) + return Val_none; val = caml_copy_string_of_os(res); #ifdef _WIN32 caml_stat_free(res); @@ -449,6 +459,26 @@ CAMLprim value caml_sys_getenv(value var) return val; } +CAMLprim value caml_sys_getenv(value var) +{ + value res = sys_getenv(var); + + if (Is_none(res)) + caml_raise_not_found(); + + return res; +} + +CAMLprim value caml_sys_getenv_opt(value var) +{ + value res = sys_getenv(var); + + if (!Is_none(res)) + res = caml_alloc_some(res); + + return res; +} + static value main_argv; CAMLprim value caml_sys_get_argv(value unit) @@ -478,7 +508,7 @@ CAMLprim value caml_sys_executable_name(value unit) return caml_copy_string_of_os(caml_params->exe_name); } -void caml_sys_init(char_os * exe_name, char_os **argv) +void caml_sys_init(const char_os * exe_name, char_os **argv) { #ifdef _WIN32 /* Initialises the caml_win32_* globals on Windows with the version of @@ -539,19 +569,19 @@ double caml_sys_time_include_children_unboxed(value include_children) { #ifdef HAS_GETRUSAGE struct rusage ru; - double acc = 0.; + double sec = 0.; getrusage (RUSAGE_SELF, &ru); - acc += ru.ru_utime.tv_sec + ru.ru_utime.tv_usec / 1e6 - + ru.ru_stime.tv_sec + ru.ru_stime.tv_usec / 1e6; + sec += ru.ru_utime.tv_sec + (double) ru.ru_utime.tv_usec / USEC_PER_SEC + + ru.ru_stime.tv_sec + (double) ru.ru_stime.tv_usec / USEC_PER_SEC; if (Bool_val(include_children)) { getrusage (RUSAGE_CHILDREN, &ru); - acc += ru.ru_utime.tv_sec + ru.ru_utime.tv_usec / 1e6 - + ru.ru_stime.tv_sec + ru.ru_stime.tv_usec / 1e6; + sec += ru.ru_utime.tv_sec + (double) ru.ru_utime.tv_usec / USEC_PER_SEC + + ru.ru_stime.tv_sec + (double) ru.ru_stime.tv_usec / USEC_PER_SEC; } - return acc; + return sec; #else #ifdef HAS_TIMES #ifndef CLK_TCK @@ -593,52 +623,48 @@ CAMLprim value caml_sys_time(value unit) } #ifdef _WIN32 -extern int caml_win32_random_seed (intnat data[16]); +extern int caml_win32_random_seed(intnat data[16]); #else int caml_unix_random_seed(intnat data[16]) { - int n = 0; + unsigned n = 0; unsigned char buffer[12]; int nread = 0; /* Try kernel entropy first */ #ifdef HAS_GETENTROPY - if (getentropy(buffer, 12) != -1) { - nread = 12; + if (getentropy(buffer, sizeof(buffer)) != -1) { + nread = sizeof(buffer); } else #endif { int fd = open("/dev/urandom", O_RDONLY, 0); if (fd != -1) { - nread = read(fd, buffer, 12); + nread = read(fd, buffer, sizeof(buffer)); close(fd); } } while (nread > 0) data[n++] = buffer[--nread]; /* If the kernel provided enough entropy, we now have 96 bits of good random data and can stop here. */ - if (n >= 12) return n; + if (n >= sizeof(buffer)) return n; /* Otherwise, complement whatever we got (probably nothing) with some not-very-random data. */ - { #ifdef HAS_GETTIMEOFDAY - struct timeval tv; - gettimeofday(&tv, NULL); - if (n < 16) data[n++] = tv.tv_usec; - if (n < 16) data[n++] = tv.tv_sec; + struct timeval tv; + gettimeofday(&tv, NULL); + if (n < 16) data[n++] = tv.tv_usec; + if (n < 16) data[n++] = tv.tv_sec; #else - if (n < 16) data[n++] = time(NULL); + if (n < 16) data[n++] = time(NULL); #endif -#ifdef HAS_UNISTD - if (n < 16) data[n++] = getpid(); - if (n < 16) data[n++] = getppid(); -#endif - return n; - } + if (n < 16) data[n++] = getpid(); + if (n < 16) data[n++] = getppid(); + return n; } #endif -CAMLprim value caml_sys_random_seed (value unit) +CAMLprim value caml_sys_random_seed(value unit) { intnat data[16]; int n; @@ -681,6 +707,11 @@ CAMLprim value caml_sys_const_max_wosize(value unit) return Val_long(Max_wosize) ; } +CAMLprim value caml_sys_io_buffer_size(value unit) +{ + return Val_long(IO_BUFFER_SIZE); +} + CAMLprim value caml_sys_const_ostype_unix(value unit) { return Val_bool(0 == strcmp(OCAML_OS_TYPE,"Unix")); @@ -770,3 +801,15 @@ CAMLprim value caml_xdg_defaults(value unit) return Val_emptylist; #endif } + +/* On Windows, returns the path to a directory suitable for storing + temporary files. On Unix, this path is more easily computed in + OCaml, so the string returned by the primitive is empty. */ +CAMLprim value caml_sys_temp_dir_name(value unit) +{ +#ifdef _WIN32 + return caml_win32_get_temp_path(); +#else + return caml_copy_string(""); +#endif +} diff --git a/runtime/unix.c b/runtime/unix.c index e19d5a26..e58c77cf 100644 --- a/runtime/unix.c +++ b/runtime/unix.c @@ -41,7 +41,7 @@ #include #endif #endif -#ifdef HAS_UNISTD +#ifndef _WIN32 #include #endif #ifdef HAS_POSIX_MONOTONIC_CLOCK @@ -135,7 +135,8 @@ caml_stat_string caml_decompose_path(struct ext_table * tbl, char * path) caml_stat_string caml_search_in_path(struct ext_table * path, const char * name) { - char * dir, * fullname; + const char * dir; + char * fullname; struct stat st; for (const char *p = name; *p != 0; p++) { @@ -333,9 +334,9 @@ CAMLexport int caml_read_directory(char * dirname, struct ext_table * contents) { DIR * d; #ifdef HAS_DIRENT - struct dirent * e; + const struct dirent * e; #else - struct direct * e; + const struct direct * e; #endif d = opendir(dirname); @@ -429,14 +430,14 @@ uint64_t caml_time_counter(void) struct timespec t; clock_gettime(CLOCK_MONOTONIC, &t); return - (uint64_t)t.tv_sec * (uint64_t)1000000000 + - (uint64_t)t.tv_nsec; + (uint64_t) t.tv_sec * NSEC_PER_SEC + + (uint64_t) t.tv_nsec; #elif defined(HAS_GETTIMEOFDAY) struct timeval t; gettimeofday(&t, 0); return - (uint64_t)t.tv_sec * (uint64_t)1000000000 + - (uint64_t)t.tv_usec * (uint64_t)1000; + (uint64_t) t.tv_sec * NSEC_PER_SEC + + (uint64_t) t.tv_usec * NSEC_PER_USEC; #else # error "No timesource available" #endif diff --git a/runtime/weak.c b/runtime/weak.c index ceb1361c..68a3277d 100644 --- a/runtime/weak.c +++ b/runtime/weak.c @@ -28,11 +28,32 @@ #include "caml/shared_heap.h" #include "caml/signals.h" #include "caml/weak.h" +#include "caml/platform.h" -value caml_dummy[] = +static value weak_dummy[] = {(value)Make_header(0,Abstract_tag, NOT_MARKABLE), + Val_unit, + (value)Make_header(0,Abstract_tag, NOT_MARKABLE), Val_unit}; -value caml_ephe_none = (value)&caml_dummy[1]; +value caml_ephe_none = (value)&weak_dummy[1]; +value caml_ephe_locked = (value)&weak_dummy[3]; + +/* The minor GC may lock key fields of ephemerons, and other domains + may complete minor GC and resume the mutator before they are unlocked. + + So, when accessing an ephemeron key, if the value is caml_ephe_locked + then you need to wait until it becomes unlocked (i.e. any other value). + + NB: Keys can only be locked by the minor GC, so once an unlocked value + is observed it's safe to do repeated accesses to the same key without + checking for locks, until the next allocation point. */ +value caml_ephe_await_key(value ephe, uintnat i) +{ + SPIN_WAIT { + value v = atomic_load_acquire(Op_atomic_val(ephe) + i); + if (v != caml_ephe_locked) return v; + } +} struct caml_ephe_info* caml_alloc_ephe_info (void) { @@ -74,7 +95,7 @@ CAMLprim value caml_weak_create (value len) Specificity of the cleaning phase (Phase_clean): The dead keys must be removed from the ephemerons and data removed - when one the keys is dead. Here we call it cleaning the ephemerons. + when one of the keys is dead. Here we call it cleaning the ephemerons. A specific phase of the GC is dedicated to this, Phase_clean. This phase is just after the mark phase, so the white values are dead values. It iterates the function caml_ephe_clean through all the @@ -107,6 +128,7 @@ static void do_check_key_clean(value e, mlsize_t offset) { value elt; CAMLassert (offset >= CAML_EPHE_FIRST_KEY); + caml_ephe_await_key(e, offset); if (caml_gc_phase != Phase_sweep_ephe) return; @@ -131,7 +153,7 @@ void caml_ephe_clean (value v) { hd = Hd_val(v); size = Wosize_hd (hd); for (mlsize_t i = CAML_EPHE_FIRST_KEY; i < size; i++) { - child = Field(v, i); + child = Ephe_key(v, i); ephemeron_again: if (child != caml_ephe_none && Is_block(child)) { if (Tag_val (child) == Forward_tag) { @@ -156,7 +178,7 @@ void caml_ephe_clean (value v) { } } - child = Field(v, CAML_EPHE_DATA_OFFSET); + child = Ephe_data(v); if (child != caml_ephe_none) { if (release_data) { Field(v, CAML_EPHE_DATA_OFFSET) = caml_ephe_none; @@ -181,25 +203,46 @@ static void clean_field (value e, mlsize_t offset) do_check_key_clean(e, offset); } -static void do_set (value e, mlsize_t offset, value v) +Caml_inline void ephe_write_barrier (value e, mlsize_t offset, value v) { - if (Is_block(v) && Is_young(v)) { - value old = Field(e, offset); - Field(e, offset) = v; - if (!(Is_block(old) && Is_young(old))) + if (Is_block (v) && Is_young (v)){ + value old = Field (e, offset); + if (!(Is_block (old) && Is_young (old))){ add_to_ephe_ref_table (&Caml_state->minor_tables->ephe_ref, e, offset); - } else { - Field(e, offset) = v; + } } } +CAMLno_tsan /* See caml_modify in memory.c for the tsan annotations on this + function. */ +static void ephe_modify (value e, mlsize_t offset, value val) +{ + volatile value *fp = &Field(e, offset); + +#if defined(WITH_THREAD_SANITIZER) && defined(NATIVE_CODE) + __tsan_func_entry(__builtin_return_address(0)); +#endif + + ephe_write_barrier(e, offset, val); + + /* See Note [MM] in memory.c */ + atomic_thread_fence(memory_order_acquire); + +#if defined(WITH_THREAD_SANITIZER) && defined(NATIVE_CODE) + __tsan_write8((void *)fp); + __tsan_func_exit(NULL); +#endif + + atomic_store_release(&Op_atomic_val((value)fp)[0], val); +} + static value ephe_set_field (value e, mlsize_t offset, value el) { CAMLparam2(e,el); clean_field(e, offset); - do_set(e, offset, el); + ephe_modify(e, offset, el); CAMLreturn(Val_unit); } @@ -330,8 +373,15 @@ static value ephe_get_field_copy (value e, mlsize_t offset) } infix_offs = 0; - /* Don't copy immediates or custom blocks #7279 */ - if (!Is_block(val) || Tag_val(val) == Custom_tag) { + /* Don't copy immediates */ + if (!Is_block(val)) { + copy = val; + goto some; + } + + /* Don't copy, but do darken, custom blocks #7279 */ + if (Tag_val(val) == Custom_tag) { + caml_darken (Caml_state, val, 0); copy = val; goto some; } @@ -420,11 +470,10 @@ CAMLprim value caml_ephe_check_data (value e) return ephe_check_field (e, CAML_EPHE_DATA_OFFSET); } -static value ephe_blit_field (value es, mlsize_t offset_s, - value ed, mlsize_t offset_d, mlsize_t length) +static value ephe_blit_keys (value es, mlsize_t offset_s, + value ed, mlsize_t offset_d, mlsize_t length) { CAMLparam2(es,ed); - CAMLlocal1(ar); if (length == 0) CAMLreturn(Val_unit); @@ -436,11 +485,13 @@ static value ephe_blit_field (value es, mlsize_t offset_s, if (offset_d < offset_s) { for (long i = 0; i < length; i++) { - do_set(ed, offset_d + i, Field(es, (offset_s + i))); + caml_ephe_await_key(ed, offset_d + i); + ephe_modify(ed, offset_d + i, Ephe_key(es, offset_s + i)); } } else { for (long i = length - 1; i >= 0; i--) { - do_set(ed, offset_d + i, Field(es, (offset_s + i))); + caml_ephe_await_key(ed, offset_d + i); + ephe_modify(ed, offset_d + i, Ephe_key(es, offset_s + i)); } } CAMLreturn(Val_unit); @@ -459,13 +510,20 @@ CAMLprim value caml_ephe_blit_key (value es, value ofs, if (offset_d < CAML_EPHE_FIRST_KEY || offset_d + length > Wosize_val (ed)){ caml_invalid_argument ("Weak.blit"); } - return ephe_blit_field (es, offset_s, ed, offset_d, length); + return ephe_blit_keys (es, offset_s, ed, offset_d, length); } CAMLprim value caml_ephe_blit_data (value es, value ed) { - ephe_blit_field (es, CAML_EPHE_DATA_OFFSET, ed, CAML_EPHE_DATA_OFFSET, 1); - caml_darken(0, Field(ed, CAML_EPHE_DATA_OFFSET), 0); + /* We clean the source and destination ephemerons before performing the blit. + * This guarantees that none of the keys and the data fields being accessed + * during a blit operation is unmarked during [Phase_sweep]. */ + caml_ephe_clean(es); + caml_ephe_clean(ed); + + value v = Ephe_data(es); + ephe_modify(ed, CAML_EPHE_DATA_OFFSET, v); + caml_darken(Caml_state, v, 0); /* [ed] may be in [Caml_state->ephe_info->live] list. The data value may be unmarked. The ephemerons on the live list are not scanned during ephemeron marking. Hence, unconditionally darken the data value. */ diff --git a/runtime/win32.c b/runtime/win32.c index 3ec659d4..8a5c8ff4 100644 --- a/runtime/win32.c +++ b/runtime/win32.c @@ -17,12 +17,12 @@ /* Win32-specific stuff */ -/* FILE_INFO_BY_HANDLE_CLASS and FILE_NAME_INFO are only available from Windows - Vista onwards */ -#undef _WIN32_WINNT -#define _WIN32_WINNT 0x0600 +/* FILE_INFO_BY_HANDLE_CLASS, FILE_NAME_INFO, and INIT_ONCE are only + available from Windows Vista onwards */ +#define _WIN32_WINNT 0x0600 /* _WIN32_WINNT_VISTA */ #define WIN32_LEAN_AND_MEAN +#define _CRT_RAND_S #include #include #include @@ -165,7 +165,7 @@ wchar_t * caml_search_in_path(struct ext_table * path, const wchar_t * name) /* not sure what empty path components mean under Windows */ fullname = caml_stat_wcsconcat(3, dir, L"\\", name); u8 = caml_stat_strdup_of_utf16(fullname); - caml_gc_message(0x100, "Searching %s\n", u8); + CAML_GC_MESSAGE(STARTUP, "Searching %s\n", u8); caml_stat_free(u8); if (_wstati64(fullname, &st) == 0 && S_ISREG(st.st_mode)) return fullname; @@ -173,7 +173,7 @@ wchar_t * caml_search_in_path(struct ext_table * path, const wchar_t * name) } not_found: u8 = caml_stat_strdup_of_utf16(name); - caml_gc_message(0x100, "%s not found in search path\n", u8); + CAML_GC_MESSAGE(STARTUP, "%s not found in search path\n", u8); caml_stat_free(u8); return caml_stat_wcsdup(name); } @@ -197,7 +197,7 @@ CAMLexport wchar_t * caml_search_exe_in_path(const wchar_t * name) &filepart); if (retcode == 0) { u8 = caml_stat_strdup_of_utf16(name); - caml_gc_message(0x100, "%s not found in search path\n", u8); + CAML_GC_MESSAGE(STARTUP, "%s not found in search path\n", u8); caml_stat_free(u8); caml_stat_free(fullname); return caml_stat_strdup_os(name); @@ -228,7 +228,7 @@ void * caml_dlopen(wchar_t * libname, int global) int flags = (global ? FLEXDLL_RTLD_GLOBAL : 0); handle = flexdll_wdlopen(libname, flags); if ((handle != NULL) - && ((atomic_load_relaxed(&caml_verb_gc) & 0x100) != 0)) { + && ((atomic_load_relaxed(&caml_verb_gc) & CAML_GC_MSG_STARTUP) != 0)) { flexdll_dump_exports(handle); fflush(stdout); } @@ -621,22 +621,30 @@ void caml_win32_unregister_overflow_detection(void) /* Seeding of pseudo-random number generators */ -int caml_win32_random_seed (intnat data[16]) +int caml_win32_random_seed(intnat data[16]) { - /* For better randomness, consider: - http://msdn.microsoft.com/library/en-us/seccrypto/security/rtlgenrandom.asp - http://blogs.msdn.com/b/michael_howard/archive/2005/01/14/353379.aspx - */ + int n = 0; + + /* Try kernel entropy first */ + for (int i = 0; i < 3; i++) + if (rand_s((unsigned int *) &data[n]) == 0) + n++; + + /* If the kernel provided enough entropy, we now have 96 bits + of good random data and can stop here. */ + if (n == 3) return n; + + /* Otherwise, use some not-very-random data. */ FILETIME t; LARGE_INTEGER pc; GetSystemTimeAsFileTime(&t); QueryPerformanceCounter(&pc); /* PR#6032 */ - data[0] = t.dwLowDateTime; - data[1] = t.dwHighDateTime; - data[2] = GetCurrentProcessId(); - data[3] = pc.LowPart; - data[4] = pc.HighPart; - return 5; + data[n++] = t.dwLowDateTime; + data[n++] = t.dwHighDateTime; + data[n++] = GetCurrentProcessId(); + data[n++] = pc.LowPart; + data[n++] = pc.HighPart; + return n; } @@ -952,32 +960,69 @@ CAMLexport value caml_copy_string_of_utf16(const wchar_t *s) return v; } -CAMLexport wchar_t* caml_stat_strdup_to_utf16(const char *s) +Caml_inline wchar_t *char_array_to_utf16_noexc(const char *s, + int slen, size_t *out_size) { wchar_t * ws; int retcode; - retcode = caml_win32_multi_byte_to_wide_char(s, -1, NULL, 0); - ws = caml_stat_alloc_noexc(retcode * sizeof(*ws)); - caml_win32_multi_byte_to_wide_char(s, -1, ws, retcode); + retcode = caml_win32_multi_byte_to_wide_char(s, slen, NULL, 0); + ws = caml_stat_alloc_noexc(retcode * sizeof(wchar_t)); + if (ws != NULL) { + caml_win32_multi_byte_to_wide_char(s, slen, ws, retcode); + if (out_size != NULL) + *out_size = retcode; + } return ws; } -CAMLexport caml_stat_string caml_stat_strdup_noexc_of_utf16(const wchar_t *s) +CAMLexport wchar_t *caml_stat_strdup_noexc_to_utf16(const char *s) +{ + return char_array_to_utf16_noexc(s, -1, NULL); +} + +CAMLexport wchar_t *caml_stat_strdup_to_utf16(const char *s) +{ + wchar_t *out = caml_stat_strdup_noexc_to_utf16(s); + if (out == NULL) + caml_raise_out_of_memory(); + return out; +} + +CAMLexport wchar_t *caml_stat_char_array_to_utf16(const char *s, size_t size, + size_t *out_size) +{ + CAMLassert(size > 0); + wchar_t *out = char_array_to_utf16_noexc(s, size, out_size); + if (out == NULL) + caml_raise_out_of_memory(); + return out; +} + +Caml_inline caml_stat_string char_array_of_utf16_noexc(const wchar_t *s, + int slen, + size_t *out_size) { caml_stat_string out; int retcode; - retcode = caml_win32_wide_char_to_multi_byte(s, -1, NULL, 0); + retcode = caml_win32_wide_char_to_multi_byte(s, slen, NULL, 0); out = caml_stat_alloc_noexc(retcode); if (out != NULL) { - caml_win32_wide_char_to_multi_byte(s, -1, out, retcode); + caml_win32_wide_char_to_multi_byte(s, slen, out, retcode); + if (out_size != NULL) + *out_size = retcode; } return out; } +CAMLexport caml_stat_string caml_stat_strdup_noexc_of_utf16(const wchar_t *s) +{ + return char_array_of_utf16_noexc(s, -1, NULL); +} + CAMLexport caml_stat_string caml_stat_strdup_of_utf16(const wchar_t *s) { caml_stat_string out = caml_stat_strdup_noexc_of_utf16(s); @@ -986,6 +1031,17 @@ CAMLexport caml_stat_string caml_stat_strdup_of_utf16(const wchar_t *s) return out; } +CAMLexport caml_stat_string caml_stat_char_array_of_utf16(const wchar_t *s, + size_t size, + size_t *out_size) +{ + CAMLassert(size > 0); + caml_stat_string out = char_array_of_utf16_noexc(s, size, out_size); + if (out == NULL) + caml_raise_out_of_memory(); + return out; +} + void caml_probe_win32_version(void) { /* Determine the version of Windows we're running, and cache it */ @@ -1029,31 +1085,17 @@ void caml_restore_win32_terminal(void) /* Detect if a named pipe corresponds to a Cygwin/MSYS pty: see https://github.com/mirror/newlib-cygwin/blob/00e9bf2/winsup/cygwin/dtable.cc#L932 */ -typedef -BOOL (WINAPI *tGetFileInformationByHandleEx)(HANDLE, FILE_INFO_BY_HANDLE_CLASS, - LPVOID, DWORD); - static int caml_win32_is_cygwin_pty(HANDLE hFile) { char buffer[1024]; FILE_NAME_INFO * nameinfo = (FILE_NAME_INFO *) buffer; - static tGetFileInformationByHandleEx pGetFileInformationByHandleEx = - INVALID_HANDLE_VALUE; - - if (pGetFileInformationByHandleEx == INVALID_HANDLE_VALUE) - pGetFileInformationByHandleEx = - (tGetFileInformationByHandleEx)GetProcAddress( - GetModuleHandle(L"KERNEL32.DLL"), "GetFileInformationByHandleEx"); - - if (pGetFileInformationByHandleEx == NULL) - return 0; /* Get pipe name. GetFileInformationByHandleEx does not NULL-terminate the string, so reduce the buffer size to allow for adding one. */ - if (! pGetFileInformationByHandleEx(hFile, - FileNameInfo, - buffer, - sizeof(buffer) - sizeof(WCHAR))) + if (! GetFileInformationByHandleEx(hFile, + FileNameInfo, + buffer, + sizeof(buffer) - sizeof(WCHAR))) return 0; nameinfo->FileName[nameinfo->FileNameLength / sizeof(WCHAR)] = L'\0'; @@ -1114,7 +1156,7 @@ CAMLexport clock_t caml_win32_clock(void) return (clock_t)((stime.ul + utime.ul) / clocks_per_sec); } -static double clock_period = 0; +static double clock_period_nsec = 0; void caml_init_os_params(void) { @@ -1129,7 +1171,7 @@ void caml_init_os_params(void) /* Get the number of nanoseconds for each tick in QueryPerformanceCounter */ QueryPerformanceFrequency(&frequency); - clock_period = (1000000000.0 / frequency.QuadPart); + clock_period_nsec = (double) NSEC_PER_SEC / frequency.QuadPart; } uint64_t caml_time_counter(void) @@ -1137,7 +1179,7 @@ uint64_t caml_time_counter(void) LARGE_INTEGER now; QueryPerformanceCounter(&now); - return (uint64_t)(now.QuadPart * clock_period); + return (uint64_t) (now.QuadPart * clock_period_nsec); } void *caml_plat_mem_map(uintnat size, int reserve_only) @@ -1272,3 +1314,31 @@ value caml_win32_xdg_defaults(void) CAMLreturn(result); } + +static INIT_ONCE get_temp_path_init_once = INIT_ONCE_STATIC_INIT; +static BOOL CALLBACK get_temp_path_init_function(PINIT_ONCE InitOnce, + PVOID Parameter, + PVOID *lpContext) +{ + FARPROC pGetTempPath2W = + GetProcAddress(GetModuleHandle(L"KERNEL32.DLL"), "GetTempPath2W"); + if (pGetTempPath2W) + *lpContext = pGetTempPath2W; + else + *lpContext = GetTempPath; + return TRUE; +} + +value caml_win32_get_temp_path(void) +{ + CAMLparam0(); + wchar_t buf[MAX_PATH+1]; + DWORD (WINAPI *get_temp_path)(DWORD, LPWSTR); + + InitOnceExecuteOnce(&get_temp_path_init_once, get_temp_path_init_function, + NULL, (LPVOID *) &get_temp_path); + + if (!get_temp_path(MAX_PATH+1, buf)) + caml_win32_sys_error(GetLastError()); + CAMLreturn(caml_copy_string_of_utf16(buf)); +} diff --git a/stdlib/.depend b/stdlib/.depend index 80bcf06a..1420b009 100644 --- a/stdlib/.depend +++ b/stdlib/.depend @@ -18,11 +18,9 @@ stdlib__Arg.cmx : arg.ml \ stdlib__Arg.cmi stdlib__Arg.cmi : arg.mli stdlib__Array.cmo : array.ml \ - stdlib__String.cmi \ stdlib__Seq.cmi \ stdlib__Array.cmi stdlib__Array.cmx : array.ml \ - stdlib__String.cmx \ stdlib__Seq.cmx \ stdlib__Array.cmi stdlib__Array.cmi : array.mli \ @@ -165,6 +163,7 @@ camlinternalOO.cmo : \ stdlib__Map.cmi \ stdlib__List.cmi \ stdlib__Char.cmi \ + stdlib__Atomic.cmi \ stdlib__Array.cmi \ camlinternalOO.cmi camlinternalOO.cmx : \ @@ -174,6 +173,7 @@ camlinternalOO.cmx : \ stdlib__Map.cmx \ stdlib__List.cmx \ stdlib__Char.cmx \ + stdlib__Atomic.cmx \ stdlib__Array.cmx \ camlinternalOO.cmi camlinternalOO.cmi : \ @@ -335,6 +335,7 @@ stdlib__Float.cmi : float.mli \ stdlib.cmi \ stdlib__Seq.cmi stdlib__Format.cmo : format.ml \ + stdlib__Uchar.cmi \ stdlib__String.cmi \ stdlib.cmi \ stdlib__Stack.cmi \ @@ -351,6 +352,7 @@ stdlib__Format.cmo : format.ml \ stdlib__Array.cmi \ stdlib__Format.cmi stdlib__Format.cmx : format.ml \ + stdlib__Uchar.cmx \ stdlib__String.cmx \ stdlib.cmx \ stdlib__Stack.cmx \ @@ -423,6 +425,19 @@ stdlib__Hashtbl.cmx : hashtbl.ml \ stdlib__Hashtbl.cmi stdlib__Hashtbl.cmi : hashtbl.mli \ stdlib__Seq.cmi +stdlib__Iarray.cmo : iarray.ml \ + stdlib.cmi \ + stdlib__Seq.cmi \ + stdlib__Array.cmi \ + stdlib__Iarray.cmi +stdlib__Iarray.cmx : iarray.ml \ + stdlib.cmx \ + stdlib__Seq.cmx \ + stdlib__Array.cmx \ + stdlib__Iarray.cmi +stdlib__Iarray.cmi : iarray.mli \ + stdlib.cmi \ + stdlib__Seq.cmi stdlib__In_channel.cmo : in_channel.ml \ stdlib__Sys.cmi \ stdlib.cmi \ @@ -591,6 +606,11 @@ stdlib__Out_channel.cmx : out_channel.ml \ stdlib__Out_channel.cmi : out_channel.mli \ stdlib.cmi \ stdlib__Bigarray.cmi +stdlib__Pair.cmo : pair.ml \ + stdlib__Pair.cmi +stdlib__Pair.cmx : pair.ml \ + stdlib__Pair.cmi +stdlib__Pair.cmi : pair.mli stdlib__Parsing.cmo : parsing.ml \ stdlib__Obj.cmi \ stdlib__Lexing.cmi \ @@ -604,6 +624,13 @@ stdlib__Parsing.cmx : parsing.ml \ stdlib__Parsing.cmi : parsing.mli \ stdlib__Obj.cmi \ stdlib__Lexing.cmi +stdlib__Pqueue.cmo : pqueue.ml \ + stdlib__Dynarray.cmi \ + stdlib__Pqueue.cmi +stdlib__Pqueue.cmx : pqueue.ml \ + stdlib__Dynarray.cmx \ + stdlib__Pqueue.cmi +stdlib__Pqueue.cmi : pqueue.mli stdlib__Printexc.cmo : printexc.ml \ stdlib.cmi \ stdlib__Printf.cmi \ @@ -670,6 +697,13 @@ stdlib__Random.cmi : random.mli \ stdlib__Nativeint.cmi \ stdlib__Int64.cmi \ stdlib__Int32.cmi +stdlib__Repr.cmo : repr.ml \ + stdlib.cmi \ + stdlib__Repr.cmi +stdlib__Repr.cmx : repr.ml \ + stdlib.cmx \ + stdlib__Repr.cmi +stdlib__Repr.cmi : repr.mli stdlib__Result.cmo : result.ml \ stdlib__Seq.cmi \ stdlib__Result.cmi @@ -764,12 +798,20 @@ std_exit.cmx : \ std_exit.cmi std_exit.cmi : stdlib__String.cmo : string.ml \ + stdlib__Uchar.cmi \ stdlib.cmi \ + stdlib__List.cmi \ + stdlib__Int.cmi \ stdlib__Bytes.cmi \ + stdlib__Array.cmi \ stdlib__String.cmi stdlib__String.cmx : string.ml \ + stdlib__Uchar.cmx \ stdlib.cmx \ + stdlib__List.cmx \ + stdlib__Int.cmx \ stdlib__Bytes.cmx \ + stdlib__Array.cmx \ stdlib__String.cmi stdlib__String.cmi : string.mli \ stdlib__Uchar.cmi \ @@ -811,6 +853,7 @@ stdlib__Unit.cmx : unit.ml \ stdlib__Unit.cmi : unit.mli stdlib__Weak.cmo : weak.ml \ stdlib__Sys.cmi \ + stdlib__Option.cmi \ stdlib__Obj.cmi \ stdlib__Int.cmi \ stdlib__Hashtbl.cmi \ @@ -818,6 +861,7 @@ stdlib__Weak.cmo : weak.ml \ stdlib__Weak.cmi stdlib__Weak.cmx : weak.ml \ stdlib__Sys.cmx \ + stdlib__Option.cmx \ stdlib__Obj.cmx \ stdlib__Int.cmx \ stdlib__Hashtbl.cmx \ diff --git a/stdlib/StdlibModules b/stdlib/StdlibModules index cd474c04..14a61afe 100644 --- a/stdlib/StdlibModules +++ b/stdlib/StdlibModules @@ -45,23 +45,26 @@ STDLIB_MODULE_BASENAMES = \ lazy \ seq \ option \ + pair \ result \ bool \ char \ uchar \ list \ int \ + array \ + iarray \ bytes \ string \ unit \ marshal \ - array \ float \ int32 \ int64 \ nativeint \ lexing \ parsing \ + repr \ set \ map \ stack \ @@ -91,6 +94,7 @@ STDLIB_MODULE_BASENAMES = \ oo \ camlinternalMod \ dynarray \ + pqueue \ ephemeron \ filename \ complex \ diff --git a/stdlib/arg.ml b/stdlib/arg.ml index 9179cb3d..e7c0cc56 100644 --- a/stdlib/arg.ml +++ b/stdlib/arg.ml @@ -120,18 +120,6 @@ let usage speclist errmsg = let current = ref 0 -let bool_of_string_opt x = - try Some (bool_of_string x) - with Invalid_argument _ -> None - -let int_of_string_opt x = - try Some (int_of_string x) - with Failure _ -> None - -let float_of_string_opt x = - try Some (float_of_string x) - with Failure _ -> None - let parse_and_expand_argv_dynamic_aux allow_expand current argv speclist anonfun errmsg = let initpos = !current in diff --git a/stdlib/array.ml b/stdlib/array.ml index 27b8f399..0847cb24 100644 --- a/stdlib/array.ml +++ b/stdlib/array.ml @@ -185,6 +185,23 @@ let of_list = function | hd::tl -> unsafe_set a i hd; fill (i+1) tl in fill 1 tl +let equal eq a b = + if length a <> length b then false else + let i = ref 0 in + let len = length a in + while !i < len && eq (unsafe_get a !i) (unsafe_get b !i) do incr i done; + !i = len + +let stdlib_compare = compare +let compare cmp a b = + let len_a = length a and len_b = length b in + let diff = len_a - len_b in + if diff <> 0 then (if diff < 0 then -1 else 1) else + let i = ref 0 and c = ref 0 in + while !i < len_a && !c = 0 + do c := cmp (unsafe_get a !i) (unsafe_get b !i); incr i done; + !c + let fold_left f x a = let r = ref x in for i = 0 to length a - 1 do @@ -253,7 +270,7 @@ let mem x a = let n = length a in let rec loop i = if i = n then false - else if compare (unsafe_get a i) x = 0 then true + else if stdlib_compare (unsafe_get a i) x = 0 then true else loop (succ i) in loop 0 @@ -441,12 +458,10 @@ let fast_sort = stable_sort let shuffle_contract_violation i j = let int = string_of_int in - String.concat "" [ - "Array.shuffle: 'rand "; int (i + 1); - "' returned "; int j; - ", out of expected range [0; "; int i; "]" - ] - |> invalid_arg + invalid_arg + ("Array.shuffle: 'rand " ^ int (i + 1) ^ + "' returned " ^ int j ^ + ", out of expected range [0; " ^ int i ^ "]") let shuffle ~rand a = (* Fisher-Yates *) for i = length a - 1 downto 1 do diff --git a/stdlib/array.mli b/stdlib/array.mli index 03497dd0..141bf3e5 100644 --- a/stdlib/array.mli +++ b/stdlib/array.mli @@ -158,6 +158,22 @@ val of_list : 'a list -> 'a array @raise Invalid_argument if the length of [l] is greater than [Sys.max_array_length]. *) +(** {1:comparison Comparison} *) + +val equal : ('a -> 'a -> bool) -> 'a array -> 'a array -> bool +(** [equal eq a b] is [true] if and only if [a] and [b] have the + same length [n] and for all [i] in \[[0];[n-1]\], [eq a.(i) b.(i)] + is [true]. + + @since 5.4 *) + +val compare : ('a -> 'a -> int) -> 'a array -> 'a array -> int +(** [compare cmp a b] compares [a] and [b] according to the shortlex order, + that is, shorter arrays are smaller and equal-sized arrays are compared + in lexicographic order using [cmp] to compare elements. + + @since 5.4 *) + (** {1 Iterators} *) val iter : ('a -> unit) -> 'a array -> unit diff --git a/stdlib/arrayLabels.mli b/stdlib/arrayLabels.mli index 912120b7..45699c83 100644 --- a/stdlib/arrayLabels.mli +++ b/stdlib/arrayLabels.mli @@ -158,6 +158,22 @@ val of_list : 'a list -> 'a array @raise Invalid_argument if the length of [l] is greater than [Sys.max_array_length]. *) +(** {1:comparison Comparison} *) + +val equal : eq:('a -> 'a -> bool) -> 'a array -> 'a array -> bool +(** [equal eq a b] is [true] if and only if [a] and [b] have the + same length [n] and for all [i] in \[[0];[n-1]\], [eq a.(i) b.(i)] + is [true]. + + @since 5.4 *) + +val compare : cmp:('a -> 'a -> int) -> 'a array -> 'a array -> int +(** [compare cmp a b] compares [a] and [b] according to the shortlex order, + that is, shorter arrays are smaller and equal-sized arrays are compared + in lexicographic order using [cmp] to compare elements. + + @since 5.4 *) + (** {1 Iterators} *) val iter : f:('a -> unit) -> 'a array -> unit diff --git a/stdlib/atomic.ml b/stdlib/atomic.ml index f4fc737d..a8c6d30c 100644 --- a/stdlib/atomic.ml +++ b/stdlib/atomic.ml @@ -12,16 +12,45 @@ (* *) (**************************************************************************) -type !'a t +external ignore : 'a -> unit = "%ignore" + +module Loc = struct + type 'a t = 'a atomic_loc + + external get : 'a t -> 'a = "%atomic_load_loc" + external exchange : 'a t -> 'a -> 'a = "%atomic_exchange_loc" + external compare_and_set : 'a t -> 'a -> 'a -> bool = "%atomic_cas_loc" + external fetch_and_add : int t -> int -> int = "%atomic_fetch_add_loc" + + let set t v = + ignore (exchange t v) + let incr t = + ignore (fetch_and_add t 1) + let decr t = + ignore (fetch_and_add t (-1)) +end + +type !'a t = + { mutable contents: 'a [@atomic]; + } + +let make v = + { contents = v } -external make : 'a -> 'a t = "%makemutable" external make_contended : 'a -> 'a t = "caml_atomic_make_contended" -external get : 'a t -> 'a = "%atomic_load" -external exchange : 'a t -> 'a -> 'a = "%atomic_exchange" -external compare_and_set : 'a t -> 'a -> 'a -> bool = "%atomic_cas" -external fetch_and_add : int t -> int -> int = "%atomic_fetch_add" -external ignore : 'a -> unit = "%ignore" -let set r x = ignore (exchange r x) -let incr r = ignore (fetch_and_add r 1) -let decr r = ignore (fetch_and_add r (-1)) +let get t = + t.contents +let set t v = + t.contents <- v + +let exchange t v = + Loc.exchange [%atomic.loc t.contents] v +let compare_and_set t old new_ = + Loc.compare_and_set [%atomic.loc t.contents] old new_ +let fetch_and_add t incr = + Loc.fetch_and_add [%atomic.loc t.contents] incr +let incr t = + Loc.incr [%atomic.loc t.contents] +let decr t = + Loc.decr [%atomic.loc t.contents] diff --git a/stdlib/atomic.mli b/stdlib/atomic.mli index b7bf8f67..26ef6535 100644 --- a/stdlib/atomic.mli +++ b/stdlib/atomic.mli @@ -68,6 +68,32 @@ val incr : int t -> unit (** [decr r] atomically decrements the value of [r] by [1]. *) val decr : int t -> unit +(** Atomic "locations", such as record fields. *) +module Loc : sig + (** This module exposes a dedicated type ['a Atomic.Loc.t] for + atomic locations (storing a value of type ['a]) inside objects + that may not be atomic references. It is used in particular for + atomic record fields: if a record [r] has an atomic field [f] of + type [foo], then [[%atomic.loc r.f]] has type [foo Atomic.Loc.t]. + + The API below mirrors the API to access {{!t}atomic references}, + see the documentation above for more information. *) + type 'a t = 'a atomic_loc + + (* exposing 'external' primitives directly helps reasoning about + performance: it guarantees that all versions of the compiler + (including bytecode) remove the pair construction on direct + calls: + Atomic.Loc.foo [%atomic.loc r.x] ... *) + external get : 'a t -> 'a = "%atomic_load_loc" + val set : 'a t -> 'a -> unit + external exchange : 'a t -> 'a -> 'a = "%atomic_exchange_loc" + external compare_and_set : 'a t -> 'a -> 'a -> bool = "%atomic_cas_loc" + external fetch_and_add : int t -> int -> int = "%atomic_fetch_add_loc" + val incr : int t -> unit + val decr : int t -> unit +end + (** {1:examples Examples} {2 Basic Thread Coordination} diff --git a/stdlib/bool.ml b/stdlib/bool.ml index 59d9def5..a7cf2cb5 100644 --- a/stdlib/bool.ml +++ b/stdlib/bool.ml @@ -18,6 +18,9 @@ type t = bool = false | true external not : bool -> bool = "%boolnot" external ( && ) : bool -> bool -> bool = "%sequand" external ( || ) : bool -> bool -> bool = "%sequor" +external logand : bool -> bool -> bool = "%andint" +external logor : bool -> bool -> bool = "%orint" +external logxor : bool -> bool -> bool = "%xorint" let equal : bool -> bool -> bool = ( = ) let compare : bool -> bool -> int = Stdlib.compare external to_int : bool -> int = "%identity" diff --git a/stdlib/bool.mli b/stdlib/bool.mli index 9c7a9cd8..918b2f07 100644 --- a/stdlib/bool.mli +++ b/stdlib/bool.mli @@ -39,6 +39,15 @@ external ( || ) : bool -> bool -> bool = "%sequor" If [e0] evaluates to [true], [e1] is not evaluated. Right-associative operator at precedence level 2/11. *) +val logand : bool -> bool -> bool +(** [logand b1 b2] is [true] if and only if [b1] and [b2] are both [true]. *) + +val logor : bool -> bool -> bool +(** [logor b1 b2] is [true] if and only if either [b1] or [b2] is [true]. *) + +val logxor : bool -> bool -> bool +(** [logxor b1 b2] is [true] if exactly one of [b1] and [b2] is [true]. *) + (** {1:preds Predicates and comparisons} *) val equal : bool -> bool -> bool diff --git a/stdlib/camlinternalFormatBasics.ml b/stdlib/camlinternalFormatBasics.ml index 61088232..da13e642 100644 --- a/stdlib/camlinternalFormatBasics.ml +++ b/stdlib/camlinternalFormatBasics.ml @@ -688,3 +688,62 @@ fun fmt1 fmt2 -> match fmt1 with | End_of_format -> fmt2 + + +type neutral_concat = + { f: + 'a 'b 'c 'd 'e 'f. [`String of string | `Char of char ] -> + ('a,'b,'c,'d,'e,'f) fmt -> ('a,'b,'c,'d,'e,'f) fmt + } + +let rec string_concat_map: type a b c d e f. + neutral_concat -> (a,b,c,d,e,f) fmt -> (a,b,c,d,e,f) fmt = + fun f -> function + | String (pad, rest) -> String (pad, string_concat_map f rest) + | Caml_string (pad, rest) -> Caml_string (pad, string_concat_map f rest) + + | Int (iconv, pad, prec, rest) -> + Int (iconv, pad, prec, string_concat_map f rest) + | Int32 (iconv, pad, prec, rest) -> + Int32 (iconv, pad, prec, string_concat_map f rest) + | Nativeint (iconv, pad, prec, rest) -> + Nativeint (iconv, pad, prec, string_concat_map f rest) + | Int64 (iconv, pad, prec, rest) -> + Int64 (iconv, pad, prec, string_concat_map f rest) + | Float (fconv, pad, prec, rest) -> + Float (fconv, pad, prec, string_concat_map f rest) + + | Char (rest) -> Char (string_concat_map f rest) + | Caml_char rest -> + Caml_char ( string_concat_map f rest) + | Bool (pad, rest) -> Bool (pad, string_concat_map f rest) + | Alpha rest -> Alpha (string_concat_map f rest) + | Theta rest -> Theta (string_concat_map f rest) + | Custom (arity, fc, rest) -> + Custom (arity, fc, string_concat_map f rest) + | Reader rest -> Reader (string_concat_map f rest) + | Flush rest -> Flush (string_concat_map f rest) + + | String_literal (str, rest) -> f.f (`String str) (string_concat_map f rest) + | Char_literal (chr, rest) -> + f.f (`Char chr) (string_concat_map f rest) + | Format_arg (pad, fmtty, rest) -> + Format_arg (pad, fmtty, string_concat_map f rest) + | Format_subst (pad, fmtty, rest) -> + Format_subst (pad, fmtty, string_concat_map f rest) + + | Scan_char_set (width_opt, char_set, rest) -> + Scan_char_set (width_opt, char_set, string_concat_map f rest) + | Scan_get_counter (counter, rest) -> + Scan_get_counter (counter,string_concat_map f rest) + | Scan_next_char (rest) -> + Scan_next_char (string_concat_map f rest) + | Ignored_param (ign, rest) -> + Ignored_param (ign, string_concat_map f rest) + + | Formatting_lit (fmting_lit, rest) -> + Formatting_lit (fmting_lit, string_concat_map f rest) + | Formatting_gen (fmting_gen, rest) -> + Formatting_gen (fmting_gen, string_concat_map f rest) + + | End_of_format -> End_of_format diff --git a/stdlib/camlinternalFormatBasics.mli b/stdlib/camlinternalFormatBasics.mli index adf76a26..976e3cbb 100644 --- a/stdlib/camlinternalFormatBasics.mli +++ b/stdlib/camlinternalFormatBasics.mli @@ -325,3 +325,15 @@ val concat_fmt : ('a, 'b, 'c, 'd, 'e, 'f) fmt -> ('f, 'b, 'c, 'e, 'g, 'h) fmt -> ('a, 'b, 'c, 'd, 'g, 'h) fmt + +type neutral_concat = + { f: + 'a 'b 'c 'd 'e 'f. [`String of string | `Char of char ] -> + ('a,'b,'c,'d,'e,'f) fmt -> ('a,'b,'c,'d,'e,'f) fmt + } + +val string_concat_map: + neutral_concat -> + ('a, 'b, 'c, 'd, 'e, 'f) fmt -> ('a, 'b, 'c, 'd, 'e, 'f) fmt +(** Helper function for splitting format string and char literal. + @since 5.4 *) diff --git a/stdlib/camlinternalLazy.ml b/stdlib/camlinternalLazy.ml index 60355416..568c6a24 100644 --- a/stdlib/camlinternalLazy.ml +++ b/stdlib/camlinternalLazy.ml @@ -103,3 +103,18 @@ let force_gen ~only_val (lzv : 'arg lazy_t) = else if t = Obj.forcing_tag then raise Undefined else if t <> Obj.lazy_tag then (Obj.obj x : 'arg) else force_gen_lazy_block ~only_val lzv + +(* If [lzv] is already forced, then [indirect lzv] is [lzv]. + Otherwise it returns a fresh thunk that, when forced, will force [lzv]. + + This provides a way to copy/move [lzv] that works correctly even if + [lzv] is being forced concurrently. +*) +let indirect (lzv : 'arg lazy_t) = + (* Sys.opaque_identity: see [force_gen] comment above. *) + let lzv = Sys.opaque_identity lzv in + let x = Obj.repr lzv in + let t = Obj.tag x in + if t = Obj.lazy_tag || t = Obj.forcing_tag + then lazy (force_lazy_block lzv) + else lzv diff --git a/stdlib/camlinternalLazy.mli b/stdlib/camlinternalLazy.mli index ac8b7a8b..2f90dbab 100644 --- a/stdlib/camlinternalLazy.mli +++ b/stdlib/camlinternalLazy.mli @@ -24,3 +24,5 @@ exception Undefined val force_lazy_block : 'a lazy_t -> 'a val force_gen : only_val:bool -> 'a lazy_t -> 'a + +val indirect : 'a lazy_t -> 'a lazy_t diff --git a/stdlib/camlinternalOO.ml b/stdlib/camlinternalOO.ml index 97889767..46f77022 100644 --- a/stdlib/camlinternalOO.ml +++ b/stdlib/camlinternalOO.ml @@ -113,7 +113,7 @@ let dummy_table = initializers = []; size = 0 } -let table_count = ref 0 +let table_count = Atomic.make 0 (* dummy_met should be a pointer, so use an atom *) let dummy_met : item = Obj.obj (Obj.new_block 0 0) @@ -125,7 +125,7 @@ let rec fit_size n = fit_size ((n+1)/2) * 2 let new_table pub_labels = - incr table_count; + Atomic.incr table_count; let len = Array.length pub_labels in let methods = Array.make (len*2+2) dummy_met in methods.(0) <- Obj.magic len; @@ -154,8 +154,8 @@ let put array label element = (**** Classes ****) -let method_count = ref 0 -let inst_var_count = ref 0 +let method_count = Atomic.make 0 +let inst_var_count = Atomic.make 0 (* type t *) type meth = item @@ -178,7 +178,7 @@ let get_method_labels table names = Array.map (get_method_label table) names let set_method table label element = - incr method_count; + Atomic.incr method_count; if Labs.find label table.methods_by_label then put table label element else @@ -309,7 +309,7 @@ let create_table public_methods = table let init_class table = - inst_var_count := !inst_var_count + table.size - 1; + ignore (Atomic.fetch_and_add inst_var_count (table.size - 1)); table.initializers <- List.rev table.initializers; resize table (3 + Obj.magic table.methods.(1) * 16 / Sys.word_size) @@ -608,5 +608,6 @@ type stats = { classes: int; methods: int; inst_vars: int; } let stats () = - { classes = !table_count; - methods = !method_count; inst_vars = !inst_var_count; } + { classes = Atomic.get table_count; + methods = Atomic.get method_count; + inst_vars = Atomic.get inst_var_count; } diff --git a/stdlib/char.ml b/stdlib/char.ml index 6c0dbb8c..d56f7ce0 100644 --- a/stdlib/char.ml +++ b/stdlib/char.ml @@ -63,3 +63,60 @@ external seeded_hash_param : int -> int -> int -> 'a -> int = "caml_hash" [@@noalloc] let seeded_hash seed x = seeded_hash_param 10 100 seed x let hash x = seeded_hash_param 10 100 0 x + +module Ascii = struct + + (* Characters *) + + let min = '\x00' + let max = '\x7F' + + (* Predicates *) + + let is_valid = function '\x00' .. '\x7F' -> true | _ -> false + let is_upper = function 'A' .. 'Z' -> true | _ -> false + let is_lower = function 'a' .. 'z' -> true | _ -> false + let is_letter = function 'A' .. 'Z' | 'a' .. 'z' -> true | _ -> false + let is_alphanum = function + | '0' .. '9' | 'A' .. 'Z' | 'a' .. 'z' -> true | _ -> false + + let is_white = function ' ' | '\t' .. '\r' -> true | _ -> false + let is_blank = function ' ' | '\t' -> true | _ -> false + let is_graphic = function '!' .. '~' -> true | _ -> false + let is_print = function ' ' .. '~' -> true | _ -> false + let is_control = function '\x00' .. '\x1F' | '\x7F' -> true | _ -> false + + (* Decimal digits *) + + let is_digit = function '0' .. '9' -> true | _ -> false + let digit_to_int = function + | '0' .. '9' as c -> code c - 0x30 + | c -> invalid_arg (escaped c ^ ": not a decimal digit") + + let digit_of_int n = unsafe_chr (0x30 + abs (n mod 10)) + + (* Hexadecimal digits *) + + let is_hex_digit = function + | '0' .. '9' | 'A' .. 'F' | 'a' .. 'f' -> true + | _ -> false + + let hex_digit_to_int = function + | '0' .. '9' as c -> code c - 0x30 + | 'A' .. 'F' as c -> 10 + code c - 0x41 + | 'a' .. 'f' as c -> 10 + code c - 0x61 + | c -> invalid_arg (escaped c ^ ": not a hexadecimal digit") + + let lower_hex_digit_of_int n = + let d = abs (n mod 16) in + unsafe_chr (if d < 10 then 0x30 + d else 0x57 + d) + + let upper_hex_digit_of_int n = + let d = abs (n mod 16) in + unsafe_chr (if d < 10 then 0x30 + d else 0x37 + d) + + (* Casing transforms *) + + let lowercase = lowercase_ascii + let uppercase = uppercase_ascii +end diff --git a/stdlib/char.mli b/stdlib/char.mli index 5fafade0..b7f5e8c2 100644 --- a/stdlib/char.mli +++ b/stdlib/char.mli @@ -13,35 +13,39 @@ (* *) (**************************************************************************) -(** Character operations. *) +(** Character operations. + + Characters are the elements of [string] and [bytes] + values. Characters represent bytes, that is an integer in the + range \[[0x00];[0xFF]\]. + + Some of the functions of this module interpret the characters in + the range \[[0x00];[0x7F]\] as the characters of the ASCII character + set. *) + +(** {1:characters Characters} *) + +type t = char +(** An alias for the type of characters. *) external code : char -> int = "%identity" -(** Return the ASCII code of the argument. *) +(** Return the integer code of the argument. *) val chr : int -> char -(** Return the character with the given ASCII code. +(** Return the character with the given integer code. @raise Invalid_argument if the argument is - outside the range 0--255. *) + outside the range \[[0x00];[0xFF]\]. *) val escaped : char -> string (** Return a string representing the given character, with special characters escaped following the lexical conventions of OCaml. - All characters outside the ASCII printable range (32..126) are + All characters outside the ASCII printable range \[[0x20];[0x7E]\] are escaped, as well as backslash, double-quote, and single-quote. *) -val lowercase_ascii : char -> char -(** Convert the given character to its equivalent lowercase character, - using the US-ASCII character set. - @since 4.03 *) +(** {1:predicates Predicates and comparisons} -val uppercase_ascii : char -> char -(** Convert the given character to its equivalent uppercase character, - using the US-ASCII character set. - @since 4.03 *) - -type t = char -(** An alias for the type of characters. *) + See also the {!Ascii} module. *) val compare: t -> t -> int (** The comparison function for characters, with the same specification as @@ -53,6 +57,134 @@ val equal: t -> t -> bool (** The equal function for chars. @since 4.03 *) +(** {1:ascii_characters ASCII characters} *) + +(** ASCII character set support. + + These functions give meaning to the integers \[[0x00];[0x7F]\] of the + {{:https://en.wikipedia.org/wiki/ASCII#Character_set}ASCII + character set}. + + Since the UTF-8 encoding of Unicode has the same encoding and + character semantics (U+0000 to U+001F) for these bytes, the + functions can be safely used on elements of UTF-8 encoded [string] + and [bytes] values. However the functions only deal with ASCII + related matters. For example the notion of Unicode whitespace is + much larger than the ASCII whitespace determined by + {!Char.Ascii.is_white}. + + @since 5.4 *) +module Ascii : sig + + (** {1:characters Characters} *) + + val min : char + (** [min] is ['\x00']. *) + + val max : char + (** [max] is ['\x7F']. *) + + (** {1:predicates Predicates} *) + + val is_valid : char -> bool + (** [is_valid c] is [true] if and only if [c] is an ASCII character, + that is a byte in the range \[{!min};{!max}\]. *) + + val is_upper : char -> bool + (** [is_upper c] is [true] if and only if [c] is an ASCII uppercase letter + ['A'] to ['Z'], that is a byte in the range \[[0x41];[0x5A]\]. *) + + val is_lower : char -> bool + (** [is_lower c] is [true] if and only if [c] is an ASCII lowercase letter + ['a'] to ['z'], that is a byte in the range \[[0x61];[0x7A]\]. *) + + val is_letter : char -> bool + (** [is_letter c] is {!is_lower}[ c || ]{!is_upper}[ c]. *) + + val is_alphanum : char -> bool + (** [is_alphanum c] is {!is_letter}[ c || ]{!is_digit}[ c]. *) + + val is_white : char -> bool + (** [is_white c] is [true] if and only if [c] is an ASCII white space + character, that is one of + tab ['\t'] ([0x09]), newline ['\n'] ([0x0A]), + vertical tab ([0x0B]), form feed ([0x0C]), + carriage return ['\r'] ([0x0D]) or space [' '] ([0x20]), *) + + val is_blank : char -> bool + (** [is_blank c] is [true] if and only if [c] is an ASCII blank character, + that is either space [' '] ([0x20]) or tab ['\t'] ([0x09]). *) + + val is_graphic : char -> bool + (** [is_graphic c] is [true] if and only if [c] is an ASCII graphic + character, that is a byte in the range \[[0x21];[0x7E]\]. *) + + val is_print : char -> bool + (** [is_print c] is {!is_graphic}[ c || c = ' ']. *) + + val is_control : char -> bool + (** [is_control c] is [true] if and only if [c] is an ASCII control character, + that is a byte in the range \[[0x00];[0x1F]\] or [0x7F]. *) + + (** {1:decimal_digits Decimal digits} *) + + val is_digit : char -> bool + (** [is_digit c] is [true] if and only if [c] is an ASCII decimal digit + ['0'] to ['9'], that is a byte in the range \[[0x30];[0x39]\]. *) + + val digit_to_int : char -> int + (** [digit_to_int c] is the numerical value of a digit + that satisfies {!is_digit}. Raises [Invalid_argument] if + {!is_digit}[ c] is [false]. *) + + val digit_of_int : int -> char + (** [digit_of_int n] is an ASCII decimal digit for the decimal + value [abs (n mod 10)]. *) + + (** {1:hex_digits Hexadecimal digits} *) + + val is_hex_digit : char -> bool + (** [is_hex_digit c] is [true] if and only if [c] is an ASCII hexadecimal + digit ['0'] to ['9'], ['a'] to ['f'] or ['A'] to ['F'], + that is a byte in one of the ranges \[[0x30];[0x39]\], + \[[0x41];[0x46]\], \[[0x61];[0x66]\]. *) + + val hex_digit_to_int : char -> int + (** [hex_digit_to_int c] is the numerical value of a digit that + satisfies {!is_hex_digit}. Raises [Invalid_argument] if + {!is_hex_digit}[ c] is [false]. *) + + val lower_hex_digit_of_int : int -> char + (** [lower_hex_digit_of_int n] is a lowercase ASCII hexadecimal digit for + the hexadecimal value [abs (n mod 16)]. *) + + val upper_hex_digit_of_int : int -> char + (** [upper_hex_digit_of_int n] is an uppercase ASCII hexadecimal + digit for the hexadecimal value [abs (n mod 16)]. *) + + (** {1:casing Casing transforms} *) + + val uppercase : char -> char + (** [uppercase c] is [c] with ASCII characters ['a'] to ['z'] respectively + mapped to uppercase characters ['A'] to ['Z']. Other characters are left + untouched. *) + + val lowercase : char -> char + (** [lowercase c] is [c] with ASCII characters ['A'] to ['Z'] respectively + mapped to lowercase characters ['a'] to ['z']. Other characters are + left untouched. *) +end + +val lowercase_ascii : char -> char +(** Use the equivalent {!Ascii.lowercase} instead. + @since 4.03 *) + +val uppercase_ascii : char -> char +(** Use the equivalent {!Ascii.uppercase} instead. + @since 4.03 *) + +(** {1:hashing Hashing} *) + val seeded_hash : int -> t -> int (** A seeded hash function for characters, with the same output value as {!Hashtbl.seeded_hash}. This function allows this module to be passed as diff --git a/stdlib/domain.mli b/stdlib/domain.mli index f7654877..6768420b 100644 --- a/stdlib/domain.mli +++ b/stdlib/domain.mli @@ -16,16 +16,16 @@ (* *) (**************************************************************************) -[@@@alert unstable - "The Domain interface may change in incompatible ways in the future." -] - (** Domains. See 'Parallel programming' chapter in the manual. @since 5.0 *) +[@@@alert unstable + "The Domain interface may change in incompatible ways in the future." +] + type !'a t (** A domain of type ['a t] runs independently, eventually producing a result of type 'a, or an exception *) diff --git a/stdlib/dune b/stdlib/dune index bd873643..1e530bc8 100644 --- a/stdlib/dune +++ b/stdlib/dune @@ -14,12 +14,13 @@ (library (name stdlib) + (libraries dune_support) (stdlib (exit_module std_exit) (internal_modules Camlinternal*) (modules_before_stdlib camlinternalFormatBasics)) - (flags (:standard -w -9 -nolabels)) + (flags (:standard -w -9 -nolabels -open New_predef_types)) (preprocess (per_module ((action diff --git a/stdlib/dune_support/dune b/stdlib/dune_support/dune new file mode 100644 index 00000000..32f1e86d --- /dev/null +++ b/stdlib/dune_support/dune @@ -0,0 +1,6 @@ +(library + (name dune_support) + (modules_without_implementation new_predef_types) + (flags (:standard -nostdlib -nopervasives)) + (wrapped false) +) diff --git a/stdlib/dune_support/new_predef_types.mli b/stdlib/dune_support/new_predef_types.mli new file mode 100644 index 00000000..1434459c --- /dev/null +++ b/stdlib/dune_support/new_predef_types.mli @@ -0,0 +1 @@ +type !+'a iarray diff --git a/stdlib/dynarray.ml b/stdlib/dynarray.ml index a3d05c55..3b7060c3 100644 --- a/stdlib/dynarray.ml +++ b/stdlib/dynarray.ml @@ -154,16 +154,24 @@ module Dummy : sig int -> (int -> 'a) -> dummy:'stamp dummy -> ('a, 'stamp) with_dummy array - val copy : 'a array -> dummy:'stamp dummy -> ('a, 'stamp) with_dummy array + val copy_from_array : + 'a array -> dummy:'stamp dummy -> ('a, 'stamp) with_dummy array - val unsafe_nocopy : - 'a array -> dummy:'stamp dummy -> - ('a, 'stamp) with_dummy array + val unsafe_nocopy_from_array : + 'a array -> dummy:'stamp dummy -> ('a, 'stamp) with_dummy array (** [unsafe_nocopy] assumes that the input array was created locally and will not be used anymore (in the spirit of [Bytes.unsafe_to_string]), and avoids a copy of the input array when possible. *) + exception Dummy_found of int + + val unsafe_nocopy_to_array : + ('a, 'stamp) with_dummy array -> dummy:'stamp dummy -> 'a array + (** Assumes, without checking, that the input array was created locally and + will not be used anymore. Performs no copy except when the elements are + floats. Raises [Dummy_found i] if there is a dummy at any index [i]. *) + val blit_array : 'a array -> int -> ('a, 'stamp) with_dummy array -> int -> @@ -241,7 +249,7 @@ end = struct arr end - let copy a ~dummy = + let copy_from_array a ~dummy = if Obj.(tag (repr a) <> double_array_tag) then Array.copy a else begin @@ -254,10 +262,30 @@ end = struct arr end - let unsafe_nocopy a ~dummy = + let unsafe_nocopy_from_array a ~dummy = if Obj.(tag (repr a) <> double_array_tag) then a - else copy a ~dummy + else copy_from_array a ~dummy + + exception Dummy_found of int + + let unsafe_nocopy_to_array a ~dummy = + let arr = + if Array.length a = 0 || Obj.(tag (repr a.(0)) <> double_tag) then + a + else begin + let n = Array.length a in + let a' = Array.make n a.(0) in + for i = 1 to n - 1 do + Array.unsafe_set a' i (unsafe_get (Array.unsafe_get a i)) + done; + a' + end + in + Array.iteri + (fun i v -> if is_dummy v dummy then raise (Dummy_found i)) + arr; + arr let init n f ~dummy = let arr = Array.make n (of_dummy dummy) in @@ -409,6 +437,11 @@ module Error = struct let[@inline never] empty_dynarray f = Printf.ksprintf invalid_arg "Dynarray.%s: empty array" f + + let[@inline never] different_lengths f ~length1 ~length2 = + Printf.ksprintf invalid_arg + "Dynarray.%s: array length mismatch: %d <> %d" + f length1 length2 end (* Detecting iterator invalidation. @@ -463,7 +496,7 @@ let make n x = let init (type a) n (f : int -> a) : a t = if n < 0 then Error.negative_length_requested "init" n; let Dummy.Fresh dummy = global_dummy in - let arr = Dummy.Array.init ~dummy n f in + let arr = Dummy.Array.init n f ~dummy in Pack { length = n; arr; @@ -878,7 +911,7 @@ let iteri k a = let Pack {arr; length; dummy} = a in check_valid_length length arr; for i = 0 to length - 1 do - k i (unsafe_get arr ~i ~dummy ~length); + k i (unsafe_get arr ~dummy ~i ~length); done; check_same_length "iteri" a ~length @@ -962,6 +995,44 @@ let for_all p a = check_same_length "for_all" a ~length; res +let exists2 p a1 a2 = + let Pack {arr = arr1; length = length1; dummy = dummy1} = a1 in + let Pack {arr = arr2; length = length2; dummy = dummy2} = a2 in + check_valid_length length1 arr1; + check_valid_length length2 arr2; + if length1 <> length2 then + Error.different_lengths "exists2" ~length1 ~length2; + let rec loop p arr1 dummy1 arr2 dummy2 i length = + if i = length then false + else + p (unsafe_get arr1 ~dummy:dummy1 ~i ~length) + (unsafe_get arr2 ~dummy:dummy2 ~i ~length) + || loop p arr1 dummy1 arr2 dummy2 (i + 1) length + in + let res = loop p arr1 dummy1 arr2 dummy2 0 length1 in + check_same_length "exists2" a1 ~length:length1; + check_same_length "exists2" a2 ~length:length2; + res + +let for_all2 p a1 a2 = + let Pack {arr = arr1; length = length1; dummy = dummy1} = a1 in + let Pack {arr = arr2; length = length2; dummy = dummy2} = a2 in + check_valid_length length1 arr1; + check_valid_length length2 arr2; + if length1 <> length2 then + Error.different_lengths "for_all2" ~length1 ~length2; + let rec loop p arr1 dummy1 arr2 dummy2 i length = + if i = length then true + else + p (unsafe_get arr1 ~dummy:dummy1 ~i ~length) + (unsafe_get arr2 ~dummy:dummy2 ~i ~length) + && loop p arr1 dummy1 arr2 dummy2 (i + 1) length + in + let res = loop p arr1 dummy1 arr2 dummy2 0 length1 in + check_same_length "for_all2" a1 ~length:length1; + check_same_length "for_all2" a2 ~length:length2; + res + let filter f a = let b = create () in iter_ "filter" (fun x -> if f x then add_last b x) a; @@ -1113,7 +1184,7 @@ let compare cmp a1 a2 = let of_array a = let length = Array.length a in let Dummy.Fresh dummy = global_dummy in - let arr = Dummy.Array.copy a ~dummy in + let arr = Dummy.Array.copy_from_array a ~dummy in Pack { length; arr; @@ -1133,7 +1204,7 @@ let of_list li = let a = Array.of_list li in let length = Array.length a in let Dummy.Fresh dummy = global_dummy in - let arr = Dummy.Array.unsafe_nocopy a ~dummy in + let arr = Dummy.Array.unsafe_nocopy_from_array a ~dummy in Pack { length; arr; @@ -1204,3 +1275,27 @@ let to_seq_rev_reentrant a = end in aux (length a - 1) + +external unsafe_iarray_of_array : 'a array -> 'a iarray = "%opaque" + +let unsafe_to_iarray ~capacity (f : 'a t -> unit) = + let a = create () in + set_capacity a capacity; + f a; + let Pack {arr; length; dummy} = a in + reset a; + (* At this point further updates to [a] (from this domain) will not mutate + [arr]. *) + let capacity = Array.length arr in + check_valid_length length arr; + let values : ('a, _) Dummy.with_dummy array = + if length = capacity then + arr + else (* length < capacity: make a copy *) + Dummy.Array.prefix arr length + in + let values : 'a array = + try Dummy.Array.unsafe_nocopy_to_array ~dummy values + with Dummy.Array.Dummy_found i -> Error.missing_element ~i ~length + in + unsafe_iarray_of_array values diff --git a/stdlib/dynarray.mli b/stdlib/dynarray.mli index c638ddb5..b3436fa4 100644 --- a/stdlib/dynarray.mli +++ b/stdlib/dynarray.mli @@ -323,8 +323,24 @@ val for_all : ('a -> bool) -> 'a t -> bool (** [for_all f a] is [true] if all elements of [a] satisfy [f]. This includes the case where [a] is empty. - For example, if the elements of [a] are [x0], [x1], then - [exists f a] is [f x0 && f x1 && f x2]. + For example, if the elements of [a] are [x0], [x1], [x2], then + [for_all f a] is [f x0 && f x1 && f x2]. +*) + +val exists2 : ('a -> 'b -> bool) -> 'a t -> 'b t -> bool +(** Same as {!exists}, but for a two-argument predicate. + + @raise Invalid_argument if the two arrays have different lengths. + + @since 5.4 +*) + +val for_all2 : ('a -> 'b -> bool) -> 'a t -> 'b t -> bool +(** Same as {!for_all}, but for a two-argument predicate. + + @raise Invalid_argument if the two arrays have different lengths. + + @since 5.4 *) val mem : 'a -> 'a t -> bool @@ -390,10 +406,9 @@ val equal : ('a -> 'a -> bool) -> 'a t -> 'a t -> bool *) val compare : ('a -> 'a -> int) -> 'a t -> 'a t -> int -(** Provided the function [cmp] defines a preorder on elements, - [compare cmp a b] compares first [a] and [b] by their length, - and then, if equal, by their elements according to - the lexicographic preorder. +(** [compare cmp a b] compares [a] and [b] according to the shortlex order, + that is, shorter arrays are smaller and equal-sized arrays are compared + in lexicographic order using [cmp] to compare elements. For more details on comparison functions, see {!Array.sort}. @@ -583,6 +598,20 @@ val reset : 'a t -> unit in the backing array at index [length a] or later. *) +val unsafe_to_iarray : capacity:int -> ('a t -> unit) -> 'a iarray +(** [unsafe_to_iarray ~capacity f] calls [f] on a new empty dynarray with the + given [capacity], then turns it into an immutable array without a copy, + when possible, that is, if two conditions hold: + - the array elements are not floats, and + - after [f] returned, the array's capacity is equal to its length. + + Note that the [capacity] argument is only a hint. For example, nothing + prevents from calling {!val:fit_capacity} at the end of [f]. + + This function is unsafe because type safety may be broken by concurrent + writes to the dynarray from other domains, without proper synchronization, + before [f] returns. *) + (** {1:examples Code examples} diff --git a/stdlib/effect.mli b/stdlib/effect.mli index c9b3198e..1f640c3d 100644 --- a/stdlib/effect.mli +++ b/stdlib/effect.mli @@ -12,16 +12,16 @@ (* *) (**************************************************************************) -[@@@alert unstable - "The Effect interface may change in incompatible ways in the future." -] - (** Effects. See 'Language extensions/Effect handlers' section in the manual. @since 5.0 *) +[@@@alert unstable + "The Effect interface may change in incompatible ways in the future." +] + type 'a t = 'a eff = .. (** The type of effects. *) diff --git a/stdlib/either.ml b/stdlib/either.ml index 9ea2f893..6dd48702 100644 --- a/stdlib/either.ml +++ b/stdlib/either.ml @@ -26,6 +26,14 @@ let is_right = function | Left _ -> false | Right _ -> true +let get_left = function +| Left v -> v +| Right _ -> invalid_arg "Either.t is Right _" + +let get_right = function +| Left _ -> invalid_arg "Either.t is Left _" +| Right v -> v + let find_left = function | Left v -> Some v | Right _ -> None @@ -50,6 +58,10 @@ let fold ~left ~right = function | Left v -> left v | Right v -> right v +let retract = function +| Left v -> v +| Right v -> v + let iter = fold let for_all = fold diff --git a/stdlib/either.mli b/stdlib/either.mli index 3d907b4c..09cc6f56 100644 --- a/stdlib/either.mli +++ b/stdlib/either.mli @@ -69,6 +69,20 @@ val is_left : ('a, 'b) t -> bool val is_right : ('a, 'b) t -> bool (** [is_right (Left v)] is [false], [is_right (Right v)] is [true]. *) +val get_left : ('a, 'b) t -> 'a +(** [get_left e] is [v] if [e] is [Left v] and raise otherwise. + + @raise Invalid_argument if [e] is [Right _]. + + @since 5.4 *) + +val get_right : ('a, 'b) t -> 'b +(** [get_right e] is [v] if [e] is [Right v] and raise otherwise. + + @raise Invalid_argument if [e] is [Left _]. + + @since 5.4 *) + val find_left : ('a, 'b) t -> 'a option (** [find_left (Left v)] is [Some v], [find_left (Right _)] is [None] *) @@ -92,6 +106,11 @@ val fold : left:('a -> 'c) -> right:('b -> 'c) -> ('a, 'b) t -> 'c (** [fold ~left ~right (Left v)] is [left v], and [fold ~left ~right (Right v)] is [right v]. *) +val retract : ('a, 'a) t -> 'a +(** [retract (Left v)] is [v], and [retract (Right v)] is [v]. + + @since 5.4 *) + val iter : left:('a -> unit) -> right:('b -> unit) -> ('a, 'b) t -> unit (** [iter ~left ~right (Left v)] is [left v], and [iter ~left ~right (Right v)] is [right v]. *) diff --git a/stdlib/ephemeron.ml b/stdlib/ephemeron.ml index 920e667c..64b9534c 100644 --- a/stdlib/ephemeron.ml +++ b/stdlib/ephemeron.ml @@ -660,7 +660,7 @@ module Kn = struct let equal c k = let len = Array.length k in let len' = length c in - if len != len' then GenHashTable.EFalse + if len <> len' then GenHashTable.EFalse else let rec equal_array k c i = if i < 0 then GenHashTable.ETrue diff --git a/stdlib/ephemeron.mli b/stdlib/ephemeron.mli index 9391a7d3..f8876465 100644 --- a/stdlib/ephemeron.mli +++ b/stdlib/ephemeron.mli @@ -73,8 +73,8 @@ (** Unsynchronized accesses to a weak hash table may lead to an invalid - weak hash table state. Thus, concurrent accesses to a buffer must be - synchronized (for instance with a {!Mutex.t}). + weak hash table state. Thus, concurrent accesses to a weak hash table + must be synchronized (for instance with a {!Mutex.t}). *) module type S = sig diff --git a/stdlib/filename.ml b/stdlib/filename.ml index bd061a77..c98b1a59 100644 --- a/stdlib/filename.ml +++ b/stdlib/filename.ml @@ -160,9 +160,9 @@ module Win32 : SYSDEPS = struct else None + external temp_dir_name: unit -> string = "caml_sys_temp_dir_name" + let temp_dir_name = temp_dir_name () - let temp_dir_name = - try Sys.getenv "TEMP" with Not_found -> "." let quote s = let l = String.length s in let b = Buffer.create (l + 20) in diff --git a/stdlib/filename.mli b/stdlib/filename.mli index dcfce109..09e620ef 100644 --- a/stdlib/filename.mli +++ b/stdlib/filename.mli @@ -183,9 +183,15 @@ val get_temp_dir_name : unit -> string (** The name of the temporary directory: Under Unix, the value of the [TMPDIR] environment variable, or "/tmp" if the variable is not set. - Under Windows, the value of the [TEMP] environment variable, or "." - if the variable is not set. + + Under Windows, the value returned by [GetTempPath2] (if available) + or [GetTempPath]. + The temporary directory can be changed with {!Filename.set_temp_dir_name}. + + Under Windows, before OCaml 5.4, it would return the value of the + [TEMP] environment variable, or "." if the variable was not set. + @since 4.00 *) diff --git a/stdlib/float.ml b/stdlib/float.ml index 41b4d376..afa3c292 100644 --- a/stdlib/float.ml +++ b/stdlib/float.ml @@ -185,13 +185,14 @@ module Array = struct external unsafe_fill : t -> (int[@untagged]) -> (int[@untagged]) -> (float[@unboxed]) -> unit - = "caml_floatarray_fill" "caml_floatarray_fill_unboxed" + = "caml_floatarray_fill" "caml_floatarray_fill_unboxed" [@@noalloc] external unsafe_blit: t -> int -> t -> int -> int -> unit = "caml_floatarray_blit" [@@noalloc] external unsafe_sub : t -> int -> int -> t = "caml_floatarray_sub" external append_prim : t -> t -> t = "caml_floatarray_append" + external concat : t list -> t = "caml_floatarray_concat" let check a ofs len msg = if ofs < 0 || len < 0 || ofs + len < 0 || ofs + len > length a then @@ -234,28 +235,6 @@ module Array = struct end; res - (* next 3 functions: modified copy of code from string.ml *) - let ensure_ge (x:int) y = - if x >= y then x else invalid_arg "Float.Array.concat" - - let rec sum_lengths acc = function - | [] -> acc - | hd :: tl -> sum_lengths (ensure_ge (length hd + acc) acc) tl - - let concat l = - let len = sum_lengths 0 l in - let result = create len in - let rec loop l i = - match l with - | [] -> assert (i = len) - | hd :: tl -> - let hlen = length hd in - unsafe_blit hd 0 result i hlen; - loop tl (i + hlen) - in - loop l 0; - result - let sub a ofs len = check a ofs len "Float.Array.sub"; unsafe_sub a ofs len @@ -271,7 +250,8 @@ module Array = struct else if length a2 = 0 then unsafe_sub a1 0 l1 else append_prim a1 a2 - let fill a ofs len v = + (* inlining exposes a float-unboxing opportunity for [v] *) + let[@inline] fill a ofs len v = check a ofs len "Float.Array.fill"; unsafe_fill a ofs len v @@ -292,6 +272,25 @@ module Array = struct in fill 0 l + (* duplicated from array.ml *) + let equal eq a b = + if length a <> length b then false else + let i = ref 0 in + let len = length a in + while !i < len && eq (unsafe_get a !i) (unsafe_get b !i) do incr i done; + !i = len + + let float_compare = compare + (* duplicated from array.ml *) + let compare cmp a b = + let len_a = length a and len_b = length b in + let diff = len_a - len_b in + if diff <> 0 then (if diff < 0 then -1 else 1) else + let i = ref 0 and c = ref 0 in + while !i < len_a && !c = 0 + do c := cmp (unsafe_get a !i) (unsafe_get b !i); incr i done; + !c + (* duplicated from array.ml *) let iter f a = for i = 0 to length a - 1 do f (unsafe_get a i) done @@ -387,7 +386,7 @@ module Array = struct let n = length a in let rec loop i = if i = n then false - else if compare (unsafe_get a i) x = 0 then true + else if float_compare (unsafe_get a i) x = 0 then true else loop (i + 1) in loop 0 diff --git a/stdlib/float.mli b/stdlib/float.mli index 9aba8ce5..179feadc 100644 --- a/stdlib/float.mli +++ b/stdlib/float.mli @@ -601,6 +601,22 @@ module Array : sig @raise Invalid_argument if the length of [l] is greater than [Sys.max_floatarray_length].*) + (** {1:comparison Comparison} *) + + val equal : (float -> float -> bool) -> t -> t -> bool + (** [equal eq a b] is [true] if and only if [a] and [b] have the + same length [n] and for all [i] in \[[0];[n-1]\], [eq a.(i) b.(i)] + is [true]. + + @since 5.4 *) + + val compare : (float -> float -> int) -> t -> t -> int + (** [compare cmp a b] compares [a] and [b] according to the shortlex order, + that is, shorter arrays are smaller and equal-sized arrays are compared + in lexicographic order using [cmp] to compare elements. + + @since 5.4 *) + (** {1 Iterators} *) val iter : (float -> unit) -> t -> unit @@ -968,6 +984,22 @@ module ArrayLabels : sig @raise Invalid_argument if the length of [l] is greater than [Sys.max_floatarray_length].*) + (** {1:comparison Comparison} *) + + val equal : eq:(float -> float -> bool) -> t -> t -> bool + (** [equal eq a b] is [true] if and only if [a] and [b] have the + same length [n] and for all [i] in \[[0];[n-1]\], [eq a.(i) b.(i)] + is [true]. + + @since 5.4 *) + + val compare : cmp:(float -> float -> int) -> t -> t -> int + (** [compare cmp a b] compares [a] and [b] according to the shortlex order, + that is, shorter arrays are smaller and equal-sized arrays are compared + in lexicographic order using [cmp] to compare elements. + + @since 5.4 *) + (** {1 Iterators} *) val iter : f:(float -> unit) -> t -> unit diff --git a/stdlib/format.ml b/stdlib/format.ml index fbf41757..622600f5 100644 --- a/stdlib/format.ml +++ b/stdlib/format.ml @@ -168,6 +168,7 @@ type formatter = { mutable pp_ellipsis : string; (* Output function. *) mutable pp_out_string : string -> int -> int -> unit; + mutable pp_out_width : string -> pos:int -> len:int -> int; (* Flushing function. *) mutable pp_out_flush : unit -> unit; (* Output of new lines. *) @@ -202,6 +203,7 @@ type formatter_stag_functions = { (* The formatter functions to output material. *) type formatter_out_functions = { out_string : string -> int -> int -> unit; + out_width: string -> pos:int -> len:int -> int; out_flush : unit -> unit; out_newline : unit -> unit; out_spaces : int -> unit; @@ -250,8 +252,10 @@ let pp_infinity = 1000000010 (* Output functions for the formatter. *) let pp_output_string state s = state.pp_out_string s 0 (String.length s) +let pp_string_width state s = state.pp_out_width s ~pos:0 ~len:(String.length s) and pp_output_substring state ~pos ~len s = state.pp_out_string s pos len +and pp_substring_width state ~pos ~len s = state.pp_out_width s ~pos ~len and pp_output_newline state = state.pp_out_newline () and pp_output_spaces state n = state.pp_out_spaces n and pp_output_indent state n = state.pp_out_indent n @@ -270,7 +274,7 @@ let format_pp_substring state size ~pos ~len source = (* Format a string by its length, if not empty *) let format_string state s = - if s <> "" then format_pp_text state (String.length s) s + if s <> "" then format_pp_text state (pp_string_width state s) s (* To format a break, indenting a new line. *) let break_new_line state (before, offset, after) width = @@ -390,7 +394,7 @@ let format_pp_token state size = function end | Pp_if_newline -> - if state.pp_current_indent != state.pp_margin - state.pp_space_left + if state.pp_current_indent <> state.pp_margin - state.pp_space_left then pp_skip_token state | Pp_break { fits; breaks } -> @@ -400,13 +404,13 @@ let format_pp_token state size = function | Some { box_type; width } -> begin match box_type with | Pp_hovbox -> - if size + String.length before > state.pp_space_left + if size + pp_string_width state before > state.pp_space_left then break_new_line state breaks width else break_same_line state fits | Pp_box -> (* Have the line just been broken here ? *) if state.pp_is_new_line then break_same_line state fits else - if size + String.length before > state.pp_space_left + if size + pp_string_width state before > state.pp_space_left then break_new_line state breaks width else (* break the line here leads to new indentation ? *) if state.pp_current_indent > state.pp_margin - width + off @@ -442,11 +446,15 @@ let rec advance_left state = | Some { size; token; length } -> let pending_count = state.pp_right_total - state.pp_left_total in if Size.is_known size || pending_count >= state.pp_space_left then begin - Queue.take state.pp_queue |> ignore; (* Not empty: we peek into it *) - let size = if Size.is_known size then Size.to_int size else pp_infinity in - format_pp_token state size token; - state.pp_left_total <- length + state.pp_left_total; - (advance_left [@tailcall]) state + match Queue.take_opt state.pp_queue with + | None -> invalid_arg "Format: Unsynchronized access to formatter" + | Some _ -> (* Not empty: we peek into it *) + let size = + if Size.is_known size then Size.to_int size else pp_infinity + in + format_pp_token state size token; + state.pp_left_total <- length + state.pp_left_total; + (advance_left [@tailcall]) state end @@ -464,7 +472,8 @@ let enqueue_substring_as ~pos ~len state size source = enqueue_advance state { size; token; length = Size.to_int size } let enqueue_string state s = - enqueue_string_as state (Size.of_int (String.length s)) s + let size = pp_string_width state s in + enqueue_string_as state (Size.of_int size) s (* Routines for scan stack @@ -644,14 +653,15 @@ let pp_print_as state isize s = let pp_print_string state s = - pp_print_as state (String.length s) s + pp_print_as state (pp_string_width state s) s let pp_print_substring_as ~pos ~len state size s = if state.pp_curr_depth < state.pp_max_boxes then enqueue_substring_as ~pos ~len state (Size.of_int size) s let pp_print_substring ~pos ~len state s = - pp_print_substring_as ~pos ~len state len s + let width = pp_substring_width state ~pos ~len s in + pp_print_substring_as ~pos ~len state width s let pp_print_bytes state s = pp_print_as state (Bytes.length s) (Bytes.to_string s) @@ -715,7 +725,11 @@ let pp_print_custom_break state ~fits ~breaks = if state.pp_curr_depth < state.pp_max_boxes then let size = Size.of_int (- state.pp_right_total) in let token = Pp_break { fits; breaks } in - let length = String.length before + width + String.length after in + let length = + pp_string_width state before + + width + + pp_string_width state after + in let elem = { size; token; length } in scan_push state true elem @@ -883,12 +897,14 @@ let pp_update_geometry state update = (* Setting a formatter basic output functions. *) let pp_set_formatter_out_functions state { out_string = f; + out_width = f2; out_flush = g; out_newline = h; out_spaces = i; out_indent = j; } = state.pp_out_string <- f; + state.pp_out_width <- f2; state.pp_out_flush <- g; state.pp_out_newline <- h; state.pp_out_spaces <- i; @@ -896,6 +912,7 @@ let pp_set_formatter_out_functions state { let pp_get_formatter_out_functions state () = { out_string = state.pp_out_string; + out_width = state.pp_out_width; out_flush = state.pp_out_flush; out_newline = state.pp_out_newline; out_spaces = state.pp_out_spaces; @@ -953,6 +970,18 @@ let default_pp_mark_close_tag = function let default_pp_print_open_tag = ignore let default_pp_print_close_tag = ignore +let utf_8_scalar_width s ~pos ~len = + let rec width s count current stop = + if current >= stop then count + else + let decode = String.get_utf_8_uchar s current in + let advance = Uchar.utf_decode_length decode in + width s (count + 1) (current+advance) stop + in + width s 0 pos (pos + len) + +let ascii_width _ ~pos:_ ~len = len + (* Building a formatter given its basic output functions. Other fields get reasonable default values. *) let pp_make_formatter f g h i j = @@ -964,6 +993,7 @@ let pp_make_formatter f g h i j = let scan_stack = Stack.create () in initialize_scan_stack scan_stack; Stack.push { left_total = 1; queue_elem = sys_tok } scan_stack; + let pp_out_width = utf_8_scalar_width in let pp_margin = 78 and pp_min_space_left = 10 in { @@ -988,6 +1018,7 @@ let pp_make_formatter f g h i j = pp_out_newline = h; pp_out_spaces = i; pp_out_indent = j; + pp_out_width; pp_print_tags = false; pp_mark_tags = false; pp_mark_open_tag = default_pp_mark_open_tag; @@ -1304,7 +1335,7 @@ let pp_print_text ppf s = let left = ref 0 in let right = ref 0 in let flush () = - pp_print_substring ppf s ~pos:!left ~len:(!right - !left); + pp_print_substring ~pos:!left ~len:(!right - !left) ppf s; incr right; left := !right; in while (!right <> len) do @@ -1320,6 +1351,53 @@ let pp_print_text ppf s = done; if !left <> len then flush () +(* To format free-flowing text *) +let format_text fmt6 = + let open CamlinternalFormatBasics in + let Format(fmt,_) = fmt6 in + let cons_space ~spaces fmt = Formatting_lit (Break("",spaces,0), fmt) in + let rec skip_and_count_whites spaces newlines len s pos = + if pos >= len then pos, spaces, newlines else + match s.[pos] with + | ' ' -> skip_and_count_whites (1+spaces) newlines len s (1+pos) + | '\n' -> skip_and_count_whites spaces (1+newlines) len s (1+pos) + | _ -> pos, spaces, newlines + in + let[@tail_mod_cons] rec split len s pos fmt = + if pos >= len then fmt + else + let space = String.index_from_opt s pos ' ' in + let newline = String.index_from_opt s pos '\n' in + let first = match space, newline with + | Some x, Some y -> Some (min x y) + | None, x | x, None -> x + in + match first with + | None -> + String_literal(String.sub s pos (len-pos), fmt) + | Some sep -> + let before = String.sub s pos (sep-pos) in + let pos, spaces, newlines = skip_and_count_whites 0 0 len s sep in + let repeat, break = + match newlines, spaces with + | (0|1), spaces -> 1, Break("", max spaces 1, 0) + | bl, _ -> bl, Force_newline + in + String_literal(before, cons ~repeat break len s pos fmt) + and[@tail_mod_cons] cons ~repeat break len s pos fmt = + if repeat = 0 then + split len s pos fmt + else + Formatting_lit (break, cons ~repeat:(repeat-1) break len s pos fmt) + in + let concat s fmt = match s with + | `Char (' '|'\n') -> cons_space ~spaces:1 fmt + | `Char c -> Char_literal(c,fmt) + | `String s -> split (String.length s) s 0 fmt in + let fmt = string_concat_map {f=concat} fmt in + Format(fmt, CamlinternalFormat.string_of_fmt fmt) + + let pp_print_option ?(none = fun _ () -> ()) pp_v ppf = function | None -> none ppf () | Some v -> pp_v ppf v diff --git a/stdlib/format.mli b/stdlib/format.mli index d3ca564f..5a803d0f 100644 --- a/stdlib/format.mli +++ b/stdlib/format.mli @@ -45,7 +45,8 @@ {b Warning}: Since {{!section:formatter}formatters} contain mutable state, it is not thread-safe to use the same formatter on multiple - domains in parallel without synchronization. + domains in parallel without synchronization. This may result in + [Invalid_argument] being raised or an unspecified behavior. If multiple domains write to the same output channel using the predefined formatters (as obtained by {!get_std_formatter} or @@ -861,6 +862,7 @@ val get_formatter_output_functions : type formatter_out_functions = { out_string : string -> int -> int -> unit; + out_width: string -> pos:int -> len:int -> int; (** @since 5.4 *) out_flush : unit -> unit; out_newline : unit -> unit; out_spaces : int -> unit; @@ -871,6 +873,13 @@ type formatter_out_functions = { It is called with a string [s], a start position [p], and a number of characters [n]; it is supposed to output characters [p] to [p + n - 1] of [s]. +- the [out_width] function informs the formatting engine of the width of the + substring as rendered on the output device. Explicit width information as + provided by [@], {!pp_print_as} or {!pp_print_substring_as} takes priority + over this function. Moreover, the formatting engine evaluates the width of the + string arguments of {!pp_print_string} and substring arguments of + {!pp_print_substring} as a whole. Consequently, [out_width] can be used to + compute an approximative width for unicode substrings. - the [out_flush] function flushes the pretty-printer output device. - [out_newline] is called to open a new line when the pretty-printer splits the line. @@ -885,6 +894,8 @@ type formatter_out_functions = { (e.g. {!Stdlib.output_string} and {!Stdlib.flush} for a {!Stdlib.out_channel} device, or [Buffer.add_substring] and {!Stdlib.ignore} for a [Buffer.t] output device), +- field [out_width] is the number of unicode scalar values + (see {!utf_8_scalar_width}) in the substring. - field [out_newline] is equivalent to [out_string "\n" 0 1]; - fields [out_spaces] and [out_indent] are equivalent to [out_string (String.make n ' ') 0 n]. @@ -903,9 +914,9 @@ val set_formatter_out_functions : formatter_out_functions -> unit lines opening (which can be connected to any other action needed by the application at hand). - Reasonable defaults for functions [out_spaces] and [out_newline] are - respectively [out_funs.out_string (String.make n ' ') 0 n] and - [out_funs.out_string "\n" 0 1]. + Reasonable defaults for functions [out_spaces], [out_newline], and [out_width] + are respectively [out_funs.out_string (String.make n ' ') 0 n], + [out_funs.out_string "\n" 0 1] and {!utf_8_scalar_width}. @since 4.01 *) @@ -918,6 +929,18 @@ val get_formatter_out_functions : unit -> formatter_out_functions @since 4.01 *) +val utf_8_scalar_width: string -> pos:int -> len:int -> int +(** [utf_8_scalar_width s ~pos ~len] is the number of unicode scalar values in + the substring [String.sub s pos len]. Invalid byte sequences are implictly + replaced by [U+FFFD] since this yields a better width approximation for + other ascii-based encoding scheme like ISO-8859-15. This is the default + [out_width] function since OCaml 5.4. + @since 5.4 *) + +val ascii_width: string -> pos:int -> len:int -> int +(** [ascii_width s ~pos ~len] is [len]. + @since 5.4 *) + (** {1:tagsmeaning Redefining semantic tag operations} *) type formatter_stag_functions = { @@ -1246,6 +1269,20 @@ val pp_print_text : formatter -> string -> unit @since 4.02 *) +val format_text: ('a,'b,'c,'d,'e,'f) format6 -> ('a,'b,'c,'d,'e,'f) format6 +(** [format_text fmt] replaces spaces and newlines in the format string literal + [fmt] with hint breaks or forced newlines: + - Blank lines (lines made only of spaces ([U+0020])) are replaced by ["\@n"]. + - Sequences of spaces and a newline ([U+000A]) preceding a blank line are + replaced by ["\@n"]: blank lines remain blank lines in the output. + - Remaining sequences made of [k] spaces and newlines are replaced + by ["@;<0 k'>"] where [k' = max 1 k] is at least [1]. + - Breaks can be avoided using non-breaking space characters ([U+00A0]). + - Lines can be forced by using ["@\n"] +@since 5.4 +*) + + val pp_print_option : ?none:(formatter -> unit -> unit) -> (formatter -> 'a -> unit) -> (formatter -> 'a option -> unit) diff --git a/stdlib/fun.mli b/stdlib/fun.mli index 8d6f4440..9ebf6b67 100644 --- a/stdlib/fun.mli +++ b/stdlib/fun.mli @@ -15,6 +15,8 @@ (** Function manipulation. + See {{!examples} the examples} below. + @since 4.08 *) (** {1:combinators Combinators} *) @@ -67,3 +69,172 @@ exception Finally_raised of exn an unexpected exception or a programming error. As a general rule, one should not catch a [Finally_raised] exception except as part of a catch-all handler. *) + +(** {1:examples Examples} + +{2 Combinators} + +{{!combinators}Combinators} provide a lightweight and sometimes more readable +way to create anonymous functions, best used as short-lived arguments rather +than standalone definitions. The examples below will demonstrate this mainly +with the {!module:List} module. + + +{3:hid {{!val:id}id}} + +{!val:List.init} with the index itself +{[ + # List.init 3 Fun.id;; + - : int list = [0; 1; 2] +]} + +Using {!val:List.filter_map} on an [int option list] to filter out +{{!const:Option.t.None}[None]} elements +{[ + # List.filter_map Fun.id [None; Some 2; Some 3; None; Some 5];; + - : int list = [2; 3; 5] +]} + +Conditionally dispatching functions of type [foo -> foo] or taking them as +arguments is another place where [id] may be useful. Consider a primitive +logging function which prints a string but gives its user the option to +preformat the string before printing, e.g. to insert a time-stamp +{[ + let log ?(preformat : string -> string = Fun.id) message = + print_endline (preformat message) +]} +Whenever we may build up closures, [id] is often used for the base-case as a +no-op. Consider a function which chains a list of unary functions: +{[ + let rec chain = function + | [] -> Fun.id + | f :: fs -> fun x -> f (chain fs x) +]} + + +{3:hconst {{!val:const}const}} + +{!val:List.init} a list of zeros +{[ + # List.init 3 (Fun.const 0);; + - : int list = [0; 0; 0] +]} + +An allow-all predicate that could be passed to any filtering function e.g. +{!val:List.filter} to disable filtration and get back all values +{[ + # List.filter (Fun.const true) [1; 2; 3];; + - : int list = [1; 2; 3] +]} + +Note that applying [const (...)] evaluates the expression [(...)] once, and +returns a function that only has the result of this evaluation. To demonstrate +this, consider if [(...)] was a call to {!val:Random.bool}[()]: + +[List.init n (Fun.const (Random.bool()))] for any [n > 0] will have {e exactly +two} possible outcomes, +{ul {- [[true; true; ...; true]]} {- [[false; false; ...; false]]}} +whereas [List.init n (fun _ -> Random.bool())] will have 2{^n} possible +outcomes, because the randomness effect is performed with every element. + +For more real-world uses, consider {!val:String.spellcheck} with a constant max +distance of 2, instead of the default variable max distance +{[ + let spellcheck known_words word = + let dict_iter yield = List.iter yield known_words in + String.spellcheck ~max_dist:(Fun.const 2) dict_iter word +]} + + +{3:hflip {{!val:flip}flip}} + +Useing [flip] to reverse the comparator passed to {!val:List.sort}, which sorts +in the opposite order +{[ + # List.sort (Fun.flip Int.compare) [5; 3; 9; 0; 1; 6; 8];; + - : int list = [9; 8; 6; 5; 3; 1; 0] +]} + +Reversing a list by accumulating a new list using {!val:List.fold_left}, which +expects the accumulator to be the first argument of the function passed to it. +We pass {!val:List.cons} which has the list as the second argument, so [flip] +is useful here +{[ + # List.fold_left (Fun.flip List.cons) [] [1; 2; 3];; + - : int list = [3; 2; 1] +]} + +Interestingly, [flip] can work with functions that aren't binary, by flipping +the first two arguments and leaving the rest in order. This is because a +function that takes [n+2] arguments is, conceptually, a binary function which +returns a function that takes [n] arguments. +Given a function [f : a -> b -> c -> d]: +{ul +{- [flip f] will have type [b -> a -> c -> d]} +{- [fun x -> flip (f x)] will have type [a -> c -> b -> d]}} +Using [flip] with non-binary functions like this is discouraged, for its +negative impact on readability and reasoning. + + +{3:hnegate {{!val:negate}negate}} + +Mainly used for reversing a predicate in a function which expects one, like +{!val:List.find_all} and similar functions + +Finding all lists which are {e not} empty using {!val:List.is_empty} +{[ + # List.find_all (Fun.negate List.is_empty) [[0]; [1; 2; 3]; []; [4; 5]];; + - : int list list = [[0]; [1; 2; 3]; [4; 5]] +]} + +From a given list of paths, finding all paths which are {e not} occupied using +{!val:Sys.file_exists} +{[ + # List.find_all (Fun.negate Sys.file_exists);; + - : string list -> string list = +]} + + +{3:hcompose {{!val:compose}compose}} + +{!val:List.map} on pair elements with a function on the second element +{[ + # List.map (Fun.compose String.length snd) [1, "one"; 2, "two"; 3, "three"];; + - : int list = [3; 3; 5] +]} + +A potential implementation of {!val:negate} +{[ + let negate f = Fun.compose not f +]} + +From the {{!hid}[chain] example}, [compose] could have been used in the +recursive branch +{[ + let rec chain = function + | [] -> Fun.id + | f :: fs -> Fun.compose f (chain fs) +]} +Or even more concisely +{[ + let chain fs = List.fold_right Fun.compose fs Fun.id +]} + +From the {{!hflip}[spellcheck] example}, [compose] and [flip] could be used to +condense the function definition so it becomes +{[ + # Fun.compose + (String.spellcheck ~max_dist:(Fun.const 2)) + (Fun.flip List.iter) + ;; + - : string list -> string -> string list = +]} +As can be seen here, this heavily impacts readability and the ability to reason +about the function. Both [String.spellcheck] and [Fun.flip] are not unary, so +there is a non-trivial interaction with partial-application in this definition. + +Heavy use of these combinators in OCaml is generally discouraged, not only +because they can quickly impact readability and reasoning, but also because the +produced functions are often in value form, thus subject to the Value +Restriction (see the manual section 6.1.2). +*) diff --git a/stdlib/gc.ml b/stdlib/gc.ml index dfb4261d..c10640fb 100644 --- a/stdlib/gc.ml +++ b/stdlib/gc.ml @@ -126,7 +126,14 @@ let[@inline never] create_alarm f = module Memprof = struct type t - type allocation_source = Normal | Marshal | Custom + + type allocation_source = Normal | Marshal | Custom | Map_file + let string_of_allocation_source = function + | Normal -> "Normal" + | Marshal -> "Marshal" + | Custom -> "Custom" + | Map_file -> "Map_file" + type allocation = { n_samples : int; size : int; @@ -163,3 +170,27 @@ module Memprof = external discard : t -> unit = "caml_memprof_discard" end + + + +type suspended_collection_work = int +(* Note: we do not currently expose this type outside the module, + because it could plausibly change in the future. In particular, + currently the runtime only track major allocations during ramp-up + work, but there are other sources of GC pressure, such as custom + block allocation, that could be tracked as well and should probably + be tracked separately. This suggests that the type of suspended work + could become a record of integers instead of one integer. + + On the other hand, it would be nice to let users, say, smooth out + suspended work by splitting it in N smaller parts to be ramped down + separately. This would be possible by exposing the type as int, or + possibly by defining a division/splitting function for the abstract + type. +*) + +external ramp_up : (unit -> 'a) -> 'a * suspended_collection_work + = "caml_ml_gc_ramp_up" + +external ramp_down : suspended_collection_work -> unit + = "caml_ml_gc_ramp_down" diff --git a/stdlib/gc.mli b/stdlib/gc.mli index 706e9608..5d531adf 100644 --- a/stdlib/gc.mli +++ b/stdlib/gc.mli @@ -140,17 +140,19 @@ type control = (** This value controls the GC messages on standard error output. It is a sum of some of the following flags, to print messages on the corresponding events: - - [0x001] Start and end of major GC cycle. - - [0x002] Minor collection and major GC slice. - - [0x004] Growing and shrinking of the heap. - - [0x008] Resizing of stacks and memory manager tables. - - [0x010] Heap compaction. - - [0x020] Change of GC parameters. - - [0x040] Computation of major GC slice size. - - [0x080] Calling of finalisation functions. - - [0x100] Bytecode executable and shared library search at start-up. - - [0x200] Computation of compaction-triggering condition. - - [0x400] Output GC statistics at program exit. + - [0x0001] Start and end of major GC cycle. + - [0x0002] Minor collection and major GC slice. + - [0x0004] Growing and shrinking of the heap. + - [0x0008] Resizing of stacks and memory manager tables. + - [0x0010] Heap compaction. + - [0x0020] Change of GC parameters. + - [0x0040] Computation of major GC slice size. + - [0x0080] Calling of finalisation functions. + - [0x0100] Bytecode executable and shared library search at start-up. + - [0x0200] Computation of compaction-triggering condition. + - [0x0400] Output GC statistics at program exit. + - [0x0800] GC debugging messages. + - [0x1000] Address space reservation changes. Default: 0. *) max_overhead : int; @@ -472,7 +474,9 @@ module Memprof : type t (** the type of a profile *) - type allocation_source = Normal | Marshal | Custom + type allocation_source = Normal | Marshal | Custom | Map_file + val string_of_allocation_source : allocation_source -> string + type allocation = private { n_samples : int; (** The number of samples in this block (>= 1). *) @@ -583,3 +587,54 @@ module Memprof : called on a profile which has not been stopped. *) end + + +type suspended_collection_work + +external ramp_up : (unit -> 'a) -> 'a * suspended_collection_work + = "caml_ml_gc_ramp_up" +(** In general, the OCaml GC assumes that the program runs in + a "steady state" where peak memory usage remains constant: for + each newly allocated work, it assumes that one work has become + unreachable and will try to collect it during the next GC slice. + + This assumption is incorrect at the points during program + execution where the live memory increases instead of remaining + stable: the steady-state assumption will make the GC work harder + at no benefit as it will not find more memory to collect. + + [ramp_up f] puts the current domain in a "ramp-up" phase for the + duration of the evaluation of [f ()], letting the GC know that the + steady-state assumption does not hold; it should be used when you + know that the live memory of the program will increase + significantly. + + During a ramp-up phase, the GC will not try to work harder for new + allocations: the corresponding collection work is "suspended". The + total amount of suspended collection work is returned by [ramp_up] + along with the result of the function. + + If the user discards this suspended work (by doing nothing + with it), the GC will never accelerate to recover the + corresponding amount of memory. This is appropriate if the ramp-up + work allocates long-lived memory that remains live until the end + of the program execution. + + If the user knows that at a certain point in the program the live + memory consumption has been reduced by the corresponding amount -- + typically, because the memory allocated during [ramp_up] has become + unused -- then they should call {!ramp_down} below to have the GC + "resume" this collection work. + + If [f ()] raises an exception, the ramp-up phase terminates, the + collection work that was suspended is resumed, and the exception + is re-raised. + + If [f ()] performs an effect, the effect is not handled and an + [Effect.Unhandled] exception is thrown instead. +*) + +external ramp_down : suspended_collection_work -> unit + = "caml_ml_gc_ramp_down" +(** Notify the GC about some amount of collection work that was + suspended during a ramp-up phase, to be resumed now. *) diff --git a/stdlib/hashbang b/stdlib/hashbang deleted file mode 100644 index 04c9334b..00000000 --- a/stdlib/hashbang +++ /dev/null @@ -1 +0,0 @@ -#! \ No newline at end of file diff --git a/stdlib/header.c b/stdlib/header.c index 164bf9de..3e71883f 100644 --- a/stdlib/header.c +++ b/stdlib/header.c @@ -21,7 +21,7 @@ #include #include #include "caml/s.h" -#ifdef HAS_UNISTD +#ifndef _WIN32 #include #endif #include @@ -160,7 +160,7 @@ static char * read_runtime_path(int fd) return runtime_path; } -static void errwrite(char * msg) +static void errwrite(const char * msg) { fputs(msg, stderr); } diff --git a/stdlib/iarray.ml b/stdlib/iarray.ml new file mode 100644 index 00000000..8e4c9e49 --- /dev/null +++ b/stdlib/iarray.ml @@ -0,0 +1,334 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Antal Spector-Zabusky, Jane Street, New York *) +(* *) +(* Copyright 2023 Jane Street Group LLC *) +(* *) +(* All rights reserved. This file is distributed under the terms of *) +(* the GNU Lesser General Public License version 2.1, with the *) +(* special exception on linking described in the file LICENSE. *) +(* *) +(**************************************************************************) + +open! Stdlib + +(* In this file, we use four different implementation strategies: + + 1. Reusing [external]s for mutable arrays. (E.g., [get].) + 2. Copying implementations from [array.ml], which in this new context read + from immutable arrays. (E.g., [iter].) + 3. As (2), but they construct a mutable array, which we unsafely + reinterpret as an immutable array at the very end (E.g., [map].) + 4. (Only for sorting.) Copying the immutable array and passing it to a + mutating function. (E.g., [sort].) + + The first and third strategies are safe because mutable and immutable arrays + have the same runtime representation, and we only apply them to functions + that satisfy the following three properties: + + A. They do not mutate their array inputs; + B. They do not hold on to their array inputs; and + C. They return a fresh array if they return an array. + + We do not expose other primitives (e.g., [unsafe_set]) or functions (e.g., + [fill]). + + We choose between the four strategies as follows: + + 1. We use [external]s if there is a corresponding [external]. + 2. Functions that only read arrays can have their implementations safely + copied. + 3. Functions that create an immutable array have to do so by creating a + mutable array and freezing it, since immutable arrays are, well, + immutable. For efficiency, we freeze them unsafely. + 4. Sorting is implemented in-place and this allows us to reuse it. +*) + +(* An alias for the type of immutable arrays. *) +type +'a t = 'a iarray + +(* Array operations *) + +external length : 'a iarray -> int = "%array_length" +external get : 'a iarray -> int -> 'a = "%array_safe_get" +external unsafe_get : 'a iarray -> int -> 'a = "%array_unsafe_get" +external concat : 'a iarray list -> 'a iarray = "caml_array_concat" + +external append_prim : 'a iarray -> 'a iarray -> 'a iarray = "caml_array_append" +external unsafe_sub : 'a iarray -> int -> int -> 'a iarray = "caml_array_sub" +external unsafe_of_array : 'a array -> 'a iarray = "%opaque" +external unsafe_to_array : 'a iarray -> 'a array = "%opaque" + +let init l f = unsafe_of_array (Array.init l f) + +let append a1 a2 = + if length a1 = 0 then a2 (* Safe because they're immutable *) + else if length a2 = 0 then a1 + else append_prim a1 a2 + +let sub a ~pos ~len = + if pos < 0 || len < 0 || pos > length a - len + then invalid_arg "Iarray.sub" + else unsafe_sub a pos len + +let iter f a = + for i = 0 to length a - 1 do f(unsafe_get a i) done + +let iter2 f a b = + if length a <> length b then + invalid_arg "Iarray.iter2: arrays must have the same length" + else + for i = 0 to length a - 1 do f (unsafe_get a i) (unsafe_get b i) done + +let map f a = + let l = length a in + let r = if l = 0 then [||] else begin + let r = Array.make l (f(unsafe_get a 0)) in + for i = 1 to l - 1 do + Array.unsafe_set r i (f(unsafe_get a i)) + done; + r + end in + unsafe_of_array r + +let map2 f a b = + let la = length a in + let lb = length b in + if la <> lb then + invalid_arg "Iarray.map2: arrays must have the same length" + else begin + let r = if la = 0 then [||] else begin + let r = Array.make la (f (unsafe_get a 0) (unsafe_get b 0)) in + for i = 1 to la - 1 do + Array.unsafe_set r i (f (unsafe_get a i) (unsafe_get b i)) + done; + r + end in + unsafe_of_array r + end + +let iteri f a = + for i = 0 to length a - 1 do f i (unsafe_get a i) done + +let mapi f a = + let l = length a in + let r = if l = 0 then [||] else begin + let r = Array.make l (f 0 (unsafe_get a 0)) in + for i = 1 to l - 1 do + Array.unsafe_set r i (f i (unsafe_get a i)) + done; + r + end in + unsafe_of_array r + +let to_list a = + let rec tolist i res = + if i < 0 then res else tolist (i - 1) (unsafe_get a i :: res) in + tolist (length a - 1) [] + +let of_list l = unsafe_of_array (Array.of_list l) + +let to_array ia = Array.copy (unsafe_to_array ia) + +let of_array ma = unsafe_of_array (Array.copy ma) + +let fold_left f x a = + let r = ref x in + for i = 0 to length a - 1 do + r := f !r (unsafe_get a i) + done; + !r + +let fold_left_map f acc input_array = + let len = length input_array in + let acc, output_array = if len = 0 then (acc, [||]) else begin + let acc, elt = f acc (unsafe_get input_array 0) in + let output_array = Array.make len elt in + let acc = ref acc in + for i = 1 to len - 1 do + let acc', elt = f !acc (unsafe_get input_array i) in + acc := acc'; + Array.unsafe_set output_array i elt; + done; + !acc, output_array + end in + acc, unsafe_of_array output_array + +let fold_right f a x = + let r = ref x in + for i = length a - 1 downto 0 do + r := f (unsafe_get a i) !r + done; + !r + +let exists p a = + let n = length a in + let rec loop i = + if i = n then false + else if p (unsafe_get a i) then true + else loop (succ i) in + loop 0 + +let for_all p a = + let n = length a in + let rec loop i = + if i = n then true + else if p (unsafe_get a i) then loop (succ i) + else false in + loop 0 + +let for_all2 p l1 l2 = + let n1 = length l1 + and n2 = length l2 in + if n1 <> n2 then invalid_arg "Iarray.for_all2" + else let rec loop i = + if i = n1 then true + else if p (unsafe_get l1 i) (unsafe_get l2 i) then loop (succ i) + else false in + loop 0 + +let exists2 p l1 l2 = + let n1 = length l1 + and n2 = length l2 in + if n1 <> n2 then invalid_arg "Iarray.exists2" + else let rec loop i = + if i = n1 then false + else if p (unsafe_get l1 i) (unsafe_get l2 i) then true + else loop (succ i) in + loop 0 + +let equal eq a1 a2 = + length a1 = length a2 && for_all2 eq a1 a2 + +let compare cmp a1 a2 = + if length a1 <> length a2 then length a1 - length a2 + else ( + let rec loop i = + if i = length a1 then 0 + else + let c = cmp (unsafe_get a1 i) (unsafe_get a2 i) in + if c <> 0 then c + else loop (i + 1) + in + loop 0 + ) + +let mem x a = + let n = length a in + let rec loop i = + if i = n then false + else if Stdlib.compare (unsafe_get a i) x = 0 then true + else loop (succ i) in + loop 0 + +let memq x a = + let n = length a in + let rec loop i = + if i = n then false + else if x == (unsafe_get a i) then true + else loop (succ i) in + loop 0 + +let find_opt p a = + let n = length a in + let rec loop i = + if i = n then None + else + let x = unsafe_get a i in + if p x then Some x + else loop (succ i) + in + loop 0 + +let find_index p a = + let n = length a in + let rec loop i = + if i = n then None + else if p (unsafe_get a i) then Some i + else loop (succ i) in + loop 0 + +let find_map f a = + let n = length a in + let rec loop i = + if i = n then None + else + match f (unsafe_get a i) with + | None -> loop (succ i) + | Some _ as r -> r + in + loop 0 + +let find_mapi f a = + let n = length a in + let rec loop i = + if i = n then None + else + match f i (unsafe_get a i) with + | None -> loop (succ i) + | Some _ as r -> r + in + loop 0 + +let split x = + if equal (=) (* unused *) x [||] then ([||], [||] : _ iarray * _ iarray) + else begin + let a0, b0 = unsafe_get x 0 in + let n = length x in + let a = Array.make n a0 in + let b = Array.make n b0 in + for i = 1 to n - 1 do + let ai, bi = unsafe_get x i in + Array.unsafe_set a i ai; + Array.unsafe_set b i bi + done; + unsafe_of_array a, unsafe_of_array b + end + +let combine a b = + let na = length a in + let nb = length b in + if na <> nb then invalid_arg "Iarray.combine"; + let r = if na = 0 then [||] + else begin + let x = Array.make na (unsafe_get a 0, unsafe_get b 0) in + for i = 1 to na - 1 do + Array.unsafe_set x i (unsafe_get a i, unsafe_get b i) + done; + x + end in + unsafe_of_array r + +(* Must be fully applied due to the value restriction *) +let lift_sort sorter cmp iarr = + let arr = to_array iarr in + sorter cmp arr; + unsafe_of_array arr + +let sort cmp iarr = lift_sort Array.sort cmp iarr +let stable_sort cmp iarr = lift_sort Array.stable_sort cmp iarr +let fast_sort cmp iarr = lift_sort Array.fast_sort cmp iarr + +let to_seq a = + let rec aux i () = + if i < length a + then + let x = unsafe_get a i in + Seq.Cons (x, aux (i+1)) + else Seq.Nil + in + aux 0 + +let to_seqi a = + let rec aux i () = + if i < length a + then + let x = unsafe_get a i in + Seq.Cons ((i,x), aux (i+1)) + else Seq.Nil + in + aux 0 + +let of_seq i = unsafe_of_array (Array.of_seq i) diff --git a/stdlib/iarray.mli b/stdlib/iarray.mli new file mode 100644 index 00000000..1b573e5d --- /dev/null +++ b/stdlib/iarray.mli @@ -0,0 +1,286 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *) +(* Antal Spector-Zabusky, Jane Street, New York *) +(* *) +(* Copyright 1996 Institut National de Recherche en Informatique et *) +(* en Automatique. *) +(* Copyright 2023 Jane Street Group LLC *) +(* *) +(* All rights reserved. This file is distributed under the terms of *) +(* the GNU Lesser General Public License version 2.1, with the *) +(* special exception on linking described in the file LICENSE. *) +(* *) +(**************************************************************************) + +open! Stdlib + +(** Operations on immutable arrays. This module mirrors the API of [Array], but + omits functions that assume mutability; in addition to obviously mutating + functions, it omits [copy] along with the functions [make], [create_float], + and [make_matrix] that produce all-constant arrays. The exception is the + sorting functions, which are given a copying API to replace the in-place + one. + + @since 5.4 +*) + +type +'a t = 'a iarray +(** An alias for the type of immutable arrays. *) + +external length : 'a iarray -> int = "%array_length" +(** Return the length (number of elements) of the given immutable array. *) + +external get : 'a iarray -> int -> 'a = "%array_safe_get" +(** [get a n] returns the element number [n] of immutable array [a]. + The first element has number 0. + The last element has number [length a - 1]. + + @raise Invalid_argument + if [n] is outside the range 0 to [(length a - 1)]. *) + +val init : int -> (int -> 'a) -> 'a iarray +(** [init n f] returns a fresh immutable array of length [n], + with element number [i] initialized to the result of [f i]. + In other terms, [init n f] tabulates the results of [f] + applied to the integers [0] to [n-1]. + + @raise Invalid_argument if [n < 0] or [n > Sys.max_array_length]. + If the return type of [f] is [float], then the maximum + size is only [Sys.max_array_length / 2]. *) + +val append : 'a iarray -> 'a iarray -> 'a iarray +(** [append v1 v2] returns a fresh immutable array containing the + concatenation of the immutable arrays [v1] and [v2]. + @raise Invalid_argument if + [length v1 + length v2 > Sys.max_array_length]. *) + +val concat : 'a iarray list -> 'a iarray +(** Same as {!append}, but concatenates a list of immutable arrays. *) + +val sub : 'a iarray -> pos:int -> len:int -> 'a iarray +(** [sub a ~pos ~len] returns a fresh immutable array of length [len], + containing the elements number [pos] to [pos + len - 1] + of immutable array [a]. This creates a copy of the selected + portion of the immutable array. + + @raise Invalid_argument if [pos] and [len] do not + designate a valid subarray of [a]; that is, if + [pos < 0], or [len < 0], or [pos + len > length a]. *) + +val to_list : 'a iarray -> 'a list +(** [to_list a] returns the list of all the elements of [a]. *) + +val of_list : 'a list -> 'a iarray +(** [of_list l] returns a fresh immutable array containing the elements + of [l]. + + @raise Invalid_argument if the length of [l] is greater than + [Sys.max_array_length]. *) + +(** {1 Converting to and from mutable arrays} *) + +val to_array : 'a iarray -> 'a array +(** [to_array a] returns a mutable copy of the immutable array [a]; that is, a + fresh (mutable) array containing the same elements as [a] *) + +val of_array : 'a array -> 'a iarray +(** [of_array ma] returns an immutable copy of the mutable array [ma]; that is, + a fresh immutable array containing the same elements as [ma] *) + +(** {1 Comparison} *) + +val equal : ('a -> 'a -> bool) -> 'a iarray -> 'a iarray -> bool +(** [eq [|a1; ...; an|] [|b1; ..; bm|]] holds when the two input immutable + arrays have the same length, and for each pair of elements [ai, bi] at the + same position we have [eq ai bi]. *) + +val compare : ('a -> 'a -> int) -> 'a iarray -> 'a iarray -> int +(** Provided the function [cmp] defines a preorder on elements, + [compare cmp a b] compares first [a] and [b] by their length, and then, if + equal, by their elements according to the lexicographic preorder. + + For more details on comparison functions, see {!Iarray.sort}. *) + +(** {1 Iterators} *) + +val iter : ('a -> unit) -> 'a iarray -> unit +(** [iter f a] applies function [f] in turn to all + the elements of [a]. It is equivalent to + [f (get a 0); f (get a 1); ...; f (get a (length a - 1)); ()]. *) + +val iteri : (int -> 'a -> unit) -> 'a iarray -> unit +(** Same as {!iter}, but the + function is applied to the index of the element as first argument, + and the element itself as second argument. *) + +val map : ('a -> 'b) -> 'a iarray -> 'b iarray +(** [map f a] applies function [f] to all the elements of [a], + and builds an immutable array with the results returned by [f]: + [[| f (get a 0); f (get a 1); ...; f (get a (length a - 1)) |]]. *) + +val mapi : (int -> 'a -> 'b) -> 'a iarray -> 'b iarray +(** Same as {!map}, but the + function is applied to the index of the element as first argument, + and the element itself as second argument. *) + +val fold_left : ('a -> 'b -> 'a) -> 'a -> 'b iarray -> 'a +(** [fold_left f init a] computes + [f (... (f (f init (get a 0)) (get a 1)) ...) (get a n-1)], + where [n] is the length of the immutable array [a]. *) + +val fold_left_map : + ('a -> 'b -> 'a * 'c) -> 'a -> 'b iarray -> 'a * 'c iarray +(** [fold_left_map] is a combination of {!fold_left} and {!map} that threads an + accumulator through calls to [f]. *) + +val fold_right : ('b -> 'a -> 'a) -> 'b iarray -> 'a -> 'a +(** [fold_right f a init] computes + [f (get a 0) (f (get a 1) ( ... (f (get a (n-1)) init) ...))], + where [n] is the length of the immutable array [a]. *) + + +(** {1 Iterators on two arrays} *) + + +val iter2 : ('a -> 'b -> unit) -> 'a iarray -> 'b iarray -> unit +(** [iter2 f a b] applies function [f] to all the elements of [a] + and [b]. + @raise Invalid_argument if the immutable arrays are not the same size. + *) + +val map2 : ('a -> 'b -> 'c) -> 'a iarray -> 'b iarray -> 'c iarray +(** [map2 f a b] applies function [f] to all the elements of [a] + and [b], and builds an immutable array with the results returned by [f]: + [[| f (get a 0) (get b 0); + ...; + f (get a (length a - 1)) (get b (length b - 1))|]]. + @raise Invalid_argument if the immutable arrays are not the same size. *) + + +(** {1 Array scanning} *) + +val for_all : ('a -> bool) -> 'a iarray -> bool +(** [for_all f [|a1; ...; an|]] checks if all elements + of the immutable array satisfy the predicate [f]. That is, it returns + [(f a1) && (f a2) && ... && (f an)]. *) + +val exists : ('a -> bool) -> 'a iarray -> bool +(** [exists f [|a1; ...; an|]] checks if at least one element of + the immutable array satisfies the predicate [f]. That is, it returns + [(f a1) || (f a2) || ... || (f an)]. *) + +val for_all2 : ('a -> 'b -> bool) -> 'a iarray -> 'b iarray -> bool +(** Same as {!for_all}, but for a two-argument predicate. + @raise Invalid_argument if the two immutable arrays have different + lengths. *) + +val exists2 : ('a -> 'b -> bool) -> 'a iarray -> 'b iarray -> bool +(** Same as {!exists}, but for a two-argument predicate. + @raise Invalid_argument if the two immutable arrays have different + lengths. *) + +val mem : 'a -> 'a iarray -> bool +(** [mem a set] is true if and only if [a] is structurally equal + to an element of [l] (i.e. there is an [x] in [l] such that + [compare a x = 0]). *) + +val memq : 'a -> 'a iarray -> bool +(** Same as {!mem}, but uses physical equality instead of structural equality + to compare array elements. *) + +val find_opt : ('a -> bool) -> 'a iarray -> 'a option +(** [find_opt f a] returns the first element of the immutable array [a] that + satisfies the predicate [f], or [None] if there is no value that satisfies + [f] in the array [a]. *) + +val find_index : ('a -> bool) -> 'a iarray -> int option +(** [find_index f a] returns [Some i], where [i] is the index of the first + element of the array [a] that satisfies [f x], if there is such an + element. + + It returns [None] if there is no such element. *) + +val find_map : ('a -> 'b option) -> 'a iarray -> 'b option +(** [find_map f a] applies [f] to the elements of [a] in order, and returns the + first result of the form [Some v], or [None] if none exist. *) + +val find_mapi : (int -> 'a -> 'b option) -> 'a iarray -> 'b option +(** Same as [find_map], but the predicate is applied to the index of + the element as first argument (counting from 0), and the element + itself as second argument. *) + +(** {1 Arrays of pairs} *) + +val split : ('a * 'b) iarray -> 'a iarray * 'b iarray +(** [split [|(a1,b1); ...; (an,bn)|]] is + [([|a1; ...; an|], [|b1; ...; bn|])]. *) + +val combine : 'a iarray -> 'b iarray -> ('a * 'b) iarray +(** [combine [|a1; ...; an|] [|b1; ...; bn|]] is [[|(a1,b1); ...; (an,bn)|]]. + Raise [Invalid_argument] if the two immutable arrays have different + lengths. *) + +(** {1 Sorting} *) + +val sort : ('a -> 'a -> int) -> 'a iarray -> 'a iarray +(** Sort an immutable array in increasing order according to a comparison + function. The comparison function must return 0 if its arguments + compare as equal, a positive integer if the first is greater, + and a negative integer if the first is smaller (see below for a + complete specification). For example, {!Stdlib.compare} is + a suitable comparison function. The result of calling [sort] is a fresh + immutable array containing the same elements as the original sorted in + increasing order. Other than this fresh array, [sort] is guaranteed to run in + constant heap space and (at most) logarithmic stack space. + + The current implementation uses Heap Sort. It runs in constant + stack space. + + Specification of the comparison function: + Let [a] be the immutable array and [cmp] the comparison function. The + following must be true for all [x], [y], [z] in [a] : +- [cmp x y] > 0 if and only if [cmp y x] < 0 +- if [cmp x y] >= 0 and [cmp y z] >= 0 then [cmp x z] >= 0 + + The result of [sort], which we'll call [a'], contains the same elements as + [a], reordered in such a way that for all i and j valid indices of [a] (or + equivalently, of [a']): +- [cmp (get a' i) (get a' j)] >= 0 if and only if i >= j +*) + +val stable_sort : ('a -> 'a -> int) -> 'a iarray -> 'a iarray +(** Same as {!sort}, but the sorting algorithm is stable (i.e. + elements that compare equal are kept in their original order) and + not guaranteed to run in constant heap space. + + The current implementation uses Merge Sort. It uses a temporary array of + length [n/2], where [n] is the length of the immutable array. It is usually + faster than the current implementation of {!sort}. +*) + +val fast_sort : ('a -> 'a -> int) -> 'a iarray -> 'a iarray +(** Same as {!sort} or {!stable_sort}, whichever is + faster on typical input. *) + +(** {1 Iterators} *) + +val to_seq : 'a iarray -> 'a Seq.t +(** Iterate on the immutable array, in increasing order. *) + +val to_seqi : 'a iarray -> (int * 'a) Seq.t +(** Iterate on the immutable array, in increasing order, yielding indices along + elements. *) + +val of_seq : 'a Seq.t -> 'a iarray +(** Create an immutable array from the generator *) + +(**/**) + +(** {1 Undocumented functions} *) + +(* The following is for system use only. Do not call directly. *) + +external unsafe_get : 'a iarray -> int -> 'a = "%array_unsafe_get" diff --git a/stdlib/in_channel.ml b/stdlib/in_channel.ml index e3255725..430e79de 100644 --- a/stdlib/in_channel.ml +++ b/stdlib/in_channel.ml @@ -151,7 +151,7 @@ let ensure buf ofs n = end let input_all ic = - let chunk_size = 65536 in (* IO_BUFFER_SIZE *) + let chunk_size = Sys.io_buffer_size in let initial_size = try Stdlib.in_channel_length ic - Stdlib.pos_in ic diff --git a/stdlib/list.ml b/stdlib/list.ml index 3b77b9a4..d284c1cb 100644 --- a/stdlib/list.ml +++ b/stdlib/list.ml @@ -26,6 +26,8 @@ let length l = length_aux 0 l let cons a l = a::l +let singleton a = [a] + let hd = function [] -> failwith "hd" | a::_ -> a @@ -295,16 +297,14 @@ let take n l = | 0, _ | _, [] -> [] | n, x::l -> x::aux (n - 1) l in - if n < 0 then invalid_arg "List.take"; - aux n l + if n <= 0 then [] else aux n l let drop n l = let rec aux i = function | _x::l when i < n -> aux (i + 1) l | rest -> rest in - if n < 0 then invalid_arg "List.drop"; - aux 0 l + if n <= 0 then l else aux 0 l let take_while p l = let[@tail_mod_cons] rec aux = function @@ -442,7 +442,7 @@ let fast_sort = stable_sort entries to the resulting list. Impossible now that Obj.truncate has been removed. *) -(** sorting + removing duplicates *) +(** sorting + removing non-first duplicates *) let sort_uniq cmp l = let rec rev_merge l1 l2 accu = @@ -479,8 +479,8 @@ let sort_uniq cmp l = let s = let c = cmp x1 x2 in if c = 0 then - let c = cmp x2 x3 in - if c = 0 then [x2] else if c < 0 then [x2; x3] else [x3; x2] + let c = cmp x1 x3 in + if c = 0 then [x1] else if c < 0 then [x1; x3] else [x3; x1] else if c < 0 then let c = cmp x2 x3 in if c = 0 then [x1; x2] @@ -519,8 +519,8 @@ let sort_uniq cmp l = let s = let c = cmp x1 x2 in if c = 0 then - let c = cmp x2 x3 in - if c = 0 then [x2] else if c > 0 then [x2; x3] else [x3; x2] + let c = cmp x1 x3 in + if c = 0 then [x1] else if c > 0 then [x1; x3] else [x3; x1] else if c > 0 then let c = cmp x2 x3 in if c = 0 then [x1; x2] diff --git a/stdlib/list.mli b/stdlib/list.mli index 662df29c..f5c0466c 100644 --- a/stdlib/list.mli +++ b/stdlib/list.mli @@ -68,6 +68,11 @@ val cons : 'a -> 'a list -> 'a list @since 4.03 (4.05 in ListLabels) *) +val singleton: 'a -> 'a list +(** [singleton x] returns the one-element list [[x]]. + + @since 5.4 *) + val hd : 'a list -> 'a (** Return the first element of the given list. @raise Failure if the list is empty. @@ -365,21 +370,22 @@ val filteri : (int -> 'a -> bool) -> 'a list -> 'a list val take : int -> 'a list -> 'a list (** [take n l] returns the prefix of [l] of length [n], - or a copy of [l] if [n > length l]. + or a copy of [l] if [n > length l]. This is the empty + list if [n] is negative. - [n] must be nonnegative. + {b Warning.} In version 5.3 only, this function raises + [Invalid_argument] for negative [n] values. - @raise Invalid_argument if [n] is negative. @since 5.3 *) val drop : int -> 'a list -> 'a list (** [drop n l] returns the suffix of [l] after [n] elements, - or [[]] if [n > length l]. + or [[]] if [n > length l]. This is [l] if [n] is negative. - [n] must be nonnegative. + {b Warning.} In version 5.3 only, this function raises + [Invalid_argument] for negative [n] values. - @raise Invalid_argument if [n] is negative. @since 5.3 *) @@ -528,8 +534,12 @@ val fast_sort : ('a -> 'a -> int) -> 'a list -> 'a list *) val sort_uniq : ('a -> 'a -> int) -> 'a list -> 'a list -(** Same as {!sort}, but also remove duplicates. +(** Same as {!sort}, but also remove duplicates: if multiple elements + compare equal, keep only the first. + @since 4.02 (4.03 in ListLabels) + + @before 5.4 the element kept was not necessarily the first one. *) val merge : ('a -> 'a -> int) -> 'a list -> 'a list -> 'a list diff --git a/stdlib/listLabels.mli b/stdlib/listLabels.mli index 7ab524d8..f1f7192f 100644 --- a/stdlib/listLabels.mli +++ b/stdlib/listLabels.mli @@ -68,6 +68,11 @@ val cons : 'a -> 'a list -> 'a list @since 4.03 (4.05 in ListLabels) *) +val singleton: 'a -> 'a list +(** [singleton x] returns the one-element list [[x]]. + + @since 5.4 *) + val hd : 'a list -> 'a (** Return the first element of the given list. @raise Failure if the list is empty. @@ -365,21 +370,22 @@ val filteri : f:(int -> 'a -> bool) -> 'a list -> 'a list val take : int -> 'a list -> 'a list (** [take n l] returns the prefix of [l] of length [n], - or a copy of [l] if [n > length l]. + or a copy of [l] if [n > length l]. This is the empty + list if [n] is negative. - [n] must be nonnegative. + {b Warning.} In version 5.3 only, this function raises + [Invalid_argument] for negative [n] values. - @raise Invalid_argument if [n] is negative. @since 5.3 *) val drop : int -> 'a list -> 'a list (** [drop n l] returns the suffix of [l] after [n] elements, - or [[]] if [n > length l]. + or [[]] if [n > length l]. This is [l] if [n] is negative. - [n] must be nonnegative. + {b Warning.} In version 5.3 only, this function raises + [Invalid_argument] for negative [n] values. - @raise Invalid_argument if [n] is negative. @since 5.3 *) @@ -528,8 +534,12 @@ val fast_sort : cmp:('a -> 'a -> int) -> 'a list -> 'a list *) val sort_uniq : cmp:('a -> 'a -> int) -> 'a list -> 'a list -(** Same as {!sort}, but also remove duplicates. +(** Same as {!sort}, but also remove duplicates: if multiple elements + compare equal, keep only the first. + @since 4.02 (4.03 in ListLabels) + + @before 5.4 the element kept was not necessarily the first one. *) val merge : cmp:('a -> 'a -> int) -> 'a list -> 'a list -> 'a list diff --git a/stdlib/map.mli b/stdlib/map.mli index 56f87d7c..cfc904b9 100644 --- a/stdlib/map.mli +++ b/stdlib/map.mli @@ -88,7 +88,7 @@ module type S = val add_to_list: key -> 'a -> 'a list t -> 'a list t (** [add_to_list key data m] is [m] with [key] mapped to [l] such that [l] is [data :: Map.find key m] if [key] was bound in - [m] and [[v]] otherwise. + [m] and [[data]] otherwise. @since 5.1 *) val update: key -> ('a option -> 'a option) -> 'a t -> 'a t diff --git a/stdlib/moreLabels.mli b/stdlib/moreLabels.mli index 26993ff7..c33bb0a5 100644 --- a/stdlib/moreLabels.mli +++ b/stdlib/moreLabels.mli @@ -739,7 +739,7 @@ module Map : sig val add_to_list: key:key -> data:'a -> 'a list t -> 'a list t (** [add_to_list ~key ~data m] is [m] with [key] mapped to [l] such that [l] is [data :: Map.find key m] if [key] was bound in - [m] and [[v]] otherwise. + [m] and [[data]] otherwise. @since 5.1 *) val update: key:key -> f:('a option -> 'a option) -> 'a t -> 'a t diff --git a/stdlib/pair.ml b/stdlib/pair.ml new file mode 100644 index 00000000..a92a1bb8 --- /dev/null +++ b/stdlib/pair.ml @@ -0,0 +1,34 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* The OCaml programmers *) +(* *) +(* Copyright 2024 Institut National de Recherche en Informatique et *) +(* en Automatique. *) +(* *) +(* All rights reserved. This file is distributed under the terms of *) +(* the GNU Lesser General Public License version 2.1, with the *) +(* special exception on linking described in the file LICENSE. *) +(* *) +(**************************************************************************) + +type ('a, 'b) t = 'a * 'b + +let make a b = (a, b) +let fst (a, _) = a +let snd (_, b) = b +let swap (a, b) = (b, a) + +let fold f (a, b) = f a b +let map f g (a, b) = (f a, g b) +let iter f g (a, b) = f a; g b +let map_fst f (a, b) = (f a, b) +let map_snd g (a, b) = (a, g b) + +let equal eqa eqb (a, b) (a', b') = + eqa a a' && eqb b b' +let compare cmpa cmpb (a, b) (a', b') = + let c = cmpa a a' in + if c <> 0 then c + else cmpb b b' diff --git a/stdlib/pair.mli b/stdlib/pair.mli new file mode 100644 index 00000000..7c062b56 --- /dev/null +++ b/stdlib/pair.mli @@ -0,0 +1,66 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* The OCaml programmers *) +(* *) +(* Copyright 2024 Institut National de Recherche en Informatique et *) +(* en Automatique. *) +(* *) +(* All rights reserved. This file is distributed under the terms of *) +(* the GNU Lesser General Public License version 2.1, with the *) +(* special exception on linking described in the file LICENSE. *) +(* *) +(**************************************************************************) + +(** Operations on pairs. + + @since 5.4 *) + + +(** {1:pairs Pairs} *) + +type ('a, 'b) t = 'a * 'b +(** The type for pairs. *) + +val make: 'a -> 'b -> 'a * 'b +(** [make a b] is the pair [(a, b)]. *) + +val fst: 'a * 'b -> 'a +(** [fst (a, b)] is [a]. *) + +val snd: 'a * 'b -> 'b +(** [snd (a, b)] is [b]. *) + +val swap: 'a * 'b -> 'b * 'a +(** [swap (a, b)] is [(b, a)]. *) + +(** {1:iters Iterators} *) + +val fold: ('a -> 'b -> 'c) -> 'a * 'b -> 'c +(** [fold f (a, b)] applies [f] to [a] and [b]. *) + +val map: ('a -> 'c) -> ('b -> 'd) -> 'a * 'b -> 'c * 'd +(** [map f g (a, b)] applies [f] to [a] and [g] to [b]. *) + +val iter: ('a -> unit) -> ('b -> unit) -> 'a * 'b -> unit +(** [iter f g (a, b)] first applies [f] to [a], and then [g] to [b]. *) + +val map_fst: ('a -> 'c) -> 'a * 'b -> 'c * 'b +(** [map_fst f p] applies [f] to [p]'s first component. *) + +val map_snd: ('b -> 'c) -> 'a * 'b -> 'a * 'c +(** [map_snd f p] applies [f] to [p]'s second component. *) + +(** {1:preds Predicates and comparisons} *) + +val equal: + ('a -> 'a -> bool) -> ('b -> 'b -> bool) -> 'a * 'b -> 'a * 'b -> bool +(** [equal eqa eqb (a1, b1) (a2, b2)] is [true] if and only if [eqa a1 a2] and + [eqb b1 b2] are both [true]. *) + +val compare: + ('a -> 'a -> int) -> ('b -> 'b -> int) -> 'a * 'b -> 'a * 'b -> int +(** [compare cmpa cmpb] is a total order on pairs using [cmpa] to compare the + first component, and [cmpb] to compare the second component. It is + implemented by a lexicographic order. *) diff --git a/stdlib/pqueue.ml b/stdlib/pqueue.ml new file mode 100644 index 00000000..b8ffecbb --- /dev/null +++ b/stdlib/pqueue.ml @@ -0,0 +1,287 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Jean-Christophe Filliâtre *) +(* *) +(* Copyright 2023 CNRS *) +(* *) +(* All rights reserved. This file is distributed under the terms of *) +(* the GNU Lesser General Public License version 2.1, with the *) +(* special exception on linking described in the file LICENSE. *) +(* *) +(**************************************************************************) + +(* Priority queues over ordered elements. + + We choose to have polymorphic elements here, so that we can later + derive both polymorphic and monomorphic priority queues from it. +*) + +module type OrderedPolyType = sig + type 'a t + val compare : 'a t -> 'b t -> int +end + +module MakeMinPoly(E: OrderedPolyType) = + struct + + type 'a elt = 'a E.t + + (* Our priority queues are implemented using the standard "min heap" + data structure, a dynamic array representing a binary tree. *) + type 'a t = 'a E.t Dynarray.t + + let create = + Dynarray.create + + let length = + Dynarray.length + + let is_empty = + Dynarray.is_empty + + let clear = + Dynarray.clear + + (* The node at index [i] has children nodes at indices [2 * i + 1] + and [2 * i + 2] -- if they are valid indices in the dynarray. *) + let left_child i = 2 * i + 1 + let right_child i = 2 * i + 2 + let parent_node i = (i - 1) / 2 + + (* We say that a heap respects the "heap ordering" if the value of + each node is no greater than the value of its children. The + algorithm manipulates arrays that respect the heap ordering, + except for one node whose value may be too small or too large. + + The auxiliary functions [sift_up] and [sift_down] take + such a misplaced value, and move it "up" (respectively: "down") + until the heap ordering is restored. + + Functions [sift_up] and [sift_down] do not perform swaps, but + rather expect the value to be assigned in the heap as an + additional parameter [x], resulting in twice less assignments. *) + + (* store [x] at index [i], moving it up if necessary *) + let rec sift_up h i x = + if i = 0 then Dynarray.set h 0 x else + let p = parent_node i in + let y = Dynarray.get h p in + if E.compare x y < 0 then ( + Dynarray.set h i y; + sift_up h p x + ) else + Dynarray.set h i x + + let add h x = + let i = Dynarray.length h in + Dynarray.add_last h x; + if i > 0 then sift_up h i x + + let add_iter h iter x = + iter (add h) x + + let min_elt h = + if Dynarray.is_empty h then None else Some (Dynarray.get h 0) + + let get_min_elt h = + if Dynarray.is_empty h then invalid_arg "empty priority queue"; + Dynarray.get h 0 + + let lt h i j = + E.compare (Dynarray.get h i) (Dynarray.get h j) < 0 + + (* store [x] at index [i], moving it down if necessary *) + let rec sift_down h ~len i x = + let left = left_child i in + if left >= len then Dynarray.set h i x (* no child, stop *) else + let smallest = + let right = right_child i in + if right >= len then left (* no right child *) else + if lt h left right then left else right + in + let y = Dynarray.get h smallest in + if E.compare y x < 0 then ( + Dynarray.set h i y; + sift_down h ~len smallest x + ) else + Dynarray.set h i x + + let pop_min h = + let n = Dynarray.length h in + if n = 0 then None else + let x = Dynarray.pop_last h in + if n = 1 then Some x else ( + let r = Dynarray.get h 0 in + sift_down h ~len:(n - 1) 0 x; + Some r + ) + + let remove_min h = + let n = Dynarray.length h in + if n > 0 then ( + let x = Dynarray.pop_last h in + if n > 1 then sift_down h ~len:(n - 1) 0 x + ) + + let copy = + Dynarray.copy + + (* array to heap in linear time (Floyd, 1964) + + many elements travel a short distance, few travel longer distances + and we can show that it totals to O(N) *) + let heapify h = + let n = Dynarray.length h in + for i = n/2 - 1 downto 0 do + sift_down h ~len:n i (Dynarray.get h i) + done; + h + + let of_array a = + Dynarray.of_array a |> heapify + + let of_list l = + Dynarray.of_list l |> heapify + + let of_iter iter x = + let a = Dynarray.create () in + iter (Dynarray.add_last a) x; + heapify a + + let iter_unordered = + Dynarray.iter + + let fold_unordered = + Dynarray.fold_left + + end + +module type MinPoly = + sig + type 'a t + type 'a elt + val create: unit ->'a t + val length: 'a t -> int + val is_empty: 'a t -> bool + val add: 'a t -> 'a elt -> unit + val add_iter: 'a t -> (('a elt -> unit) -> 'x -> unit) -> 'x -> unit + val min_elt: 'a t -> 'a elt option + val get_min_elt: 'a t -> 'a elt + val pop_min: 'a t -> 'a elt option + val remove_min: 'a t -> unit + val clear: 'a t -> unit + val copy: 'a t -> 'a t + val of_array: 'a elt array -> 'a t + val of_list: 'a elt list -> 'a t + val of_iter: (('a elt -> unit) -> 'x -> unit) -> 'x -> 'a t + val iter_unordered: ('a elt -> unit) -> 'a t -> unit + val fold_unordered: ('acc -> 'a elt -> 'acc) -> 'acc -> 'a t -> 'acc + end + +module type MaxPoly = + sig + type 'a t + type 'a elt + val create: unit -> 'a t + val length: 'a t -> int + val is_empty: 'a t -> bool + val add: 'a t -> 'a elt -> unit + val add_iter: 'a t -> (('a elt -> unit) -> 'x -> unit) -> 'x -> unit + val max_elt: 'a t -> 'a elt option + val get_max_elt: 'a t -> 'a elt + val pop_max: 'a t -> 'a elt option + val remove_max: 'a t -> unit + val clear: 'a t -> unit + val copy: 'a t -> 'a t + val of_array: 'a elt array -> 'a t + val of_list: 'a elt list -> 'a t + val of_iter: (('a elt -> unit) -> 'x -> unit) -> 'x -> 'a t + val iter_unordered: ('a elt -> unit) -> 'a t -> unit + val fold_unordered: ('acc -> 'a elt -> 'acc) -> 'acc -> 'a t -> 'acc +end + +module MakeMaxPoly(E: OrderedPolyType) + : MaxPoly with type 'a elt = 'a E.t = + struct + include MakeMinPoly(struct + type 'a t = 'a E.t + let compare x y = E.compare y x + end) + (* renaming a few functions... *) + let max_elt = min_elt + let get_max_elt = get_min_elt + let pop_max = pop_min + let remove_max = remove_min + end + +(* Monomorphic priority queues *) + +module type OrderedType = + sig + type t + val compare: t -> t -> int + end + +module type Min = + sig + type t + type elt + val create: unit ->t + val length: t -> int + val is_empty: t -> bool + val add: t -> elt -> unit + val add_iter: t -> ((elt -> unit) -> 'x -> unit) -> 'x -> unit + val min_elt: t -> elt option + val get_min_elt: t -> elt + val pop_min: t -> elt option + val remove_min: t -> unit + val clear: t -> unit + val copy: t -> t + val of_array: elt array -> t + val of_list: elt list -> t + val of_iter: ((elt -> unit) -> 'x -> unit) -> 'x -> t + val iter_unordered: (elt -> unit) -> t -> unit + val fold_unordered: ('acc -> elt -> 'acc) -> 'acc -> t -> 'acc + end + +module MakeMin(E: OrderedType) = + struct + include MakeMinPoly(struct type 'a t = E.t + let compare = E.compare end) + type t = E.t Dynarray.t + end + +module type Max = + sig + type t + type elt + val create: unit ->t + val length: t -> int + val is_empty: t -> bool + val add: t -> elt -> unit + val add_iter: t -> ((elt -> unit) -> 'x -> unit) -> 'x -> unit + val max_elt: t -> elt option + val get_max_elt: t -> elt + val pop_max: t -> elt option + val remove_max: t -> unit + val clear: t -> unit + val copy: t -> t + val of_array: elt array -> t + val of_list: elt list -> t + val of_iter: ((elt -> unit) -> 'x -> unit) -> 'x -> t + val iter_unordered: (elt -> unit) -> t -> unit + val fold_unordered: ('acc -> elt -> 'acc) -> 'acc -> t -> 'acc + end + +module MakeMax(E: OrderedType) = + struct + include MakeMinPoly(struct type 'a t = E.t + let compare x y = E.compare y x end) + type t = E.t Dynarray.t + let max_elt = min_elt + let get_max_elt = get_min_elt + let pop_max = pop_min + let remove_max = remove_min + end diff --git a/stdlib/pqueue.mli b/stdlib/pqueue.mli new file mode 100644 index 00000000..f35c76ce --- /dev/null +++ b/stdlib/pqueue.mli @@ -0,0 +1,275 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Jean-Christophe Filliâtre *) +(* *) +(* Copyright 2023 CNRS *) +(* *) +(* All rights reserved. This file is distributed under the terms of *) +(* the GNU Lesser General Public License version 2.1, with the *) +(* special exception on linking described in the file LICENSE. *) +(* *) +(**************************************************************************) + +(** Priority queues. + + The {!Pqueue} module implements a data structure of priority queues, + given a totally ordered type for elements. This is a mutable + data structure. Both min- and max-priority queues are provided. + + The implementation uses a heap stored in a dynamic array, and is + therefore reasonably efficient: accessing the minimum + (resp. maximum) element takes constant time, and insertion and + removal take time logarithmic in the size of the priority + queue. Note that [of_array] runs in linear time (and thus must be + preferred to repeated insertions with [add]). + + It is fine to have several elements with the same priority. + Nothing is guaranteed regarding the order in which they will be + popped. However, it is guaranteed that the element returned by + [min_elt] (or [get_min_elt]) is the one that is removed from the + priority queue by [pop_min] (or [remove_min]). This is important + in many algorithms, (e.g. when peeking at several priority queues + and then selecting one to remove from). + + @since 5.4 +*) + +module type OrderedType = + sig + type t + (** The type of elements. *) + + val compare : t -> t -> int + (** A total ordering function to compare elements. + + This is a two-argument function [f] such that [f e1 e2] is + zero if the elements [e1] and [e2] are equal, [f e1 e2] is + strictly negative if [e1] is smaller than [e2], and [f e1 + e2] is strictly positive if [e1] is greater than [e2]. + + The generic structural comparison function {!Stdlib.compare} + is a suitable ordering function for element types such as + [int] or [string]. *) + end +(** Input signature of the functors {!MakeMin} and {!MakeMax}. *) + +module type Min = + sig + + (** {1:pqueue Min-priority queues} *) + + type t + (** The type of priority queues. *) + + type elt + (** The type of priority queue elements. *) + + val create: unit -> t + (** Return a new priority queue, initially empty. *) + + val length: t -> int + (** Return the number of elements in a priority queue. *) + + val is_empty: t -> bool + (** [is_empty q] is [true] iff [q] is empty, that is, iff [length q = 0]. *) + + val add: t -> elt -> unit + (** [add q x] adds the element [x] in the priority queue [q]. *) + + val add_iter: t -> ((elt -> unit) -> 'x -> unit) -> 'x -> unit + (** [add_iter q iter x] adds each element of [x] to the end of [q]. + This is [iter (add q) x]. *) + + val min_elt: t -> elt option + (** [min_elt q] is an element of [q] with minimal priority or + [None] if the queue is empty. The queue is not modified. *) + + val get_min_elt: t -> elt + (** [get_min_elt q] returns an element of [q] with minimal + priority, or raises {!Stdlib.Invalid_argument} if the queue is + empty. The queue is not modified. *) + + val pop_min: t -> elt option + (** [pop_min q] removes and returns an element in queue [q] with + minimal priority, or returns [None] if the queue is empty. *) + + val remove_min: t -> unit + (** [remove_min q] removes an element in queue [q] with minimal + priority. It does nothing if [q] is empty. *) + + val clear: t -> unit + (** [clear q] removes all elements from [q]. *) + + val copy: t -> t + (** [copy q] is a new priority queue with the same elements [q] has. *) + + (** {1:conversions Conversions from other data structures} *) + + val of_array: elt array -> t + (** [of_array a] returns a new priority queue containing the + elements of array [a]. Runs in linear time. *) + + val of_list: elt list -> t + (** [of_list l] returns a new priority queue containing the + elements of list [l]. Runs in linear time. *) + + val of_iter: ((elt -> unit) -> 'x -> unit) -> 'x -> t + (** [of_iter iter x] returns a new priority queue containing the + elements of [x], obtained from [iter]. + + For example, [of_iter Seq.iter s] returns a new priority queue + containing all the elements of the sequence [s] (provided it + is finite). + + Runs in linear time (excluding the time spent in [iter]). *) + + (** {1:iteration Iteration} + + The order in which the elements of a priority queue are + traversed is unspecified. + + It is a programming error to mutate a priority queue (by + adding or removing elements) during an iteration of the queue. + Such an error may be detected and signaled by the backing dynamic + array implementation, but this is not guaranteed. *) + + val iter_unordered: (elt -> unit) -> t -> unit + (** [iter_unordered f q] applies [f] to all elements in [q]. The + order in which the elements are passed to [f] is unspecified. + + The behavior is not specified if the priority queue is modified + by [f] during the iteration. *) + + val fold_unordered: ('acc -> elt -> 'acc) -> 'acc -> t -> 'acc + (** [fold_unordered f accu q] is [(f (... (f (f accu x1) x2) ...) + xn)] where [x1,x2,...,xn] are the elements of [q]. The order + in which the elements are passed to [f] is unspecified. + + The behavior is not specified if the priority queue is modified + by [f] during the iteration. *) + + end +(** Output signature of the functor {!MakeMin}. *) + +module MakeMin(E: OrderedType) : Min with type elt := E.t +(** Functor building an implementation of the min-priority queue + structure given a totally ordered type for elements. *) + +module type Max = + sig + type t + type elt + val create: unit -> t + val length: t -> int + val is_empty: t -> bool + val add: t -> elt -> unit + val add_iter: t -> ((elt -> unit) -> 'x -> unit) -> 'x -> unit + val max_elt: t -> elt option + val get_max_elt: t -> elt + val pop_max: t -> elt option + val remove_max: t -> unit + val clear: t -> unit + val copy: t -> t + val of_array: elt array -> t + val of_list: elt list -> t + val of_iter: ((elt -> unit) -> 'x -> unit) -> 'x -> t + val iter_unordered: (elt -> unit) -> t -> unit + val fold_unordered: ('acc -> elt -> 'acc) -> 'acc -> t -> 'acc +end +(** Output signature of the functor {!MakeMax}. *) + +module MakeMax(E: OrderedType) : Max with type elt := E.t +(** Functor building an implementation of the max-priority queue + structure given a totally ordered type for elements. *) + +(** {1 Polymorphic priority queues} + + The following, more complex functors create polymorphic queues of + type ['a t], just like other polymorphic containers (lists, + arrays...). They require a notion of "polymorphic elements" ['a + elt] that can be compared without depending on the values of ['a]. + + One usage scenario is when the user wants to pass priorities + separately from the value stored in the queue. This is done by + using pairs [priority * 'a] as elements. + {[ + module Prio : OrderedType = ... + + module PrioQueue = Pqueue.MakeMinPoly(struct + type 'a t = Prio.t * 'a + let compare (p1, _) (p2, _) = Prio.compare p1 p2 + end) + + (* for example, we now have: *) + PrioQueue.add: 'a PrioQueue.t -> Prio.t * 'a -> unit + PrioQueue.min_elt: 'a PrioQueue.t -> (Prio.t * 'a) option + ]} +*) + +module type OrderedPolyType = + sig + type 'a t + (** The polymorphic type of elements. *) + + val compare : 'a t -> 'b t -> int + (** [compare] is a total order on values of type {!t}. *) + end +(** Input signature of the functors {!MakeMinPoly} and {!MakeMaxPoly}. *) + +module type MinPoly = + sig + type 'a t + type 'a elt + val create: unit ->'a t + val length: 'a t -> int + val is_empty: 'a t -> bool + val add: 'a t -> 'a elt -> unit + val add_iter: 'a t -> (('a elt -> unit) -> 'x -> unit) -> 'x -> unit + val min_elt: 'a t -> 'a elt option + val get_min_elt: 'a t -> 'a elt + val pop_min: 'a t -> 'a elt option + val remove_min: 'a t -> unit + val clear: 'a t -> unit + val copy: 'a t -> 'a t + val of_array: 'a elt array -> 'a t + val of_list: 'a elt list -> 'a t + val of_iter: (('a elt -> unit) -> 'x -> unit) -> 'x -> 'a t + val iter_unordered: ('a elt -> unit) -> 'a t -> unit + val fold_unordered: ('acc -> 'a elt -> 'acc) -> 'acc -> 'a t -> 'acc + end +(** Output signature of the functor {!MakeMinPoly}. *) + +module MakeMinPoly (E : OrderedPolyType) : + MinPoly with type 'a elt := 'a E.t +(** Functor building an implementation of min-priority queues + given a totally ordered type for the elements. *) + +module type MaxPoly = + sig + type 'a t + type 'a elt + val create: unit -> 'a t + val length: 'a t -> int + val is_empty: 'a t -> bool + val add: 'a t -> 'a elt -> unit + val add_iter: 'a t -> (('a elt -> unit) -> 'x -> unit) -> 'x -> unit + val max_elt: 'a t -> 'a elt option + val get_max_elt: 'a t -> 'a elt + val pop_max: 'a t -> 'a elt option + val remove_max: 'a t -> unit + val clear: 'a t -> unit + val copy: 'a t -> 'a t + val of_array: 'a elt array -> 'a t + val of_list: 'a elt list -> 'a t + val of_iter: (('a elt -> unit) -> 'x -> unit) -> 'x -> 'a t + val iter_unordered: ('a elt -> unit) -> 'a t -> unit + val fold_unordered: ('acc -> 'a elt -> 'acc) -> 'acc -> 'a t -> 'acc +end +(** Output signature of the functor {!MakeMaxPoly}. *) + +module MakeMaxPoly (E : OrderedPolyType) : + MaxPoly with type 'a elt := 'a E.t +(** Functor building an implementation of max-priority queues + given a totally ordered type for the elements. *) diff --git a/stdlib/random.mli b/stdlib/random.mli index 27f6e242..2b0807ab 100644 --- a/stdlib/random.mli +++ b/stdlib/random.mli @@ -39,11 +39,11 @@ val full_init : int array -> unit (** Same as {!Random.init} but takes more data as seed. *) val self_init : unit -> unit -(** Initialize the domain-local generator with a random seed chosen - in a system-dependent way. If [/dev/urandom] is available on the host - machine, it is used to provide a highly random initial seed. Otherwise, a - less random seed is computed from system parameters (current time, process - IDs, domain-local state). *) +(** Initialize the domain-local generator with a random seed chosen in a + system-dependent way. If a cryptographically secure pseudorandom number + generator is available on the host machine, it is used to provide a highly + random initial seed. Otherwise, a less random seed is computed from system + parameters (current time, process IDs, domain-local state). *) val bits : unit -> int (** Return 30 random bits in a nonnegative integer. diff --git a/stdlib/repr.ml b/stdlib/repr.ml new file mode 100644 index 00000000..cc0d4615 --- /dev/null +++ b/stdlib/repr.ml @@ -0,0 +1,21 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Kate Deplaix *) +(* *) +(* Copyright 2025 Kate Deplaix *) +(* *) +(* All rights reserved. This file is distributed under the terms of *) +(* the GNU Lesser General Public License version 2.1, with the *) +(* special exception on linking described in the file LICENSE. *) +(* *) +(**************************************************************************) + +external phys_equal : 'a -> 'a -> bool = "%eq" + +external equal : 'a -> 'a -> bool = "%equal" +external compare : 'a -> 'a -> int = "%compare" + +let min = Stdlib.min +let max = Stdlib.max diff --git a/stdlib/repr.mli b/stdlib/repr.mli new file mode 100644 index 00000000..9a1f292c --- /dev/null +++ b/stdlib/repr.mli @@ -0,0 +1,69 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Kate Deplaix *) +(* *) +(* Copyright 2025 Kate Deplaix *) +(* *) +(* All rights reserved. This file is distributed under the terms of *) +(* the GNU Lesser General Public License version 2.1, with the *) +(* special exception on linking described in the file LICENSE. *) +(* *) +(**************************************************************************) + +(** Functions defined on the low-level representations of values. + + @since 5.4 *) + +(** {1 Physical comparison} *) + +external phys_equal : 'a -> 'a -> bool = "%eq" +(** [phys_equal e1 e2] tests for physical equality of [e1] and [e2]. + On mutable types such as references, arrays, byte sequences, records with + mutable fields and objects with mutable instance variables, + [phys_equal e1 e2] is true if and only if physical modification of [e1] + also affects [e2]. + On non-mutable types, the behavior of [phys_equal] is + implementation-dependent; however, it is guaranteed that + [phys_equal e1 e2] implies [compare e1 e2 = 0]. *) + +(** {1 Polymorphic comparison} *) + +external equal : 'a -> 'a -> bool = "%equal" +(** [equal e1 e2] tests for structural equality of [e1] and [e2]. + Mutable structures (e.g. references and arrays) are equal + if and only if their current contents are structurally equal, + even if the two mutable objects are not the same physical object. + Equality between functional values raises [Invalid_argument]. + Equality between cyclic data structures may not terminate. *) + +external compare : 'a -> 'a -> int = "%compare" +(** [compare x y] returns [0] if [x] is equal to [y], + a negative integer if [x] is less than [y], and a positive integer + if [x] is greater than [y]. The ordering implemented by [compare] + is compatible with the comparison predicates {!Stdlib.( = )}, + {!Stdlib.( < )} and {!Stdlib.( > )}, as well as the [equal] function + defined above, with one difference on the treatment of the float value + {!Stdlib.nan}. Namely, the comparison predicates treat [nan] + as different from any other float value, including itself; + while [compare] treats [nan] as equal to itself and less than any + other float value. This treatment of [nan] ensures that [compare] + defines a total ordering relation. + + [compare] applied to functional values may raise [Invalid_argument]. + [compare] applied to cyclic structures may not terminate. + + The [compare] function can be used as the comparison function + required by the {!Set.Make} and {!Map.Make} functors, as well as + the {!List.sort} and {!Array.sort} functions. *) + +val min : 'a -> 'a -> 'a +(** Return the smaller of the two arguments. + The result is unspecified if one of the arguments contains + the float value {!Stdlib.nan}. *) + +val max : 'a -> 'a -> 'a +(** Return the greater of the two arguments. + The result is unspecified if one of the arguments contains + the float value {!Stdlib.nan}. *) diff --git a/stdlib/result.ml b/stdlib/result.ml index 6d172702..b9e60f52 100644 --- a/stdlib/result.ml +++ b/stdlib/result.ml @@ -19,12 +19,20 @@ let ok v = Ok v let error e = Error e let value r ~default = match r with Ok v -> v | Error _ -> default let get_ok = function Ok v -> v | Error _ -> invalid_arg "result is Error _" +let get_ok' = function Ok v -> v | Error e -> invalid_arg e let get_error = function Error e -> e | Ok _ -> invalid_arg "result is Ok _" +let error_to_failure = function Ok v -> v | Error e -> failwith e let bind r f = match r with Ok v -> f v | Error _ as e -> e let join = function Ok r -> r | Error _ as e -> e let map f = function Ok v -> Ok (f v) | Error _ as e -> e +let product r0 r1 = match r0, r1 with +| (Error _ as r), _ +| _, (Error _ as r) -> r +| Ok v0, Ok v1 -> Ok (v0, v1) + let map_error f = function Error e -> Error (f e) | Ok _ as v -> v let fold ~ok ~error = function Ok v -> ok v | Error e -> error e +let retract = function Ok v -> v | Error v -> v let iter f = function Ok v -> f v | Error _ -> () let iter_error f = function Error e -> f e | Ok _ -> () let is_ok = function Ok _ -> true | Error _ -> false @@ -44,3 +52,10 @@ let compare ~ok ~error r0 r1 = match r0, r1 with let to_option = function Ok v -> Some v | Error _ -> None let to_list = function Ok v -> [v] | Error _ -> [] let to_seq = function Ok v -> Seq.return v | Error _ -> Seq.empty + +module Syntax = struct + let ( let* ) = bind + let ( and* ) = product + let ( let+ ) r f = map f r + let ( and+ ) = product +end diff --git a/stdlib/result.mli b/stdlib/result.mli index abf4f9e5..cfcaa976 100644 --- a/stdlib/result.mli +++ b/stdlib/result.mli @@ -39,11 +39,23 @@ val get_ok : ('a, 'e) result -> 'a @raise Invalid_argument if [r] is [Error _]. *) +val get_ok' : ('a, string) result -> 'a +(** [get_ok'] is like {!get_ok} but in case of error uses the + error message for raising [Invalid_argument]. + + @since 5.4 *) + val get_error : ('a, 'e) result -> 'e (** [get_error r] is [e] if [r] is [Error e] and raise otherwise. @raise Invalid_argument if [r] is [Ok _]. *) +val error_to_failure : ('a, string) result -> 'a +(** [error_to_failure r] is [v] if [r] is [Ok v] and raises [Failure e] + if [r] is [Error e]. + + @since 5.4 *) + val bind : ('a, 'e) result -> ('a -> ('b, 'e) result) -> ('b, 'e) result (** [bind r f] is [f v] if [r] is [Ok v] and [r] if [r] is [Error _]. *) @@ -53,6 +65,12 @@ val join : (('a, 'e) result, 'e) result -> ('a, 'e) result val map : ('a -> 'b) -> ('a, 'e) result -> ('b, 'e) result (** [map f r] is [Ok (f v)] if [r] is [Ok v] and [r] if [r] is [Error _]. *) +val product : ('a, 'e) result -> ('b, 'e) result -> ('a * 'b, 'e) result +(** [product r0 r1] is [Ok (v0, v1)] if [r0] is [Ok v0] and [r1] is [Ok v2] + and otherwise returns the error of [r0], if any, or the error of [r1]. + + @since 5.4 *) + val map_error : ('e -> 'f) -> ('a, 'e) result -> ('a, 'f) result (** [map_error f r] is [Error (f e)] if [r] is [Error e] and [r] if [r] is [Ok _]. *) @@ -61,6 +79,11 @@ val fold : ok:('a -> 'c) -> error:('e -> 'c) -> ('a, 'e) result -> 'c (** [fold ~ok ~error r] is [ok v] if [r] is [Ok v] and [error e] if [r] is [Error e]. *) +val retract : ('a, 'a) result -> 'a +(** [retract r] is [v] if [r] is [Ok v] or [Error v]. + + @since 5.4 *) + val iter : ('a -> unit) -> ('a, 'e) result -> unit (** [iter f r] is [f v] if [r] is [Ok v] and [()] otherwise. *) @@ -101,3 +124,23 @@ val to_list : ('a, 'e) result -> 'a list val to_seq : ('a, 'e) result -> 'a Seq.t (** [to_seq r] is [r] as a sequence. [Ok v] is the singleton sequence containing [v] and [Error _] is the empty sequence. *) + +(** {1:syntax Syntax} *) + +(** Binding operators. + + @since 5.4 *) +module Syntax : sig + + val ( let* ) : ('a, 'e) result -> ('a -> ('b, 'e) result) -> ('b, 'e) result + (** [( let* )] is {!Result.bind}. *) + + val ( and* ) : ('a, 'e) result -> ('b, 'e) result -> ('a * 'b, 'e) result + (** [( and* )] is {!Result.product}. *) + + val ( let+ ) : ('a, 'e) result -> ('a -> 'b) -> ('b, 'e) result + (** [( let+ )] is {!Result.map}. *) + + val ( and+ ) : ('a, 'e) result -> ('b, 'e) result -> ('a * 'b, 'e) result + (** [( and+ )] is {!Result.product}. *) +end diff --git a/stdlib/seq.ml b/stdlib/seq.ml index f93c7d0b..8ae04055 100644 --- a/stdlib/seq.ml +++ b/stdlib/seq.ml @@ -27,6 +27,8 @@ let return x () = Cons (x, empty) let cons x next () = Cons (x, next) +let singleton x () = Cons (x, empty) + let rec append seq1 seq2 () = match seq1() with | Nil -> seq2() @@ -50,6 +52,17 @@ let rec filter f seq () = match seq() with then Cons (x, filter f next) else filter f next () +let rec filteri_aux f i seq () = match seq() with + | Nil -> Nil + | Cons (x, next) -> + let i' = i + 1 in + if f i x + then Cons (x, filteri_aux f i' next) + else filteri_aux f i' next () + +let[@inline] filteri f seq () = + filteri_aux f 0 seq () + let rec concat seq () = match seq () with | Nil -> Nil | Cons (x, next) -> diff --git a/stdlib/seq.mli b/stdlib/seq.mli index 485d1105..52698537 100644 --- a/stdlib/seq.mli +++ b/stdlib/seq.mli @@ -150,7 +150,7 @@ val uncons : 'a t -> ('a * 'a t) option val length : 'a t -> int (** [length xs] is the length of the sequence [xs]. - The sequence [xs] must be finite. + Does not terminate if [xs] is infinite. @since 4.14 *) @@ -198,15 +198,15 @@ val for_all : ('a -> bool) -> 'a t -> bool (** [for_all p xs] determines whether all elements [x] of the sequence [xs] satisfy [p x]. - The sequence [xs] must be finite. + May not terminate if [xs] is infinite. @since 4.14 *) val exists : ('a -> bool) -> 'a t -> bool -(** [exists xs p] determines whether at least one element [x] +(** [exists p xs] determines whether at least one element [x] of the sequence [xs] satisfies [p x]. - The sequence [xs] must be finite. + May not terminate if [xs] is infinite. @since 4.14 *) @@ -216,7 +216,7 @@ val find : ('a -> bool) -> 'a t -> 'a option It returns [None] if there is no such element. - The sequence [xs] must be finite. + May not terminate if [xs] is infinite. @since 4.14 *) @@ -227,7 +227,7 @@ val find_index : ('a -> bool) -> 'a t -> int option It returns [None] if there is no such element. - The sequence [xs] must be finite. + May not terminate if [xs] is infinite. @since 5.1 *) @@ -238,7 +238,7 @@ val find_map : ('a -> 'b option) -> 'a t -> 'b option It returns [None] if there is no such element. - The sequence [xs] must be finite. + May not terminate if [xs] is infinite. @since 4.14 *) @@ -247,7 +247,7 @@ val find_mapi : (int -> 'a -> 'b option) -> 'a t -> 'b option the element as first argument (counting from 0), and the element itself as second argument. - The sequence [xs] must be finite. + May not terminate if [xs] is infinite. @since 5.1 *) @@ -298,7 +298,7 @@ val for_all2 : ('a -> 'b -> bool) -> 'a t -> 'b t -> bool [for_all2] and [equal] differ: [equal eq xs ys] can be true only if [xs] and [ys] have the same length. - At least one of the sequences [xs] and [ys] must be finite. + May not terminate if both of the sequences [xs] and [ys] are infinite. [for_all2 p xs ys] is equivalent to [for_all (fun b -> b) (map2 p xs ys)]. @@ -312,7 +312,7 @@ val exists2 : ('a -> 'b -> bool) -> 'a t -> 'b t -> bool iteration must stop as soon as one sequence is exhausted; the excess elements in the other sequence are ignored. - At least one of the sequences [xs] and [ys] must be finite. + May not terminate if both of the sequences [xs] and [ys] are infinite. [exists2 p xs ys] is equivalent to [exists (fun b -> b) (map2 p xs ys)]. @@ -323,7 +323,7 @@ val equal : ('a -> 'b -> bool) -> 'a t -> 'b t -> bool [equal eq xs ys] determines whether the sequences [xs] and [ys] are pointwise equal. - At least one of the sequences [xs] and [ys] must be finite. + May not terminate if both of the sequences [xs] and [ys] are infinite. @since 4.14 *) @@ -334,7 +334,7 @@ val compare : ('a -> 'b -> int) -> 'a t -> 'b t -> int For more details on comparison functions, see {!Array.sort}. - At least one of the sequences [xs] and [ys] must be finite. + May not terminate if both of the sequences [xs] and [ys] are infinite. @since 4.14 *) @@ -362,6 +362,11 @@ val cons : 'a -> 'a t -> 'a t @since 4.11 *) +val singleton: 'a -> 'a t +(** [singleton x] returns the one-element sequence containing only [x]. + + @since 5.4 *) + val init : int -> (int -> 'a) -> 'a t (** [init n f] is the sequence [f 0; f 1; ...; f (n-1)]. @@ -456,6 +461,14 @@ val filter : ('a -> bool) -> 'a t -> 'a t In other words, [filter p xs] is the sequence [xs], deprived of the elements [x] such that [p x] is false. *) +val filteri : (int -> 'a -> bool) -> 'a t -> 'a t +(** Same as {!filter}, but the predicate is applied to the index of + the element as first argument (counting from 0), and the element + itself as second argument. + + @since 5.4 +*) + val filter_map : ('a -> 'b option) -> 'a t -> 'b t (** [filter_map f xs] is the sequence of the elements [y] such that [f x = Some y], where [x] ranges over [xs]. diff --git a/stdlib/stdlib.ml b/stdlib/stdlib.ml index 79a9fb64..0fe14638 100644 --- a/stdlib/stdlib.ml +++ b/stdlib/stdlib.ml @@ -598,6 +598,7 @@ module Condition = Condition module Digest = Digest module Domain = Domain module Dynarray = Dynarray +module Pqueue = Pqueue module Effect = Effect module Either = Either module Ephemeron = Ephemeron @@ -607,6 +608,7 @@ module Format = Format module Fun = Fun module Gc = Gc module Hashtbl = Hashtbl +module Iarray = Iarray module In_channel = In_channel module Int = Int module Int32 = Int32 @@ -624,12 +626,14 @@ module Obj = Obj module Oo = Oo module Option = Option module Out_channel = Out_channel +module Pair = Pair module Parsing = Parsing module Printexc = Printexc module Printf = Printf module Queue = Queue module Random = Random module Result = Result +module Repr = Repr module Scanf = Scanf module Semaphore = Semaphore module Seq = Seq diff --git a/stdlib/stdlib.mli b/stdlib/stdlib.mli index 81af56ce..63a0e895 100644 --- a/stdlib/stdlib.mli +++ b/stdlib/stdlib.mli @@ -119,16 +119,12 @@ exception Undefined_recursive_module of (string * int * int) (** {1 Comparisons} *) external ( = ) : 'a -> 'a -> bool = "%equal" -(** [e1 = e2] tests for structural equality of [e1] and [e2]. - Mutable structures (e.g. references and arrays) are equal - if and only if their current contents are structurally equal, - even if the two mutable objects are not the same physical object. - Equality between functional values raises [Invalid_argument]. - Equality between cyclic data structures may not terminate. - Left-associative operator, see {!Ocaml_operators} for more information. *) +(** Alias of {!Repr.equal} + Left-associative operator, see {!Ocaml_operators} for more information. +*) external ( <> ) : 'a -> 'a -> bool = "%notequal" -(** Negation of {!Stdlib.( = )}. +(** Negation of {!Repr.equal}. Left-associative operator, see {!Ocaml_operators} for more information. *) @@ -152,56 +148,29 @@ external ( >= ) : 'a -> 'a -> bool = "%greaterequal" the usual orderings over integers, characters, strings, byte sequences and floating-point numbers, and extend them to a total ordering over all types. - The ordering is compatible with [( = )]. As in the case - of [( = )], mutable structures are compared by contents. + The ordering is compatible with {!Repr.equal}. As in the case + of {!Repr.equal}, mutable structures are compared by contents. Comparison between functional values raises [Invalid_argument]. Comparison between cyclic structures may not terminate. Left-associative operator, see {!Ocaml_operators} for more information. *) external compare : 'a -> 'a -> int = "%compare" -(** [compare x y] returns [0] if [x] is equal to [y], - a negative integer if [x] is less than [y], and a positive integer - if [x] is greater than [y]. The ordering implemented by [compare] - is compatible with the comparison predicates [=], [<] and [>] - defined above, with one difference on the treatment of the float value - {!Stdlib.nan}. Namely, the comparison predicates treat [nan] - as different from any other float value, including itself; - while [compare] treats [nan] as equal to itself and less than any - other float value. This treatment of [nan] ensures that [compare] - defines a total ordering relation. - - [compare] applied to functional values may raise [Invalid_argument]. - [compare] applied to cyclic structures may not terminate. - - The [compare] function can be used as the comparison function - required by the {!Set.Make} and {!Map.Make} functors, as well as - the {!List.sort} and {!Array.sort} functions. *) +(** Alias of {!Repr.compare}. *) val min : 'a -> 'a -> 'a -(** Return the smaller of the two arguments. - The result is unspecified if one of the arguments contains - the float value [nan]. *) +(** Alias of {!Repr.min}. *) val max : 'a -> 'a -> 'a -(** Return the greater of the two arguments. - The result is unspecified if one of the arguments contains - the float value [nan]. *) +(** Alias of {!Repr.max}. *) external ( == ) : 'a -> 'a -> bool = "%eq" -(** [e1 == e2] tests for physical equality of [e1] and [e2]. - On mutable types such as references, arrays, byte sequences, records with - mutable fields and objects with mutable instance variables, - [e1 == e2] is true if and only if physical modification of [e1] - also affects [e2]. - On non-mutable types, the behavior of [( == )] is - implementation-dependent; however, it is guaranteed that - [e1 == e2] implies [compare e1 e2 = 0]. - Left-associative operator, see {!Ocaml_operators} for more information. +(** Alias of {!Repr.phys_equal}. + Left-associative operator, see {!Ocaml_operators} for more information. *) external ( != ) : 'a -> 'a -> bool = "%noteq" -(** Negation of {!Stdlib.( == )}. +(** Negation of {!Repr.phys_equal}. Left-associative operator, see {!Ocaml_operators} for more information. *) @@ -1407,6 +1376,7 @@ module Domain = Domain "The Domain interface may change in incompatible ways in the future." ] module Dynarray = Dynarray +module Pqueue = Pqueue module Effect = Effect [@@alert "-unstable"] [@@alert unstable @@ -1420,6 +1390,7 @@ module Format = Format module Fun = Fun module Gc = Gc module Hashtbl = Hashtbl +module Iarray = Iarray module In_channel = In_channel module Int = Int module Int32 = Int32 @@ -1437,12 +1408,14 @@ module Obj = Obj module Oo = Oo module Option = Option module Out_channel = Out_channel +module Pair = Pair module Parsing = Parsing module Printexc = Printexc module Printf = Printf module Queue = Queue module Random = Random module Result = Result +module Repr = Repr module Scanf = Scanf module Semaphore = Semaphore module Seq = Seq diff --git a/stdlib/string.ml b/stdlib/string.ml index 7365cef2..892071fb 100644 --- a/stdlib/string.ml +++ b/stdlib/string.ml @@ -40,6 +40,7 @@ let empty = "" let of_bytes = B.to_string let to_bytes = B.of_string let sub s ofs len = + if ofs = 0 && length s = len then s else B.sub (bos s) ofs len |> bts let blit = B.blit_string @@ -62,6 +63,7 @@ let rec unsafe_blits dst pos sep seplen = function let concat sep = function [] -> "" + | [s] -> s | l -> let seplen = length sep in bts @@ unsafe_blits (B.create (sum_lengths 0 seplen l)) @@ -278,3 +280,101 @@ let get_int32_le s i = B.get_int32_le (bos s) i let get_int32_be s i = B.get_int32_be (bos s) i let get_int64_le s i = B.get_int64_le (bos s) i let get_int64_be s i = B.get_int64_be (bos s) i + +(* Spellchecking *) + +let utf_8_uchar_length s = + let slen = length s in + let i = ref 0 and ulen = ref 0 in + while (!i < slen) do + let dec_len = Uchar.utf_8_decode_length_of_byte (unsafe_get s !i) in + i := (!i + if dec_len = 0 then 1 (* count one Uchar.rep *) else dec_len); + incr ulen; + done; + !ulen + +let uchar_array_of_utf_8_string s = + let slen = length s in (* is an upper bound on Uchar.t count *) + let uchars = Array.make slen Uchar.max in + let k = ref 0 and i = ref 0 in + while (!i < slen) do + let dec = get_utf_8_uchar s !i in + i := !i + Uchar.utf_decode_length dec; + uchars.(!k) <- Uchar.utf_decode_uchar dec; + incr k; + done; + uchars, !k + +let edit_distance' ?(limit = Int.max_int) s (s0, len0) s1 = + if limit <= 1 then (if equal s s1 then 0 else limit) else + let[@inline] minimum a b c = Int.min a (Int.min b c) in + let s1, len1 = uchar_array_of_utf_8_string s1 in + let limit = Int.min (Int.max len0 len1) limit in + if Int.abs (len1 - len0) >= limit then limit else + let s0, s1 = if len0 > len1 then s0, s1 else s1, s0 in + let len0, len1 = if len0 > len1 then len0, len1 else len1, len0 in + let rec loop row_minus2 row_minus1 row i len0 limit s0 s1 = + if i > len0 then row_minus1.(Array.length row_minus1 - 1) else + let len1 = Array.length row - 1 in + let row_min = ref Int.max_int in + row.(0) <- i; + let jmax = + let jmax = Int.min len1 (i + limit - 1) in + if jmax < 0 then (* overflow *) len1 else jmax + in + for j = Int.max 1 (i - limit) to jmax do + let cost = if Uchar.equal s0.(i-1) s1.(j-1) then 0 else 1 in + let min = minimum + (row_minus1.(j-1) + cost) (* substitute *) + (row_minus1.(j) + 1) (* delete *) + (row.(j-1) + 1) (* insert *) + (* Note when j = i - limit, the latter [row] read makes a bogus read + on the value that was in the matrix at d.(i-2).(i - limit - 1). + Since by induction for all i,j, d.(i).(j) >= abs (i - j), + (row.(j-1) + 1) is greater or equal to [limit] and thus does + not affect adversely the minimum computation. *) + in + let min = + if (i > 1 && j > 1 && + Uchar.equal s0.(i-1) s1.(j-2) && + Uchar.equal s0.(i-2) s1.(j-1)) + then Int.min min (row_minus2.(j-2) + cost) (* transpose *) + else min + in + row.(j) <- min; + row_min := Int.min !row_min min; + done; + if !row_min >= limit then (* can no longer decrease *) limit else + loop row_minus1 row row_minus2 (i + 1) len0 limit s0 s1 + in + let ignore = + (* Value used to make the values around the diagonal stripe ignored + by the min computations when we have a limit. *) + limit + 1 + in + let row_minus2 = Array.make (len1 + 1) ignore in + let row_minus1 = Array.init (len1 + 1) (fun x -> x) in + let row = Array.make (len1 + 1) ignore in + let d = loop row_minus2 row_minus1 row 1 len0 limit s0 s1 in + if d > limit then limit else d + +let edit_distance ?limit s0 s1 = + let us0 = uchar_array_of_utf_8_string s0 in + edit_distance' ?limit s0 us0 s1 + +let default_max_dist s = match utf_8_uchar_length s with + | 0 | 1 | 2 -> 0 + | 3 | 4 -> 1 + | _ -> 2 + +let spellcheck ?(max_dist = default_max_dist) iter_dict s = + let min = ref (max_dist s) in + let acc = ref [] in + let select_words s us word = + let d = edit_distance' ~limit:(!min + 1) s us word in + if d = !min then (acc := word :: !acc) else + if d < !min then (min := d; acc := [word]) else () + in + let us = uchar_array_of_utf_8_string s in + iter_dict (select_words s us); + List.rev !acc diff --git a/stdlib/string.mli b/stdlib/string.mli index 186c1bc5..b50252ad 100644 --- a/stdlib/string.mli +++ b/stdlib/string.mli @@ -395,6 +395,53 @@ val is_valid_utf_16le : t -> bool (** [is_valid_utf_16le b] is [true] if and only if [b] contains valid UTF-16LE data. *) +(** {1:spellchecking Spellchecking} *) + +val edit_distance : ?limit:int -> t -> t -> int +(** [edit_distance s0 s1] is the number of single character edits + (understood as insertion, deletion, substitution, transposition) + that are needed to change [s0] into [s1]. + + If [limit] is provided the function returns with [limit] as soon + as it was determined that [s0] and [s1] have distance of at least + [limit]. This is faster if you have a fixed limit, for example for + spellchecking. + + The function assumes the strings are UTF-8 encoded and uses {!Uchar.t} + for the notion of character. Decoding errors are replaced by + {!Uchar.rep}. Normalizing the strings to + {{:https://unicode.org/glossary/#normalization_form_c}NFC} gives + better results. + + {b Note.} This implements the simpler Optimal String Alignement (OSA) + distance, not the Damerau-Levenshtein distance. With this function + ["ca"] and ["abc"] have a distance of 3 not 2. + + @since 5.4 +*) + +val spellcheck : + ?max_dist:(string -> int) -> ((string -> unit) -> unit) -> string -> + string list +(** [spellcheck iter_dict s] are the strings enumerated by the + iterator [iter_dict] whose {{!edit_distance}edit distance} to [s] + is the smallest and at most [max_dist s]. If multiple corrections + are returned their order is as found in [iter_dict]. The default + [max_dist s] is: + + {ul + {- [0] if [s] has 0 to 2 Unicode characters.} + {- [1] if [s] has 3 to 4 Unicode characters.} + {- [2] otherwise.}} + + If your dictionary is a list [l], a suitable [iter_dict] is given + by [(fun yield -> List.iter yield l)]. + + All strings are assumed to be UTF-8 encoded, decoding + errors are replaced by {!Uchar.rep} characters. + + @since 5.4 *) + (** {1 Binary decoding of integers} *) (** The functions in this section binary decode integers from strings. diff --git a/stdlib/stringLabels.mli b/stdlib/stringLabels.mli index c6771eaa..934220bc 100644 --- a/stdlib/stringLabels.mli +++ b/stdlib/stringLabels.mli @@ -395,6 +395,53 @@ val is_valid_utf_16le : t -> bool (** [is_valid_utf_16le b] is [true] if and only if [b] contains valid UTF-16LE data. *) +(** {1:spellchecking Spellchecking} *) + +val edit_distance : ?limit:int -> t -> t -> int +(** [edit_distance s0 s1] is the number of single character edits + (understood as insertion, deletion, substitution, transposition) + that are needed to change [s0] into [s1]. + + If [limit] is provided the function returns with [limit] as soon + as it was determined that [s0] and [s1] have distance of at least + [limit]. This is faster if you have a fixed limit, for example for + spellchecking. + + The function assumes the strings are UTF-8 encoded and uses {!Uchar.t} + for the notion of character. Decoding errors are replaced by + {!Uchar.rep}. Normalizing the strings to + {{:https://unicode.org/glossary/#normalization_form_c}NFC} gives + better results. + + {b Note.} This implements the simpler Optimal String Alignement (OSA) + distance, not the Damerau-Levenshtein distance. With this function + ["ca"] and ["abc"] have a distance of 3 not 2. + + @since 5.4 +*) + +val spellcheck : + ?max_dist:(string -> int) -> ((string -> unit) -> unit) -> string -> + string list +(** [spellcheck iter_dict s] are the strings enumerated by the + iterator [iter_dict] whose {{!edit_distance}edit distance} to [s] + is the smallest and at most [max_dist s]. If multiple corrections + are returned their order is as found in [iter_dict]. The default + [max_dist s] is: + + {ul + {- [0] if [s] has 0 to 2 Unicode characters.} + {- [1] if [s] has 3 to 4 Unicode characters.} + {- [2] otherwise.}} + + If your dictionary is a list [l], a suitable [iter_dict] is given + by [(fun yield -> List.iter yield l)]. + + All strings are assumed to be UTF-8 encoded, decoding + errors are replaced by {!Uchar.rep} characters. + + @since 5.4 *) + (** {1 Binary decoding of integers} *) (** The functions in this section binary decode integers from strings. diff --git a/stdlib/sys.ml.in b/stdlib/sys.ml.in index 842ea845..89777411 100644 --- a/stdlib/sys.ml.in +++ b/stdlib/sys.ml.in @@ -55,11 +55,7 @@ external is_regular_file : string -> bool = "caml_sys_is_regular_file" external remove: string -> unit = "caml_sys_remove" external rename : string -> string -> unit = "caml_sys_rename" external getenv: string -> string = "caml_sys_getenv" - -let getenv_opt s = - (* TODO: expose a non-raising primitive directly. *) - try Some (getenv s) - with Not_found -> None +external getenv_opt: string -> string option = "caml_sys_getenv_opt" external command: string -> int = "caml_sys_system_command" external time: unit -> (float [@unboxed]) = @@ -70,14 +66,19 @@ external rmdir: string -> unit = "caml_sys_rmdir" external getcwd: unit -> string = "caml_sys_getcwd" external readdir : string -> string array = "caml_sys_read_directory" +external io_buffer_size: unit -> int = "caml_sys_io_buffer_size" +let io_buffer_size = io_buffer_size () + let interactive = ref false +type signal = int + type signal_behavior = Signal_default | Signal_ignore - | Signal_handle of (int -> unit) + | Signal_handle of (signal -> unit) -external signal : int -> signal_behavior -> signal_behavior +external signal : signal -> signal_behavior -> signal_behavior = "caml_install_signal_handler" let set_signal sig_num sig_beh = ignore(signal sig_num sig_beh) @@ -110,6 +111,55 @@ let sigtrap = -25 let sigurg = -26 let sigxcpu = -27 let sigxfsz = -28 +let sigio = -29 +let sigwinch = -30 + +let signal_to_string s = + if s = sigabrt then "SIGABRT" + else if s = sigalrm then "SIGALRM" + else if s = sigfpe then "SIGFPE" + else if s = sighup then "SIGHUP" + else if s = sigill then "SIGILL" + else if s = sigint then "SIGINT" + else if s = sigkill then "SIGKILL" + else if s = sigpipe then "SIGPIPE" + else if s = sigquit then "SIGQUIT" + else if s = sigsegv then "SIGSEGV" + else if s = sigterm then "SIGTERM" + else if s = sigusr1 then "SIGUSR1" + else if s = sigusr2 then "SIGUSR2" + else if s = sigchld then "SIGCHLD" + else if s = sigcont then "SIGCONT" + else if s = sigstop then "SIGSTOP" + else if s = sigtstp then "SIGTSTP" + else if s = sigttin then "SIGTTIN" + else if s = sigttou then "SIGTTOU" + else if s = sigvtalrm then "SIGVTALRM" + else if s = sigprof then "SIGPROF" + else if s = sigbus then "SIGBUS" + else if s = sigpoll then "SIGPOLL" + else if s = sigsys then "SIGSYS" + else if s = sigtrap then "SIGTRAP" + else if s = sigurg then "SIGURG" + else if s = sigxcpu then "SIGXCPU" + else if s = sigxfsz then "SIGXFSZ" + else if s = sigio then "SIGIO" + else if s = sigwinch then "SIGWINCH" + else if s < sigwinch then invalid_arg "Sys.signal_to_string" + else "SIG(" ^ string_of_int s ^ ")" + +external rev_convert_signal_number: int -> int = + "caml_sys_rev_convert_signal_number" +external convert_signal_number: int -> int = + "caml_sys_convert_signal_number" + +let signal_of_int i = + if i < 0 then invalid_arg "Sys.signal_of_int" + else rev_convert_signal_number i + +let signal_to_int i = + if i < sigwinch then invalid_arg "Sys.signal_to_int" + else convert_signal_number i exception Break diff --git a/stdlib/sys.mli b/stdlib/sys.mli index b34120fe..a21cf211 100644 --- a/stdlib/sys.mli +++ b/stdlib/sys.mli @@ -126,6 +126,17 @@ external readdir : string -> string array = "caml_sys_read_directory" in any specific order; they are not, in particular, guaranteed to appear in alphabetical order. *) +val io_buffer_size: int +(** Size of C buffers used by the runtime system and IO primitives of the [unix] + library. + + Primitives that read from or write to values of type [string] or [bytes] + generally use an intermediate buffer of this size to avoid holding the + domain lock. + + @since 5.4 +*) + val interactive : bool ref [@@alert unsynchronized_access "The interactive status is a mutable global state." @@ -216,129 +227,175 @@ external poll_actions : unit -> unit = "%poll" (** {1 Signal handling} *) +type signal = int +(** The type for signal numbers. + + Negative numbers are used by OCaml to provide a platform-independent + number for signals recognised by OCaml. Positive numbers are always the + platform-dependent value for a given signal. + The function {!signal_of_int} converts known platform-dependent numbers + to independent ones, and {!signal_to_int} does the reverse. + @since 5.4 *) type signal_behavior = Signal_default | Signal_ignore - | Signal_handle of (int -> unit) (** *) + | Signal_handle of (signal -> unit) (** *) (** What to do when receiving a signal: - [Signal_default]: take the default behavior (usually: abort the program) - [Signal_ignore]: ignore the signal - [Signal_handle f]: call function [f], giving it the signal - number as argument. *) + number as an argument. *) external signal : - int -> signal_behavior -> signal_behavior = "caml_install_signal_handler" + signal -> signal_behavior -> signal_behavior = "caml_install_signal_handler" (** Set the behavior of the system on receipt of a given signal. The first argument is the signal number. Return the behavior previously associated with the signal. If the signal number is invalid (or not available on your system), an [Invalid_argument] - exception is raised. *) + exception is raised. -val set_signal : int -> signal_behavior -> unit -(** Same as {!Sys.signal} but return value is ignored. *) + If a platform-dependent signal number is used, it will be converted + to a platform-independent signal using {!signal_of_int} before + calling the handler. +*) +val set_signal : signal -> signal_behavior -> unit +(** Same as {!Sys.signal} but the return value is ignored. *) (** {2 Signal numbers for the standard POSIX signals.} *) -val sigabrt : int +val sigabrt : signal (** Abnormal termination *) -val sigalrm : int +val sigalrm : signal (** Timeout *) -val sigfpe : int +val sigfpe : signal (** Arithmetic exception *) -val sighup : int +val sighup : signal (** Hangup on controlling terminal *) -val sigill : int +val sigill : signal (** Invalid hardware instruction *) -val sigint : int +val sigint : signal (** Interactive interrupt (ctrl-C) *) -val sigkill : int +val sigkill : signal (** Termination (cannot be ignored) *) -val sigpipe : int +val sigpipe : signal (** Broken pipe *) -val sigquit : int +val sigquit : signal (** Interactive termination *) -val sigsegv : int +val sigsegv : signal (** Invalid memory reference *) -val sigterm : int +val sigterm : signal (** Termination *) -val sigusr1 : int +val sigusr1 : signal (** Application-defined signal 1 *) -val sigusr2 : int +val sigusr2 : signal (** Application-defined signal 2 *) -val sigchld : int +val sigchld : signal (** Child process terminated *) -val sigcont : int +val sigcont : signal (** Continue *) -val sigstop : int -(** Stop *) +val sigstop : signal +(** Stop (cannot be caught or ignored) *) -val sigtstp : int +val sigtstp : signal (** Interactive stop *) -val sigttin : int +val sigttin : signal (** Terminal read from background process *) -val sigttou : int +val sigttou : signal (** Terminal write from background process *) -val sigvtalrm : int +val sigvtalrm : signal (** Timeout in virtual time *) -val sigprof : int +val sigprof : signal (** Profiling interrupt *) -val sigbus : int +val sigbus : signal (** Bus error @since 4.03 *) -val sigpoll : int +val sigpoll : signal (** Pollable event @since 4.03 *) -val sigsys : int +val sigsys : signal (** Bad argument to routine @since 4.03 *) -val sigtrap : int +val sigtrap : signal (** Trace/breakpoint trap @since 4.03 *) -val sigurg : int +val sigurg : signal (** Urgent condition on socket @since 4.03 *) -val sigxcpu : int +val sigxcpu : signal (** Timeout in cpu time @since 4.03 *) -val sigxfsz : int +val sigxfsz : signal (** File size limit exceeded @since 4.03 *) +val sigio : signal +(** I/O is possible on a descriptor + @since 5.4 *) + +val sigwinch : signal +(** Window size change + @since 5.4 *) + +val signal_to_string : signal -> string +(** [signal_to_string] formats an OCaml [signal] as a C POSIX + {{:http://pubs.opengroup.org/onlinepubs/9799919799/basedefs/signal.h.html} + constant} or ["SIG(%d)"] for platform-dependent signal numbers. + + @raise Invalid_argument for unrecognised negative numbers. + @since 5.4 *) + +val signal_of_int : int -> signal +(** [signal_of_int n] converts a platform-dependent signal number [n] to + an OCaml signal number. + + For positive [n] this is [n] itself if OCaml does not have a + platform-independent signal number for [n]. + + @raise Invalid_argument if [n] is negative. + @since 5.4 *) + +val signal_to_int : signal -> int +(** [signal_to_int n] converts an OCaml signal number [n] to + a platform-dependent signal number. + + For positive [n] this is [n] itself. + + @raise Invalid_argument for unrecognised negative numbers. + @since 5.4 *) exception Break (** Exception raised on interactive interrupt if {!Sys.catch_break} is enabled. *) - val catch_break : bool -> unit (** [catch_break] governs whether interactive interrupt (ctrl-C) terminates the program or raises the [Break] exception. diff --git a/stdlib/templates/floatarraylabeled.template.mli b/stdlib/templates/floatarraylabeled.template.mli index b4898f1e..74689304 100644 --- a/stdlib/templates/floatarraylabeled.template.mli +++ b/stdlib/templates/floatarraylabeled.template.mli @@ -117,6 +117,22 @@ val of_list : float list -> t @raise Invalid_argument if the length of [l] is greater than [Sys.max_floatarray_length].*) +(** {1:comparison Comparison} *) + +val equal : eq:(float -> float -> bool) -> t -> t -> bool +(** [equal eq a b] is [true] if and only if [a] and [b] have the + same length [n] and for all [i] in \[[0];[n-1]\], [eq a.(i) b.(i)] + is [true]. + + @since 5.4 *) + +val compare : cmp:(float -> float -> int) -> t -> t -> int +(** [compare cmp a b] compares [a] and [b] according to the shortlex order, + that is, shorter arrays are smaller and equal-sized arrays are compared + in lexicographic order using [cmp] to compare elements. + + @since 5.4 *) + (** {1 Iterators} *) val iter : f:(float -> unit) -> t -> unit diff --git a/stdlib/templates/map.template.mli b/stdlib/templates/map.template.mli index 4639853a..0def0dab 100644 --- a/stdlib/templates/map.template.mli +++ b/stdlib/templates/map.template.mli @@ -88,7 +88,7 @@ module type S = val add_to_list: key:key -> data:'a -> 'a list t -> 'a list t (** [add_to_list ~key ~data m] is [m] with [key] mapped to [l] such that [l] is [data :: Map.find key m] if [key] was bound in - [m] and [[v]] otherwise. + [m] and [[data]] otherwise. @since 5.1 *) val update: key:key -> f:('a option -> 'a option) -> 'a t -> 'a t diff --git a/stdlib/type.ml b/stdlib/type.ml index d568b3b0..63cbfd1d 100644 --- a/stdlib/type.ml +++ b/stdlib/type.ml @@ -32,7 +32,7 @@ module Id = struct (module struct type t = a type _ id += Id : t id end) let[@inline] uid (type a) ((module A) : a t) = - Obj.Extension_constructor.id (Obj.Extension_constructor.of_val A.Id) + Obj.Extension_constructor.id [%extension_constructor A.Id] let provably_equal (type a b) ((module A) : a t) ((module B) : b t) : (a, b) eq option diff --git a/stdlib/uchar.ml b/stdlib/uchar.ml index 89e72e07..e3f3d7b2 100644 --- a/stdlib/uchar.ml +++ b/stdlib/uchar.ml @@ -80,6 +80,16 @@ let[@inline] utf_decode_uchar d = unsafe_of_int (d land 0xFFFFFF) let[@inline] utf_decode n u = ((8 lor n) lsl decode_bits) lor (to_int u) let[@inline] utf_decode_invalid n = (n lsl decode_bits) lor rep +let utf_8_decode_length_of_byte = function + | '\x00' .. '\x7F' -> 1 + | '\x80' .. '\xC1' -> 0 + | '\xC2' .. '\xDF' -> 2 + | '\xE0' .. '\xEF' -> 3 + | '\xF0' .. '\xF4' -> 4 + | _ -> 0 + +let max_utf_8_decode_length = 4 + let utf_8_byte_length u = match to_int u with | u when u < 0 -> assert false | u when u <= 0x007F -> 1 diff --git a/stdlib/uchar.mli b/stdlib/uchar.mli index b399e621..070c7e66 100644 --- a/stdlib/uchar.mli +++ b/stdlib/uchar.mli @@ -106,8 +106,9 @@ val hash : t -> int (** An unseeded hash function with the same output value as {!Hashtbl.hash}. This function allows this module to be passed as an argument to the functor {!Hashtbl.Make}. - - @since 5.3 *) + @before 5.3 The hashing algorithm was different. + Use [Hashtbl.rebuild] for stored tables which used this hashing + function *) (** {1:utf UTF codecs tools} @@ -143,6 +144,20 @@ val utf_decode_invalid : int -> utf_decode smaller or equal to [4] (this is not checked by the module). The resulting decode has {!rep} as the decoded Unicode character. *) +val utf_8_decode_length_of_byte : char -> int +(** [utf_8_decode_length_of_byte byte] is the number of bytes, from 1 + to {!max_utf_8_decode_length}, that a valid UTF-8 decode starting + with byte [byte] would consume or [0] if [byte] cannot start a + valid decode. + + @since 5.4 *) + +val max_utf_8_decode_length : int +(** [max_utf_8_decode_length] is [4], the maximal number of bytes + a valid or invalid UTF-8 decode can consume. + + @since 5.4 *) + val utf_8_byte_length : t -> int (** [utf_8_byte_length u] is the number of bytes needed to encode [u] in UTF-8. *) diff --git a/stdlib/weak.ml b/stdlib/weak.ml index e1e0a209..5cc3a67c 100644 --- a/stdlib/weak.ml +++ b/stdlib/weak.ml @@ -238,34 +238,30 @@ module Make (H : Hashtbl.HashedType) : (S with type data = H.t) = struct let bucket = t.table.(index) in let hashes = t.hashes.(index) in let sz = length bucket in - let rec loop i = - if i >= sz then begin - let newsz = - Int.min (3 * sz / 2 + 3) (Sys.max_array_length - additional_values) - in - if newsz <= sz then failwith "Weak.Make: hash bucket cannot grow more"; - let newbucket = weak_create newsz in - let newhashes = Array.make newsz 0 in - blit bucket 0 newbucket 0 sz; - Array.blit hashes 0 newhashes 0 sz; - setter newbucket sz d; - newhashes.(sz) <- h; - t.table.(index) <- newbucket; - t.hashes.(index) <- newhashes; - if sz <= t.limit && newsz > t.limit then begin - t.oversize <- t.oversize + 1; - for _i = 0 to over_limit do test_shrink_bucket t done; - end; - if t.oversize > Array.length t.table / over_limit then resize t; - end else if check bucket i then begin - loop (i + 1) - end else begin - setter bucket i d; - hashes.(i) <- h; + let i = ref 0 in + while !i < sz && check bucket !i do incr i done; + if !i < sz then begin + setter bucket !i d; + hashes.(!i) <- h; + end else begin + let newsz = + Int.min (3 * sz / 2 + 3) (Sys.max_array_length - additional_values) + in + if newsz <= sz then failwith "Weak.Make: hash bucket cannot grow more"; + let newbucket = weak_create newsz in + let newhashes = Array.make newsz 0 in + blit bucket 0 newbucket 0 sz; + Array.blit hashes 0 newhashes 0 sz; + setter newbucket sz d; + newhashes.(sz) <- h; + t.table.(index) <- newbucket; + t.hashes.(index) <- newhashes; + if sz <= t.limit && newsz > t.limit then begin + t.oversize <- t.oversize + 1; + for _i = 0 to over_limit do test_shrink_bucket t done; end; - in - loop 0 - + if t.oversize > Array.length t.table / over_limit then resize t; + end let add t d = let h = H.hash d in @@ -274,21 +270,27 @@ module Make (H : Hashtbl.HashedType) : (S with type data = H.t) = struct (* General auxiliary function for searching for a particular value * in a hash-set, and acting according to whether or not it's found *) - let find_aux t d found notfound = + let find_aux t d k_found k_notfound = let h = H.hash d in let index = get_index t h in let bucket = t.table.(index) in let hashes = t.hashes.(index) in let sz = length bucket in - let rec loop i = - if i >= sz then notfound h index - else if h = hashes.(i) then begin - match get bucket i with - | Some v as opt when H.equal v d -> found bucket i opt v - | _ -> loop (i + 1) - end else loop (i + 1) - in - loop 0 + let found = ref None in + let i = ref 0 in + while !i < sz && Option.is_none !found do + if h = hashes.(!i) then begin + match get bucket !i with + | Some v as opt -> + if H.equal v d then + found := opt + else incr i + | _ -> incr i + end else incr i + done; + match !found with + | Some v as opt -> k_found bucket !i opt v + | None -> k_notfound h index let find_opt t d = find_aux t d (fun _b _i o _v -> o) (fun _h _i -> None) diff --git a/testsuite/HACKING.adoc b/testsuite/HACKING.adoc index 05bc9bad..42b35ace 100644 --- a/testsuite/HACKING.adoc +++ b/testsuite/HACKING.adoc @@ -11,7 +11,8 @@ a specific sub-directory. == Writing new tests There are many kind of tests already, so the easiest way to start is -to extend or copy an existing test. +to extend or copy an existing test. To learn how to write new tests +using ocamltest, read [OCAMLTEST.org](../ocamltest/OCAMLTEST.org). Note: in april 2023, the test scripting language has changed: the org-mode-based syntax was replaced by at C-like syntax. ocamltest diff --git a/testsuite/tests/array-functions/test_iarray.ml b/testsuite/tests/array-functions/test_iarray.ml new file mode 100644 index 00000000..df2802d9 --- /dev/null +++ b/testsuite/tests/array-functions/test_iarray.ml @@ -0,0 +1,270 @@ +(* TEST *) + +(* Copied from [test.ml], but with all the [Array.fill] tests deleted *) + +(* [iarray]s don't have the [make*] functions, so we redefine them here *) +let make n x = Iarray.init n (fun _ -> x);; +let make_matrix m n x = make m (make n x);; + +let () = + let a : _ iarray = [|0;1;2;3;4;5;6;7;8;9|] in + assert (Iarray.exists (fun a -> a < 10) a); + assert (Iarray.exists (fun a -> a > 0) a); + assert (Iarray.exists (fun a -> a = 0) a); + assert (Iarray.exists (fun a -> a = 1) a); + assert (Iarray.exists (fun a -> a = 2) a); + assert (Iarray.exists (fun a -> a = 3) a); + assert (Iarray.exists (fun a -> a = 4) a); + assert (Iarray.exists (fun a -> a = 5) a); + assert (Iarray.exists (fun a -> a = 6) a); + assert (Iarray.exists (fun a -> a = 7) a); + assert (Iarray.exists (fun a -> a = 8) a); + assert (Iarray.exists (fun a -> a = 9) a); + assert (not (Iarray.exists (fun a -> a < 0) a)); + assert (not (Iarray.exists (fun a -> a > 9) a)); + assert (Iarray.exists (fun _ -> true) a); +;; + +let () = + let a : _ iarray = [|1;2;3|] in + assert (Iarray.exists (fun a -> a < 3) a); + assert (Iarray.exists (fun a -> a < 2) a); + assert (not (Iarray.exists (fun a -> a < 1) a)); + assert (Iarray.exists (fun a -> a mod 2 = 0) [|1;4;5|]); + assert (not (Iarray.exists (fun a -> a mod 2 = 0) [|1;3;5|])); + assert (not (Iarray.exists (fun _ -> true) [||])); + assert (Iarray.exists (fun a -> Iarray.get a 9 = 1) (make_matrix 10 10 1));; +;; + +let () = + let a: int iarray = [||] in + assert (not (Iarray.exists (fun a -> a = 0) a)); + assert (not (Iarray.exists (fun a -> a = 1) a)); + assert (not (Iarray.exists (fun a -> a = 2) a)); + assert (not (Iarray.exists (fun a -> a = 3) a)); + assert (not (Iarray.exists (fun a -> a = 4) a)); + assert (not (Iarray.exists (fun a -> a = 5) a)); + assert (not (Iarray.exists (fun a -> a = 6) a)); + assert (not (Iarray.exists (fun a -> a = 7) a)); + assert (not (Iarray.exists (fun a -> a = 8) a)); + assert (not (Iarray.exists (fun a -> a = 9) a)); + assert (not (Iarray.exists (fun a -> a <> 0) a)); + assert (not (Iarray.exists (fun a -> a <> 1) a)); + assert (not (Iarray.exists (fun a -> a <> 2) a)); + assert (not (Iarray.exists (fun a -> a <> 3) a)); + assert (not (Iarray.exists (fun a -> a <> 4) a)); + assert (not (Iarray.exists (fun a -> a <> 5) a)); + assert (not (Iarray.exists (fun a -> a <> 6) a)); + assert (not (Iarray.exists (fun a -> a <> 7) a)); + assert (not (Iarray.exists (fun a -> a <> 8) a)); + assert (not (Iarray.exists (fun a -> a <> 9) a)); + assert (not (Iarray.exists (fun a -> a < 0) a)); + assert (not (Iarray.exists (fun a -> a < 1) a)); + assert (not (Iarray.exists (fun a -> a < 2) a)); + assert (not (Iarray.exists (fun a -> a < 3) a)); + assert (not (Iarray.exists (fun a -> a < 4) a)); + assert (not (Iarray.exists (fun a -> a < 5) a)); + assert (not (Iarray.exists (fun a -> a < 6) a)); + assert (not (Iarray.exists (fun a -> a < 7) a)); + assert (not (Iarray.exists (fun a -> a < 8) a)); + assert (not (Iarray.exists (fun a -> a < 9) a)); + assert (not (Iarray.exists (fun a -> a > 0) a)); + assert (not (Iarray.exists (fun a -> a > 1) a)); + assert (not (Iarray.exists (fun a -> a > 2) a)); + assert (not (Iarray.exists (fun a -> a > 3) a)); + assert (not (Iarray.exists (fun a -> a > 4) a)); + assert (not (Iarray.exists (fun a -> a > 5) a)); + assert (not (Iarray.exists (fun a -> a > 6) a)); + assert (not (Iarray.exists (fun a -> a > 7) a)); + assert (not (Iarray.exists (fun a -> a > 8) a)); + assert (not (Iarray.exists (fun a -> a > 9) a)); +;; + +let () = + let a : _ iarray = [|0;1;2;3;4;5;6;7;8;9|] in + assert (Iarray.for_all (fun a -> a < 10) a); + assert (Iarray.for_all (fun a -> a >= 0) a); + assert (not (Iarray.for_all (fun a -> a = 0) a)); + assert (not (Iarray.for_all (fun a -> a = 1) a)); + assert (not (Iarray.for_all (fun a -> a = 2) a)); + assert (not (Iarray.for_all (fun a -> a = 3) a)); + assert (not (Iarray.for_all (fun a -> a = 4) a)); + assert (not (Iarray.for_all (fun a -> a = 5) a)); + assert (not (Iarray.for_all (fun a -> a = 6) a)); + assert (not (Iarray.for_all (fun a -> a = 7) a)); + assert (not (Iarray.for_all (fun a -> a = 8) a)); + assert (not (Iarray.for_all (fun a -> a = 9) a)); + assert (Iarray.for_all (fun a -> a <> 10) a); + assert (Iarray.for_all (fun a -> a <> (-1)) a); + assert (Iarray.for_all (fun _ -> true) a); +;; + +let () = + assert (Iarray.for_all (fun x -> x mod 2 = 0) [|2;4;6|]); + assert (not (Iarray.for_all (fun x -> x mod 2 = 0) [|2;3;6|])); + assert (Iarray.for_all (fun _ -> false) [||]); + assert (Iarray.for_all (fun a -> Iarray.get a 9 = 1) (make_matrix 10 10 1)); +;; +;; + +let () = + let a : _ iarray = [||] in + assert (Iarray.for_all (fun a -> a < 10) a); + assert (Iarray.for_all (fun a -> a >= 0) a); + assert (Iarray.for_all (fun a -> a = 0) a); + assert (Iarray.for_all (fun a -> a = 1) a); + assert (Iarray.for_all (fun a -> a = 2) a); + assert (Iarray.for_all (fun a -> a = 3) a); + assert (Iarray.for_all (fun a -> a = 4) a); + assert (Iarray.for_all (fun a -> a = 5) a); + assert (Iarray.for_all (fun a -> a = 6) a); + assert (Iarray.for_all (fun a -> a = 7) a); + assert (Iarray.for_all (fun a -> a = 8) a); + assert (Iarray.for_all (fun a -> a = 9) a); + assert (Iarray.for_all (fun a -> a <> 10) a); + assert (Iarray.for_all (fun a -> a <> (-1)) a); + assert (Iarray.for_all (fun _ -> true) a); +;; + +let does_raise3 f a b c = + try + ignore (f a b c); + false + with _ -> + true + +let () = + let a : _ iarray = [|1;2;3;4;5;6;7;8;9|] + and b : _ iarray = [|1;2;3;4;5;6;7;8;9|] in + assert (Iarray.exists2 (fun a b -> a = b) a b); + assert (Iarray.exists2 (fun a b -> a - b = 0) a b); + assert (Iarray.exists2 (fun a b -> a = 1 && b = 1) a b); + assert (Iarray.exists2 (fun a b -> a = 2 && b = 2) a b); + assert (Iarray.exists2 (fun a b -> a = 3 && b = 3) a b); + assert (Iarray.exists2 (fun a b -> a = 4 && b = 4) a b); + assert (Iarray.exists2 (fun a b -> a = 5 && b = 5) a b); + assert (Iarray.exists2 (fun a b -> a = 6 && b = 6) a b); + assert (Iarray.exists2 (fun a b -> a = 7 && b = 7) a b); + assert (Iarray.exists2 (fun a b -> a = 8 && b = 8) a b); + assert (Iarray.exists2 (fun a b -> a = 9 && b = 9) a b); + assert (not (Iarray.exists2 (fun a b -> a <> b) a b)); +;; + +let () = + let a : _ iarray = [|1|] + and b : _ iarray = [|1;2|] in + assert (does_raise3 Iarray.exists2 (fun a b -> a = b) a b); + assert (does_raise3 Iarray.exists2 (fun _ _ -> true) a b); + assert (does_raise3 Iarray.exists2 (fun _ _ -> false) a b); + assert (does_raise3 Iarray.exists2 (fun a b -> a = 1 && b = 1) a b); + assert (does_raise3 Iarray.exists2 (fun a b -> a = 2 && b = 2) a b); + assert (does_raise3 Iarray.exists2 (fun a b -> a = 3 && b = 3) a b); + assert (does_raise3 Iarray.exists2 (fun a b -> a = 4 && b = 4) a b); + assert (does_raise3 Iarray.exists2 (fun a b -> a = 5 && b = 5) a b); + assert (does_raise3 Iarray.exists2 (fun a b -> a = 6 && b = 6) a b); + assert (does_raise3 Iarray.exists2 (fun a b -> a = 7 && b = 7) a b); + assert (does_raise3 Iarray.exists2 (fun a b -> a = 8 && b = 8) a b); + assert (does_raise3 Iarray.exists2 (fun a b -> a = 9 && b = 9) a b); +;; + +let () = + assert (Iarray.exists2 (=) [|1;2;3|] [|3;2;1|]); + assert (not (Iarray.exists2 (<>) [|1;2;3|] [|1;2;3|])); + assert (does_raise3 Iarray.exists2 (=) [|1;2|] [|3|]); +;; + +let () = + let a : _ iarray = [|1;2;3;4;5;6;7;8;9|] + and b : _ iarray = [|1;2;3;4;5;6;7;8;9|] in + assert (Iarray.for_all2 (fun a b -> a = b) a b); + assert (Iarray.for_all2 (fun a b -> a - b = 0) a b); + assert (Iarray.for_all2 (fun a b -> a > 0 && b > 0) a b); + assert (Iarray.for_all2 (fun a b -> a < 10 && b < 10) a b); + assert (Iarray.for_all2 (fun a b -> if a = 1 then b = 1 else b <> 1) a b); + assert (Iarray.for_all2 (fun a b -> if a = 2 then b = 2 else b <> 2) a b); + assert (Iarray.for_all2 (fun a b -> if a = 3 then b = 3 else b <> 3) a b); + assert (Iarray.for_all2 (fun a b -> if a = 4 then b = 4 else b <> 4) a b); + assert (Iarray.for_all2 (fun a b -> if a = 5 then b = 5 else b <> 5) a b); + assert (Iarray.for_all2 (fun a b -> if a = 6 then b = 6 else b <> 6) a b); + assert (Iarray.for_all2 (fun a b -> if a = 7 then b = 7 else b <> 7) a b); + assert (Iarray.for_all2 (fun a b -> if a = 8 then b = 8 else b <> 8) a b); + assert (Iarray.for_all2 (fun a b -> if a = 9 then b = 9 else b <> 9) a b); + assert (not (Iarray.for_all2 (fun a b -> a <> b) a b)); +;; + +let () = + let a : _ iarray = [|1|] + and b : _ iarray = [|1;2|] in + assert (does_raise3 Iarray.for_all2 (fun a b -> a = b) a b); + assert (does_raise3 Iarray.for_all2 (fun _ _ -> true) a b); + assert (does_raise3 Iarray.for_all2 (fun _ _ -> false) a b); + assert (does_raise3 Iarray.for_all2 (fun a b -> a = 1 && b = 1) a b); + assert (does_raise3 Iarray.for_all2 (fun a b -> a = 2 && b = 2) a b); + assert (does_raise3 Iarray.for_all2 (fun a b -> a = 3 && b = 3) a b); + assert (does_raise3 Iarray.for_all2 (fun a b -> a = 4 && b = 4) a b); + assert (does_raise3 Iarray.for_all2 (fun a b -> a = 5 && b = 5) a b); + assert (does_raise3 Iarray.for_all2 (fun a b -> a = 6 && b = 6) a b); + assert (does_raise3 Iarray.for_all2 (fun a b -> a = 7 && b = 7) a b); + assert (does_raise3 Iarray.for_all2 (fun a b -> a = 8 && b = 8) a b); + assert (does_raise3 Iarray.for_all2 (fun a b -> a = 9 && b = 9) a b); +;; + +let () = + assert (not (Iarray.for_all2 (=) [|1;2;3|] [|3;2;1|])); + assert (Iarray.for_all2 (=) [|1;2;3|] [|1;2;3|]); + assert (not (Iarray.for_all2 (<>) [|1;2;3|] [|3;2;1|])); + assert (does_raise3 Iarray.for_all2 (=) [|1;2;3|] [|1;2;3;4|]); + assert (does_raise3 Iarray.for_all2 (=) [|1;2|] [||]); +;; + +let () = + let a : _ iarray = [|1;2;3;4;5;6;7;8;9|] in + assert (Iarray.mem 1 a); + assert (Iarray.mem 2 a); + assert (Iarray.mem 3 a); + assert (Iarray.mem 4 a); + assert (Iarray.mem 5 a); + assert (Iarray.mem 6 a); + assert (Iarray.mem 7 a); + assert (Iarray.mem 8 a); + assert (Iarray.mem 9 a); + assert (not (Iarray.mem 0 a)); + assert (not (Iarray.mem 10 a)); +;; + +let () = + assert (Iarray.mem 2 [|1;2;3|]); + assert (not (Iarray.mem 2 [||])); + assert (Iarray.mem (ref 3) [|ref 1; ref 2; ref 3|]); + assert (Iarray.mem [|1;2;3|] [|[|1;2;3|];[|2;3;4|];[|0|]|]); + assert (Iarray.mem 1 (make 100 1)); + assert (Iarray.mem (ref 1) (make 100 (ref 1))); +;; + +let () = + let a : _ iarray = [|1;2;3;4;5;6;7;8;9|] in + assert (Iarray.memq 1 a); + assert (Iarray.memq 2 a); + assert (Iarray.memq 3 a); + assert (Iarray.memq 4 a); + assert (Iarray.memq 5 a); + assert (Iarray.memq 6 a); + assert (Iarray.memq 7 a); + assert (Iarray.memq 8 a); + assert (Iarray.memq 9 a); + assert (not (Iarray.memq 0 a)); + assert (not (Iarray.memq 10 a)); +;; + +let () = + assert (Iarray.memq 2 [|1;2;3|]); + assert (not (Iarray.memq 2 [||])); + assert (not (Iarray.memq (ref 3) [|ref 1; ref 2; ref 3|])); + (* The below tests immutable arrays of *mutable* arrays because physical + equality is only guaranteed to be distinct for mutable values *) + assert (not (Iarray.memq [|1;2;3|] [|[|1;2;3|];[|2;3;4|];[|0|]|])); + assert (Iarray.memq 1 (make 100 1)); + assert (not (Iarray.memq (ref 1) (make 100 (ref 1)))); +;; + +let () = print_endline "OK" diff --git a/testsuite/tests/array-functions/test_iarray.reference b/testsuite/tests/array-functions/test_iarray.reference new file mode 100644 index 00000000..d86bac9d --- /dev/null +++ b/testsuite/tests/array-functions/test_iarray.reference @@ -0,0 +1 @@ +OK diff --git a/testsuite/tests/asmcomp/0001-test.compilers.reference b/testsuite/tests/asmcomp/0001-test.compilers.reference index caa67d4c..4b546038 100644 --- a/testsuite/tests/asmcomp/0001-test.compilers.reference +++ b/testsuite/tests/asmcomp/0001-test.compilers.reference @@ -1,2 +1,2 @@ File "0001-test.ml", line 1: -Warning 24 [bad-module-name]: bad source file name: "0001-test" is not a valid module name. +Warning 24 [bad-module-name]: bad source file name: 0001-test is not a valid module name. diff --git a/testsuite/tests/asmcomp/func_sections.ml b/testsuite/tests/asmcomp/func_sections.ml index eae0681b..76719a2b 100644 --- a/testsuite/tests/asmcomp/func_sections.ml +++ b/testsuite/tests/asmcomp/func_sections.ml @@ -2,28 +2,20 @@ flags = "-S -function-sections"; function_sections; { - arch_arm; - reference = "${test_source_directory}/func_sections.arm.reference"; - native; - }{ arch_arm64; - reference = "${test_source_directory}/func_sections.arm.reference"; + reference = "${test_source_directory}/func_sections.no_jump_tables_in_rodata.reference"; native; }{ arch_amd64; reference = "${test_source_directory}/func_sections.reference"; native; - }{ - arch_i386; - reference = "${test_source_directory}/func_sections.reference"; - native; }{ arch_power; - reference = "${test_source_directory}/func_sections.arm.reference"; + reference = "${test_source_directory}/func_sections.no_jump_tables_in_rodata.reference"; native; }{ - arch_riscv64; - reference = "${test_source_directory}/func_sections.reference"; + arch_riscv; + reference = "${test_source_directory}/func_sections.no_jump_tables_in_rodata.reference"; native; }{ arch_s390x; @@ -32,8 +24,9 @@ } *) -(* We have a separate reference output for ARM and POWER because - they don't emit .text after jump tables. *) +(* We have a separate reference output for the backends which do not emit + jump tables in .rodata, and thus do not need to emit text section + directives after them. This only affects compilation of f5 below. *) (* Test for anonymous functions which result in a mangled symbol *) let f4 list = diff --git a/testsuite/tests/asmcomp/func_sections.arm.reference b/testsuite/tests/asmcomp/func_sections.no_jump_tables_in_rodata.reference similarity index 100% rename from testsuite/tests/asmcomp/func_sections.arm.reference rename to testsuite/tests/asmcomp/func_sections.no_jump_tables_in_rodata.reference diff --git a/testsuite/tests/asmcomp/func_sections.run b/testsuite/tests/asmcomp/func_sections.run index cb63628b..a16d5dd0 100755 --- a/testsuite/tests/asmcomp/func_sections.run +++ b/testsuite/tests/asmcomp/func_sections.run @@ -7,4 +7,4 @@ ${program} # now check the assembly file produced during compilation asm=${test_build_directory}/func_sections.s -grep "\.section \.text\.caml\.camlFunc_sections\." "$asm" | wc -l | tr -d ' ' | sed '/^$/d' +grep "\.section \.text\.caml\.camlFunc_sections[.$]" "$asm" | wc -l | tr -d ' ' | sed '/^$/d' diff --git a/testsuite/tests/asmcomp/issue13875.ml b/testsuite/tests/asmcomp/issue13875.ml new file mode 100644 index 00000000..307dcea4 --- /dev/null +++ b/testsuite/tests/asmcomp/issue13875.ml @@ -0,0 +1,10 @@ +(* TEST *) + +let () = + let o1 = object val x = 123 method get () = x end in + let o2 = object method get () = 456 end in + let r = ref o1 in + let n = (!r)#get (r := o2) in + (* Order of evaluation here is not really specified or consistent, + but we want to get either 123 or 456 *) + assert (n = 123 || n = 456) diff --git a/testsuite/tests/asmcomp/regression_value_kinds.ml b/testsuite/tests/asmcomp/regression_value_kinds.ml new file mode 100644 index 00000000..0b274d3c --- /dev/null +++ b/testsuite/tests/asmcomp/regression_value_kinds.ml @@ -0,0 +1,21 @@ +(* TEST + native; +*) + +type r = { foo : float } + +type 'a t = Left of 'a | Right of r + +type 'a ty = + | Float : float ty + | Anything : 'a ty + +let f (type a) (ty : a ty) (x : a t) = + match ty, x with + | Float, Right { foo = (((3.5 : a) as a) : float) } + | _, Left a -> ignore (Sys.opaque_identity a) + | _, _ -> () + +let f = Sys.opaque_identity f + +let () = f Anything (Left 0) diff --git a/testsuite/tests/asmcomp/static_catch_unboxing.ml b/testsuite/tests/asmcomp/static_catch_unboxing.ml new file mode 100644 index 00000000..8fb5e5b4 --- /dev/null +++ b/testsuite/tests/asmcomp/static_catch_unboxing.ml @@ -0,0 +1,17 @@ +(* TEST + native; +*) + +let[@inline never][@local never] f b x = + let[@local] g y = + y +. x > 0. + in + if b then g x else g (x +. 1.) + +let () = + let x0 = Gc.allocated_bytes () in + let x1 = Gc.allocated_bytes () in + ignore (f true 1.); + ignore (f false 1.); + let x2 = Gc.allocated_bytes () in + assert(x1 -. x0 = x2 -. x1) diff --git a/testsuite/tests/ast-invariants/test.ml b/testsuite/tests/ast-invariants/test.ml index 47f28644..69689b3f 100644 --- a/testsuite/tests/ast-invariants/test.ml +++ b/testsuite/tests/ast-invariants/test.ml @@ -62,7 +62,11 @@ let kind fn = let rec walk dir = Array.iter (fun fn -> - if fn = "" || fn.[0] = '.' then + (* Ignore any "hidden" names (.git, etc.). Similarly ignore anything + beginning with _ - catches both the ancient use of _ instead of . on + Windows and also means we don't recurse into either _ocamltest or + _build directories. *) + if fn = "" || fn.[0] = '.' || fn.[0] = '_' then () else begin let fn = Filename.concat dir fn in diff --git a/testsuite/tests/atomic-locs/cmm.compilers.reference b/testsuite/tests/atomic-locs/cmm.compilers.reference new file mode 100644 index 00000000..8985e70b --- /dev/null +++ b/testsuite/tests/atomic-locs/cmm.compilers.reference @@ -0,0 +1,56 @@ + +cmm: +(data) +(data + int 3063 + "camlCmm.5": + addr "camlCmm.standard_atomic_get_274" + int 72057594037927941) +(data + int 4087 + "camlCmm.4": + addr "caml_curry3" + int 216172782113783815 + addr "camlCmm.standard_atomic_cas_299") +(data int 3063 "camlCmm.3": addr "camlCmm.get_307" int 72057594037927941) +(data + int 4087 + "camlCmm.2": + addr "caml_curry2" + int 144115188075855879 + addr "camlCmm.set_310") +(data + int 4087 + "camlCmm.1": + addr "caml_curry3" + int 216172782113783815 + addr "camlCmm.cas_314") +(data int 5888 global "camlCmm" "camlCmm": int 1 int 1 int 1 int 1 int 1) +(data global "camlCmm.gc_roots" "camlCmm.gc_roots": addr "camlCmm" int 0) +(function camlCmm.standard_atomic_get_274 (r: val) (load_mut_atomic val r)) + +(function camlCmm.standard_atomic_cas_299 (r: val oldv: val newv: val) + (extcall "caml_atomic_cas_field" r 1 oldv newv int,int,int,int->val)) + +(function camlCmm.get_307 (r: val) (load_mut_atomic val (+a r 8))) + +(function camlCmm.set_310 (r: val v: val) + (extcall "caml_atomic_exchange_field" r 3 v int,int,int->unit) 1) + +(function camlCmm.cas_314 (r: val oldv: val newv: val) + (extcall "caml_atomic_cas_field" r 3 oldv newv int,int,int,int->val)) + +(function camlCmm.entry () + (let standard_atomic_get "camlCmm.5" + (extcall "caml_initialize" "camlCmm" standard_atomic_get ->unit)) + (let standard_atomic_cas "camlCmm.4" + (extcall "caml_initialize" (+a "camlCmm" 8) standard_atomic_cas ->unit)) + (let get "camlCmm.3" + (extcall "caml_initialize" (+a "camlCmm" 16) get ->unit)) + (let set "camlCmm.2" + (extcall "caml_initialize" (+a "camlCmm" 24) set ->unit)) + (let cas "camlCmm.1" + (extcall "caml_initialize" (+a "camlCmm" 32) cas ->unit)) + 1) + +(data) diff --git a/testsuite/tests/atomic-locs/cmm.ml b/testsuite/tests/atomic-locs/cmm.ml new file mode 100644 index 00000000..c4def560 --- /dev/null +++ b/testsuite/tests/atomic-locs/cmm.ml @@ -0,0 +1,42 @@ +(* TEST_BELOW *) + +(* standard atomics *) + +let standard_atomic_get (r : 'a Atomic.t) = + Atomic.get r + +let standard_atomic_cas (r : 'a Atomic.t) oldv newv = + Atomic.compare_and_set r oldv newv + + +(* atomic record fields *) + +type 'a atomic = { filler : unit; mutable x : 'a [@atomic] } + +let get (r : 'a atomic) : 'a = + r.x + +let set (r : 'a atomic) v = + r.x <- v + +let cas (r : 'a atomic) oldv newv = + Atomic.Loc.compare_and_set [%atomic.loc r.x] oldv newv + +(* TEST + + (* we restrict this test to a single configuration, + amd64+linux no-tsan no-flambda + to avoid dealing with differences in cmm output across systems + (the check is known to fail under MSCV, which uses a different + symbol generator.) + *) + arch_amd64; + linux; + no-flambda; (* the output will be slightly different under Flambda *) + no-tsan; (* TSan modifies the generated code *) + + setup-ocamlopt.byte-build-env; + flags = "-c -dcmm -dno-locations -dno-unique-ids"; + ocamlopt.byte; + check-ocamlopt.byte-output; +*) diff --git a/testsuite/tests/atomic-locs/record_fields.ml b/testsuite/tests/atomic-locs/record_fields.ml new file mode 100644 index 00000000..5194f316 --- /dev/null +++ b/testsuite/tests/atomic-locs/record_fields.ml @@ -0,0 +1,271 @@ +(* TEST + flags = "-dlambda -dno-locations -dno-unique-ids"; + expect; +*) + +(* Basic usage: redefine atomics. *) + +module Basic = struct + type 'a atomic = { mutable filler: unit; mutable x : 'a [@atomic] } + + let get (type a) (r : a atomic) : a = r.x + + let set (type a) (r : a atomic) (v : a) : unit = r.x <- v + + let cas (type a) (r : a atomic) oldv newv = + Atomic.Loc.compare_and_set [%atomic.loc r.x] oldv newv + + let[@inline never] get_loc (type a) (r : a atomic) : a Atomic.Loc.t = + [%atomic.loc r.x] + + let slow_cas (type a) (r : a atomic) oldv newv = + Atomic.Loc.compare_and_set (get_loc r) oldv newv +end +[%%expect{| +(apply (field_mut 1 (global Toploop!)) "Basic/339" + (let + (get = (function r (atomic_load r 1)) + set = (function r v : int (ignore (caml_atomic_exchange_field r 1 v))) + cas = (function r oldv newv : int (caml_atomic_cas_field r 1 oldv newv)) + get_loc = (function r never_inline (makeblock 0 (*,int) r 1)) + slow_cas = + (function r oldv newv : int + (let (atomic_arg = (apply get_loc r)) + (caml_atomic_cas_field (field_imm 0 atomic_arg) + (field_int 1 atomic_arg) oldv newv)))) + (makeblock 0 get set cas get_loc slow_cas))) +module Basic : + sig + type 'a atomic = { mutable filler : unit; mutable x : 'a [@atomic]; } + val get : 'a atomic -> 'a + val set : 'a atomic -> 'a -> unit + val cas : 'a atomic -> 'a -> 'a -> bool + val get_loc : 'a atomic -> 'a Atomic.Loc.t + val slow_cas : 'a atomic -> 'a -> 'a -> bool + end +|}];; + + +(* Atomic fields must be mutable. *) +module Error1 = struct + type t = { x : int [@atomic] } +end +[%%expect{| +Line 2, characters 13-30: +2 | type t = { x : int [@atomic] } + ^^^^^^^^^^^^^^^^^ +Error: The label "x" must be mutable to be declared atomic. +|}];; + + +(* [%atomic.loc _] payload must be a record field access *) +module Error2 = struct + type t = { mutable x : int [@atomic] } + let f t = [%atomic.loc t] +end +[%%expect{| +Line 3, characters 12-27: +3 | let f t = [%atomic.loc t] + ^^^^^^^^^^^^^^^ +Error: Invalid "[%atomic.loc]" payload, a record field access is expected. +|}];; + + +(* [%atomic.loc _] only works on atomic fields *) +module Error3 = struct + type t = { x : int } + let f t = [%atomic.loc t.x] +end +[%%expect{| +Line 3, characters 12-29: +3 | let f t = [%atomic.loc t.x] + ^^^^^^^^^^^^^^^^^ +Error: The record field "x" is not atomic +|}];; + + +(* Check module interface checking: it is not allowed to remove or add + atomic attributes. *) + +module Wrong1 = (struct + type t = { mutable x : int } +end : sig + (* adding an 'atomic' attribute missing in the implementation: invalid. *) + type t = { mutable x : int [@atomic] } +end) +[%%expect{| +Lines 1-3, characters 17-3: +1 | .................struct +2 | type t = { mutable x : int } +3 | end...... +Error: Signature mismatch: + Modules do not match: + sig type t = { mutable x : int; } end + is not included in + sig type t = { mutable x : int [@atomic]; } end + Type declarations do not match: + type t = { mutable x : int; } + is not included in + type t = { mutable x : int [@atomic]; } + Fields do not match: + "mutable x : int;" + is not the same as: + "mutable x : int [@atomic];" + The second is atomic and the first is not. +|}];; + +module Wrong2 = (struct + type t = { mutable x : int [@atomic] } +end : sig + (* removing an 'atomic' attribute present in the implementation: invalid. *) + type t = { mutable x : int } +end) +[%%expect{| +Lines 1-3, characters 17-3: +1 | .................struct +2 | type t = { mutable x : int [@atomic] } +3 | end...... +Error: Signature mismatch: + Modules do not match: + sig type t = { mutable x : int [@atomic]; } end + is not included in + sig type t = { mutable x : int; } end + Type declarations do not match: + type t = { mutable x : int [@atomic]; } + is not included in + type t = { mutable x : int; } + Fields do not match: + "mutable x : int [@atomic];" + is not the same as: + "mutable x : int;" + The first is atomic and the second is not. +|}];; + +module Ok = (struct + type t = { mutable x : int [@atomic] } +end : sig + type t = { mutable x : int [@atomic] } +end) +[%%expect{| +(apply (field_mut 1 (global Toploop!)) "Ok/366" (makeblock 0)) +module Ok : sig type t = { mutable x : int [@atomic]; } end +|}];; + + + +(* Inline records are supported, including in extensions. *) + +module Inline_record = struct + type t = A of { mutable x : int [@atomic] } + + let test : t -> int = fun (A r) -> r.x +end +[%%expect{| +(apply (field_mut 1 (global Toploop!)) "Inline_record/374" + (let (test = (function param : int (atomic_load param 0))) + (makeblock 0 test))) +module Inline_record : + sig type t = A of { mutable x : int [@atomic]; } val test : t -> int end +|}];; + +module Extension_with_inline_record = struct + type t = .. + type t += A of { mutable x : int [@atomic] } + + (* one should see in the -dlambda output below that the field offset is not 0 + as one could expect, but 1, due to an extra argument in extensible variants. *) + let test : t -> int = function + | A r -> r.x + | _ -> 0 + + let () = assert (test (A { x = 42 }) = 42) +end +[%%expect{| +(apply (field_mut 1 (global Toploop!)) "Extension_with_inline_record/382" + (let + (A = + (makeblock 248 "Extension_with_inline_record.A" (caml_fresh_oo_id 0)) + test = + (function param : int + (if (== (field_imm 0 param) A) (atomic_load param 1) 0)) + *match* = + (if (== (apply test (makemutable 0 (*,int) A 42)) 42) 0 + (raise (makeblock 0 (global Assert_failure!) [0: "" 11 11])))) + (makeblock 0 A test))) +module Extension_with_inline_record : + sig + type t = .. + type t += A of { mutable x : int [@atomic]; } + val test : t -> int + end +|}];; + + +(* Marking a field [@atomic] in a float-only record disables the unboxing optimization. *) +module Float_records = struct + type t = { x : float; mutable y : float [@atomic] } + + (* one should see in the -dlambda output below that this creates a block of tag 0. *) + let mk_t x y : t = { x; y } + let get v = v.y +end +[%%expect{| +(apply (field_mut 1 (global Toploop!)) "Float_records/397" + (let + (mk_t = (function x[float] y[float] (makemutable 0 (float,float) x y)) + get = (function v : float (atomic_load v 1))) + (makeblock 0 mk_t get))) +module Float_records : + sig + type t = { x : float; mutable y : float [@atomic]; } + val mk_t : float -> float -> t + val get : t -> float + end +|}];; + + +(* Pattern-matching on atomic record fields is disallowed. *) +module Pattern_matching = struct + type t = { x : int; mutable y : int [@atomic] } + + let forbidden { x; y } = x + y +end +[%%expect{| +Line 4, characters 16-24: +4 | let forbidden { x; y } = x + y + ^^^^^^^^ +Error: Atomic fields (here "y") are forbidden in patterns, + as it is difficult to reason about when the atomic read + will happen during pattern matching: the field may be read + zero, one or several times depending on the patterns around it. +|}] + +(* ... except for wildcards, to allow exhaustive record patterns. *) +module Pattern_matching_wildcard = struct + type t = { x : int; mutable y : int [@atomic] } + + [@@@warning "+missing-record-field-pattern"] + let warning { x } = x + + let allowed { x; y = _ } = x +end +[%%expect{| +Line 5, characters 14-19: +5 | let warning { x } = x + ^^^^^ +Warning 9 [missing-record-field-pattern]: the following labels are not bound + in this record pattern: "y". + Either bind these labels explicitly or add "; _" to the pattern. +(apply (field_mut 1 (global Toploop!)) "Pattern_matching_wildcard/417" + (let + (warning = (function param : int (field_int 0 param)) + allowed = (function param : int (field_int 0 param))) + (makeblock 0 warning allowed))) + +module Pattern_matching_wildcard : + sig + type t = { x : int; mutable y : int [@atomic]; } + val warning : t -> int + val allowed : t -> int + end +|}] diff --git a/testsuite/tests/backtrace/backtrace_dynlink.flambda.reference b/testsuite/tests/backtrace/backtrace_dynlink.flambda.reference index e2241810..c0682afd 100644 --- a/testsuite/tests/backtrace/backtrace_dynlink.flambda.reference +++ b/testsuite/tests/backtrace/backtrace_dynlink.flambda.reference @@ -1,9 +1,9 @@ Raised by primitive operation at Backtrace_dynlink_plugin in file "backtrace_dynlink_plugin.ml", line 6, characters 13-38 Called from Dynlink.Native.run.(fun) in file "otherlibs/dynlink/native/dynlink.ml", line 85, characters 12-29 -Called from Stdlib__List.iter in file "list.ml" (inlined), line 112, characters 12-15 +Called from Stdlib__List.iter in file "list.ml" (inlined), line 114, characters 12-15 Called from Dynlink.Native.run in file "otherlibs/dynlink/native/dynlink.ml", lines 84-90, characters 4-47 Called from Dynlink_common.Make.load.(fun) in file "otherlibs/dynlink/dynlink_common.ml", line 356, characters 11-54 -Called from Stdlib__List.iter in file "list.ml" (inlined), line 112, characters 12-15 +Called from Stdlib__List.iter in file "list.ml" (inlined), line 114, characters 12-15 Called from Dynlink_common.Make.load.(fun) in file "otherlibs/dynlink/dynlink_common.ml" (inlined), lines 352-361, characters 6-13 Called from Stdlib__Fun.protect in file "fun.ml" (inlined), line 34, characters 8-15 Called from Dynlink_common.Make.load in file "otherlibs/dynlink/dynlink_common.ml", lines 345-362, characters 4-7 @@ -12,10 +12,10 @@ Called from Backtrace_dynlink in file "backtrace_dynlink.ml", line 39, character execution of module initializers in the shared library failed: Failure("SUCCESS") Raised by primitive operation at Dynlink.Native.run.(fun) in file "otherlibs/dynlink/native/dynlink.ml", line 85, characters 12-29 Re-raised at Dynlink.Native.run.(fun) in file "otherlibs/dynlink/native/dynlink.ml", lines 87-89, characters 10-43 -Called from Stdlib__List.iter in file "list.ml" (inlined), line 112, characters 12-15 +Called from Stdlib__List.iter in file "list.ml" (inlined), line 114, characters 12-15 Called from Dynlink.Native.run in file "otherlibs/dynlink/native/dynlink.ml", lines 84-90, characters 4-47 Called from Dynlink_common.Make.load.(fun) in file "otherlibs/dynlink/dynlink_common.ml", line 356, characters 11-54 -Called from Stdlib__List.iter in file "list.ml" (inlined), line 112, characters 12-15 +Called from Stdlib__List.iter in file "list.ml" (inlined), line 114, characters 12-15 Called from Dynlink_common.Make.load.(fun) in file "otherlibs/dynlink/dynlink_common.ml" (inlined), lines 352-361, characters 6-13 Called from Stdlib__Fun.protect in file "fun.ml" (inlined), line 34, characters 8-15 Called from Dynlink_common.Make.load in file "otherlibs/dynlink/dynlink_common.ml", lines 345-362, characters 4-7 diff --git a/testsuite/tests/backtrace/backtrace_dynlink.reference b/testsuite/tests/backtrace/backtrace_dynlink.reference index 158a7c84..00ee2eef 100644 --- a/testsuite/tests/backtrace/backtrace_dynlink.reference +++ b/testsuite/tests/backtrace/backtrace_dynlink.reference @@ -1,17 +1,17 @@ Raised by primitive operation at Backtrace_dynlink_plugin in file "backtrace_dynlink_plugin.ml", line 6, characters 13-38 Called from Dynlink.Native.run.(fun) in file "otherlibs/dynlink/native/dynlink.ml", line 85, characters 12-29 -Called from Stdlib__List.iter in file "list.ml", line 112, characters 12-15 +Called from Stdlib__List.iter in file "list.ml", line 114, characters 12-15 Called from Dynlink_common.Make.load.(fun) in file "otherlibs/dynlink/dynlink_common.ml", line 356, characters 11-54 -Called from Stdlib__List.iter in file "list.ml", line 112, characters 12-15 +Called from Stdlib__List.iter in file "list.ml", line 114, characters 12-15 Called from Stdlib__Fun.protect in file "fun.ml", line 34, characters 8-15 Called from Dynlink_common.Make.loadfile in file "otherlibs/dynlink/dynlink_common.ml" (inlined), line 364, characters 26-45 Called from Backtrace_dynlink in file "backtrace_dynlink.ml", line 39, characters 4-52 execution of module initializers in the shared library failed: Failure("SUCCESS") Raised by primitive operation at Dynlink.Native.run.(fun) in file "otherlibs/dynlink/native/dynlink.ml", line 85, characters 12-29 Re-raised at Dynlink.Native.run.(fun) in file "otherlibs/dynlink/native/dynlink.ml", lines 87-89, characters 10-43 -Called from Stdlib__List.iter in file "list.ml", line 112, characters 12-15 +Called from Stdlib__List.iter in file "list.ml", line 114, characters 12-15 Called from Dynlink_common.Make.load.(fun) in file "otherlibs/dynlink/dynlink_common.ml", line 356, characters 11-54 -Called from Stdlib__List.iter in file "list.ml", line 112, characters 12-15 +Called from Stdlib__List.iter in file "list.ml", line 114, characters 12-15 Called from Stdlib__Fun.protect in file "fun.ml", line 34, characters 8-15 Re-raised at Stdlib__Fun.protect in file "fun.ml", line 39, characters 6-52 Called from Dynlink_common.Make.loadfile in file "otherlibs/dynlink/dynlink_common.ml" (inlined), line 364, characters 26-45 diff --git a/testsuite/tests/badly-ordered-deps/cocinelle.ml b/testsuite/tests/badly-ordered-deps/coccinelle.ml similarity index 74% rename from testsuite/tests/badly-ordered-deps/cocinelle.ml rename to testsuite/tests/badly-ordered-deps/coccinelle.ml index e4ed4586..eee606b2 100644 --- a/testsuite/tests/badly-ordered-deps/cocinelle.ml +++ b/testsuite/tests/badly-ordered-deps/coccinelle.ml @@ -1,17 +1,17 @@ (* TEST - modules = "a.ml cocinelle.ml"; + modules = "a.ml coccinelle.ml"; { setup-ocamlc.byte-build-env; flags = "-for-pack Pack"; module = "a.ml"; ocamlc.byte; flags = "-for-pack Pack"; - module = "cocinelle.ml"; + module = "coccinelle.ml"; ocamlc.byte; module = ""; flags = ""; - program="./cocinelle.byte"; - all_modules = "a.cmo cocinelle.cmo"; + program="./coccinelle.byte"; + all_modules = "a.cmo coccinelle.cmo"; module = ""; ocamlc.byte; run; @@ -22,11 +22,9 @@ module = "a.ml"; ocamlopt.byte; flags = "-for-pack Pack"; - module = "cocinelle.ml"; + module = "coccinelle.ml"; ocamlopt.byte; - output="cocinelle"; - all_modules = "a.cmx cocinelle.cmx"; - program="./cocinelle.exe"; + all_modules = "a.cmx coccinelle.cmx"; module = ""; ocamlopt.byte; run; diff --git a/testsuite/tests/badly-ordered-deps/cocinelle.reference b/testsuite/tests/badly-ordered-deps/coccinelle.reference similarity index 100% rename from testsuite/tests/badly-ordered-deps/cocinelle.reference rename to testsuite/tests/badly-ordered-deps/coccinelle.reference diff --git a/testsuite/tests/badly-ordered-deps/main.bytecode.reference b/testsuite/tests/badly-ordered-deps/main.bytecode.reference index ca66cec2..80487ba2 100644 --- a/testsuite/tests/badly-ordered-deps/main.bytecode.reference +++ b/testsuite/tests/badly-ordered-deps/main.bytecode.reference @@ -1,7 +1,7 @@ File "_none_", line 1: -Error: Wrong link order: "Lib" (lib.cmo) depends on "Main" (main.cmo) +Error: Wrong link order: Lib (lib.cmo) depends on Main (main.cmo) File "_none_", line 1: -Error: Wrong link order: "Lib" (lib.cmo) depends on "Main" (main.cmo) +Error: Wrong link order: Lib (lib.cmo) depends on Main (main.cmo) File "_none_", line 1: Error: No implementation provided for the following modules: - "Main" referenced from "Lib" (lib.cmo) + Main referenced from Lib (lib.cmo) diff --git a/testsuite/tests/badly-ordered-deps/main.native.reference b/testsuite/tests/badly-ordered-deps/main.native.reference index db715c4d..8b44dea1 100644 --- a/testsuite/tests/badly-ordered-deps/main.native.reference +++ b/testsuite/tests/badly-ordered-deps/main.native.reference @@ -1,7 +1,7 @@ File "_none_", line 1: -Error: Wrong link order: "Lib" (lib.cmx) depends on "Main" (main.cmx) +Error: Wrong link order: Lib (lib.cmx) depends on Main (main.cmx) File "_none_", line 1: -Error: Wrong link order: "Lib" (lib.cmx) depends on "Main" (main.cmx) +Error: Wrong link order: Lib (lib.cmx) depends on Main (main.cmx) File "_none_", line 1: Error: No implementation provided for the following modules: - "Main" referenced from "Lib" (lib.cmx) + Main referenced from Lib (lib.cmx) diff --git a/testsuite/tests/basic-more/morematch.compilers.reference b/testsuite/tests/basic-more/morematch.compilers.reference index 49d5cbb0..f2474aec 100644 --- a/testsuite/tests/basic-more/morematch.compilers.reference +++ b/testsuite/tests/basic-more/morematch.compilers.reference @@ -59,8 +59,7 @@ File "morematch.ml", lines 1050-1053, characters 8-10: 1052 | | B (`B,`D) -> 1 1053 | | C -> 2 Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -A `D + Here is an example of a case that is not matched: A `D File "morematch.ml", line 1084, characters 5-51: 1084 | | _, _, _, _, _, A, _, _, _, _, B, _, _, _, _, _ -> "11" diff --git a/testsuite/tests/basic-more/pr10338.compilers.reference b/testsuite/tests/basic-more/pr10338.compilers.reference index b6b32d0c..2a2d05dc 100644 --- a/testsuite/tests/basic-more/pr10338.compilers.reference +++ b/testsuite/tests/basic-more/pr10338.compilers.reference @@ -2,4 +2,4 @@ File "pr10338.ml", line 7, characters 21-65: 7 | let f ?(s="hello") = function x when (print_endline s; true) -> x;; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. -All clauses in this pattern-matching are guarded. + All clauses in this pattern-matching are guarded. diff --git a/testsuite/tests/basic-more/robustmatch.compilers.reference b/testsuite/tests/basic-more/robustmatch.compilers.reference index f213748f..595a9280 100644 --- a/testsuite/tests/basic-more/robustmatch.compilers.reference +++ b/testsuite/tests/basic-more/robustmatch.compilers.reference @@ -5,8 +5,7 @@ File "robustmatch.ml", lines 33-37, characters 6-23: 36 | | _, AB, B -> () 37 | | _, MAB, B -> () Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -(AB, MAB, A) + Here is an example of a case that is not matched: (AB, MAB, A) File "robustmatch.ml", lines 43-47, characters 4-21: 43 | ....match t1, t2, x with @@ -15,48 +14,42 @@ File "robustmatch.ml", lines 43-47, characters 4-21: 46 | | _, AB, B -> () 47 | | _, MAB, B -> () Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -(AB, MAB, A) + Here is an example of a case that is not matched: (AB, MAB, A) File "robustmatch.ml", lines 54-56, characters 4-27: 54 | ....match r1, r2, a with 55 | | R1, _, 0 -> () 56 | | _, R2, "coucou" -> () Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -(R1, R1, 1) + Here is an example of a case that is not matched: (R1, R1, 1) File "robustmatch.ml", lines 64-66, characters 4-27: 64 | ....match r1, r2, a with 65 | | R1, _, A -> () 66 | | _, R2, "coucou" -> () Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -(R1, R1, (B|C)) + Here is an example of a case that is not matched: (R1, R1, (B|C)) File "robustmatch.ml", lines 69-71, characters 4-20: 69 | ....match r1, r2, a with 70 | | _, R2, "coucou" -> () 71 | | R1, _, A -> () Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -(R1, R1, (B|C)) + Here is an example of a case that is not matched: (R1, R1, (B|C)) File "robustmatch.ml", lines 74-76, characters 4-20: 74 | ....match r1, r2, a with 75 | | _, R2, "coucou" -> () 76 | | R1, _, _ -> () Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -(R2, R2, "") + Here is an example of a case that is not matched: (R2, R2, "") File "robustmatch.ml", lines 85-87, characters 4-20: 85 | ....match r1, r2, a with 86 | | R1, _, A -> () 87 | | _, R2, X -> () Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -(R1, R1, (B|C)) + Here is an example of a case that is not matched: (R1, R1, (B|C)) File "robustmatch.ml", lines 90-93, characters 4-20: 90 | ....match r1, r2, a with @@ -64,40 +57,35 @@ File "robustmatch.ml", lines 90-93, characters 4-20: 92 | | _, R2, X -> () 93 | | R1, _, _ -> () Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -(R2, R2, (Y|Z)) + Here is an example of a case that is not matched: (R2, R2, (Y|Z)) File "robustmatch.ml", lines 96-98, characters 4-20: 96 | ....match r1, r2, a with 97 | | R1, _, _ -> () 98 | | _, R2, X -> () Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -(R2, R2, (Y|Z)) + Here is an example of a case that is not matched: (R2, R2, (Y|Z)) File "robustmatch.ml", lines 107-109, characters 4-20: 107 | ....match r1, r2, a with 108 | | R1, _, A -> () 109 | | _, R2, X -> () Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -(R1, R1, (B|C)) + Here is an example of a case that is not matched: (R1, R1, (B|C)) File "robustmatch.ml", lines 129-131, characters 4-20: 129 | ....match r1, r2, a with 130 | | R1, _, A -> () 131 | | _, R2, X -> () Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -(R1, R1, B) + Here is an example of a case that is not matched: (R1, R1, B) File "robustmatch.ml", lines 151-153, characters 4-20: 151 | ....match r1, r2, a with 152 | | R1, _, A -> () 153 | | _, R2, X -> () Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -(R1, R1, B) + Here is an example of a case that is not matched: (R1, R1, B) File "robustmatch.ml", lines 156-159, characters 4-20: 156 | ....match r1, r2, a with @@ -105,24 +93,21 @@ File "robustmatch.ml", lines 156-159, characters 4-20: 158 | | _, R2, X -> () 159 | | R1, _, _ -> () Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -(R2, R2, Y) + Here is an example of a case that is not matched: (R2, R2, Y) File "robustmatch.ml", lines 162-164, characters 4-20: 162 | ....match r1, r2, a with 163 | | R1, _, _ -> () 164 | | _, R2, X -> () Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -(R2, R2, Y) + Here is an example of a case that is not matched: (R2, R2, Y) File "robustmatch.ml", lines 167-169, characters 4-20: 167 | ....match r1, r2, a with 168 | | R1, _, C -> () 169 | | _, R2, Y -> () Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -(R1, R1, A) + Here is an example of a case that is not matched: (R1, R1, A) File "robustmatch.ml", lines 176-179, characters 4-20: 176 | ....match r1, r2, a with @@ -130,16 +115,14 @@ File "robustmatch.ml", lines 176-179, characters 4-20: 178 | | R2, _, [||] -> () 179 | | _, R1, 1 -> () Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -(R2, R2, [| _ |]) + Here is an example of a case that is not matched: (R2, R2, [| _ |]) File "robustmatch.ml", lines 182-184, characters 4-23: 182 | ....match r1, r2, a with 183 | | R1, _, _ -> () 184 | | _, R2, [||] -> () Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -(R2, R2, [| _ |]) + Here is an example of a case that is not matched: (R2, R2, [| _ |]) File "robustmatch.ml", lines 187-190, characters 4-20: 187 | ....match r1, r2, a with @@ -147,8 +130,7 @@ File "robustmatch.ml", lines 187-190, characters 4-20: 189 | | R1, _, 0 -> () 190 | | R1, _, _ -> () Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -(R2, R2, [| _ |]) + Here is an example of a case that is not matched: (R2, R2, [| _ |]) File "robustmatch.ml", lines 200-203, characters 4-19: 200 | ....match r1, r2, a with @@ -156,71 +138,64 @@ File "robustmatch.ml", lines 200-203, characters 4-19: 202 | | R1, _, 0 -> () 203 | | _, _, _ -> () Warning 4 [fragile-match]: this pattern-matching is fragile. -It will remain exhaustive when constructors are added to type repr. + It will remain exhaustive when constructors are added to type repr. File "robustmatch.ml", lines 210-212, characters 4-27: 210 | ....match r1, r2, a with 211 | | R1, _, 'c' -> () 212 | | _, R2, "coucou" -> () Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -(R1, R1, 'a') + Here is an example of a case that is not matched: (R1, R1, 'a') File "robustmatch.ml", lines 219-221, characters 4-27: 219 | ....match r1, r2, a with 220 | | R1, _, `A -> () 221 | | _, R2, "coucou" -> () Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -(R1, R1, `B) + Here is an example of a case that is not matched: (R1, R1, `B) File "robustmatch.ml", lines 228-230, characters 4-37: 228 | ....match r1, r2, a with 229 | | R1, _, (3, "") -> () 230 | | _, R2, (1, "coucou", 'a') -> () Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -(R1, R1, (3, "*")) + Here is an example of a case that is not matched: (R1, R1, (3, "*")) File "robustmatch.ml", lines 239-241, characters 4-51: 239 | ....match r1, r2, a with 240 | | R1, _, { x = 3; y = "" } -> () 241 | | _, R2, { a = 1; b = "coucou"; c = 'a' } -> () Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -(R1, R1, {x=3; y="*"}) + Here is an example of a case that is not matched: (R1, R1, {x=3; y="*"}) File "robustmatch.ml", lines 244-246, characters 4-36: 244 | ....match r1, r2, a with 245 | | R2, _, { a = 1; b = "coucou"; c = 'a' } -> () 246 | | _, R1, { x = 3; y = "" } -> () Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -(R2, R2, {a=1; b="coucou"; c='b'}) + Here is an example of a case that is not matched: + (R2, R2, {a=1; b="coucou"; c='b'}) File "robustmatch.ml", lines 253-255, characters 4-20: 253 | ....match r1, r2, a with 254 | | R1, _, (3, "") -> () 255 | | _, R2, 1 -> () Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -(R1, R1, (3, "*")) + Here is an example of a case that is not matched: (R1, R1, (3, "*")) File "robustmatch.ml", lines 263-265, characters 4-20: 263 | ....match r1, r2, a with 264 | | R1, _, { x = 3; y = "" } -> () 265 | | _, R2, 1 -> () Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -(R1, R1, {x=3; y="*"}) + Here is an example of a case that is not matched: (R1, R1, {x=3; y="*"}) File "robustmatch.ml", lines 272-274, characters 4-20: 272 | ....match r1, r2, a with 273 | | R1, _, lazy 1 -> () 274 | | _, R2, 1 -> () Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -(R1, R1, lazy 0) + Here is an example of a case that is not matched: (R1, R1, lazy 0) File "robustmatch.ml", lines 281-284, characters 4-24: 281 | ....match r1, r2, a with @@ -228,5 +203,4 @@ File "robustmatch.ml", lines 281-284, characters 4-24: 283 | | _, R2, "coucou" -> () 284 | | _, R2, "foo" -> () Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -(R2, R2, "") + Here is an example of a case that is not matched: (R2, R2, "") diff --git a/testsuite/tests/basic/eval_order_9.ml b/testsuite/tests/basic/eval_order_9.ml new file mode 100644 index 00000000..75763c50 --- /dev/null +++ b/testsuite/tests/basic/eval_order_9.ml @@ -0,0 +1,8 @@ +(* TEST *) + +(* From #12440, by Jeremy Yallop *) +let _ = + let r = ref true in + match Fun.id ((r := false), !r) with + | _, true -> print_endline "Ok" + | _, false -> print_endline "ERROR" diff --git a/testsuite/tests/basic/eval_order_9.reference b/testsuite/tests/basic/eval_order_9.reference new file mode 100644 index 00000000..7326d960 --- /dev/null +++ b/testsuite/tests/basic/eval_order_9.reference @@ -0,0 +1 @@ +Ok diff --git a/testsuite/tests/basic/patmatch_for_multiple.ml b/testsuite/tests/basic/patmatch_for_multiple.ml index 8c1c8b87..85ad6158 100644 --- a/testsuite/tests/basic/patmatch_for_multiple.ml +++ b/testsuite/tests/basic/patmatch_for_multiple.ml @@ -1,5 +1,5 @@ (* TEST - flags = "-drawlambda -dlambda"; + flags = "-drawlambda -dlambda -dcanonical-ids"; expect; *) @@ -26,15 +26,15 @@ match (3, 2, 1) with | _ -> false ;; [%%expect{| -(let (*match*/277 = 3 *match*/278 = 2 *match*/279 = 1) +(let (*match*/0 = 3 *match*/1 = 2 *match*/2 = 1) (catch (catch - (catch (if (!= *match*/278 3) (exit 4) (exit 2)) with (4) - (if (!= *match*/277 1) (exit 3) (exit 2))) + (catch (if (!= *match*/1 3) (exit 4) (exit 2)) with (4) + (if (!= *match*/0 1) (exit 3) (exit 2))) with (3) 0) with (2) 1)) -(let (*match*/277 = 3 *match*/278 = 2 *match*/279 = 1) - (catch (if (!= *match*/278 3) (if (!= *match*/277 1) 0 (exit 2)) (exit 2)) +(let (*match*/0 = 3 *match*/1 = 2 *match*/2 = 1) + (catch (if (!= *match*/1 3) (if (!= *match*/0 1) 0 (exit 2)) (exit 2)) with (2) 1)) - : bool = false |}];; @@ -47,26 +47,26 @@ match (3, 2, 1) with | _ -> false ;; [%%expect{| -(let (*match*/282 = 3 *match*/283 = 2 *match*/284 = 1) +(let (*match*/3 = 3 *match*/4 = 2 *match*/5 = 1) (catch (catch (catch - (if (!= *match*/283 3) (exit 8) - (let (x/286 =a (makeblock 0 *match*/282 *match*/283 *match*/284)) - (exit 6 x/286))) + (if (!= *match*/4 3) (exit 8) + (let (x/0 =a (makeblock 0 *match*/3 *match*/4 *match*/5)) + (exit 6 x/0))) with (8) - (if (!= *match*/282 1) (exit 7) - (let (x/285 =a (makeblock 0 *match*/282 *match*/283 *match*/284)) - (exit 6 x/285)))) + (if (!= *match*/3 1) (exit 7) + (let (x/1 =a (makeblock 0 *match*/3 *match*/4 *match*/5)) + (exit 6 x/1)))) with (7) 0) - with (6 x/280) (seq (ignore x/280) 1))) -(let (*match*/282 = 3 *match*/283 = 2 *match*/284 = 1) + with (6 x/2) (seq (ignore x/2) 1))) +(let (*match*/3 = 3 *match*/4 = 2 *match*/5 = 1) (catch - (if (!= *match*/283 3) - (if (!= *match*/282 1) 0 - (exit 6 (makeblock 0 *match*/282 *match*/283 *match*/284))) - (exit 6 (makeblock 0 *match*/282 *match*/283 *match*/284))) - with (6 x/280) (seq (ignore x/280) 1))) + (if (!= *match*/4 3) + (if (!= *match*/3 1) 0 + (exit 6 (makeblock 0 *match*/3 *match*/4 *match*/5))) + (exit 6 (makeblock 0 *match*/3 *match*/4 *match*/5))) + with (6 x/2) (seq (ignore x/2) 1))) - : bool = false |}];; @@ -76,8 +76,8 @@ let _ = fun a b -> | ((true, _) as _g) | ((false, _) as _g) -> () [%%expect{| -(function a/287[int] b/288 : int 0) -(function a/287[int] b/288 : int 0) +(function a/0[int] b/0 : int 0) +(function a/0[int] b/0 : int 0) - : bool -> 'a -> unit = |}];; @@ -96,8 +96,8 @@ let _ = fun a b -> match a, b with | (false, _) as p -> p (* outside, trivial *) [%%expect {| -(function a/291[int] b/292 (let (p/293 =a (makeblock 0 a/291 b/292)) p/293)) -(function a/291[int] b/292 (makeblock 0 a/291 b/292)) +(function a/1[int] b/1 (let (p/0 =a (makeblock 0 a/1 b/1)) p/0)) +(function a/1[int] b/1 (makeblock 0 a/1 b/1)) - : bool -> 'a -> bool * 'a = |}] @@ -106,8 +106,8 @@ let _ = fun a b -> match a, b with | ((false, _) as p) -> p (* inside, trivial *) [%%expect{| -(function a/295[int] b/296 (let (p/297 =a (makeblock 0 a/295 b/296)) p/297)) -(function a/295[int] b/296 (makeblock 0 a/295 b/296)) +(function a/2[int] b/2 (let (p/1 =a (makeblock 0 a/2 b/2)) p/1)) +(function a/2[int] b/2 (makeblock 0 a/2 b/2)) - : bool -> 'a -> bool * 'a = |}];; @@ -116,11 +116,10 @@ let _ = fun a b -> match a, b with | (false as x, _) as p -> x, p (* outside, simple *) [%%expect {| -(function a/301[int] b/302 - (let (x/303 =a[int] a/301 p/304 =a (makeblock 0 a/301 b/302)) - (makeblock 0 (int,*) x/303 p/304))) -(function a/301[int] b/302 - (makeblock 0 (int,*) a/301 (makeblock 0 a/301 b/302))) +(function a/3[int] b/3 + (let (x/3 =a[int] a/3 p/2 =a (makeblock 0 a/3 b/3)) + (makeblock 0 (int,*) x/3 p/2))) +(function a/3[int] b/3 (makeblock 0 (int,*) a/3 (makeblock 0 a/3 b/3))) - : bool -> 'a -> bool * (bool * 'a) = |}] @@ -129,11 +128,10 @@ let _ = fun a b -> match a, b with | ((false as x, _) as p) -> x, p (* inside, simple *) [%%expect {| -(function a/307[int] b/308 - (let (x/309 =a[int] a/307 p/310 =a (makeblock 0 a/307 b/308)) - (makeblock 0 (int,*) x/309 p/310))) -(function a/307[int] b/308 - (makeblock 0 (int,*) a/307 (makeblock 0 a/307 b/308))) +(function a/4[int] b/4 + (let (x/4 =a[int] a/4 p/3 =a (makeblock 0 a/4 b/4)) + (makeblock 0 (int,*) x/4 p/3))) +(function a/4[int] b/4 (makeblock 0 (int,*) a/4 (makeblock 0 a/4 b/4))) - : bool -> 'a -> bool * (bool * 'a) = |}] @@ -142,15 +140,15 @@ let _ = fun a b -> match a, b with | (false, x) as p -> x, p (* outside, complex *) [%%expect{| -(function a/317[int] b/318[int] - (if a/317 - (let (x/319 =a[int] a/317 p/320 =a (makeblock 0 a/317 b/318)) - (makeblock 0 (int,*) x/319 p/320)) - (let (x/321 =a b/318 p/322 =a (makeblock 0 a/317 b/318)) - (makeblock 0 (int,*) x/321 p/322)))) -(function a/317[int] b/318[int] - (if a/317 (makeblock 0 (int,*) a/317 (makeblock 0 a/317 b/318)) - (makeblock 0 (int,*) b/318 (makeblock 0 a/317 b/318)))) +(function a/5[int] b/5[int] + (if a/5 + (let (x/5 =a[int] a/5 p/4 =a (makeblock 0 a/5 b/5)) + (makeblock 0 (int,*) x/5 p/4)) + (let (x/6 =a b/5 p/5 =a (makeblock 0 a/5 b/5)) + (makeblock 0 (int,*) x/6 p/5)))) +(function a/5[int] b/5[int] + (if a/5 (makeblock 0 (int,*) a/5 (makeblock 0 a/5 b/5)) + (makeblock 0 (int,*) b/5 (makeblock 0 a/5 b/5)))) - : bool -> bool -> bool * (bool * bool) = |}] @@ -160,19 +158,17 @@ let _ = fun a b -> match a, b with -> x, p (* inside, complex *) [%%expect{| -(function a/323[int] b/324[int] +(function a/6[int] b/6[int] (catch - (if a/323 - (let (x/331 =a[int] a/323 p/332 =a (makeblock 0 a/323 b/324)) - (exit 31 x/331 p/332)) - (let (x/329 =a b/324 p/330 =a (makeblock 0 a/323 b/324)) - (exit 31 x/329 p/330))) - with (31 x/325[int] p/326) (makeblock 0 (int,*) x/325 p/326))) -(function a/323[int] b/324[int] + (if a/6 + (let (x/7 =a[int] a/6 p/6 =a (makeblock 0 a/6 b/6)) (exit 31 x/7 p/6)) + (let (x/8 =a b/6 p/7 =a (makeblock 0 a/6 b/6)) (exit 31 x/8 p/7))) + with (31 x/9[int] p/8) (makeblock 0 (int,*) x/9 p/8))) +(function a/6[int] b/6[int] (catch - (if a/323 (exit 31 a/323 (makeblock 0 a/323 b/324)) - (exit 31 b/324 (makeblock 0 a/323 b/324))) - with (31 x/325[int] p/326) (makeblock 0 (int,*) x/325 p/326))) + (if a/6 (exit 31 a/6 (makeblock 0 a/6 b/6)) + (exit 31 b/6 (makeblock 0 a/6 b/6))) + with (31 x/9[int] p/8) (makeblock 0 (int,*) x/9 p/8))) - : bool -> bool -> bool * (bool * bool) = |}] @@ -185,15 +181,15 @@ let _ = fun a b -> match a, b with | (false as x, _) as p -> x, p (* outside, onecase *) [%%expect {| -(function a/333[int] b/334[int] - (if a/333 - (let (x/335 =a[int] a/333 _p/336 =a (makeblock 0 a/333 b/334)) - (makeblock 0 (int,*) x/335 [0: 1 1])) - (let (x/337 =a[int] a/333 p/338 =a (makeblock 0 a/333 b/334)) - (makeblock 0 (int,*) x/337 p/338)))) -(function a/333[int] b/334[int] - (if a/333 (makeblock 0 (int,*) a/333 [0: 1 1]) - (makeblock 0 (int,*) a/333 (makeblock 0 a/333 b/334)))) +(function a/7[int] b/7[int] + (if a/7 + (let (x/10 =a[int] a/7 _p/0 =a (makeblock 0 a/7 b/7)) + (makeblock 0 (int,*) x/10 [0: 1 1])) + (let (x/11 =a[int] a/7 p/9 =a (makeblock 0 a/7 b/7)) + (makeblock 0 (int,*) x/11 p/9)))) +(function a/7[int] b/7[int] + (if a/7 (makeblock 0 (int,*) a/7 [0: 1 1]) + (makeblock 0 (int,*) a/7 (makeblock 0 a/7 b/7)))) - : bool -> bool -> bool * (bool * bool) = |}] @@ -202,11 +198,10 @@ let _ = fun a b -> match a, b with | ((false as x, _) as p) -> x, p (* inside, onecase *) [%%expect{| -(function a/339[int] b/340 - (let (x/341 =a[int] a/339 p/342 =a (makeblock 0 a/339 b/340)) - (makeblock 0 (int,*) x/341 p/342))) -(function a/339[int] b/340 - (makeblock 0 (int,*) a/339 (makeblock 0 a/339 b/340))) +(function a/8[int] b/8 + (let (x/12 =a[int] a/8 p/10 =a (makeblock 0 a/8 b/8)) + (makeblock 0 (int,*) x/12 p/10))) +(function a/8[int] b/8 (makeblock 0 (int,*) a/8 (makeblock 0 a/8 b/8))) - : bool -> 'a -> bool * (bool * 'a) = |}] @@ -223,14 +218,14 @@ let _ =fun a b -> match a, b with | (_, _) as p -> p (* outside, tuplist *) [%%expect {| -(function a/352[int] b/353 +(function a/9[int] b/9 (catch - (if a/352 (if b/353 (let (p/354 =a (field_imm 0 b/353)) p/354) (exit 42)) + (if a/9 (if b/9 (let (p/11 =a (field_imm 0 b/9)) p/11) (exit 42)) (exit 42)) - with (42) (let (p/355 =a (makeblock 0 a/352 b/353)) p/355))) -(function a/352[int] b/353 - (catch (if a/352 (if b/353 (field_imm 0 b/353) (exit 42)) (exit 42)) - with (42) (makeblock 0 a/352 b/353))) + with (42) (let (p/12 =a (makeblock 0 a/9 b/9)) p/12))) +(function a/9[int] b/9 + (catch (if a/9 (if b/9 (field_imm 0 b/9) (exit 42)) (exit 42)) with (42) + (makeblock 0 a/9 b/9))) - : bool -> bool tuplist -> bool * bool tuplist = |}] @@ -239,20 +234,19 @@ let _ = fun a b -> match a, b with | ((_, _) as p) -> p (* inside, tuplist *) [%%expect{| -(function a/356[int] b/357 +(function a/10[int] b/10 (catch (catch - (if a/356 - (if b/357 (let (p/361 =a (field_imm 0 b/357)) (exit 46 p/361)) - (exit 47)) + (if a/10 + (if b/10 (let (p/13 =a (field_imm 0 b/10)) (exit 46 p/13)) (exit 47)) (exit 47)) - with (47) (let (p/360 =a (makeblock 0 a/356 b/357)) (exit 46 p/360))) - with (46 p/358) p/358)) -(function a/356[int] b/357 + with (47) (let (p/14 =a (makeblock 0 a/10 b/10)) (exit 46 p/14))) + with (46 p/15) p/15)) +(function a/10[int] b/10 (catch (catch - (if a/356 (if b/357 (exit 46 (field_imm 0 b/357)) (exit 47)) (exit 47)) - with (47) (exit 46 (makeblock 0 a/356 b/357))) - with (46 p/358) p/358)) + (if a/10 (if b/10 (exit 46 (field_imm 0 b/10)) (exit 47)) (exit 47)) + with (47) (exit 46 (makeblock 0 a/10 b/10))) + with (46 p/15) p/15)) - : bool -> bool tuplist -> bool * bool tuplist = |}] diff --git a/testsuite/tests/basic/patmatch_incoherence.ml b/testsuite/tests/basic/patmatch_incoherence.ml index ecf6b0b8..8f52516b 100644 --- a/testsuite/tests/basic/patmatch_incoherence.ml +++ b/testsuite/tests/basic/patmatch_incoherence.ml @@ -40,8 +40,7 @@ Lines 1-3, characters 0-20: 2 | | { x = 3 } -> () 3 | | { x = None } -> () Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -{x=Some _} + Here is an example of a case that is not matched: "{x=Some _}" Exception: Assert_failure ("", 1, 12). |}];; @@ -56,8 +55,7 @@ Lines 1-3, characters 0-18: 2 | | { x = None } -> () 3 | | { x = "" } -> () Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -{x="*"} + Here is an example of a case that is not matched: "{x="*"}" Exception: Assert_failure ("", 1, 12). |}];; @@ -72,8 +70,7 @@ Lines 1-3, characters 0-18: 2 | | { x = None } -> () 3 | | { x = `X } -> () Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -{x=`AnyOtherTag} + Here is an example of a case that is not matched: "{x=`AnyOtherTag}" Exception: Assert_failure ("", 1, 12). |}];; @@ -88,8 +85,7 @@ Lines 1-3, characters 0-17: 2 | | { x = [||] } -> () 3 | | { x = 3 } -> () Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -{x=0} + Here is an example of a case that is not matched: "{x=0}" Exception: Assert_failure ("", 1, 12). |}];; @@ -104,8 +100,7 @@ Lines 1-3, characters 0-17: 2 | | { x = `X } -> () 3 | | { x = 3 } -> () Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -{x=0} + Here is an example of a case that is not matched: "{x=0}" Exception: Assert_failure ("", 1, 12). |}];; @@ -120,8 +115,7 @@ Lines 1-3, characters 0-17: 2 | | { x = `X "lol" } -> () 3 | | { x = 3 } -> () Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -{x=0} + Here is an example of a case that is not matched: "{x=0}" Exception: Assert_failure ("", 1, 12). |}];; @@ -138,8 +132,7 @@ Lines 1-4, characters 0-17: 3 | | { x = None } -> () 4 | | { x = 3 } -> () Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -{x=0} + Here is an example of a case that is not matched: "{x=0}" Exception: Assert_failure ("", 1, 12). |}];; diff --git a/testsuite/tests/basic/patmatch_split_no_or.ml b/testsuite/tests/basic/patmatch_split_no_or.ml index 1b858141..66f824d3 100644 --- a/testsuite/tests/basic/patmatch_split_no_or.ml +++ b/testsuite/tests/basic/patmatch_split_no_or.ml @@ -1,5 +1,5 @@ (* TEST - flags = "-nostdlib -nopervasives -dlambda"; + flags = "-nostdlib -nopervasives -dlambda -dcanonical-ids"; expect; *) @@ -15,13 +15,13 @@ let last_is_anys = function ;; [%%expect{| (let - (last_is_anys/11 = - (function param/13 : int + (last_is_anys/0 = + (function param/0 : int (catch - (if (field_imm 0 param/13) (if (field_imm 1 param/13) (exit 2) 1) - (if (field_imm 1 param/13) (exit 2) 2)) + (if (field_imm 0 param/0) (if (field_imm 1 param/0) (exit 2) 1) + (if (field_imm 1 param/0) (exit 2) 2)) with (2) 3))) - (apply (field_mut 1 (global Toploop!)) "last_is_anys" last_is_anys/11)) + (apply (field_mut 1 (global Toploop!)) "last_is_anys" last_is_anys/0)) val last_is_anys : bool * bool -> int = |}] @@ -32,13 +32,13 @@ let last_is_vars = function ;; [%%expect{| (let - (last_is_vars/18 = - (function param/22 : int + (last_is_vars/0 = + (function param/1 : int (catch - (if (field_imm 0 param/22) (if (field_imm 1 param/22) (exit 5) 1) - (if (field_imm 1 param/22) (exit 5) 2)) + (if (field_imm 0 param/1) (if (field_imm 1 param/1) (exit 5) 1) + (if (field_imm 1 param/1) (exit 5) 2)) with (5) 3))) - (apply (field_mut 1 (global Toploop!)) "last_is_vars" last_is_vars/18)) + (apply (field_mut 1 (global Toploop!)) "last_is_vars" last_is_vars/0)) val last_is_vars : bool * bool -> int = |}] @@ -52,12 +52,12 @@ type t += A | B of unit | C of bool * int;; 0 type t = .. (let - (A/26 = (makeblock 248 "A" (caml_fresh_oo_id 0)) - B/27 = (makeblock 248 "B" (caml_fresh_oo_id 0)) - C/28 = (makeblock 248 "C" (caml_fresh_oo_id 0))) - (seq (apply (field_mut 1 (global Toploop!)) "A/26" A/26) - (apply (field_mut 1 (global Toploop!)) "B/27" B/27) - (apply (field_mut 1 (global Toploop!)) "C/28" C/28))) + (A/0 = (makeblock 248 "A" (caml_fresh_oo_id 0)) + B/0 = (makeblock 248 "B" (caml_fresh_oo_id 0)) + C/0 = (makeblock 248 "C" (caml_fresh_oo_id 0))) + (seq (apply (field_mut 1 (global Toploop!)) "A/26" A/0) + (apply (field_mut 1 (global Toploop!)) "B/27" B/0) + (apply (field_mut 1 (global Toploop!)) "C/28" C/0))) type t += A | B of unit | C of bool * int |}] @@ -71,20 +71,20 @@ let f = function ;; [%%expect{| (let - (C/28 = (apply (field_mut 0 (global Toploop!)) "C/28") - B/27 = (apply (field_mut 0 (global Toploop!)) "B/27") - A/26 = (apply (field_mut 0 (global Toploop!)) "A/26") - f/29 = - (function param/31 : int - (let (*match*/32 =a (field_imm 0 param/31)) + (C/0 = (apply (field_mut 0 (global Toploop!)) "C/28") + B/0 = (apply (field_mut 0 (global Toploop!)) "B/27") + A/0 = (apply (field_mut 0 (global Toploop!)) "A/26") + f/0 = + (function param/2 : int + (let (*match*/0 =a (field_imm 0 param/2)) (catch - (if (== *match*/32 A/26) (if (field_imm 1 param/31) 1 (exit 11)) + (if (== *match*/0 A/0) (if (field_imm 1 param/2) 1 (exit 11)) (exit 11)) with (11) - (if (field_imm 1 param/31) - (if (== (field_imm 0 *match*/32) B/27) 2 - (if (== (field_imm 0 *match*/32) C/28) 3 4)) - (if (field_imm 2 param/31) 12 11)))))) - (apply (field_mut 1 (global Toploop!)) "f" f/29)) + (if (field_imm 1 param/2) + (if (== (field_imm 0 *match*/0) B/0) 2 + (if (== (field_imm 0 *match*/0) C/0) 3 4)) + (if (field_imm 2 param/2) 12 11)))))) + (apply (field_mut 1 (global Toploop!)) "f" f/0)) val f : t * bool * bool -> int = |}] diff --git a/testsuite/tests/basic/unit_naming.compilers.reference b/testsuite/tests/basic/unit_naming.compilers.reference index 60f0aac0..4e521d7f 100644 --- a/testsuite/tests/basic/unit_naming.compilers.reference +++ b/testsuite/tests/basic/unit_naming.compilers.reference @@ -1,4 +1,4 @@ -File "unit_naming.ml", line 9, characters 10-25: +File "unit_naming.ml", line 9, characters 10-18: 9 | print_int Camlcase.answer - ^^^^^^^^^^^^^^^ -Error: Unbound module "Camlcase" + ^^^^^^^^ +Error: Unbound module Camlcase diff --git a/testsuite/tests/callback/signals_alloc.ml b/testsuite/tests/callback/signals_alloc.ml index ba3c9fbe..ee646beb 100644 --- a/testsuite/tests/callback/signals_alloc.ml +++ b/testsuite/tests/callback/signals_alloc.ml @@ -1,7 +1,8 @@ (* TEST include unix; modules = "callbackprim.c"; - libunix; + hasunix; + not-target-windows; { bytecode; }{ diff --git a/testsuite/tests/callback/test_signalhandler.ml b/testsuite/tests/callback/test_signalhandler.ml index d94b17c0..1c791aff 100644 --- a/testsuite/tests/callback/test_signalhandler.ml +++ b/testsuite/tests/callback/test_signalhandler.ml @@ -1,7 +1,8 @@ (* TEST include unix; modules = "test_signalhandler_.c"; - libunix; + hasunix; + not-target-windows; { bytecode; }{ diff --git a/testsuite/tests/compaction/test_compact_manydomains.ml b/testsuite/tests/compaction/test_compact_manydomains.ml new file mode 100644 index 00000000..6d26260a --- /dev/null +++ b/testsuite/tests/compaction/test_compact_manydomains.ml @@ -0,0 +1,16 @@ +(* TEST +*) + +let num_domains = 20 + +let go () = + let n = 50_000 in + let c = Array.make n None in + for i = 0 to n-1 do + c.(i) <- Some (i, i) + done; + Gc.compact () + +let () = + Array.init num_domains (fun _ -> Domain.spawn go) + |> Array.iter Domain.join diff --git a/testsuite/tests/compiler-libs/test_longident.ml b/testsuite/tests/compiler-libs/test_longident.ml index d30060c7..a15b89a4 100644 --- a/testsuite/tests/compiler-libs/test_longident.ml +++ b/testsuite/tests/compiler-libs/test_longident.ml @@ -1,25 +1,33 @@ (* TEST - flags = "-I ${ocamlsrcdir}/parsing"; - include ocamlcommon; + flags = "-I ${ocamlsrcdir}/parsing -I ${ocamlsrcdir}/toplevel"; + include ocamltoplevel; expect; *) [@@@alert "-deprecated"] module L = Longident +let mknoloc = Location.mknoloc +let lident l = mknoloc (L.Lident l) + +let () = + Topdirs.dir_install_printer Format.err_formatter + (L.parse "Location.print_loc") [%%expect {| module L = Longident +val mknoloc : 'a -> 'a Location.loc = +val lident : string -> L.t Location.loc = |}] let flatten_ident = L.flatten (L.Lident "foo") [%%expect {| val flatten_ident : string list = ["foo"] |}] -let flatten_dot = L.flatten (L.Ldot (L.Lident "M", "foo")) +let flatten_dot = L.flatten (L.Ldot (lident "M", mknoloc "foo")) [%%expect {| val flatten_dot : string list = ["M"; "foo"] |}] -let flatten_apply = L.flatten (L.Lapply (L.Lident "F", L.Lident "X")) +let flatten_apply = L.flatten (L.Lapply (lident "F", lident "X")) [%%expect {| >> Fatal error: Longident.flat Exception: Misc.Fatal_error. @@ -36,24 +44,30 @@ val unflatten_sing : L.t option = Some (L.Lident "foo") let unflatten_dot = L.unflatten ["M"; "N"; "foo"] [%%expect {| val unflatten_dot : L.t option = - Some (L.Ldot (L.Ldot (L.Lident "M", "N"), "foo")) + Some + (L.Ldot + ({Location.txt = + L.Ldot ({Location.txt = L.Lident "M"; loc = File "_none_", line 1}, + {Location.txt = "N"; loc = File "_none_", line 1}); + loc = File "_none_", line 1}, + {Location.txt = "foo"; loc = File "_none_", line 1})) |}] let last_ident = L.last (L.Lident "foo") [%%expect {| val last_ident : string = "foo" |}] -let last_dot = L.last (L.Ldot (L.Lident "M", "foo")) +let last_dot = L.last (L.Ldot (lident "M", mknoloc "foo")) [%%expect {| val last_dot : string = "foo" |}] -let last_apply = L.last (L.Lapply (L.Lident "F", L.Lident "X")) +let last_apply = L.last (L.Lapply (lident "F", lident "X")) [%%expect {| >> Fatal error: Longident.last Exception: Misc.Fatal_error. |}] let last_dot_apply = L.last - (L.Ldot (L.Lapply (L.Lident "F", L.Lident "X"), "foo")) + (L.Ldot (mknoloc (L.Lapply (lident "F", lident "X")), mknoloc "foo")) [%%expect {| val last_dot_apply : string = "foo" |}];; @@ -72,14 +86,7 @@ let parse_empty_val = Parse.longident (Lexing.from_string "") type parse_result = { flat : L.t; spec : L.t; any_is_correct : bool; } val test : (Lexing.lexbuf -> L.t) -> string -> parse_result = val parse_empty : L.t = L.Lident "" -Exception: -Syntaxerr.Error - (Syntaxerr.Other - {Location.loc_start = - {Lexing.pos_fname = ""; pos_lnum = 1; pos_bol = 0; pos_cnum = 0}; - loc_end = - {Lexing.pos_fname = ""; pos_lnum = 1; pos_bol = 0; pos_cnum = 0}; - loc_ghost = false}). +Exception: Syntaxerr.Error (Syntaxerr.Other Line 1, characters 0-0). |}] let parse_ident = test Parse.val_ident "foo" [%%expect {| @@ -89,14 +96,32 @@ val parse_ident : parse_result = let parse_dot = test Parse.val_ident "M.foo" [%%expect {| val parse_dot : parse_result = - {flat = L.Ldot (L.Lident "M", "foo"); spec = L.Ldot (L.Lident "M", "foo"); + {flat = + L.Ldot ({Location.txt = L.Lident "M"; loc = File "_none_", line 1}, + {Location.txt = "foo"; loc = File "_none_", line 1}); + spec = + L.Ldot ({Location.txt = L.Lident "M"; loc = Line 1, characters 0-1}, + {Location.txt = "foo"; loc = Line 1, characters 2-5}); any_is_correct = true} |}] let parse_path = test Parse.val_ident "M.N.foo" [%%expect {| val parse_path : parse_result = - {flat = L.Ldot (L.Ldot (L.Lident "M", "N"), "foo"); - spec = L.Ldot (L.Ldot (L.Lident "M", "N"), "foo"); any_is_correct = true} + {flat = + L.Ldot + ({Location.txt = + L.Ldot ({Location.txt = L.Lident "M"; loc = File "_none_", line 1}, + {Location.txt = "N"; loc = File "_none_", line 1}); + loc = File "_none_", line 1}, + {Location.txt = "foo"; loc = File "_none_", line 1}); + spec = + L.Ldot + ({Location.txt = + L.Ldot ({Location.txt = L.Lident "M"; loc = Line 1, characters 0-1}, + {Location.txt = "N"; loc = Line 1, characters 2-3}); + loc = Line 1, characters 0-3}, + {Location.txt = "foo"; loc = Line 1, characters 4-7}); + any_is_correct = true} |}] let parse_complex = test Parse.type_ident "M.F(M.N).N.foo" (* the result below is a known misbehavior of Longident.parse @@ -104,13 +129,41 @@ let parse_complex = test Parse.type_ident "M.F(M.N).N.foo" [%%expect {| val parse_complex : parse_result = {flat = - L.Ldot (L.Ldot (L.Ldot (L.Ldot (L.Lident "M", "F(M"), "N)"), "N"), "foo"); + L.Ldot + ({Location.txt = + L.Ldot + ({Location.txt = + L.Ldot + ({Location.txt = + L.Ldot + ({Location.txt = L.Lident "M"; loc = File "_none_", line 1}, + {Location.txt = "F(M"; loc = File "_none_", line 1}); + loc = File "_none_", line 1}, + {Location.txt = "N)"; loc = File "_none_", line 1}); + loc = File "_none_", line 1}, + {Location.txt = "N"; loc = File "_none_", line 1}); + loc = File "_none_", line 1}, + {Location.txt = "foo"; loc = File "_none_", line 1}); spec = L.Ldot - (L.Ldot - (L.Lapply (L.Ldot (L.Lident "M", "F"), L.Ldot (L.Lident "M", "N")), - "N"), - "foo"); + ({Location.txt = + L.Ldot + ({Location.txt = + L.Lapply + ({Location.txt = + L.Ldot + ({Location.txt = L.Lident "M"; loc = Line 1, characters 0-1}, + {Location.txt = "F"; loc = Line 1, characters 2-3}); + loc = Line 1, characters 0-3}, + {Location.txt = + L.Ldot + ({Location.txt = L.Lident "M"; loc = Line 1, characters 4-5}, + {Location.txt = "N"; loc = Line 1, characters 6-7}); + loc = Line 1, characters 4-7}); + loc = Line 1, characters 0-8}, + {Location.txt = "N"; loc = Line 1, characters 9-10}); + loc = Line 1, characters 0-10}, + {Location.txt = "foo"; loc = Line 1, characters 11-14}); any_is_correct = true} |}] @@ -118,16 +171,35 @@ let parse_op = test Parse.val_ident "M.(.%.()<-)" (* the result below is another known misbehavior of Longident.parse. *) [%%expect {| val parse_op : parse_result = - {flat = L.Ldot (L.Ldot (L.Ldot (L.Lident "M", "("), "%"), "()<-)"); - spec = L.Ldot (L.Lident "M", ".%.()<-"); any_is_correct = true} + {flat = + L.Ldot + ({Location.txt = + L.Ldot + ({Location.txt = + L.Ldot + ({Location.txt = L.Lident "M"; loc = File "_none_", line 1}, + {Location.txt = "("; loc = File "_none_", line 1}); + loc = File "_none_", line 1}, + {Location.txt = "%"; loc = File "_none_", line 1}); + loc = File "_none_", line 1}, + {Location.txt = "()<-)"; loc = File "_none_", line 1}); + spec = + L.Ldot ({Location.txt = L.Lident "M"; loc = Line 1, characters 0-1}, + {Location.txt = ".%.()<-"; loc = Line 1, characters 2-11}); + any_is_correct = true} |}] let parse_let_op = test Parse.val_ident "M.(let+*!)" [%%expect {| val parse_let_op : parse_result = - {flat = L.Ldot (L.Lident "M", "(let+*!)"); - spec = L.Ldot (L.Lident "M", "let+*!"); any_is_correct = true} + {flat = + L.Ldot ({Location.txt = L.Lident "M"; loc = File "_none_", line 1}, + {Location.txt = "(let+*!)"; loc = File "_none_", line 1}); + spec = + L.Ldot ({Location.txt = L.Lident "M"; loc = Line 1, characters 0-1}, + {Location.txt = "let+*!"; loc = Line 1, characters 2-10}); + any_is_correct = true} |}] let constr = test Parse.constr_ident "true" @@ -139,8 +211,30 @@ val constr : parse_result = let prefix_constr = test Parse.constr_ident "A.B.C.(::)" [%%expect{| val prefix_constr : parse_result = - {flat = L.Ldot (L.Ldot (L.Ldot (L.Lident "A", "B"), "C"), "(::)"); - spec = L.Ldot (L.Ldot (L.Ldot (L.Lident "A", "B"), "C"), "::"); + {flat = + L.Ldot + ({Location.txt = + L.Ldot + ({Location.txt = + L.Ldot + ({Location.txt = L.Lident "A"; loc = File "_none_", line 1}, + {Location.txt = "B"; loc = File "_none_", line 1}); + loc = File "_none_", line 1}, + {Location.txt = "C"; loc = File "_none_", line 1}); + loc = File "_none_", line 1}, + {Location.txt = "(::)"; loc = File "_none_", line 1}); + spec = + L.Ldot + ({Location.txt = + L.Ldot + ({Location.txt = + L.Ldot + ({Location.txt = L.Lident "A"; loc = Line 1, characters 0-1}, + {Location.txt = "B"; loc = Line 1, characters 2-3}); + loc = Line 1, characters 0-3}, + {Location.txt = "C"; loc = Line 1, characters 4-5}); + loc = Line 1, characters 0-5}, + {Location.txt = "::"; loc = Line 1, characters 6-10}); any_is_correct = true} |}] @@ -150,17 +244,52 @@ let mod_ext = test Parse.extended_module_path "A.F(B.C(X)).G(Y).D" [%%expect{| val mod_ext : parse_result = {flat = - L.Ldot (L.Ldot (L.Ldot (L.Ldot (L.Lident "A", "F(B"), "C(X))"), "G(Y)"), - "D"); + L.Ldot + ({Location.txt = + L.Ldot + ({Location.txt = + L.Ldot + ({Location.txt = + L.Ldot + ({Location.txt = L.Lident "A"; loc = File "_none_", line 1}, + {Location.txt = "F(B"; loc = File "_none_", line 1}); + loc = File "_none_", line 1}, + {Location.txt = "C(X))"; loc = File "_none_", line 1}); + loc = File "_none_", line 1}, + {Location.txt = "G(Y)"; loc = File "_none_", line 1}); + loc = File "_none_", line 1}, + {Location.txt = "D"; loc = File "_none_", line 1}); spec = L.Ldot - (L.Lapply - (L.Ldot - (L.Lapply (L.Ldot (L.Lident "A", "F"), - L.Lapply (L.Ldot (L.Lident "B", "C"), L.Lident "X")), - "G"), - L.Lident "Y"), - "D"); + ({Location.txt = + L.Lapply + ({Location.txt = + L.Ldot + ({Location.txt = + L.Lapply + ({Location.txt = + L.Ldot + ({Location.txt = L.Lident "A"; + loc = Line 1, characters 0-1}, + {Location.txt = "F"; loc = Line 1, characters 2-3}); + loc = Line 1, characters 0-3}, + {Location.txt = + L.Lapply + ({Location.txt = + L.Ldot + ({Location.txt = L.Lident "B"; + loc = Line 1, characters 4-5}, + {Location.txt = "C"; loc = Line 1, characters 6-7}); + loc = Line 1, characters 4-7}, + {Location.txt = L.Lident "X"; + loc = Line 1, characters 8-9}); + loc = Line 1, characters 4-10}); + loc = Line 1, characters 0-11}, + {Location.txt = "G"; loc = Line 1, characters 12-13}); + loc = Line 1, characters 0-13}, + {Location.txt = L.Lident "Y"; loc = Line 1, characters 14-15}); + loc = Line 1, characters 0-16}, + {Location.txt = "D"; loc = Line 1, characters 17-18}); any_is_correct = true} |}] @@ -188,8 +317,8 @@ val str_path : string = "M.N.foo" let str_complex = string_of_longident - (let (&.) p word = L.Ldot(p, word) in - L.Lapply(L.Lident "M" &. "F", L.Lident "M" &. "N") &. "N" &. "foo") + (let (&.) p word = L.Ldot(mknoloc p, mknoloc word) in + L.Lapply(mknoloc (L.Lident "M" &. "F"), mknoloc (L.Lident "M" &. "N")) &. "N" &. "foo") [%%expect{| val str_complex : string = "M.F(M.N).N.foo" |}] diff --git a/testsuite/tests/compiler-libs/test_untypeast.ml b/testsuite/tests/compiler-libs/test_untypeast.ml index 62a5c356..d662523e 100644 --- a/testsuite/tests/compiler-libs/test_untypeast.ml +++ b/testsuite/tests/compiler-libs/test_untypeast.ml @@ -8,17 +8,27 @@ let run s = let pe = Parse.expression (Lexing.from_string s) in let te = Typecore.type_expression Env.initial pe in let ute = Untypeast.untype_expression te in - Format.asprintf "%a" Pprintast.expression ute + Format.printf "%a@." Pprintast.expression ute ;; [%%expect{| -val run : string -> string = +val run : string -> unit = |}];; run {| match None with Some (Some _) -> () | _ -> () |};; [%%expect{| -- : string = "match None with | Some (Some _) -> () | _ -> ()" +match None with | Some (Some _) -> () | _ -> () +- : unit = () +|}];; + +run {| let open struct type t = { mutable x : int [@atomic] } end in + let _ = fun (v : t) -> [%atomic.loc v.x] in () |};; +[%%expect{| +let open struct type t = { + mutable x: int [@atomic ]} end in + let _ = fun (v : t) -> [%ocaml.atomic.loc v.x] in () +- : unit = () |}];; (***********************************) @@ -28,12 +38,53 @@ run {| match None with Some (Some _) -> () | _ -> () |};; run {| fun x y z -> function w -> x y z w |};; [%%expect{| -- : string = "fun x y z -> function | w -> x y z w" +fun x y z -> function | w -> x y z w +- : unit = () |}];; (* 3-ary function returning a 1-ary function *) run {| fun x y z -> (function w -> x y z w) |};; [%%expect{| -- : string = "fun x y z -> (function | w -> x y z w)" +fun x y z -> (function | w -> x y z w) +- : unit = () +|}];; + +(***********************************) +(* Untypeast/pprintast correctly handle value binding type annotations. *) + +run {| let foo : 'a. 'a -> 'a = fun x -> x in foo |} + +[%%expect{| +let foo : 'a . 'a -> 'a = fun x -> x in foo +- : unit = () +|}];; + +run {| let foo : type a . a -> a = fun x -> x in foo |} + +[%%expect{| +let foo : 'a . 'a -> 'a = fun (type a) -> (fun x -> x : a -> a) in foo +- : unit = () +|}] + + +let run s = + let pe = Parse.implementation (Lexing.from_string s) in + let te,_,_,_,_ = Typemod.type_structure Env.initial pe in + let ute = Untypeast.untype_structure te in + Format.printf "%a@." Pprintast.structure ute +;; + +[%%expect{| +val run : string -> unit = |}];; + +(* That test would hang before ocaml/ocaml#14105 *) +run {|type t = (::);; let f (x : t) = match x with (::) -> 4|} + +[%%expect{| +type t = + | (::) +let f (x : t) = match x with | (::) -> 4 +- : unit = () +|}] diff --git a/testsuite/tests/effect-syntax/error_messages.ml b/testsuite/tests/effect-syntax/error_messages.ml index fc925eb9..be1a7bff 100644 --- a/testsuite/tests/effect-syntax/error_messages.ml +++ b/testsuite/tests/effect-syntax/error_messages.ml @@ -26,14 +26,6 @@ Line 3, characters 21-22: ^ Error: The value "k" has type "(%eff, unit) continuation" but an expression was expected of type "unit" -|}, Principal{| -Line 3, characters 21-22: -3 | | effect A _, k -> k - ^ -Error: The value "k" has type "(int, unit) continuation" - but an expression was expected of type "unit" - This instance of "int" is ambiguous: - it would escape the scope of its equation |}] let () = match () with diff --git a/testsuite/tests/effect-syntax/when_test.compilers.reference b/testsuite/tests/effect-syntax/when_test.compilers.reference index c8ed32c7..557239f0 100644 --- a/testsuite/tests/effect-syntax/when_test.compilers.reference +++ b/testsuite/tests/effect-syntax/when_test.compilers.reference @@ -2,5 +2,5 @@ type _ eff += E : unit eff Line 5, characters 32-33: 5 | | effect E, k when (continue k (); false) -> assert false ^ -Error: Unbound value "k" +Error: Unbound value k diff --git a/testsuite/tests/formatting/errors_batch.reference b/testsuite/tests/formatting/errors_batch.reference index 450693d8..ce134c8c 100644 --- a/testsuite/tests/formatting/errors_batch.reference +++ b/testsuite/tests/formatting/errors_batch.reference @@ -6,5 +6,5 @@ File "hello.ml", line 20, characters 4-8: File "hello.ml", line 20, characters 6-8: Longer sub-messages that do not fit on the same line as the location get indented. - This second sub-message does not have a location; - ghost locations of submessages are not printed. +This second sub-message does not have a location; +ghost locations of submessages are not printed. diff --git a/testsuite/tests/formatting/margins.ocaml.reference b/testsuite/tests/formatting/margins.ocaml.reference index 814dd061..6d5fa21a 100644 --- a/testsuite/tests/formatting/margins.ocaml.reference +++ b/testsuite/tests/formatting/margins.ocaml.reference @@ -2,11 +2,11 @@ Line 2, characters 4-9: 2 | 1 + "foo";; ^^^^^ Error: This constant has type - "string" + string but an expression was expected of type - "int" + int Line 2, characters 4-9: 2 | 1 + "foo";; ^^^^^ -Error: This constant has type "string" but an expression was expected of type "int" +Error: This constant has type string but an expression was expected of type int diff --git a/testsuite/tests/frame-pointers/c_call.reference b/testsuite/tests/frame-pointers/c_call.reference index 23095e74..44063152 100644 --- a/testsuite/tests/frame-pointers/c_call.reference +++ b/testsuite/tests/frame-pointers/c_call.reference @@ -1,12 +1,13 @@ fp_backtrace_many_args +caml_c_call_copy_stack_args caml_c_call_stack_args -camlC_call.f -camlC_call.entry +camlC_call$f +camlC_call$entry caml_program caml_c_call -camlC_call.f -camlC_call.entry +camlC_call$f +camlC_call$entry caml_program -camlC_call.f -camlC_call.entry +camlC_call$f +camlC_call$entry caml_program diff --git a/testsuite/tests/frame-pointers/effects.reference b/testsuite/tests/frame-pointers/effects.reference index 8ae3fc26..32a90628 100644 --- a/testsuite/tests/frame-pointers/effects.reference +++ b/testsuite/tests/frame-pointers/effects.reference @@ -1,26 +1,26 @@ # computation f -camlEffects.f +camlEffects$f caml_runstack -camlEffects.entry +camlEffects$entry caml_program # perform effect (E 0) # caught effect (E 0). continuing... -camlEffects.h_effect_e -camlEffects.entry +camlEffects$h_effect_e +camlEffects$entry caml_program # perform returns 1 -camlEffects.f +camlEffects$f caml_runstack -camlEffects.h_effect_e -camlEffects.entry +camlEffects$h_effect_e +camlEffects$entry caml_program # done 2 -camlEffects.v_retc -camlEffects.h_effect_e -camlEffects.entry +camlEffects$v_retc +camlEffects$h_effect_e +camlEffects$entry caml_program # continue returns 3 -camlEffects.h_effect_e -camlEffects.entry +camlEffects$h_effect_e +camlEffects$entry caml_program # result=4 diff --git a/testsuite/tests/frame-pointers/exception_handler.ml b/testsuite/tests/frame-pointers/exception_handler.ml index 19773f78..4bb5ddc9 100644 --- a/testsuite/tests/frame-pointers/exception_handler.ml +++ b/testsuite/tests/frame-pointers/exception_handler.ml @@ -11,8 +11,8 @@ external fp_backtrace : string -> unit = "fp_backtrace" [@@noalloc] exception Exn1 exception Exn2 -(* We want to be sure to use some stack space so that rbp is shifted, -* preventing inlining seems enough *) +(* We want to be sure to use some stack space so that frame pointer is shifted, + * preventing inlining seems enough *) let[@inline never] raiser i = match i with | 1 -> raise Exn1 @@ -21,10 +21,10 @@ let[@inline never] raiser i = let[@inline never][@local never] f x = x -(* This give us a chance to overwrite the memory address pointed by rbp if it -* is still within 'raiser' stack frame. -* Technically we don't need to overwrite it but by doing so we avoid some -* infinite loop while walking the stack. *) +(* This give us a chance to overwrite the memory address pointed by frame + * pointer if it is still within 'raiser' stack frame. + * Technically we don't need to overwrite it but by doing so we avoid some + * infinite loop while walking the stack. *) let[@inline never] handler () = (* Force spilling of x0, x1, x2 *) let x0 = Sys.opaque_identity 0x6f56df77 (* 0xdeadbeef *) in @@ -48,7 +48,7 @@ let[@inline never] nested i = i (* Check that we haven't broken anything by raising directly from this -* function, it doesn't require rbp to be adjusted *) + * function, it doesn't require the frame pointer to be adjusted. *) let[@inline never] bare i = begin try diff --git a/testsuite/tests/frame-pointers/exception_handler.reference b/testsuite/tests/frame-pointers/exception_handler.reference index e012fb6d..1d4d8c5c 100644 --- a/testsuite/tests/frame-pointers/exception_handler.reference +++ b/testsuite/tests/frame-pointers/exception_handler.reference @@ -1,16 +1,16 @@ -camlException_handler.handler -camlException_handler.bare -camlException_handler.entry +camlException_handler$handler +camlException_handler$bare +camlException_handler$entry caml_program -camlException_handler.handler -camlException_handler.bare -camlException_handler.entry +camlException_handler$handler +camlException_handler$bare +camlException_handler$entry caml_program -camlException_handler.handler -camlException_handler.nested -camlException_handler.entry +camlException_handler$handler +camlException_handler$nested +camlException_handler$entry caml_program -camlException_handler.handler -camlException_handler.nested -camlException_handler.entry +camlException_handler$handler +camlException_handler$nested +camlException_handler$entry caml_program diff --git a/testsuite/tests/frame-pointers/exceptions.ml b/testsuite/tests/frame-pointers/exceptions.ml new file mode 100644 index 00000000..cd931145 --- /dev/null +++ b/testsuite/tests/frame-pointers/exceptions.ml @@ -0,0 +1,34 @@ +(* TEST + frame_pointers; + readonly_files = "fp_backtrace.c"; + all_modules = "${readonly_files} exceptions.ml"; + native; + *) + +external fp_backtrace : string -> unit = "fp_backtrace" [@@noalloc] + +exception FortyTwo + +(* We want to ensure backtraces from raiser, handler and catcher are correct. + *) +let [@inline never] handler i = + Printf.printf "# handler %d\n%!" i; + fp_backtrace Sys.argv.(0); + i + 1 + +let [@inline never] raiser i = + Printf.printf "# raiser %d\n%!" i; + fp_backtrace Sys.argv.(0); + match i with + | 42 -> raise FortyTwo + | _ -> i + +let [@inline never] catcher i = + Printf.printf "# catcher %d\n%!" i; + fp_backtrace Sys.argv.(0); + try raiser i with + | FortyTwo -> ignore (handler i); + i + +let () = + ignore (catcher 42) diff --git a/testsuite/tests/frame-pointers/exceptions.reference b/testsuite/tests/frame-pointers/exceptions.reference new file mode 100644 index 00000000..802016b1 --- /dev/null +++ b/testsuite/tests/frame-pointers/exceptions.reference @@ -0,0 +1,14 @@ +# catcher 42 +camlExceptions$catcher +camlExceptions$entry +caml_program +# raiser 42 +camlExceptions$raiser +camlExceptions$catcher +camlExceptions$entry +caml_program +# handler 42 +camlExceptions$handler +camlExceptions$catcher +camlExceptions$entry +caml_program diff --git a/testsuite/tests/frame-pointers/fp_backtrace.c b/testsuite/tests/frame-pointers/fp_backtrace.c index 38e5952d..16c640d9 100644 --- a/testsuite/tests/frame-pointers/fp_backtrace.c +++ b/testsuite/tests/frame-pointers/fp_backtrace.c @@ -10,7 +10,7 @@ #define ARR_SIZE(a) (sizeof(a) / sizeof(*(a))) #if defined(__APPLE__) -#define RE_FUNC_NAME "^[[:digit:]]+[[:space:]]+[[:alnum:]_\\.]+[[:space:]]+0x[[:xdigit:]]+[[:space:]]([[:alnum:]_\\.]+).*$" +#define RE_FUNC_NAME "^[[:digit:]]+[[:space:]]+[[:alnum:]_\\.]+[[:space:]]+0x[[:xdigit:]]+[[:space:]]([[:alnum:]_\\$]+).*$" #else #define RE_FUNC_NAME "^.*\\((.+)\\+0x[[:xdigit:]]+\\) \\[0x[[:xdigit:]]+\\]$" #endif @@ -19,13 +19,13 @@ typedef struct frame_info { - struct frame_info* prev; /* rbp */ - void* retaddr; /* rip */ + struct frame_info* prev; /* base pointer / frame pointer */ + void* retaddr; /* instruction pointer / program counter */ } frame_info; /* * A backtrace symbol looks like this on Linux: - * ./path/to/binary(camlModule_fn_123+0xAABBCC) [0xAABBCCDDEE] + * ./path/to/binary(camlModule.fn_123+0xAABBCC) [0xAABBCCDDEE] * * or this on macOS: * 0 c_call.opt 0x000000010e621079 camlC_call.entry + 57 diff --git a/testsuite/tests/frame-pointers/qsort.ml b/testsuite/tests/frame-pointers/qsort.ml new file mode 100644 index 00000000..88bdd5e9 --- /dev/null +++ b/testsuite/tests/frame-pointers/qsort.ml @@ -0,0 +1,48 @@ +(* TEST + frame_pointers; + modules = "qsort_.c"; +*) + +external with_frame : (unit -> 'a) -> 'a = "with_frame" +external check_frames : unit -> unit = "check_frames" + +external in_callback : (unit -> 'a) -> 'a = "in_callback" +external in_callback_stk : + int -> int -> int -> int -> int -> + int -> int -> int -> int -> int -> + (unit -> 'a) -> 'a = "in_callback_stk_byte" "in_callback_stk" + +external sort2 : ('a -> 'a -> int) -> 'a -> 'a -> 'a * 'a = "sort2" + +let rec recurse n = + if n = 0 then 0 else 1 + recurse (n-1) + +let f a b = + check_frames (); + let cmp_str a b = + Printf.printf "Comparing %s <=> %s\n" a b; + let n = recurse 10000 in (* force stack realloc *) + assert (n = 10000); + (* check_frames not expected to work here: + we're inside a call to qsort that may not have frame pointers *) + Gc.minor (); + String.compare a b + in + let a, b = sort2 cmp_str a b in + check_frames (); + Printf.printf "Sorted: %s <= %s\n" a b + +let in_finaliser f = + let finalised = ref false in + Gc.finalise_last (fun () -> finalised := true; f ()) (ref 42); + Gc.minor (); + assert (!finalised) + +let () = + in_callback @@ fun () -> + with_frame @@ fun () -> + in_finaliser @@ fun () -> + in_callback @@ fun () -> + in_callback_stk 10 10 10 10 10 10 10 10 10 10 (fun () -> + f "foo" "bar"; + f "bar" "foo") diff --git a/testsuite/tests/frame-pointers/qsort.reference b/testsuite/tests/frame-pointers/qsort.reference new file mode 100644 index 00000000..c789ed8e --- /dev/null +++ b/testsuite/tests/frame-pointers/qsort.reference @@ -0,0 +1,4 @@ +Comparing foo <=> bar +Sorted: bar <= foo +Comparing bar <=> foo +Sorted: bar <= foo diff --git a/testsuite/tests/frame-pointers/qsort_.c b/testsuite/tests/frame-pointers/qsort_.c new file mode 100644 index 00000000..5a017e09 --- /dev/null +++ b/testsuite/tests/frame-pointers/qsort_.c @@ -0,0 +1,80 @@ +#include +#include +#include +#include + +typedef struct frame_info +{ + struct frame_info* prev; /* base pointer / frame pointer */ + void* retaddr; /* instruction pointer / program counter */ +} frame_info; + +static frame_info* top_frame = NULL; + +value with_frame(value callback) +{ + top_frame = __builtin_frame_address(0); + value ret = caml_callback(callback, Val_unit); + top_frame = NULL; + return ret; +} + +value check_frames(value unit) +{ + int count = 0; + if (!top_frame) caml_failwith("only use inside with_frame"); + struct frame_info* fp = __builtin_frame_address(0); + while ((uintnat)fp > 4096) { + if (fp == top_frame) return Val_unit; + if (count > 1000) caml_failwith("too many frames - loop?"); + count++; + /* return address should be a readable location */ + (void)(*((volatile char*)fp->retaddr)); + fp = fp->prev; + } + caml_failwith("top frame not found"); +} + +value in_callback(value cb) +{ + return caml_callback(cb, Val_unit); +} + +value in_callback_stk( + value v0, value v1, value v2, value v3, value v4, + value v5, value v6, value v7, value v8, value v9, + value cb) +{ + if (Int_val(v0) + Int_val(v1) + Int_val(v2) + Int_val(v3) + Int_val(v4) + + Int_val(v5) + Int_val(v6) + Int_val(v7) + Int_val(v8) + Int_val(v9) + != 100) + caml_failwith("bad args"); + return caml_callback(cb, Val_unit); +} + +value in_callback_stk_byte(value* v, int argn) +{ + return in_callback_stk( + v[0], v[1], v[2], v[3], v[4], + v[5], v[6], v[7], v[8], v[9], + v[10]); +} + +static value* cmp_fn = NULL; + +static int cmp_callback(const void* p_a, const void* p_b) +{ + value* const* a = p_a; + value* const* b = p_b; + return Long_val(caml_callback2(*cmp_fn, **a, **b)); +} + +value sort2(value cmp_clos, value a, value b) +{ + CAMLparam3(cmp_clos, a, b); + value* vs[2] = {&a, &b}; + cmp_fn = &cmp_clos; + qsort(vs, 2, sizeof(value*), &cmp_callback); + cmp_fn = NULL; + CAMLreturn (caml_alloc_2(0, *vs[0], *vs[1])); +} diff --git a/testsuite/tests/frame-pointers/reperform.reference b/testsuite/tests/frame-pointers/reperform.reference index e215f771..f8ab38d4 100644 --- a/testsuite/tests/frame-pointers/reperform.reference +++ b/testsuite/tests/frame-pointers/reperform.reference @@ -1,17 +1,17 @@ # resumed... -camlReperform.foo -camlReperform.foo -camlReperform.foo -camlReperform.foo -camlReperform.foo -camlReperform.foo +camlReperform$foo +camlReperform$foo +camlReperform$foo +camlReperform$foo +camlReperform$foo +camlReperform$foo caml_runstack -camlReperform.bar -camlReperform.bar -camlReperform.bar -camlReperform.bar -camlReperform.bar -camlReperform.bar +camlReperform$bar +camlReperform$bar +camlReperform$bar +camlReperform$bar +camlReperform$bar +camlReperform$bar caml_runstack -camlReperform.entry +camlReperform$entry caml_program diff --git a/testsuite/tests/frame-pointers/stack_realloc.arm64.reference b/testsuite/tests/frame-pointers/stack_realloc.arm64.reference new file mode 100644 index 00000000..0c6d100f --- /dev/null +++ b/testsuite/tests/frame-pointers/stack_realloc.arm64.reference @@ -0,0 +1,10 @@ +camlStack_realloc$callback +caml_start_program +caml_callback_exn +caml_callback +c_fun +caml_c_call +camlStack_realloc$f_comp +caml_runstack +camlStack_realloc$entry +caml_program diff --git a/testsuite/tests/frame-pointers/stack_realloc.ml b/testsuite/tests/frame-pointers/stack_realloc.ml index cacc43c2..a581342a 100644 --- a/testsuite/tests/frame-pointers/stack_realloc.ml +++ b/testsuite/tests/frame-pointers/stack_realloc.ml @@ -2,7 +2,17 @@ frame_pointers; readonly_files = "fp_backtrace.c stack_realloc_.c"; all_modules = "${readonly_files} stack_realloc.ml"; - native; + { + (* NOTE clang on macOS and gcc on Linux are less eager to inline + certain C functions in the runtime. *) + reference = "${test_source_directory}/stack_realloc.arm64.reference"; + arch_arm64; + native; + } { + reference = "${test_source_directory}/stack_realloc.reference"; + arch_amd64; + native; + } *) open Effect @@ -22,7 +32,7 @@ let[@inline never] consume_stack () = * and Stack_threshold_words = 32 *) (* in words *) let size = 128 in - let allocated = 2 * 2 (* 2 spilled registers *) + 1 (* saved rbp *) in + let allocated = 2 * 2 (* 2 spilled registers *) + 1 (* saved frame pointer *) in let count = size / allocated in let[@inline never] rec gobbler i = (* Force spilling of x0 and x1 *) diff --git a/testsuite/tests/frame-pointers/stack_realloc.reference b/testsuite/tests/frame-pointers/stack_realloc.reference index e61d4104..fb1fde62 100644 --- a/testsuite/tests/frame-pointers/stack_realloc.reference +++ b/testsuite/tests/frame-pointers/stack_realloc.reference @@ -1,9 +1,9 @@ -camlStack_realloc.callback +camlStack_realloc$callback caml_start_program caml_callback c_fun caml_c_call -camlStack_realloc.f_comp +camlStack_realloc$f_comp caml_runstack -camlStack_realloc.entry +camlStack_realloc$entry caml_program diff --git a/testsuite/tests/frame-pointers/stack_realloc2.arm64.reference b/testsuite/tests/frame-pointers/stack_realloc2.arm64.reference new file mode 100644 index 00000000..e4be15d6 --- /dev/null +++ b/testsuite/tests/frame-pointers/stack_realloc2.arm64.reference @@ -0,0 +1,10 @@ +camlStack_realloc2$callback +caml_start_program +caml_callback_exn +caml_callback +c_fun +caml_c_call +camlStack_realloc2$f_comp +caml_runstack +camlStack_realloc2$entry +caml_program diff --git a/testsuite/tests/frame-pointers/stack_realloc2.ml b/testsuite/tests/frame-pointers/stack_realloc2.ml index b2a602fa..d24ac887 100644 --- a/testsuite/tests/frame-pointers/stack_realloc2.ml +++ b/testsuite/tests/frame-pointers/stack_realloc2.ml @@ -2,7 +2,17 @@ frame_pointers; readonly_files = "fp_backtrace.c stack_realloc_.c"; all_modules = "${readonly_files} stack_realloc2.ml"; - native; + { + (* NOTE clang on MacOS and gcc on Linux are less eager to inline + certain C functions in the runtime. *) + reference = "${test_source_directory}/stack_realloc2.arm64.reference"; + arch_arm64; + native; + } { + reference = "${test_source_directory}/stack_realloc2.reference"; + arch_amd64; + native; + } *) open Effect @@ -22,7 +32,7 @@ let[@inline never] consume_stack () = * and Stack_threshold_words = 32 *) (* in words *) let size = 128 in - let allocated = 2 * 2 (* 2 spilled registers *) + 1 (* saved rbp *) in + let allocated = 2 * 2 (* 2 spilled registers *) + 1 (* saved frame pointer *) in let count = size / allocated in let[@inline never] rec gobbler i = (* Force spilling of x0 and x1 *) diff --git a/testsuite/tests/frame-pointers/stack_realloc2.reference b/testsuite/tests/frame-pointers/stack_realloc2.reference index 0051f3ba..b31adfd4 100644 --- a/testsuite/tests/frame-pointers/stack_realloc2.reference +++ b/testsuite/tests/frame-pointers/stack_realloc2.reference @@ -1,9 +1,9 @@ -camlStack_realloc2.callback +camlStack_realloc2$callback caml_start_program caml_callback c_fun caml_c_call -camlStack_realloc2.f_comp +camlStack_realloc2$f_comp caml_runstack -camlStack_realloc2.entry +camlStack_realloc2$entry caml_program diff --git a/testsuite/tests/generated-parse-errors/errors.compilers.reference b/testsuite/tests/generated-parse-errors/errors.compilers.reference index 903eba79..2e2c05e3 100644 --- a/testsuite/tests/generated-parse-errors/errors.compilers.reference +++ b/testsuite/tests/generated-parse-errors/errors.compilers.reference @@ -47,9 +47,9 @@ Error: Syntax error File "implementation: BEGIN PERCENT AND VIRTUAL", line 1, characters 12-19: Error: Syntax error File "implementation: BEGIN UIDENT WITH", line 1, characters 13-17: -Error: Syntax error: "end" expected +Error: Syntax error: end expected File "implementation: BEGIN UIDENT WITH", line 1, characters 0-5: - This "begin" might be unmatched + This begin might be unmatched File "implementation: BEGIN WITH", line 1, characters 6-10: Error: Syntax error File "implementation: CLASS LBRACKET UNDERSCORE RBRACKET WITH", line 1, characters 12-16: @@ -99,9 +99,9 @@ Error: Syntax error File "implementation: CLASS LIDENT COLON OBJECT CONSTRAINT LBRACKETAT AND RBRACKET WHILE", line 1, characters 42-47: Error: Syntax error File "implementation: CLASS LIDENT COLON OBJECT CONSTRAINT UNDERSCORE EQUAL LIDENT INITIALIZER", line 1, characters 44-55: -Error: Syntax error: "end" expected +Error: Syntax error: end expected File "implementation: CLASS LIDENT COLON OBJECT CONSTRAINT UNDERSCORE EQUAL LIDENT INITIALIZER", line 1, characters 15-21: - This "object" might be unmatched + This object might be unmatched File "implementation: CLASS LIDENT COLON OBJECT CONSTRAINT WITH", line 1, characters 33-37: Error: Syntax error File "implementation: CLASS LIDENT COLON OBJECT END WITH", line 1, characters 26-30: @@ -109,23 +109,23 @@ Error: Syntax error File "implementation: CLASS LIDENT COLON OBJECT INHERIT LBRACKETAT AND RBRACKET WHILE", line 1, characters 39-44: Error: Syntax error File "implementation: CLASS LIDENT COLON OBJECT INHERIT QUOTED_STRING_EXPR WITH", line 1, characters 46-50: -Error: Syntax error: "end" expected +Error: Syntax error: end expected File "implementation: CLASS LIDENT COLON OBJECT INHERIT QUOTED_STRING_EXPR WITH", line 1, characters 15-21: - This "object" might be unmatched + This object might be unmatched File "implementation: CLASS LIDENT COLON OBJECT INHERIT WITH", line 1, characters 30-34: Error: Syntax error File "implementation: CLASS LIDENT COLON OBJECT LBRACKETAT AND RBRACKET WHILE", line 1, characters 31-36: -Error: Syntax error: "end" expected +Error: Syntax error: end expected File "implementation: CLASS LIDENT COLON OBJECT LBRACKETAT AND RBRACKET WHILE", line 1, characters 15-21: - This "object" might be unmatched + This object might be unmatched File "implementation: CLASS LIDENT COLON OBJECT LBRACKETATATAT AND RBRACKET WITH", line 1, characters 33-37: -Error: Syntax error: "end" expected +Error: Syntax error: end expected File "implementation: CLASS LIDENT COLON OBJECT LBRACKETATATAT AND RBRACKET WITH", line 1, characters 15-21: - This "object" might be unmatched + This object might be unmatched File "implementation: CLASS LIDENT COLON OBJECT LPAREN UNDERSCORE RPAREN WITH", line 1, characters 28-32: -Error: Syntax error: "end" expected +Error: Syntax error: end expected File "implementation: CLASS LIDENT COLON OBJECT LPAREN UNDERSCORE RPAREN WITH", line 1, characters 15-21: - This "object" might be unmatched + This object might be unmatched File "implementation: CLASS LIDENT COLON OBJECT LPAREN UNDERSCORE WITH", line 1, characters 26-30: Error: Syntax error File "implementation: CLASS LIDENT COLON OBJECT LPAREN WITH", line 1, characters 24-28: @@ -133,9 +133,9 @@ Error: Syntax error File "implementation: CLASS LIDENT COLON OBJECT METHOD LBRACKETAT AND RBRACKET WHILE", line 1, characters 38-43: Error: Syntax error File "implementation: CLASS LIDENT COLON OBJECT METHOD LIDENT COLON UNDERSCORE INITIALIZER", line 1, characters 40-51: -Error: Syntax error: "end" expected +Error: Syntax error: end expected File "implementation: CLASS LIDENT COLON OBJECT METHOD LIDENT COLON UNDERSCORE INITIALIZER", line 1, characters 15-21: - This "object" might be unmatched + This object might be unmatched File "implementation: CLASS LIDENT COLON OBJECT METHOD LIDENT COLON WITH", line 1, characters 38-42: Error: Syntax error File "implementation: CLASS LIDENT COLON OBJECT METHOD LIDENT WITH", line 1, characters 36-40: @@ -149,15 +149,15 @@ Error: Syntax error File "implementation: CLASS LIDENT COLON OBJECT METHOD WITH", line 1, characters 29-33: Error: Syntax error File "implementation: CLASS LIDENT COLON OBJECT QUOTED_STRING_ITEM WITH", line 1, characters 39-43: -Error: Syntax error: "end" expected +Error: Syntax error: end expected File "implementation: CLASS LIDENT COLON OBJECT QUOTED_STRING_ITEM WITH", line 1, characters 15-21: - This "object" might be unmatched + This object might be unmatched File "implementation: CLASS LIDENT COLON OBJECT VAL LBRACKETAT AND RBRACKET WHILE", line 1, characters 35-40: Error: Syntax error File "implementation: CLASS LIDENT COLON OBJECT VAL LIDENT COLON UNDERSCORE WITH", line 1, characters 37-41: -Error: Syntax error: "end" expected +Error: Syntax error: end expected File "implementation: CLASS LIDENT COLON OBJECT VAL LIDENT COLON UNDERSCORE WITH", line 1, characters 15-21: - This "object" might be unmatched + This object might be unmatched File "implementation: CLASS LIDENT COLON OBJECT VAL LIDENT COLON WITH", line 1, characters 35-39: Error: Syntax error File "implementation: CLASS LIDENT COLON OBJECT VAL LIDENT WITH", line 1, characters 33-37: @@ -171,9 +171,9 @@ Error: Syntax error File "implementation: CLASS LIDENT COLON OBJECT VAL WITH", line 1, characters 26-30: Error: Syntax error File "implementation: CLASS LIDENT COLON OBJECT WITH", line 1, characters 22-26: -Error: Syntax error: "end" expected +Error: Syntax error: end expected File "implementation: CLASS LIDENT COLON OBJECT WITH", line 1, characters 15-21: - This "object" might be unmatched + This object might be unmatched File "implementation: CLASS LIDENT COLON OPTLABEL UNDERSCORE MINUSGREATER WITH", line 1, characters 28-32: Error: Syntax error File "implementation: CLASS LIDENT COLON OPTLABEL UNDERSCORE WITH", line 1, characters 25-29: @@ -339,9 +339,9 @@ Error: Syntax error File "implementation: EXTERNAL LIDENT WITH", line 1, characters 16-20: Error: Syntax error File "implementation: EXTERNAL LPAREN MODULE WITH", line 1, characters 18-22: -Error: Syntax error: "module-expr" expected. +Error: Syntax error: module-expr expected. File "implementation: EXTERNAL LPAREN WITH", line 1, characters 11-15: -Error: Syntax error: "operator" expected. +Error: Syntax error: operator expected. File "implementation: EXTERNAL PERCENT AND LBRACKET", line 1, characters 15-16: Error: Syntax error File "implementation: EXTERNAL WITH", line 1, characters 9-13: @@ -351,9 +351,9 @@ Error: Syntax error File "implementation: FOR PERCENT AND ASSERT", line 1, characters 10-16: Error: Syntax error File "implementation: FOR UNDERSCORE EQUAL UIDENT TO UIDENT DO UIDENT WITH", line 1, characters 28-34: -Error: Syntax error: "done" expected +Error: Syntax error: done expected File "implementation: FOR UNDERSCORE EQUAL UIDENT TO UIDENT DO UIDENT WITH", line 1, characters 25-27: - This "do" might be unmatched + This do might be unmatched File "implementation: FOR UNDERSCORE EQUAL UIDENT TO UIDENT DO WITH", line 1, characters 28-32: Error: Syntax error File "implementation: FOR UNDERSCORE EQUAL UIDENT TO UIDENT WITH", line 1, characters 25-29: @@ -381,7 +381,7 @@ Error: Syntax error File "implementation: FUN LPAREN TYPE WITH", line 1, characters 11-15: Error: Syntax error File "implementation: FUN LPAREN WITH", line 1, characters 6-10: -Error: Syntax error: "operator" expected. +Error: Syntax error: operator expected. File "implementation: FUN OPTLABEL LPAREN UNDERSCORE COLON UNDERSCORE WITH", line 1, characters 20-24: Error: Syntax error File "implementation: FUN OPTLABEL LPAREN UNDERSCORE COLON WITH", line 1, characters 18-22: @@ -429,7 +429,7 @@ Error: Syntax error File "implementation: FUN UNDERSCORE LPAREN TYPE WITH", line 1, characters 13-17: Error: Syntax error File "implementation: FUN UNDERSCORE LPAREN WITH", line 1, characters 8-12: -Error: Syntax error: "operator" expected. +Error: Syntax error: operator expected. File "implementation: FUN UNDERSCORE MINUSGREATER WITH", line 1, characters 9-13: Error: Syntax error File "implementation: FUN UNDERSCORE UNDERSCORE WITH", line 1, characters 8-12: @@ -451,15 +451,15 @@ Error: Syntax error File "implementation: FUNCTION PERCENT AND ASSERT", line 1, characters 15-21: Error: Syntax error File "implementation: FUNCTION UNDERSCORE AS WITH", line 1, characters 14-18: -Error: Syntax error: "identifier" expected. +Error: Syntax error: identifier expected. File "implementation: FUNCTION UNDERSCORE BAR UNDERSCORE WITH", line 1, characters 15-19: Error: Syntax error File "implementation: FUNCTION UNDERSCORE BAR WITH", line 1, characters 13-17: -Error: Syntax error: "pattern" expected. +Error: Syntax error: pattern expected. File "implementation: FUNCTION UNDERSCORE COLONCOLON UNDERSCORE WITH", line 1, characters 16-20: Error: Syntax error File "implementation: FUNCTION UNDERSCORE COLONCOLON WITH", line 1, characters 14-18: -Error: Syntax error: "pattern" expected. +Error: Syntax error: pattern expected. File "implementation: FUNCTION UNDERSCORE COMMA CHAR COMMA UNDERSCORE WITH", line 1, characters 21-25: Error: Syntax error File "implementation: FUNCTION UNDERSCORE COMMA CHAR COMMA WITH", line 1, characters 19-23: @@ -467,7 +467,7 @@ Error: Syntax error File "implementation: FUNCTION UNDERSCORE COMMA UNDERSCORE WITH", line 1, characters 15-19: Error: Syntax error File "implementation: FUNCTION UNDERSCORE COMMA WITH", line 1, characters 13-17: -Error: Syntax error: "pattern" expected. +Error: Syntax error: pattern expected. File "implementation: FUNCTION UNDERSCORE MINUSGREATER CHAR BAR WITH", line 1, characters 20-24: Error: Syntax error File "implementation: FUNCTION UNDERSCORE MINUSGREATER DOT WHILE", line 1, characters 16-21: @@ -517,55 +517,55 @@ Error: Syntax error File "implementation: LAZY WITH", line 1, characters 5-9: Error: Syntax error File "implementation: LBRACE LIDENT COLONGREATER LIDENT RPAREN", line 1, characters 19-20: -Error: Syntax error: "}" expected +Error: Syntax error: } expected File "implementation: LBRACE LIDENT COLONGREATER LIDENT RPAREN", line 1, characters 0-1: - This "{" might be unmatched + This { might be unmatched File "implementation: LBRACE LIDENT EQUAL CHAR GREATERRBRACE", line 1, characters 15-17: -Error: Syntax error: "}" expected +Error: Syntax error: } expected File "implementation: LBRACE LIDENT EQUAL CHAR GREATERRBRACE", line 1, characters 0-1: - This "{" might be unmatched + This { might be unmatched File "implementation: LBRACE LIDENT SEMI WITH", line 1, characters 11-15: -Error: Syntax error: "}" expected +Error: Syntax error: } expected File "implementation: LBRACE LIDENT SEMI WITH", line 1, characters 0-1: - This "{" might be unmatched + This { might be unmatched File "implementation: LBRACE LIDENT WHILE", line 1, characters 9-14: -Error: Syntax error: "}" expected +Error: Syntax error: } expected File "implementation: LBRACE LIDENT WHILE", line 1, characters 0-1: - This "{" might be unmatched + This { might be unmatched File "implementation: LBRACE TRUE DOT LBRACE UIDENT WITH", line 1, characters 18-22: -Error: Syntax error: "}" expected +Error: Syntax error: } expected File "implementation: LBRACE TRUE DOT LBRACE UIDENT WITH", line 1, characters 9-10: - This "{" might be unmatched + This { might be unmatched File "implementation: LBRACE TRUE DOT LBRACE WITH", line 1, characters 11-15: Error: Syntax error File "implementation: LBRACE TRUE DOT LBRACKET UIDENT WITH", line 1, characters 18-22: -Error: Syntax error: "]" expected +Error: Syntax error: ] expected File "implementation: LBRACE TRUE DOT LBRACKET UIDENT WITH", line 1, characters 9-10: - This "[" might be unmatched + This [ might be unmatched File "implementation: LBRACE TRUE DOT LBRACKET WITH", line 1, characters 11-15: Error: Syntax error File "implementation: LBRACE TRUE DOT LPAREN UIDENT WITH", line 1, characters 18-22: -Error: Syntax error: ")" expected +Error: Syntax error: ) expected File "implementation: LBRACE TRUE DOT LPAREN UIDENT WITH", line 1, characters 9-10: - This "(" might be unmatched + This ( might be unmatched File "implementation: LBRACE TRUE DOT LPAREN WITH", line 1, characters 11-15: Error: Syntax error File "implementation: LBRACE TRUE DOT UIDENT DOTOP LBRACE UIDENT RPAREN", line 1, characters 28-29: -Error: Syntax error: "}" expected +Error: Syntax error: } expected File "implementation: LBRACE TRUE DOT UIDENT DOTOP LBRACE UIDENT RPAREN", line 1, characters 19-20: - This "{" might be unmatched + This { might be unmatched File "implementation: LBRACE TRUE DOT UIDENT DOTOP LBRACE WITH", line 1, characters 21-25: Error: Syntax error File "implementation: LBRACE TRUE DOT UIDENT DOTOP LBRACKET UIDENT RPAREN", line 1, characters 28-29: -Error: Syntax error: "]" expected +Error: Syntax error: ] expected File "implementation: LBRACE TRUE DOT UIDENT DOTOP LBRACKET UIDENT RPAREN", line 1, characters 19-20: - This "[" might be unmatched + This [ might be unmatched File "implementation: LBRACE TRUE DOT UIDENT DOTOP LBRACKET WITH", line 1, characters 21-25: Error: Syntax error File "implementation: LBRACE TRUE DOT UIDENT DOTOP LPAREN UIDENT RBRACKET", line 1, characters 28-29: -Error: Syntax error: ")" expected +Error: Syntax error: ) expected File "implementation: LBRACE TRUE DOT UIDENT DOTOP LPAREN UIDENT RBRACKET", line 1, characters 19-20: - This "(" might be unmatched + This ( might be unmatched File "implementation: LBRACE TRUE DOT UIDENT DOTOP LPAREN WITH", line 1, characters 21-25: Error: Syntax error File "implementation: LBRACE TRUE DOT UIDENT DOTOP WITH", line 1, characters 19-23: @@ -577,27 +577,27 @@ Error: Syntax error File "implementation: LBRACE TRUE WHILE", line 1, characters 7-12: Error: Syntax error File "implementation: LBRACE UIDENT DOT LIDENT WHILE", line 1, characters 18-23: -Error: Syntax error: "}" expected +Error: Syntax error: } expected File "implementation: LBRACE UIDENT DOT LIDENT WHILE", line 1, characters 0-1: - This "{" might be unmatched + This { might be unmatched File "implementation: LBRACE UIDENT DOT WITH", line 1, characters 11-15: Error: Syntax error File "implementation: LBRACE UIDENT DOTOP LBRACE UIDENT SEMI RPAREN", line 1, characters 23-24: -Error: Syntax error: "}" expected +Error: Syntax error: } expected File "implementation: LBRACE UIDENT DOTOP LBRACE UIDENT SEMI RPAREN", line 1, characters 12-13: - This "{" might be unmatched + This { might be unmatched File "implementation: LBRACE UIDENT DOTOP LBRACE WITH", line 1, characters 14-18: Error: Syntax error File "implementation: LBRACE UIDENT DOTOP LBRACKET UIDENT RPAREN", line 1, characters 21-22: -Error: Syntax error: "]" expected +Error: Syntax error: ] expected File "implementation: LBRACE UIDENT DOTOP LBRACKET UIDENT RPAREN", line 1, characters 12-13: - This "[" might be unmatched + This [ might be unmatched File "implementation: LBRACE UIDENT DOTOP LBRACKET WITH", line 1, characters 14-18: Error: Syntax error File "implementation: LBRACE UIDENT DOTOP LPAREN UIDENT RBRACKET", line 1, characters 21-22: -Error: Syntax error: ")" expected +Error: Syntax error: ) expected File "implementation: LBRACE UIDENT DOTOP LPAREN UIDENT RBRACKET", line 1, characters 12-13: - This "(" might be unmatched + This ( might be unmatched File "implementation: LBRACE UIDENT DOTOP LPAREN WITH", line 1, characters 14-18: Error: Syntax error File "implementation: LBRACE UIDENT DOTOP WITH", line 1, characters 12-16: @@ -605,37 +605,37 @@ Error: Syntax error File "implementation: LBRACE UIDENT WHILE", line 1, characters 9-14: Error: Syntax error File "implementation: LBRACE UIDENT WITH LIDENT WITH", line 1, characters 21-25: -Error: Syntax error: "}" expected +Error: Syntax error: } expected File "implementation: LBRACE UIDENT WITH LIDENT WITH", line 1, characters 0-1: - This "{" might be unmatched + This { might be unmatched File "implementation: LBRACE UIDENT WITH WITH", line 1, characters 14-18: Error: Syntax error File "implementation: LBRACE WITH", line 1, characters 2-6: Error: Syntax error File "implementation: LBRACELESS LIDENT EQUAL UIDENT RBRACE", line 1, characters 19-20: -Error: Syntax error: ">}" expected +Error: Syntax error: >} expected File "implementation: LBRACELESS LIDENT EQUAL UIDENT RBRACE", line 1, characters 0-2: - This "{<" might be unmatched + This {< might be unmatched File "implementation: LBRACELESS LIDENT EQUAL UIDENT WITH", line 1, characters 19-23: -Error: Syntax error: ">}" expected +Error: Syntax error: >} expected File "implementation: LBRACELESS LIDENT EQUAL UIDENT WITH", line 1, characters 0-2: - This "{<" might be unmatched + This {< might be unmatched File "implementation: LBRACELESS LIDENT EQUAL WITH", line 1, characters 12-16: Error: Syntax error File "implementation: LBRACELESS LIDENT SEMI WITH", line 1, characters 12-16: -Error: Syntax error: ">}" expected +Error: Syntax error: >} expected File "implementation: LBRACELESS LIDENT SEMI WITH", line 1, characters 0-2: - This "{<" might be unmatched + This {< might be unmatched File "implementation: LBRACELESS LIDENT WITH", line 1, characters 10-14: -Error: Syntax error: ">}" expected +Error: Syntax error: >} expected File "implementation: LBRACELESS LIDENT WITH", line 1, characters 0-2: - This "{<" might be unmatched + This {< might be unmatched File "implementation: LBRACELESS WITH", line 1, characters 3-7: Error: Syntax error File "implementation: LBRACKET UIDENT RPAREN", line 1, characters 9-10: -Error: Syntax error: "]" expected +Error: Syntax error: ] expected File "implementation: LBRACKET UIDENT RPAREN", line 1, characters 0-1: - This "[" might be unmatched + This [ might be unmatched File "implementation: LBRACKET WITH", line 1, characters 2-6: Error: Syntax error File "implementation: LBRACKETATATAT UNDERSCORE", line 1, characters 5-6: @@ -645,17 +645,17 @@ Error: Syntax error File "implementation: LBRACKETATATAT WITH VIRTUAL", line 1, characters 10-17: Error: Syntax error File "implementation: LBRACKETBAR UIDENT RPAREN", line 1, characters 10-11: -Error: Syntax error: "|]" expected +Error: Syntax error: |] expected File "implementation: LBRACKETBAR UIDENT RPAREN", line 1, characters 0-2: - This "[|" might be unmatched + This [| might be unmatched File "implementation: LBRACKETBAR UIDENT SEMI WITH", line 1, characters 12-16: -Error: Syntax error: "|]" expected +Error: Syntax error: |] expected File "implementation: LBRACKETBAR UIDENT SEMI WITH", line 1, characters 0-2: - This "[|" might be unmatched + This [| might be unmatched File "implementation: LBRACKETBAR UIDENT WITH", line 1, characters 10-14: -Error: Syntax error: "|]" expected +Error: Syntax error: |] expected File "implementation: LBRACKETBAR UIDENT WITH", line 1, characters 0-2: - This "[|" might be unmatched + This [| might be unmatched File "implementation: LBRACKETBAR WITH", line 1, characters 3-7: Error: Syntax error File "implementation: LBRACKETPERCENT UNDERSCORE", line 1, characters 3-4: @@ -747,7 +747,7 @@ Error: Syntax error File "implementation: LBRACKETPERCENTPERCENT WITH COLON MODULE UIDENT COLONEQUAL UIDENT WITH", line 1, characters 35-39: Error: Syntax error File "implementation: LBRACKETPERCENTPERCENT WITH COLON MODULE UIDENT COLONEQUAL WITH", line 1, characters 28-32: -Error: Syntax error: "module path" expected. +Error: Syntax error: module path expected. File "implementation: LBRACKETPERCENTPERCENT WITH COLON MODULE UIDENT WITH", line 1, characters 25-29: Error: Syntax error File "implementation: LBRACKETPERCENTPERCENT WITH COLON MODULE UNDERSCORE COLON UIDENT RPAREN", line 1, characters 29-30: @@ -757,7 +757,7 @@ Error: Syntax error File "implementation: LBRACKETPERCENTPERCENT WITH COLON MODULE UNDERSCORE EQUAL UIDENT WITH", line 1, characters 29-33: Error: Syntax error File "implementation: LBRACKETPERCENTPERCENT WITH COLON MODULE UNDERSCORE EQUAL WITH", line 1, characters 20-21: -Error: Syntax error: ":" expected. +Error: Syntax error: : expected. File "implementation: LBRACKETPERCENTPERCENT WITH COLON MODULE UNDERSCORE LPAREN RPAREN WITH", line 1, characters 24-28: Error: Syntax error File "implementation: LBRACKETPERCENTPERCENT WITH COLON MODULE UNDERSCORE WITH", line 1, characters 20-24: @@ -963,53 +963,53 @@ Error: Syntax error File "implementation: LETOP LAZY WITH", line 1, characters 10-14: Error: Syntax error File "implementation: LETOP LBRACE LIDENT COLON UNDERSCORE WITH", line 1, characters 18-22: -Error: Syntax error: "}" expected +Error: Syntax error: } expected File "implementation: LETOP LBRACE LIDENT COLON UNDERSCORE WITH", line 1, characters 5-6: - This "{" might be unmatched + This { might be unmatched File "implementation: LETOP LBRACE LIDENT COLON WITH", line 1, characters 16-20: Error: Syntax error File "implementation: LETOP LBRACE LIDENT EQUAL UNDERSCORE WITH", line 1, characters 18-22: -Error: Syntax error: "}" expected +Error: Syntax error: } expected File "implementation: LETOP LBRACE LIDENT EQUAL UNDERSCORE WITH", line 1, characters 5-6: - This "{" might be unmatched + This { might be unmatched File "implementation: LETOP LBRACE LIDENT EQUAL WITH", line 1, characters 16-20: Error: Syntax error File "implementation: LETOP LBRACE LIDENT SEMI UNDERSCORE SEMI WITH", line 1, characters 20-24: -Error: Syntax error: "}" expected +Error: Syntax error: } expected File "implementation: LETOP LBRACE LIDENT SEMI UNDERSCORE SEMI WITH", line 1, characters 5-6: - This "{" might be unmatched + This { might be unmatched File "implementation: LETOP LBRACE LIDENT SEMI UNDERSCORE WITH", line 1, characters 18-22: -Error: Syntax error: "}" expected +Error: Syntax error: } expected File "implementation: LETOP LBRACE LIDENT SEMI UNDERSCORE WITH", line 1, characters 5-6: - This "{" might be unmatched + This { might be unmatched File "implementation: LETOP LBRACE LIDENT SEMI WITH", line 1, characters 16-20: -Error: Syntax error: "}" expected +Error: Syntax error: } expected File "implementation: LETOP LBRACE LIDENT SEMI WITH", line 1, characters 5-6: - This "{" might be unmatched + This { might be unmatched File "implementation: LETOP LBRACE LIDENT WITH", line 1, characters 14-18: -Error: Syntax error: "}" expected +Error: Syntax error: } expected File "implementation: LETOP LBRACE LIDENT WITH", line 1, characters 5-6: - This "{" might be unmatched + This { might be unmatched File "implementation: LETOP LBRACE WITH", line 1, characters 7-11: Error: Syntax error File "implementation: LETOP LBRACKET UNDERSCORE BARRBRACKET", line 1, characters 9-11: -Error: Syntax error: "]" expected +Error: Syntax error: ] expected File "implementation: LETOP LBRACKET UNDERSCORE BARRBRACKET", line 1, characters 5-6: - This "[" might be unmatched + This [ might be unmatched File "implementation: LETOP LBRACKET WITH", line 1, characters 7-11: Error: Syntax error File "implementation: LETOP LBRACKETBAR UNDERSCORE RBRACKET", line 1, characters 10-11: -Error: Syntax error: "|]" expected +Error: Syntax error: |] expected File "implementation: LETOP LBRACKETBAR UNDERSCORE RBRACKET", line 1, characters 5-7: - This "[|" might be unmatched + This [| might be unmatched File "implementation: LETOP LBRACKETBAR UNDERSCORE SEMI WITH", line 1, characters 12-16: -Error: Syntax error: "|]" expected +Error: Syntax error: |] expected File "implementation: LETOP LBRACKETBAR UNDERSCORE SEMI WITH", line 1, characters 5-7: - This "[|" might be unmatched + This [| might be unmatched File "implementation: LETOP LBRACKETBAR UNDERSCORE WITH", line 1, characters 10-14: -Error: Syntax error: "|]" expected +Error: Syntax error: |] expected File "implementation: LETOP LBRACKETBAR UNDERSCORE WITH", line 1, characters 5-7: - This "[|" might be unmatched + This [| might be unmatched File "implementation: LETOP LBRACKETBAR WITH", line 1, characters 8-12: Error: Syntax error File "implementation: LETOP LIDENT ANDOP WITH", line 1, characters 17-21: @@ -1025,7 +1025,7 @@ Error: Syntax error File "implementation: LETOP LIDENT LPAREN TYPE WITH", line 1, characters 19-23: Error: Syntax error File "implementation: LETOP LIDENT LPAREN WITH", line 1, characters 14-18: -Error: Syntax error: "operator" expected. +Error: Syntax error: operator expected. File "implementation: LETOP LIDENT UNDERSCORE COLONGREATER LIDENT EQUAL WITH", line 1, characters 26-30: Error: Syntax error File "implementation: LETOP LIDENT UNDERSCORE COLONGREATER LIDENT SEMI", line 1, characters 24-25: @@ -1035,39 +1035,39 @@ Error: Syntax error File "implementation: LETOP LIDENT WITH", line 1, characters 12-16: Error: Syntax error File "implementation: LETOP LPAREN MINUS WITH", line 1, characters 9-13: -Error: Syntax error: ")" expected +Error: Syntax error: ) expected File "implementation: LETOP LPAREN MINUS WITH", line 1, characters 5-6: - This "(" might be unmatched + This ( might be unmatched File "implementation: LETOP LPAREN MODULE LBRACKETAT AND RBRACKET WHILE", line 1, characters 23-28: Error: Syntax error File "implementation: LETOP LPAREN MODULE PERCENT AND WHILE", line 1, characters 20-25: Error: Syntax error File "implementation: LETOP LPAREN MODULE UNDERSCORE COLON UIDENT VAL", line 1, characters 25-28: -Error: Syntax error: ")" expected +Error: Syntax error: ) expected File "implementation: LETOP LPAREN MODULE UNDERSCORE COLON UIDENT VAL", line 1, characters 5-6: - This "(" might be unmatched + This ( might be unmatched File "implementation: LETOP LPAREN MODULE UNDERSCORE COLON WITH", line 1, characters 18-22: Error: Syntax error File "implementation: LETOP LPAREN MODULE UNDERSCORE WITH", line 1, characters 16-20: Error: Syntax error File "implementation: LETOP LPAREN MODULE WITH", line 1, characters 14-18: -Error: Syntax error: "module-expr" expected. +Error: Syntax error: module-expr expected. File "implementation: LETOP LPAREN PLUS WITH", line 1, characters 9-13: -Error: Syntax error: ")" expected +Error: Syntax error: ) expected File "implementation: LETOP LPAREN PLUS WITH", line 1, characters 5-6: - This "(" might be unmatched + This ( might be unmatched File "implementation: LETOP LPAREN UNDERSCORE COLON UNDERSCORE WITH", line 1, characters 13-17: -Error: Syntax error: ")" expected +Error: Syntax error: ) expected File "implementation: LETOP LPAREN UNDERSCORE COLON UNDERSCORE WITH", line 1, characters 5-6: - This "(" might be unmatched + This ( might be unmatched File "implementation: LETOP LPAREN UNDERSCORE COLON WITH", line 1, characters 11-15: -Error: Syntax error: "type" expected. +Error: Syntax error: type expected. File "implementation: LETOP LPAREN UNDERSCORE WITH", line 1, characters 9-13: -Error: Syntax error: ")" expected +Error: Syntax error: ) expected File "implementation: LETOP LPAREN UNDERSCORE WITH", line 1, characters 5-6: - This "(" might be unmatched + This ( might be unmatched File "implementation: LETOP LPAREN WITH", line 1, characters 7-11: -Error: Syntax error: "operator" expected. +Error: Syntax error: operator expected. File "implementation: LETOP MINUS WITH", line 1, characters 7-11: Error: Syntax error File "implementation: LETOP PLUS WITH", line 1, characters 7-11: @@ -1079,25 +1079,25 @@ Error: Syntax error File "implementation: LETOP UIDENT DOT LBRACKET WITH", line 1, characters 16-20: Error: Syntax error File "implementation: LETOP UIDENT DOT LPAREN UNDERSCORE WITH", line 1, characters 18-22: -Error: Syntax error: ")" expected +Error: Syntax error: ) expected File "implementation: LETOP UIDENT DOT LPAREN UNDERSCORE WITH", line 1, characters 14-15: - This "(" might be unmatched + This ( might be unmatched File "implementation: LETOP UIDENT DOT LPAREN WITH", line 1, characters 16-20: -Error: Syntax error: "pattern" expected. +Error: Syntax error: pattern expected. File "implementation: LETOP UIDENT DOT WITH", line 1, characters 14-18: Error: Syntax error File "implementation: LETOP UIDENT LIDENT WITH", line 1, characters 19-23: Error: Syntax error -File "implementation: LETOP UIDENT TILDE", line 1, characters 12-13: +File "implementation: LETOP UIDENT TILDE", line 1, characters 0-2: Error: Syntax error File "implementation: LETOP UIDENT WITH", line 1, characters 12-16: Error: Syntax error File "implementation: LETOP UNDERSCORE AS WITH", line 1, characters 10-14: -Error: Syntax error: "identifier" expected. +Error: Syntax error: identifier expected. File "implementation: LETOP UNDERSCORE BAR UNDERSCORE WITH", line 1, characters 11-15: Error: Syntax error File "implementation: LETOP UNDERSCORE BAR WITH", line 1, characters 9-13: -Error: Syntax error: "pattern" expected. +Error: Syntax error: pattern expected. File "implementation: LETOP UNDERSCORE COLON UNDERSCORE EQUAL WITH", line 1, characters 13-17: Error: Syntax error File "implementation: LETOP UNDERSCORE COLON UNDERSCORE WITH", line 1, characters 11-15: @@ -1107,7 +1107,7 @@ Error: Syntax error File "implementation: LETOP UNDERSCORE COLONCOLON UNDERSCORE WITH", line 1, characters 12-16: Error: Syntax error File "implementation: LETOP UNDERSCORE COLONCOLON WITH", line 1, characters 10-14: -Error: Syntax error: "pattern" expected. +Error: Syntax error: pattern expected. File "implementation: LETOP UNDERSCORE COMMA CHAR COMMA UNDERSCORE WITH", line 1, characters 17-21: Error: Syntax error File "implementation: LETOP UNDERSCORE COMMA CHAR COMMA WITH", line 1, characters 15-19: @@ -1115,7 +1115,7 @@ Error: Syntax error File "implementation: LETOP UNDERSCORE COMMA UNDERSCORE WITH", line 1, characters 11-15: Error: Syntax error File "implementation: LETOP UNDERSCORE COMMA WITH", line 1, characters 9-13: -Error: Syntax error: "pattern" expected. +Error: Syntax error: pattern expected. File "implementation: LETOP UNDERSCORE EQUAL CHAR WITH", line 1, characters 13-17: Error: Syntax error File "implementation: LETOP UNDERSCORE EQUAL WITH", line 1, characters 9-13: @@ -1131,31 +1131,31 @@ Error: Syntax error File "implementation: LIDENT WHILE", line 1, characters 7-12: Error: Syntax error File "implementation: LPAREN BANG WITH", line 1, characters 4-8: -Error: Syntax error: ")" expected +Error: Syntax error: ) expected File "implementation: LPAREN BANG WITH", line 1, characters 0-1: - This "(" might be unmatched + This ( might be unmatched File "implementation: LPAREN COLONCOLON WITH", line 1, characters 5-9: Error: Syntax error File "implementation: LPAREN DOTOP LBRACE RBRACE WITH", line 1, characters 9-13: -Error: Syntax error: ")" expected +Error: Syntax error: ) expected File "implementation: LPAREN DOTOP LBRACE RBRACE WITH", line 1, characters 0-1: - This "(" might be unmatched + This ( might be unmatched File "implementation: LPAREN DOTOP LBRACE SEMI DOTDOT WITH", line 1, characters 12-16: Error: Syntax error File "implementation: LPAREN DOTOP LBRACE WITH", line 1, characters 7-11: Error: Syntax error File "implementation: LPAREN DOTOP LBRACKET RBRACKET WITH", line 1, characters 9-13: -Error: Syntax error: ")" expected +Error: Syntax error: ) expected File "implementation: LPAREN DOTOP LBRACKET RBRACKET WITH", line 1, characters 0-1: - This "(" might be unmatched + This ( might be unmatched File "implementation: LPAREN DOTOP LBRACKET SEMI DOTDOT WITH", line 1, characters 12-16: Error: Syntax error File "implementation: LPAREN DOTOP LBRACKET WITH", line 1, characters 7-11: Error: Syntax error File "implementation: LPAREN DOTOP LPAREN RPAREN WITH", line 1, characters 9-13: -Error: Syntax error: ")" expected +Error: Syntax error: ) expected File "implementation: LPAREN DOTOP LPAREN RPAREN WITH", line 1, characters 0-1: - This "(" might be unmatched + This ( might be unmatched File "implementation: LPAREN DOTOP LPAREN SEMI DOTDOT WITH", line 1, characters 12-16: Error: Syntax error File "implementation: LPAREN DOTOP LPAREN SEMI WITH", line 1, characters 9-13: @@ -1165,17 +1165,17 @@ Error: Syntax error File "implementation: LPAREN DOTOP WITH", line 1, characters 5-9: Error: Syntax error File "implementation: LPAREN LETOP WITH", line 1, characters 7-11: -Error: Syntax error: ")" expected +Error: Syntax error: ) expected File "implementation: LPAREN LETOP WITH", line 1, characters 0-1: - This "(" might be unmatched + This ( might be unmatched File "implementation: LPAREN MINUS WITH", line 1, characters 4-8: -Error: Syntax error: ")" expected +Error: Syntax error: ) expected File "implementation: LPAREN MINUS WITH", line 1, characters 0-1: - This "(" might be unmatched + This ( might be unmatched File "implementation: LPAREN MINUSDOT WITH", line 1, characters 5-9: -Error: Syntax error: ")" expected +Error: Syntax error: ) expected File "implementation: LPAREN MINUSDOT WITH", line 1, characters 0-1: - This "(" might be unmatched + This ( might be unmatched File "implementation: LPAREN MODULE LBRACKETAT AND RBRACKET FUNCTION", line 1, characters 18-26: Error: Syntax error File "implementation: LPAREN MODULE PERCENT AND WHILE", line 1, characters 15-20: @@ -1183,29 +1183,29 @@ Error: Syntax error File "implementation: LPAREN MODULE UIDENT COLON UIDENT VAL", line 1, characters 25-28: Error: Syntax error File "implementation: LPAREN MODULE UIDENT COLON WITH", line 1, characters 18-22: -Error: Syntax error: ")" expected +Error: Syntax error: ) expected File "implementation: LPAREN MODULE UIDENT COLON WITH", line 1, characters 0-1: - This "(" might be unmatched + This ( might be unmatched File "implementation: LPAREN MODULE UIDENT WITH", line 1, characters 16-20: Error: Syntax error File "implementation: LPAREN MODULE WITH", line 1, characters 9-13: -Error: Syntax error: "module-expr" expected. +Error: Syntax error: module-expr expected. File "implementation: LPAREN PLUS WITH", line 1, characters 4-8: -Error: Syntax error: ")" expected +Error: Syntax error: ) expected File "implementation: LPAREN PLUS WITH", line 1, characters 0-1: - This "(" might be unmatched + This ( might be unmatched File "implementation: LPAREN PLUSDOT WITH", line 1, characters 5-9: -Error: Syntax error: ")" expected +Error: Syntax error: ) expected File "implementation: LPAREN PLUSDOT WITH", line 1, characters 0-1: - This "(" might be unmatched + This ( might be unmatched File "implementation: LPAREN PREFIXOP WITH", line 1, characters 5-9: -Error: Syntax error: ")" expected +Error: Syntax error: ) expected File "implementation: LPAREN PREFIXOP WITH", line 1, characters 0-1: - This "(" might be unmatched + This ( might be unmatched File "implementation: LPAREN STAR WITH", line 1, characters 4-8: -Error: Syntax error: ")" expected +Error: Syntax error: ) expected File "implementation: LPAREN STAR WITH", line 1, characters 0-1: - This "(" might be unmatched + This ( might be unmatched File "implementation: LPAREN UIDENT COLON UNDERSCORE COLONGREATER UNDERSCORE WITH", line 1, characters 18-22: Error: Syntax error File "implementation: LPAREN UIDENT COLON UNDERSCORE COLONGREATER WITH", line 1, characters 16-20: @@ -1221,11 +1221,11 @@ Error: Syntax error File "implementation: LPAREN UIDENT COLONGREATER WITH", line 1, characters 12-16: Error: Syntax error File "implementation: LPAREN UIDENT WITH", line 1, characters 9-13: -Error: Syntax error: ")" expected +Error: Syntax error: ) expected File "implementation: LPAREN UIDENT WITH", line 1, characters 0-1: - This "(" might be unmatched + This ( might be unmatched File "implementation: LPAREN WITH", line 1, characters 2-6: -Error: Syntax error: "operator" expected. +Error: Syntax error: operator expected. File "implementation: MATCH LBRACKETAT AND RBRACKET AND", line 1, characters 15-18: Error: Syntax error File "implementation: MATCH PERCENT AND VIRTUAL", line 1, characters 12-19: @@ -1285,9 +1285,9 @@ Error: Syntax error File "implementation: MODULE UNDERSCORE COLON FUNCTOR WITH", line 1, characters 19-23: Error: Syntax error File "implementation: MODULE UNDERSCORE COLON LPAREN UIDENT VAL", line 1, characters 20-23: -Error: Syntax error: ")" expected +Error: Syntax error: ) expected File "implementation: MODULE UNDERSCORE COLON LPAREN UIDENT VAL", line 1, characters 11-12: - This "(" might be unmatched + This ( might be unmatched File "implementation: MODULE UNDERSCORE COLON LPAREN WITH", line 1, characters 13-17: Error: Syntax error File "implementation: MODULE UNDERSCORE COLON MODULE TYPE OF LBRACKETAT AND RBRACKET FUNCTION", line 1, characters 35-43: @@ -1301,17 +1301,17 @@ Error: Syntax error File "implementation: MODULE UNDERSCORE COLON MODULE WITH", line 1, characters 18-22: Error: Syntax error File "implementation: MODULE UNDERSCORE COLON SIG LBRACKETAT AND RBRACKET WHILE", line 1, characters 24-29: -Error: Syntax error: "end" expected +Error: Syntax error: end expected File "implementation: MODULE UNDERSCORE COLON SIG LBRACKETAT AND RBRACKET WHILE", line 1, characters 11-14: - This "sig" might be unmatched + This sig might be unmatched File "implementation: MODULE UNDERSCORE COLON SIG SEMISEMI RBRACKET", line 1, characters 18-19: -Error: Syntax error: "end" expected +Error: Syntax error: end expected File "implementation: MODULE UNDERSCORE COLON SIG SEMISEMI RBRACKET", line 1, characters 11-14: - This "sig" might be unmatched + This sig might be unmatched File "implementation: MODULE UNDERSCORE COLON SIG WITH", line 1, characters 15-19: -Error: Syntax error: "end" expected +Error: Syntax error: end expected File "implementation: MODULE UNDERSCORE COLON SIG WITH", line 1, characters 11-14: - This "sig" might be unmatched + This sig might be unmatched File "implementation: MODULE UNDERSCORE COLON UIDENT DOT UIDENT WHILE", line 1, characters 27-32: Error: Syntax error File "implementation: MODULE UNDERSCORE COLON UIDENT DOT WITH", line 1, characters 20-24: @@ -1363,7 +1363,7 @@ Error: Syntax error File "implementation: MODULE UNDERSCORE COLON UIDENT WITH WITH", line 1, characters 23-27: Error: Syntax error File "implementation: MODULE UNDERSCORE COLON WITH", line 1, characters 9-10: -Error: Syntax error: "=" expected. +Error: Syntax error: = expected. File "implementation: MODULE UNDERSCORE EQUAL QUOTED_STRING_EXPR IN", line 1, characters 27-29: Error: Syntax error File "implementation: MODULE UNDERSCORE EQUAL UIDENT WITH", line 1, characters 18-22: @@ -1523,9 +1523,9 @@ Error: Syntax error File "implementation: OBJECT CONSTRAINT UNDERSCORE AS WITH", line 1, characters 23-27: Error: Syntax error File "implementation: OBJECT CONSTRAINT UNDERSCORE EQUAL UNDERSCORE WITH", line 1, characters 24-28: -Error: Syntax error: "end" expected +Error: Syntax error: end expected File "implementation: OBJECT CONSTRAINT UNDERSCORE EQUAL UNDERSCORE WITH", line 1, characters 0-6: - This "object" might be unmatched + This object might be unmatched File "implementation: OBJECT CONSTRAINT UNDERSCORE EQUAL WITH", line 1, characters 22-26: Error: Syntax error File "implementation: OBJECT CONSTRAINT UNDERSCORE HASH WITH", line 1, characters 22-26: @@ -1551,21 +1551,21 @@ Error: Syntax error File "implementation: OBJECT INHERIT BANG LBRACKETAT AND RBRACKET WHILE", line 1, characters 26-31: Error: Syntax error File "implementation: OBJECT INHERIT BANG QUOTED_STRING_EXPR AS LIDENT WITH", line 1, characters 43-47: -Error: Syntax error: "end" expected +Error: Syntax error: end expected File "implementation: OBJECT INHERIT BANG QUOTED_STRING_EXPR AS LIDENT WITH", line 1, characters 0-6: - This "object" might be unmatched + This object might be unmatched File "implementation: OBJECT INHERIT BANG QUOTED_STRING_EXPR WITH", line 1, characters 33-37: -Error: Syntax error: "end" expected +Error: Syntax error: end expected File "implementation: OBJECT INHERIT BANG QUOTED_STRING_EXPR WITH", line 1, characters 0-6: - This "object" might be unmatched + This object might be unmatched File "implementation: OBJECT INHERIT BANG WITH", line 1, characters 17-21: Error: Syntax error File "implementation: OBJECT INHERIT FUN LBRACKETAT AND RBRACKET WHILE", line 1, characters 28-33: Error: Syntax error File "implementation: OBJECT INHERIT FUN UNDERSCORE MINUSGREATER QUOTED_STRING_EXPR WITH", line 1, characters 40-44: -Error: Syntax error: "end" expected +Error: Syntax error: end expected File "implementation: OBJECT INHERIT FUN UNDERSCORE MINUSGREATER QUOTED_STRING_EXPR WITH", line 1, characters 0-6: - This "object" might be unmatched + This object might be unmatched File "implementation: OBJECT INHERIT FUN UNDERSCORE MINUSGREATER WITH", line 1, characters 24-28: Error: Syntax error File "implementation: OBJECT INHERIT FUN UNDERSCORE WITH", line 1, characters 21-25: @@ -1585,9 +1585,9 @@ Error: Syntax error File "implementation: OBJECT INHERIT LBRACKETAT AND RBRACKET FOR", line 1, characters 24-27: Error: Syntax error File "implementation: OBJECT INHERIT LET CHAR EQUAL CHAR IN QUOTED_STRING_EXPR WITH", line 1, characters 48-52: -Error: Syntax error: "end" expected +Error: Syntax error: end expected File "implementation: OBJECT INHERIT LET CHAR EQUAL CHAR IN QUOTED_STRING_EXPR WITH", line 1, characters 0-6: - This "object" might be unmatched + This object might be unmatched File "implementation: OBJECT INHERIT LET CHAR EQUAL CHAR IN WITH", line 1, characters 32-36: Error: Syntax error File "implementation: OBJECT INHERIT LET CHAR EQUAL CHAR LBRACKETATAT AND RBRACKET VAL", line 1, characters 39-42: @@ -1597,9 +1597,9 @@ Error: Syntax error File "implementation: OBJECT INHERIT LET OPEN BANG LBRACKETAT AND RBRACKET WHILE", line 1, characters 35-40: Error: Syntax error File "implementation: OBJECT INHERIT LET OPEN BANG UIDENT IN QUOTED_STRING_EXPR WITH", line 1, characters 52-56: -Error: Syntax error: "end" expected +Error: Syntax error: end expected File "implementation: OBJECT INHERIT LET OPEN BANG UIDENT IN QUOTED_STRING_EXPR WITH", line 1, characters 0-6: - This "object" might be unmatched + This object might be unmatched File "implementation: OBJECT INHERIT LET OPEN BANG UIDENT IN WITH", line 1, characters 36-40: Error: Syntax error File "implementation: OBJECT INHERIT LET OPEN BANG UIDENT WITH", line 1, characters 33-37: @@ -1609,9 +1609,9 @@ Error: Syntax error File "implementation: OBJECT INHERIT LET OPEN LBRACKETAT AND RBRACKET WHILE", line 1, characters 33-38: Error: Syntax error File "implementation: OBJECT INHERIT LET OPEN UIDENT IN QUOTED_STRING_EXPR WITH", line 1, characters 50-54: -Error: Syntax error: "end" expected +Error: Syntax error: end expected File "implementation: OBJECT INHERIT LET OPEN UIDENT IN QUOTED_STRING_EXPR WITH", line 1, characters 0-6: - This "object" might be unmatched + This object might be unmatched File "implementation: OBJECT INHERIT LET OPEN UIDENT IN WITH", line 1, characters 34-38: Error: Syntax error File "implementation: OBJECT INHERIT LET OPEN UIDENT WITH", line 1, characters 31-35: @@ -1625,73 +1625,73 @@ Error: Syntax error File "implementation: OBJECT INHERIT LET WITH", line 1, characters 19-23: Error: Syntax error File "implementation: OBJECT INHERIT LIDENT UIDENT WITH", line 1, characters 29-33: -Error: Syntax error: "end" expected +Error: Syntax error: end expected File "implementation: OBJECT INHERIT LIDENT UIDENT WITH", line 1, characters 0-6: - This "object" might be unmatched + This object might be unmatched File "implementation: OBJECT INHERIT LIDENT WITH", line 1, characters 22-26: -Error: Syntax error: "end" expected +Error: Syntax error: end expected File "implementation: OBJECT INHERIT LIDENT WITH", line 1, characters 0-6: - This "object" might be unmatched + This object might be unmatched File "implementation: OBJECT INHERIT LPAREN QUOTED_STRING_EXPR COLON QUOTED_STRING_EXPR VAL", line 1, characters 51-54: -Error: Syntax error: ")" expected +Error: Syntax error: ) expected File "implementation: OBJECT INHERIT LPAREN QUOTED_STRING_EXPR COLON QUOTED_STRING_EXPR VAL", line 1, characters 15-16: - This "(" might be unmatched + This ( might be unmatched File "implementation: OBJECT INHERIT LPAREN QUOTED_STRING_EXPR COLON WITH", line 1, characters 35-39: Error: Syntax error File "implementation: OBJECT INHERIT LPAREN QUOTED_STRING_EXPR WITH", line 1, characters 33-37: -Error: Syntax error: ")" expected +Error: Syntax error: ) expected File "implementation: OBJECT INHERIT LPAREN QUOTED_STRING_EXPR WITH", line 1, characters 15-16: - This "(" might be unmatched + This ( might be unmatched File "implementation: OBJECT INHERIT LPAREN WITH", line 1, characters 17-21: Error: Syntax error File "implementation: OBJECT INHERIT OBJECT LBRACKETAT AND RBRACKET WHILE", line 1, characters 31-36: -Error: Syntax error: "end" expected +Error: Syntax error: end expected File "implementation: OBJECT INHERIT OBJECT LBRACKETAT AND RBRACKET WHILE", line 1, characters 15-21: - This "object" might be unmatched + This object might be unmatched File "implementation: OBJECT INHERIT OBJECT LPAREN CHAR RPAREN WITH", line 1, characters 30-34: -Error: Syntax error: "end" expected +Error: Syntax error: end expected File "implementation: OBJECT INHERIT OBJECT LPAREN CHAR RPAREN WITH", line 1, characters 15-21: - This "object" might be unmatched + This object might be unmatched File "implementation: OBJECT INHERIT OBJECT WITH", line 1, characters 22-26: -Error: Syntax error: "end" expected +Error: Syntax error: end expected File "implementation: OBJECT INHERIT OBJECT WITH", line 1, characters 15-21: - This "object" might be unmatched + This object might be unmatched File "implementation: OBJECT INHERIT QUOTED_STRING_EXPR AS LIDENT WITH", line 1, characters 41-45: -Error: Syntax error: "end" expected +Error: Syntax error: end expected File "implementation: OBJECT INHERIT QUOTED_STRING_EXPR AS LIDENT WITH", line 1, characters 0-6: - This "object" might be unmatched + This object might be unmatched File "implementation: OBJECT INHERIT QUOTED_STRING_EXPR AS WITH", line 1, characters 34-38: Error: Syntax error File "implementation: OBJECT INHERIT QUOTED_STRING_EXPR WITH", line 1, characters 31-35: -Error: Syntax error: "end" expected +Error: Syntax error: end expected File "implementation: OBJECT INHERIT QUOTED_STRING_EXPR WITH", line 1, characters 0-6: - This "object" might be unmatched + This object might be unmatched File "implementation: OBJECT INHERIT WITH", line 1, characters 15-19: Error: Syntax error File "implementation: OBJECT INITIALIZER LBRACKETAT AND RBRACKET AND", line 1, characters 28-31: Error: Syntax error File "implementation: OBJECT INITIALIZER UIDENT WITH", line 1, characters 26-30: -Error: Syntax error: "end" expected +Error: Syntax error: end expected File "implementation: OBJECT INITIALIZER UIDENT WITH", line 1, characters 0-6: - This "object" might be unmatched + This object might be unmatched File "implementation: OBJECT INITIALIZER WITH", line 1, characters 19-23: Error: Syntax error File "implementation: OBJECT LBRACKETAT AND RBRACKET CLASS", line 1, characters 16-21: -Error: Syntax error: "end" expected +Error: Syntax error: end expected File "implementation: OBJECT LBRACKETAT AND RBRACKET CLASS", line 1, characters 0-6: - This "object" might be unmatched + This object might be unmatched File "implementation: OBJECT LBRACKETATATAT AND RBRACKET WITH", line 1, characters 18-22: -Error: Syntax error: "end" expected +Error: Syntax error: end expected File "implementation: OBJECT LBRACKETATATAT AND RBRACKET WITH", line 1, characters 0-6: - This "object" might be unmatched + This object might be unmatched File "implementation: OBJECT LPAREN UNDERSCORE COLON UNDERSCORE WITH", line 1, characters 15-19: Error: Syntax error File "implementation: OBJECT LPAREN UNDERSCORE COLON WITH", line 1, characters 13-17: Error: Syntax error File "implementation: OBJECT LPAREN UNDERSCORE RPAREN COMMENT", line 1, characters 0-2: -Error: Syntax error: "end" expected +Error: Syntax error: end expected File "implementation: OBJECT LPAREN UNDERSCORE RPAREN COMMENT", line 1, characters 0-6: - This "object" might be unmatched + This object might be unmatched File "implementation: OBJECT LPAREN UNDERSCORE WITH", line 1, characters 11-15: Error: Syntax error File "implementation: OBJECT LPAREN WITH", line 1, characters 9-13: @@ -1747,9 +1747,9 @@ Error: Syntax error File "implementation: OBJECT METHOD LIDENT COLON WITH", line 1, characters 23-27: Error: Syntax error File "implementation: OBJECT METHOD LIDENT EQUAL CHAR WITH", line 1, characters 27-31: -Error: Syntax error: "end" expected +Error: Syntax error: end expected File "implementation: OBJECT METHOD LIDENT EQUAL CHAR WITH", line 1, characters 0-6: - This "object" might be unmatched + This object might be unmatched File "implementation: OBJECT METHOD LIDENT WITH", line 1, characters 21-25: Error: Syntax error File "implementation: OBJECT METHOD PRIVATE WITH", line 1, characters 22-26: @@ -1765,13 +1765,13 @@ Error: Syntax error File "implementation: OBJECT METHOD WITH", line 1, characters 14-18: Error: Syntax error File "implementation: OBJECT PERCENT AND COLON", line 1, characters 13-14: -Error: Syntax error: "end" expected +Error: Syntax error: end expected File "implementation: OBJECT PERCENT AND COLON", line 1, characters 0-6: - This "object" might be unmatched + This object might be unmatched File "implementation: OBJECT QUOTED_STRING_ITEM WITH", line 1, characters 24-28: -Error: Syntax error: "end" expected +Error: Syntax error: end expected File "implementation: OBJECT QUOTED_STRING_ITEM WITH", line 1, characters 0-6: - This "object" might be unmatched + This object might be unmatched File "implementation: OBJECT VAL BANG LBRACKETAT AND RBRACKET WHILE", line 1, characters 22-27: Error: Syntax error File "implementation: OBJECT VAL BANG LIDENT COLONGREATER LIDENT EQUAL WITH", line 1, characters 32-36: @@ -1793,9 +1793,9 @@ Error: Syntax error File "implementation: OBJECT VAL LIDENT COLONGREATER LIDENT SEMI", line 1, characters 28-29: Error: Syntax error File "implementation: OBJECT VAL LIDENT EQUAL CHAR WITH", line 1, characters 24-28: -Error: Syntax error: "end" expected +Error: Syntax error: end expected File "implementation: OBJECT VAL LIDENT EQUAL CHAR WITH", line 1, characters 0-6: - This "object" might be unmatched + This object might be unmatched File "implementation: OBJECT VAL LIDENT EQUAL WITH", line 1, characters 20-24: Error: Syntax error File "implementation: OBJECT VAL LIDENT WITH", line 1, characters 18-22: @@ -1803,9 +1803,9 @@ Error: Syntax error File "implementation: OBJECT VAL MUTABLE WITH", line 1, characters 19-23: Error: Syntax error File "implementation: OBJECT VAL VIRTUAL LIDENT COLON UNDERSCORE WITH", line 1, characters 30-34: -Error: Syntax error: "end" expected +Error: Syntax error: end expected File "implementation: OBJECT VAL VIRTUAL LIDENT COLON UNDERSCORE WITH", line 1, characters 0-6: - This "object" might be unmatched + This object might be unmatched File "implementation: OBJECT VAL VIRTUAL LIDENT COLON WITH", line 1, characters 28-32: Error: Syntax error File "implementation: OBJECT VAL VIRTUAL LIDENT WITH", line 1, characters 26-30: @@ -1817,9 +1817,9 @@ Error: Syntax error File "implementation: OBJECT VAL WITH", line 1, characters 11-15: Error: Syntax error File "implementation: OBJECT WITH", line 1, characters 7-11: -Error: Syntax error: "end" expected +Error: Syntax error: end expected File "implementation: OBJECT WITH", line 1, characters 0-6: - This "object" might be unmatched + This object might be unmatched File "implementation: OPEN BANG LBRACKETAT AND RBRACKET FUNCTION", line 1, characters 16-24: Error: Syntax error File "implementation: OPEN BANG PERCENT AND WHILE", line 1, characters 13-18: @@ -1843,15 +1843,15 @@ Error: Syntax error File "implementation: OPEN LBRACKETAT AND RBRACKET WITH", line 1, characters 14-18: Error: Syntax error File "implementation: OPEN LPAREN UIDENT COLON UIDENT VAL", line 1, characters 23-26: -Error: Syntax error: ")" expected +Error: Syntax error: ) expected File "implementation: OPEN LPAREN UIDENT COLON UIDENT VAL", line 1, characters 5-6: - This "(" might be unmatched + This ( might be unmatched File "implementation: OPEN LPAREN UIDENT COLON WITH", line 1, characters 16-20: Error: Syntax error File "implementation: OPEN LPAREN UIDENT WITH", line 1, characters 14-18: -Error: Syntax error: ")" expected +Error: Syntax error: ) expected File "implementation: OPEN LPAREN UIDENT WITH", line 1, characters 5-6: - This "(" might be unmatched + This ( might be unmatched File "implementation: OPEN LPAREN VAL LBRACKETAT AND RBRACKET VIRTUAL", line 1, characters 20-27: Error: Syntax error File "implementation: OPEN LPAREN VAL UIDENT COLON UIDENT COLONGREATER UIDENT VAL", line 1, characters 37-40: @@ -1861,19 +1861,19 @@ Error: Syntax error File "implementation: OPEN LPAREN VAL UIDENT COLON UIDENT VAL", line 1, characters 27-30: Error: Syntax error File "implementation: OPEN LPAREN VAL UIDENT COLON WITH", line 1, characters 20-24: -Error: Syntax error: ")" expected +Error: Syntax error: ) expected File "implementation: OPEN LPAREN VAL UIDENT COLON WITH", line 1, characters 5-6: - This "(" might be unmatched + This ( might be unmatched File "implementation: OPEN LPAREN VAL UIDENT COLONGREATER UIDENT VAL", line 1, characters 28-31: Error: Syntax error File "implementation: OPEN LPAREN VAL UIDENT COLONGREATER WITH", line 1, characters 21-25: -Error: Syntax error: ")" expected +Error: Syntax error: ) expected File "implementation: OPEN LPAREN VAL UIDENT COLONGREATER WITH", line 1, characters 5-6: - This "(" might be unmatched + This ( might be unmatched File "implementation: OPEN LPAREN VAL UIDENT WITH", line 1, characters 18-22: -Error: Syntax error: ")" expected +Error: Syntax error: ) expected File "implementation: OPEN LPAREN VAL UIDENT WITH", line 1, characters 5-6: - This "(" might be unmatched + This ( might be unmatched File "implementation: OPEN LPAREN VAL WITH", line 1, characters 11-15: Error: Syntax error File "implementation: OPEN LPAREN WITH", line 1, characters 7-11: @@ -1883,17 +1883,17 @@ Error: Syntax error File "implementation: OPEN PERCENT UNDERSCORE", line 1, characters 7-8: Error: Syntax error File "implementation: OPEN STRUCT LBRACKETAT AND RBRACKET AND", line 1, characters 21-24: -Error: Syntax error: "end" expected +Error: Syntax error: end expected File "implementation: OPEN STRUCT LBRACKETAT AND RBRACKET AND", line 1, characters 5-11: - This "struct" might be unmatched + This struct might be unmatched File "implementation: OPEN STRUCT UIDENT RBRACKET", line 1, characters 19-20: -Error: Syntax error: "end" expected +Error: Syntax error: end expected File "implementation: OPEN STRUCT UIDENT RBRACKET", line 1, characters 5-11: - This "struct" might be unmatched + This struct might be unmatched File "implementation: OPEN STRUCT WITH", line 1, characters 12-16: -Error: Syntax error: "end" expected +Error: Syntax error: end expected File "implementation: OPEN STRUCT WITH", line 1, characters 5-11: - This "struct" might be unmatched + This struct might be unmatched File "implementation: OPEN UIDENT DOT WITH", line 1, characters 14-18: Error: Syntax error File "implementation: OPEN UIDENT LPAREN WITH", line 1, characters 14-18: @@ -1939,23 +1939,24 @@ Error: Syntax error File "implementation: TRUE DOT LBRACE UIDENT RBRACE WHILE", line 1, characters 18-23: Error: Syntax error File "implementation: TRUE DOT LBRACE UIDENT WITH", line 1, characters 16-20: -Error: Syntax error: "}" expected +Error: Syntax error: } expected File "implementation: TRUE DOT LBRACE UIDENT WITH", line 1, characters 7-8: - This "{" might be unmatched + This { might be unmatched File "implementation: TRUE DOT LBRACE WITH", line 1, characters 9-13: Error: Syntax error File "implementation: TRUE DOT LBRACKET UIDENT RBRACKET LESSMINUS OBJECT END WHILE", line 1, characters 0-31: -Error: Syntax error: strings are immutable, there is no assignment syntax for them. +Error: Syntax error: strings are immutable, there is no assignment syntax for + them. Hint: Mutable sequences of bytes are available in the Bytes module. -Hint: Did you mean to use "Bytes.set"? +Hint: Did you mean to use Bytes.set? File "implementation: TRUE DOT LBRACKET UIDENT RBRACKET LESSMINUS WITH", line 1, characters 21-25: Error: Syntax error File "implementation: TRUE DOT LBRACKET UIDENT RBRACKET WHILE", line 1, characters 18-23: Error: Syntax error File "implementation: TRUE DOT LBRACKET UIDENT WITH", line 1, characters 16-20: -Error: Syntax error: "]" expected +Error: Syntax error: ] expected File "implementation: TRUE DOT LBRACKET UIDENT WITH", line 1, characters 7-8: - This "[" might be unmatched + This [ might be unmatched File "implementation: TRUE DOT LBRACKET WITH", line 1, characters 9-13: Error: Syntax error File "implementation: TRUE DOT LIDENT LESSMINUS OBJECT END WHILE", line 1, characters 28-33: @@ -1971,9 +1972,9 @@ Error: Syntax error File "implementation: TRUE DOT LPAREN UIDENT RPAREN WHILE", line 1, characters 18-23: Error: Syntax error File "implementation: TRUE DOT LPAREN UIDENT WITH", line 1, characters 16-20: -Error: Syntax error: ")" expected +Error: Syntax error: ) expected File "implementation: TRUE DOT LPAREN UIDENT WITH", line 1, characters 7-8: - This "(" might be unmatched + This ( might be unmatched File "implementation: TRUE DOT LPAREN WITH", line 1, characters 9-13: Error: Syntax error File "implementation: TRUE DOT UIDENT DOTOP LBRACE UIDENT RBRACE LESSMINUS OBJECT END WHILE", line 1, characters 42-47: @@ -1983,9 +1984,9 @@ Error: Syntax error File "implementation: TRUE DOT UIDENT DOTOP LBRACE UIDENT RBRACE WHILE", line 1, characters 28-33: Error: Syntax error File "implementation: TRUE DOT UIDENT DOTOP LBRACE UIDENT RPAREN", line 1, characters 26-27: -Error: Syntax error: "}" expected +Error: Syntax error: } expected File "implementation: TRUE DOT UIDENT DOTOP LBRACE UIDENT RPAREN", line 1, characters 17-18: - This "{" might be unmatched + This { might be unmatched File "implementation: TRUE DOT UIDENT DOTOP LBRACE WITH", line 1, characters 19-23: Error: Syntax error File "implementation: TRUE DOT UIDENT DOTOP LBRACKET UIDENT RBRACKET LESSMINUS OBJECT END WHILE", line 1, characters 42-47: @@ -1995,15 +1996,15 @@ Error: Syntax error File "implementation: TRUE DOT UIDENT DOTOP LBRACKET UIDENT RBRACKET WHILE", line 1, characters 28-33: Error: Syntax error File "implementation: TRUE DOT UIDENT DOTOP LBRACKET UIDENT RPAREN", line 1, characters 26-27: -Error: Syntax error: "]" expected +Error: Syntax error: ] expected File "implementation: TRUE DOT UIDENT DOTOP LBRACKET UIDENT RPAREN", line 1, characters 17-18: - This "[" might be unmatched + This [ might be unmatched File "implementation: TRUE DOT UIDENT DOTOP LBRACKET WITH", line 1, characters 19-23: Error: Syntax error File "implementation: TRUE DOT UIDENT DOTOP LPAREN UIDENT RBRACKET", line 1, characters 26-27: -Error: Syntax error: ")" expected +Error: Syntax error: ) expected File "implementation: TRUE DOT UIDENT DOTOP LPAREN UIDENT RBRACKET", line 1, characters 17-18: - This "(" might be unmatched + This ( might be unmatched File "implementation: TRUE DOT UIDENT DOTOP LPAREN UIDENT RPAREN LESSMINUS OBJECT END WHILE", line 1, characters 42-47: Error: Syntax error File "implementation: TRUE DOT UIDENT DOTOP LPAREN UIDENT RPAREN LESSMINUS WITH", line 1, characters 31-35: @@ -2153,7 +2154,7 @@ Error: Syntax error File "implementation: TYPE UIDENT LPAREN UIDENT WITH", line 1, characters 21-25: Error: Syntax error File "implementation: TYPE UIDENT LPAREN WITH", line 1, characters 14-18: -Error: Syntax error: "module path" expected. +Error: Syntax error: module path expected. File "implementation: TYPE UIDENT WITH", line 1, characters 12-16: Error: Syntax error File "implementation: TYPE UNDERSCORE LETOP", line 1, characters 7-11: @@ -2195,15 +2196,15 @@ Error: Syntax error File "implementation: UIDENT DOT LBRACELESS WITH", line 1, characters 12-16: Error: Syntax error File "implementation: UIDENT DOT LBRACKET UIDENT RPAREN", line 1, characters 18-19: -Error: Syntax error: "]" expected +Error: Syntax error: ] expected File "implementation: UIDENT DOT LBRACKET UIDENT RPAREN", line 1, characters 9-10: - This "[" might be unmatched + This [ might be unmatched File "implementation: UIDENT DOT LBRACKET WITH", line 1, characters 11-15: Error: Syntax error File "implementation: UIDENT DOT LBRACKETBAR UIDENT RPAREN", line 1, characters 19-20: -Error: Syntax error: "|]" expected +Error: Syntax error: |] expected File "implementation: UIDENT DOT LBRACKETBAR UIDENT RPAREN", line 1, characters 9-11: - This "[|" might be unmatched + This [| might be unmatched File "implementation: UIDENT DOT LBRACKETBAR WITH", line 1, characters 12-16: Error: Syntax error File "implementation: UIDENT DOT LPAREN COLONCOLON WITH", line 1, characters 14-18: @@ -2215,19 +2216,19 @@ Error: Syntax error File "implementation: UIDENT DOT LPAREN MODULE UIDENT COLON UIDENT VAL", line 1, characters 34-37: Error: Syntax error File "implementation: UIDENT DOT LPAREN MODULE UIDENT COLON WITH", line 1, characters 27-31: -Error: Syntax error: ")" expected +Error: Syntax error: ) expected File "implementation: UIDENT DOT LPAREN MODULE UIDENT COLON WITH", line 1, characters 9-10: - This "(" might be unmatched + This ( might be unmatched File "implementation: UIDENT DOT LPAREN MODULE UIDENT WITH", line 1, characters 25-29: Error: Syntax error File "implementation: UIDENT DOT LPAREN MODULE WITH", line 1, characters 18-22: -Error: Syntax error: "module-expr" expected. +Error: Syntax error: module-expr expected. File "implementation: UIDENT DOT LPAREN UIDENT WITH", line 1, characters 18-22: -Error: Syntax error: ")" expected +Error: Syntax error: ) expected File "implementation: UIDENT DOT LPAREN UIDENT WITH", line 1, characters 9-10: - This "(" might be unmatched + This ( might be unmatched File "implementation: UIDENT DOT LPAREN WITH", line 1, characters 11-15: -Error: Syntax error: "operator" expected. +Error: Syntax error: operator expected. File "implementation: UIDENT DOT WITH", line 1, characters 9-13: Error: Syntax error File "implementation: UIDENT DOTOP LBRACE UIDENT RBRACE LESSMINUS OBJECT END WHILE", line 1, characters 35-40: @@ -2237,13 +2238,13 @@ Error: Syntax error File "implementation: UIDENT DOTOP LBRACE UIDENT RBRACE WHILE", line 1, characters 21-26: Error: Syntax error File "implementation: UIDENT DOTOP LBRACE UIDENT SEMI RPAREN", line 1, characters 21-22: -Error: Syntax error: "}" expected +Error: Syntax error: } expected File "implementation: UIDENT DOTOP LBRACE UIDENT SEMI RPAREN", line 1, characters 10-11: - This "{" might be unmatched + This { might be unmatched File "implementation: UIDENT DOTOP LBRACE UIDENT WITH", line 1, characters 19-23: -Error: Syntax error: "}" expected +Error: Syntax error: } expected File "implementation: UIDENT DOTOP LBRACE UIDENT WITH", line 1, characters 10-11: - This "{" might be unmatched + This { might be unmatched File "implementation: UIDENT DOTOP LBRACE WITH", line 1, characters 12-16: Error: Syntax error File "implementation: UIDENT DOTOP LBRACKET UIDENT RBRACKET LESSMINUS OBJECT END WHILE", line 1, characters 35-40: @@ -2253,15 +2254,15 @@ Error: Syntax error File "implementation: UIDENT DOTOP LBRACKET UIDENT RBRACKET WHILE", line 1, characters 21-26: Error: Syntax error File "implementation: UIDENT DOTOP LBRACKET UIDENT RPAREN", line 1, characters 19-20: -Error: Syntax error: "]" expected +Error: Syntax error: ] expected File "implementation: UIDENT DOTOP LBRACKET UIDENT RPAREN", line 1, characters 10-11: - This "[" might be unmatched + This [ might be unmatched File "implementation: UIDENT DOTOP LBRACKET WITH", line 1, characters 12-16: Error: Syntax error File "implementation: UIDENT DOTOP LPAREN UIDENT RBRACKET", line 1, characters 19-20: -Error: Syntax error: ")" expected +Error: Syntax error: ) expected File "implementation: UIDENT DOTOP LPAREN UIDENT RBRACKET", line 1, characters 10-11: - This "(" might be unmatched + This ( might be unmatched File "implementation: UIDENT DOTOP LPAREN UIDENT RPAREN LESSMINUS OBJECT END WHILE", line 1, characters 35-40: Error: Syntax error File "implementation: UIDENT DOTOP LPAREN UIDENT RPAREN LESSMINUS WITH", line 1, characters 24-28: @@ -2393,9 +2394,9 @@ Error: Syntax error File "implementation: WHILE PERCENT WITH VIRTUAL", line 1, characters 13-20: Error: Syntax error File "implementation: WHILE UIDENT DO UIDENT WITH", line 1, characters 16-22: -Error: Syntax error: "done" expected +Error: Syntax error: done expected File "implementation: WHILE UIDENT DO UIDENT WITH", line 1, characters 13-15: - This "do" might be unmatched + This do might be unmatched File "implementation: WHILE UIDENT DO WITH", line 1, characters 16-20: Error: Syntax error File "implementation: WHILE UIDENT WITH", line 1, characters 13-17: diff --git a/testsuite/tests/hidden_includes/cant_reference_hidden.ocamlc.reference b/testsuite/tests/hidden_includes/cant_reference_hidden.ocamlc.reference index caae6f73..4e1a7beb 100644 --- a/testsuite/tests/hidden_includes/cant_reference_hidden.ocamlc.reference +++ b/testsuite/tests/hidden_includes/cant_reference_hidden.ocamlc.reference @@ -1,4 +1,4 @@ -File "libc/c3.ml", line 1, characters 8-11: +File "libc/c3.ml", line 1, characters 8-9: 1 | let x = A.x + 1 - ^^^ -Error: Unbound module "A" + ^ +Error: Unbound module A diff --git a/testsuite/tests/hidden_includes/hidden_stays_hidden.ocamlc.reference b/testsuite/tests/hidden_includes/hidden_stays_hidden.ocamlc.reference index 8ba62b87..59d6b224 100644 --- a/testsuite/tests/hidden_includes/hidden_stays_hidden.ocamlc.reference +++ b/testsuite/tests/hidden_includes/hidden_stays_hidden.ocamlc.reference @@ -1,4 +1,4 @@ -File "libc/c4.ml", line 2, characters 8-11: +File "libc/c4.ml", line 2, characters 8-9: 2 | let y = A.x + 1 - ^^^ -Error: Unbound module "A" + ^ +Error: Unbound module A diff --git a/testsuite/tests/hidden_includes/not_included.ocamlc.reference b/testsuite/tests/hidden_includes/not_included.ocamlc.reference index 66c0b213..86296a0b 100644 --- a/testsuite/tests/hidden_includes/not_included.ocamlc.reference +++ b/testsuite/tests/hidden_includes/not_included.ocamlc.reference @@ -1,6 +1,6 @@ File "libc/c1.ml", line 1, characters 8-11: 1 | let x = B.x + 1 ^^^ -Error: The value "B.x" has type "A.t" but an expression was expected of type "int" - Type "A.t" is abstract because no corresponding cmi file was found +Error: The value B.x has type A.t but an expression was expected of type int + Type A.t is abstract because no corresponding cmi file was found in path. diff --git a/testsuite/tests/hidden_includes/test.ml b/testsuite/tests/hidden_includes/test.ml index 4ea735df..f2ad8474 100644 --- a/testsuite/tests/hidden_includes/test.ml +++ b/testsuite/tests/hidden_includes/test.ml @@ -93,7 +93,7 @@ ocamlc.byte; ocamlc.byte; } { - not-windows; + not-target-windows; flags = "-H liba -I liba_alt -I libb -nocwd"; module = "libc/c1.ml"; setup-ocamlc.byte-build-env; @@ -104,7 +104,7 @@ ocamlc.byte; check-ocamlc.byte-output; } { - not-windows; + not-target-windows; flags = "-I liba_alt -H liba -I libb -nocwd"; module = "libc/c1.ml"; setup-ocamlc.byte-build-env; @@ -117,7 +117,7 @@ ocamlc.byte; (* The next two tests show that earlier -Hs take priority over later -Hs *) { - not-windows; + not-target-windows; flags = "-H liba_alt -H liba -I libb -nocwd"; module = "libc/c1.ml"; setup-ocamlc.byte-build-env; diff --git a/testsuite/tests/hidden_includes/wrong_include_order.ocamlc.reference b/testsuite/tests/hidden_includes/wrong_include_order.ocamlc.reference index 6863dffd..cb4538eb 100644 --- a/testsuite/tests/hidden_includes/wrong_include_order.ocamlc.reference +++ b/testsuite/tests/hidden_includes/wrong_include_order.ocamlc.reference @@ -1,3 +1,3 @@ File "libc/c1.ml", line 1: -Error: The files "libb/b.cmi" and "liba_alt/a.cmi" make inconsistent assumptions - over interface "A" +Error: The files libb/b.cmi and liba_alt/a.cmi make inconsistent assumptions + over interface A diff --git a/testsuite/tests/lazy/lazy10.ml b/testsuite/tests/lazy/lazy10.ml new file mode 100644 index 00000000..c30bad31 --- /dev/null +++ b/testsuite/tests/lazy/lazy10.ml @@ -0,0 +1,21 @@ +(* TEST *) + +(* This test checks that we're not propagating the approximation of + a lazy block down the path where it has been shortcut *) + +let[@inline never][@local never] run () = + let l = lazy (Sys.opaque_identity None) in + let check () = + match Lazy.force l with + | None -> print_endline "Ok" + | Some _ -> print_endline "Error" + in + (* First force the lazy value *) + check (); + (* Then trigger a minor GC to shortcut the evaluated lazy value *) + Gc.minor (); + (* Now check that the code above can cope with [l] being an immediate + instead of a pointer *) + check () + +let () = run () diff --git a/testsuite/tests/lazy/lazy10.reference b/testsuite/tests/lazy/lazy10.reference new file mode 100644 index 00000000..541dab48 --- /dev/null +++ b/testsuite/tests/lazy/lazy10.reference @@ -0,0 +1,2 @@ +Ok +Ok diff --git a/testsuite/tests/lazy/lazy9.ml b/testsuite/tests/lazy/lazy9.ml new file mode 100644 index 00000000..40b28b3b --- /dev/null +++ b/testsuite/tests/lazy/lazy9.ml @@ -0,0 +1,36 @@ +(* TEST *) + +(* In some situations, these code snippets would cause the + let-rec size computation to raise a fatal error. *) + +(* *) +type t = + | C of t Lazy.t Lazy.t + +let rec x = + let y = (lazy (C x)) in + lazy y + +(* *) +let todo () : float = + let rec l = + let x = lazy (Lazy.force (Lazy.force l)) in + lazy x + in + Lazy.force (Lazy.force l) + +(* *) +let () = + begin match Lazy.force (Lazy.force x) with + | C _ -> () + end; + begin match todo () with + | f -> + (* trying to get the actual value of the float will cause a segfault *) + let f' = f +. 1. in + print_float f'; + print_newline () + | exception CamlinternalLazy.Undefined -> + (* this is what should happen if `todo` is compiled correctly *) + () + end; diff --git a/testsuite/tests/lazy/lazy9.reference b/testsuite/tests/lazy/lazy9.reference new file mode 100644 index 00000000..e69de29b diff --git a/testsuite/tests/let-syntax/let_syntax.ml b/testsuite/tests/let-syntax/let_syntax.ml index 875455ee..7d0cfb2b 100644 --- a/testsuite/tests/let-syntax/let_syntax.ml +++ b/testsuite/tests/let-syntax/let_syntax.ml @@ -217,7 +217,7 @@ Line 3, characters 13-14: ^ Error: The constant "1" has type "int" but an expression was expected of type "float" - Hint: Did you mean "1."? +Hint: Did you mean "1."? |}];; module Ill_typed_3 = struct @@ -587,7 +587,8 @@ val let_not_principal : unit = () Line 3, characters 9-10: 3 | let+ A = A.A in ^ -Warning 18 [not-principal]: this type-based constructor disambiguation is not principal. +Warning 18 [not-principal]: this type-based constructor disambiguation is not + principal. val let_not_principal : unit = () |}];; @@ -617,7 +618,8 @@ val and_not_principal : A.t -> A.t -> unit = Line 5, characters 11-12: 5 | and+ A = y in ^ -Warning 18 [not-principal]: this type-based constructor disambiguation is not principal. +Warning 18 [not-principal]: this type-based constructor disambiguation is not + principal. val and_not_principal : A.t -> A.t -> unit = |}];; @@ -720,8 +722,9 @@ val bad_location : 'a GADT_ordering.is_point -> 'a -> int = Line 4, characters 11-19: 4 | let+ Is_point = is_point ^^^^^^^^ -Warning 18 [not-principal]: typing this pattern requires considering GADT_ordering.point and a as equal. -But the knowledge of these types is not principal. +Warning 18 [not-principal]: typing this pattern requires considering + "GADT_ordering.point" and "a" as equal. But the knowledge of these types is not + principal. Line 5, characters 11-19: 5 | and+ { x; y } = a in diff --git a/testsuite/tests/letrec-check/pr7215.ocaml.reference b/testsuite/tests/letrec-check/pr7215.ocaml.reference index 2ca260ae..af664134 100644 --- a/testsuite/tests/letrec-check/pr7215.ocaml.reference +++ b/testsuite/tests/letrec-check/pr7215.ocaml.reference @@ -3,5 +3,5 @@ val cast : ('a, 'b) eq -> 'a -> 'b = Line 3, characters 30-55: 3 | let rec (p : (int, a) eq) = match p with Refl -> Refl in ^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: This kind of expression is not allowed as right-hand side of "let rec" +Error: This kind of expression is not allowed as right-hand side of let rec diff --git a/testsuite/tests/letrec-check/pr7231.ocaml.reference b/testsuite/tests/letrec-check/pr7231.ocaml.reference index f7e9e7dd..0d70942c 100644 --- a/testsuite/tests/letrec-check/pr7231.ocaml.reference +++ b/testsuite/tests/letrec-check/pr7231.ocaml.reference @@ -6,5 +6,5 @@ Warning 20 [ignored-extra-argument]: this argument will not be used by the funct Line 5, characters 12-52: 5 | let rec r = let rec x () = r and y () = x () in y () in r "oops";; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: This kind of expression is not allowed as right-hand side of "let rec" +Error: This kind of expression is not allowed as right-hand side of let rec diff --git a/testsuite/tests/letrec-check/pr7706.ocaml.reference b/testsuite/tests/letrec-check/pr7706.ocaml.reference index 2bc56f51..f00bf3e3 100644 --- a/testsuite/tests/letrec-check/pr7706.ocaml.reference +++ b/testsuite/tests/letrec-check/pr7706.ocaml.reference @@ -1,9 +1,9 @@ Lines 5-6, characters 2-3: 5 | ..let y = if false then (fun z -> 1) else (fun z -> x 4 + 1) in 6 | y.. -Error: This kind of expression is not allowed as right-hand side of "let rec" +Error: This kind of expression is not allowed as right-hand side of let rec Line 2, characters 17-18: 2 | let () = ignore (x 42);; ^ -Error: Unbound value "x" +Error: Unbound value x diff --git a/testsuite/tests/letrec-compilation/lazy_.ml b/testsuite/tests/letrec-compilation/lazy_.ml index 6929d81e..dc82e37d 100644 --- a/testsuite/tests/letrec-compilation/lazy_.ml +++ b/testsuite/tests/letrec-compilation/lazy_.ml @@ -1,5 +1,19 @@ (* TEST *) -let rec c = lazy (0 + d) and d = 3;; +let rec c = lazy (0 + d) and d = 42;; -let () = Printf.printf "%d\n" (Lazy.force c) +let () = + Printf.printf "Cyclic thunk: %d\n" (Lazy.force c) + +(* regression test for #13930 *) +let f x = + let rec l = + let v = lazy x in + Gc.minor (); + v + in + l + +let () = + Printf.printf "Forward shortcut regression: %d\n" + (Lazy.force (f 84)) diff --git a/testsuite/tests/letrec-compilation/lazy_.reference b/testsuite/tests/letrec-compilation/lazy_.reference index 00750edc..7c6c8d62 100644 --- a/testsuite/tests/letrec-compilation/lazy_.reference +++ b/testsuite/tests/letrec-compilation/lazy_.reference @@ -1 +1,2 @@ -3 +Cyclic thunk: 42 +Forward shortcut regression: 84 diff --git a/testsuite/tests/letrec-compilation/nested2.ml b/testsuite/tests/letrec-compilation/nested2.ml new file mode 100644 index 00000000..aa1d789c --- /dev/null +++ b/testsuite/tests/letrec-compilation/nested2.ml @@ -0,0 +1,8 @@ +(* TEST *) + +(* #13931 *) + +let f a = + let rec x = + let rec y = Some a in y + in x diff --git a/testsuite/tests/lexing/escape.ocaml.reference b/testsuite/tests/lexing/escape.ocaml.reference index fe53e3d9..5197fcba 100644 --- a/testsuite/tests/lexing/escape.ocaml.reference +++ b/testsuite/tests/lexing/escape.ocaml.reference @@ -2,9 +2,9 @@ Line 7, characters 15-17: 7 | let invalid = "\99" ;; ^^ Warning 14 [illegal-backslash]: illegal backslash escape in string. -Hint: Single backslashes \ are reserved for escape sequences -(\n, \r, ...). Did you check the list of OCaml escape sequences? -To get a backslash character, escape it with a second backslash: \\. + Hint: Single backslashes \ are reserved for escape sequences (\n, \r, ...). + Did you check the list of OCaml escape sequences? + To get a backslash character, escape it with a second backslash: \\. val invalid : string = "\\99" Line 1, characters 15-19: @@ -19,18 +19,18 @@ Line 1, characters 15-17: 1 | let invalid = "\o77" ;; ^^ Warning 14 [illegal-backslash]: illegal backslash escape in string. -Hint: Single backslashes \ are reserved for escape sequences -(\n, \r, ...). Did you check the list of OCaml escape sequences? -To get a backslash character, escape it with a second backslash: \\. + Hint: Single backslashes \ are reserved for escape sequences (\n, \r, ...). + Did you check the list of OCaml escape sequences? + To get a backslash character, escape it with a second backslash: \\. val invalid : string = "\\o77" Line 1, characters 15-17: 1 | let invalid = "\o99" ;; ^^ Warning 14 [illegal-backslash]: illegal backslash escape in string. -Hint: Single backslashes \ are reserved for escape sequences -(\n, \r, ...). Did you check the list of OCaml escape sequences? -To get a backslash character, escape it with a second backslash: \\. + Hint: Single backslashes \ are reserved for escape sequences (\n, \r, ...). + Did you check the list of OCaml escape sequences? + To get a backslash character, escape it with a second backslash: \\. val invalid : string = "\\o99" diff --git a/testsuite/tests/lexing/uchar_esc.ocaml.reference b/testsuite/tests/lexing/uchar_esc.ocaml.reference index c4133193..14881a0d 100644 --- a/testsuite/tests/lexing/uchar_esc.ocaml.reference +++ b/testsuite/tests/lexing/uchar_esc.ocaml.reference @@ -26,18 +26,18 @@ Line 1, characters 21-23: 1 | let no_hex_digits = "\u{}" ;; ^^ Warning 14 [illegal-backslash]: illegal backslash escape in string. -Hint: Single backslashes \ are reserved for escape sequences -(\n, \r, ...). Did you check the list of OCaml escape sequences? -To get a backslash character, escape it with a second backslash: \\. + Hint: Single backslashes \ are reserved for escape sequences (\n, \r, ...). + Did you check the list of OCaml escape sequences? + To get a backslash character, escape it with a second backslash: \\. val no_hex_digits : string = "\\u{}" Line 1, characters 25-27: 1 | let illegal_hex_digit = "\u{u}" ;; ^^ Warning 14 [illegal-backslash]: illegal backslash escape in string. -Hint: Single backslashes \ are reserved for escape sequences -(\n, \r, ...). Did you check the list of OCaml escape sequences? -To get a backslash character, escape it with a second backslash: \\. + Hint: Single backslashes \ are reserved for escape sequences (\n, \r, ...). + Did you check the list of OCaml escape sequences? + To get a backslash character, escape it with a second backslash: \\. val illegal_hex_digit : string = "\\u{u}" diff --git a/testsuite/tests/lib-array/test_array.ml b/testsuite/tests/lib-array/test_array.ml index 09817baa..694111e3 100644 --- a/testsuite/tests/lib-array/test_array.ml +++ b/testsuite/tests/lib-array/test_array.ml @@ -195,3 +195,47 @@ let a = Array.init_matrix 2 3 (fun i j -> 10 * i + j);; [%%expect{| val a : int array array = [|[|0; 1; 2|]; [|10; 11; 12|]|] |}] + +let () = (* Array.equal *) + let test a b ~eq = + assert (Array.equal Int.equal a b = eq); + assert (Array.equal Int.equal b a = eq) + in + test [||] [||] ~eq:true; + test [||] [|1|] ~eq:false; + test [|1;2|] [|1;2|] ~eq:true; + test [|1;2|] [|1;2;3|] ~eq:false; + test [|1;2|] [|1;2;3|] ~eq:false; + () +[%%expect{| +|}] + +let () = (* Array.compare *) + let test a b ~cmp = + assert (Array.compare Int.compare a b = cmp); + assert (Array.compare Int.compare b a = -1 * cmp); + in + test [||] [||] ~cmp:0; + test [||] [|0;1|] ~cmp:~-1; + test [|0|] [||] ~cmp:1; + test [|0|] [|0;1|] ~cmp:~-1; + test [|0;1|] [|0;1|] ~cmp:0; + test [|0;1|] [|0;2|] ~cmp:~-1; + test [|0;1|] [|0;0|] ~cmp:1; + test [|0;1|] [|0;1|] ~cmp:0; + test [|1;0|] [|0;1|] ~cmp:1; + test [|0;1;2|] [|0;1;2|] ~cmp:0; + test [|0;2;2|] [|0;1;2|] ~cmp:1; + test [|0;1;2|] [|0;1|] ~cmp:1; + (* Check that the result of compare is normalized in -1,0,1 on large + array length differences. *) + test [|0;1;2;2;2|] [|0;1|] ~cmp:1; + test [|0;1|] [|0;1;2;2;2|] ~cmp:~-1; + (* If the length is different it is sufficent to order arrays and + we do not compare elements. This tests that so that + a possible behaviour change in the future can be detected *) + assert (Array.compare (fun _ _ -> assert false) [|0;1|] [|0;1;2|] = -1); + assert (Array.compare (fun _ _ -> assert false) [|0;1;2|] [|0;1|] = 1); + () +[%%expect{| +|}] diff --git a/testsuite/tests/lib-array/test_iarray.ml b/testsuite/tests/lib-array/test_iarray.ml new file mode 100644 index 00000000..b8578722 --- /dev/null +++ b/testsuite/tests/lib-array/test_iarray.ml @@ -0,0 +1,445 @@ +(* TEST + expect; +*) + +(** Create some immutable and mutable arrays *) + +let iarray : int iarray = [|1;2;3;4;5|];; +let ifarray : float iarray = [|1.5;2.5;3.5;4.5;5.5|];; + +let marray : int array = [|1;2;3;4;5|];; +let mfarray : float array = [|1.5;2.5;3.5;4.5;5.5|];; + +[%%expect{| +val iarray : int iarray = [|1; 2; 3; 4; 5|] +val ifarray : float iarray = [|1.5; 2.5; 3.5; 4.5; 5.5|] +val marray : int array = [|1; 2; 3; 4; 5|] +val mfarray : float array = [|1.5; 2.5; 3.5; 4.5; 5.5|] +|}];; + +(** Confirm that immutable and mutable arrays have the same representation, even + when they're different objects *) + +Obj.repr iarray = Obj.repr marray;; +[%%expect{| +- : bool = true +|}];; + +Obj.repr ifarray = Obj.repr mfarray;; +[%%expect{| +- : bool = true +|}];; + +iarray == Obj.magic marray;; +[%%expect{| +- : bool = false +|}];; + +ifarray == Obj.magic mfarray;; +[%%expect{| +- : bool = false +|}];; + +(** Confirm that immutable and mutable arrays don't collide *) + +Obj.repr iarray <> Obj.repr ifarray;; +[%%expect{| +- : bool = true +|}];; + +Obj.repr marray <> Obj.repr mfarray;; +[%%expect{| +- : bool = true +|}];; + +(** Test basic functionality: One or a few tests for every function in [Iarray]. + We test both success and error cases, and in general try to have coverage of + edge cases. Comments are attached everywhere something subtle is being + checked. *) + +Iarray.length iarray, Iarray.length ifarray;; +[%%expect{| +- : int * int = (5, 5) +|}];; + +Iarray.get iarray 0, Iarray.get iarray 1, Iarray.get ifarray 2, +Iarray.get ifarray 3;; +[%%expect{| +- : int * int * float * float = (1, 2, 3.5, 4.5) +|}];; + +Iarray.get iarray 10 +[%%expect{| +Exception: Invalid_argument "index out of bounds". +|}];; + +Iarray.get iarray (-1);; +[%%expect{| +Exception: Invalid_argument "index out of bounds". +|}];; + +Iarray.get ifarray (-10);; +[%%expect{| +Exception: Invalid_argument "index out of bounds". +|}];; + +Iarray.get ifarray 5;; +[%%expect{| +Exception: Invalid_argument "index out of bounds". +|}];; + +Iarray.init 10 (fun x -> x * 2);; +[%%expect{| +- : int iarray = [|0; 2; 4; 6; 8; 10; 12; 14; 16; 18|] +|}];; + +Iarray.append iarray iarray;; +[%%expect{| +- : int iarray = [|1; 2; 3; 4; 5; 1; 2; 3; 4; 5|] +|}];; + +Iarray.concat [];; +[%%expect{| +- : 'a iarray = [||] +|}];; + +Iarray.concat [ Iarray.init 1 (fun x -> 1 + x) + ; Iarray.init 2 (fun x -> 20 + x) + ; Iarray.init 3 (fun x -> 300 + x) ];; +[%%expect{| +- : int iarray = [|1; 20; 21; 300; 301; 302|] +|}];; + +Iarray.sub iarray ~pos:0 ~len:2, Iarray.sub iarray ~pos:2 ~len:3;; +[%%expect{| +- : int iarray * int iarray = ([|1; 2|], [|3; 4; 5|]) +|}];; + +Iarray.sub iarray ~pos:(-1) ~len:3;; +[%%expect{| +Exception: Invalid_argument "Iarray.sub". +|}];; + +Iarray.sub iarray ~pos:1 ~len:(-3);; +[%%expect{| +Exception: Invalid_argument "Iarray.sub". +|}];; + +Iarray.sub iarray ~pos:3 ~len:10;; +[%%expect{| +Exception: Invalid_argument "Iarray.sub". +|}];; + +Iarray.to_list iarray;; +[%%expect{| +- : int list = [1; 2; 3; 4; 5] +|}];; + +Iarray.of_list [10;20;30];; +[%%expect{| +- : int iarray = [|10; 20; 30|] +|}];; + + +Iarray.to_array iarray;; +[%%expect{| +- : int array = [|1; 2; 3; 4; 5|] +|}];; + +Iarray.of_array mfarray;; +[%%expect{| +- : float iarray = [|1.5; 2.5; 3.5; 4.5; 5.5|] +|}];; + +(* [Iarray.to_array] creates a fresh mutable array every time *) +Iarray.to_array iarray == marray;; +[%%expect{| +- : bool = false +|}];; + +(* [Iarray.to_array] creates a fresh mutable array every time *) +Iarray.to_array ifarray == Iarray.to_array ifarray;; +[%%expect{| +- : bool = false +|}];; + +(* Round-tripping from and to an [iarray] creates a fresh copy every time *) +Iarray.of_array (Iarray.to_array iarray) == iarray;; +[%%expect{| +- : bool = false +|}];; + +let sum = ref 0. in +Iarray.iter (fun x -> sum := !sum +. x) ifarray; +!sum;; +[%%expect{| +- : float = 17.5 +|}];; + +let total = ref 0 in +Iarray.iteri (fun i x -> total := !total + i*x) iarray; +!total;; +[%%expect{| +- : int = 40 +|}];; + +Iarray.map Int.neg iarray;; +[%%expect{| +- : int iarray = [|-1; -2; -3; -4; -5|] +|}];; + +Iarray.mapi (fun i x -> i, 10.*.x) ifarray;; +[%%expect{| +- : (int * float) iarray = +[|(0, 15.); (1, 25.); (2, 35.); (3, 45.); (4, 55.)|] +|}];; + +Iarray.fold_left (fun acc x -> -x :: acc) [] iarray;; +[%%expect{| +- : int list = [-5; -4; -3; -2; -1] +|}];; + +Iarray.fold_left_map (fun acc x -> acc + x, string_of_int x) 0 iarray;; +[%%expect{| +- : int * string iarray = (15, [|"1"; "2"; "3"; "4"; "5"|]) +|}];; + +(* Confirm the function isn't called on the empty immutable array *) +Iarray.fold_left_map (fun _ _ -> assert false) 0 [||];; +[%%expect{| +- : int * 'a iarray = (0, [||]) +|}];; + +Iarray.fold_right (fun x acc -> -.x :: acc) ifarray [];; +[%%expect{| +- : float list = [-1.5; -2.5; -3.5; -4.5; -5.5] +|}];; + +let ints = ref 0 in +let floats = ref 0. in +Iarray.iter2 + (fun i f -> + ints := i + !ints; + floats := f +. !floats) + iarray + ifarray; +!ints, !floats;; +[%%expect{| +- : int * float = (15, 17.5) +|}];; + +Iarray.map2 (fun i f -> f, i) iarray ifarray;; +[%%expect{| +- : (float * int) iarray = +[|(1.5, 1); (2.5, 2); (3.5, 3); (4.5, 4); (5.5, 5)|] +|}];; + +Iarray.for_all (fun i -> i > 0) iarray;; +[%%expect{| +- : bool = true +|}];; + +Iarray.for_all (fun f -> f < 5.) ifarray;; +[%%expect{| +- : bool = false +|}];; + +Iarray.exists (fun f -> f < 5.) ifarray;; +[%%expect{| +- : bool = true +|}];; + +Iarray.exists (fun i -> i > 10) iarray;; +[%%expect{| +- : bool = false +|}];; + +Iarray.for_all2 (fun i f -> Float.of_int i < f) iarray ifarray;; +[%%expect{| +- : bool = true +|}];; + +Iarray.for_all2 (fun f i -> i = 1 && f = 1.5) ifarray iarray;; +[%%expect{| +- : bool = false +|}];; + +Iarray.exists2 (fun f i -> Float.of_int i +. f = 8.5) ifarray iarray;; +[%%expect{| +- : bool = true +|}];; + +Iarray.exists2 (fun i f -> Float.of_int i > f) iarray ifarray;; +[%%expect{| +- : bool = false +|}];; + +Iarray.mem 3 iarray, Iarray.mem 3.5 ifarray;; +[%%expect{| +- : bool * bool = (true, true) +|}];; + +Iarray.mem 30 iarray, Iarray.mem 35. ifarray;; +[%%expect{| +- : bool * bool = (false, false) +|}];; + +let x = ref 0 in +Iarray.memq x (Iarray.init 3 (Fun.const x));; +[%%expect{| +- : bool = true +|}];; + +Iarray.memq (ref 0) (Iarray.init 3 (Fun.const (ref 0))) +[%%expect{| +- : bool = false +|}];; + +Iarray.find_opt (fun x -> x*x > 5) iarray, +Iarray.find_opt (fun x -> x*.x > 5.) ifarray;; +[%%expect{| +- : int option * float option = (Some 3, Some 2.5) +|}];; + +Iarray.find_opt (fun x -> x*x > 50) iarray, +Iarray.find_opt (fun x -> x*.x > 50.) ifarray;; +[%%expect{| +- : int option * float option = (None, None) +|}];; + +Iarray.find_map (fun x -> if x mod 2 = 0 + then Some (x / 2) + else None) + iarray, +Iarray.find_map (fun x -> if Float.rem x 2. = 0.5 + then Some ((x -. 0.5) /. 2.) + else None) + ifarray;; +[%%expect{| +- : int option * float option = (Some 1, Some 1.) +|}];; + +Iarray.find_map (fun x -> if x mod 7 = 0 + then Some (x / 7) + else None) + iarray, +Iarray.find_map (fun x -> if Float.rem x 7. = 0.5 + then Some ((x -. 0.5) /. 7.) + else None) + ifarray;; +[%%expect{| +- : int option * float option = (None, None) +|}];; + +Iarray.split [| 1, "a"; 2, "b"; 3, "c" |];; +[%%expect{| +- : int iarray * string iarray = ([|1; 2; 3|], [|"a"; "b"; "c"|]) +|}];; + +Iarray.split [||];; +[%%expect{| +- : 'a iarray * 'b iarray = ([||], [||]) +|}];; + +Iarray.combine iarray ifarray;; +[%%expect{| +- : (int * float) iarray = +[|(1, 1.5); (2, 2.5); (3, 3.5); (4, 4.5); (5, 5.5)|] +|}];; + +Iarray.combine [||] [||];; +[%%expect{| +- : ('a * 'b) iarray = [||] +|}];; + +Iarray.combine iarray [| "wrong length" |];; +[%%expect{| +Exception: Invalid_argument "Iarray.combine". +|}];; + +Iarray.sort (Fun.flip Int.compare) iarray, +Iarray.sort (Fun.flip Float.compare) ifarray;; +[%%expect{| +- : int iarray * Float.t iarray = +([|5; 4; 3; 2; 1|], [|5.5; 4.5; 3.5; 2.5; 1.5|]) +|}];; + +Iarray.stable_sort (Fun.flip Int.compare) iarray, +Iarray.stable_sort (Fun.flip Float.compare) ifarray;; +[%%expect{| +- : int iarray * Float.t iarray = +([|5; 4; 3; 2; 1|], [|5.5; 4.5; 3.5; 2.5; 1.5|]) +|}];; + +(* Check stability *) +Iarray.stable_sort + (fun s1 s2 -> Int.compare (String.length s1) (String.length s2)) + [| "zero"; "one"; "two"; "three"; "four"; + "five"; "six"; "seven"; "eight"; "nine"; + "ten" |];; +[%%expect{| +- : string iarray = +[|"one"; "two"; "six"; "ten"; "zero"; "four"; "five"; "nine"; "three"; + "seven"; "eight"|] +|}];; + +Iarray.fast_sort (Fun.flip Int.compare) iarray, +Iarray.fast_sort (Fun.flip Float.compare) ifarray;; +[%%expect{| +- : int iarray * Float.t iarray = +([|5; 4; 3; 2; 1|], [|5.5; 4.5; 3.5; 2.5; 1.5|]) +|}];; + +Iarray.to_seq iarray |> List.of_seq;; +[%%expect{| +- : int list = [1; 2; 3; 4; 5] +|}];; + +Iarray.to_seqi ifarray |> List.of_seq;; +[%%expect{| +- : (int * float) list = [(0, 1.5); (1, 2.5); (2, 3.5); (3, 4.5); (4, 5.5)] +|}];; + +["hello"; "world"] |> List.to_seq |> Iarray.of_seq;; +[%%expect{| +- : string iarray = [|"hello"; "world"|] +|}];; + +(** Confirm that we haven't edited the immutable arrays, and that editing + mutable siblings or copies does nothing *) + +Array.fill marray 0 3 0; +marray;; +[%%expect{| +- : int array = [|0; 0; 0; 4; 5|] +|}];; + +Array.fill (Iarray.to_array iarray) 3 2 10; +iarray;; +[%%expect{| +- : int iarray = [|1; 2; 3; 4; 5|] +|}];; + +Array.fill mfarray 3 2 0.; +mfarray;; +[%%expect{| +- : float array = [|1.5; 2.5; 3.5; 0.; 0.|] +|}];; + +Array.fill (Iarray.to_array ifarray) 0 3 10.; +ifarray;; +[%%expect{| +- : float iarray = [|1.5; 2.5; 3.5; 4.5; 5.5|] +|}];; + +(* Confirm that nothing has changed *) + +iarray;; +[%%expect{| +- : int iarray = [|1; 2; 3; 4; 5|] +|}];; + +ifarray;; +[%%expect{| +- : float iarray = [|1.5; 2.5; 3.5; 4.5; 5.5|] +|}];; diff --git a/testsuite/tests/lib-bigarray-2/bigarrcstub.c b/testsuite/tests/lib-bigarray-2/bigarrcstub.c index a4fffa05..d1ad87cd 100644 --- a/testsuite/tests/lib-bigarray-2/bigarrcstub.c +++ b/testsuite/tests/lib-bigarray-2/bigarrcstub.c @@ -42,8 +42,15 @@ void printtab(double tab[DIMX][DIMY]) value c_filltab(value unit) { filltab(); +#if defined(_MSC_VER) && !defined(__clang__) +#pragma warning(push) +#pragma warning(disable : 5287) +#endif return caml_ba_alloc_dims(CAML_BA_FLOAT64 | CAML_BA_C_LAYOUT, 2, ctab, (intnat)DIMX, (intnat)DIMY); +#if defined(_MSC_VER) && !defined(__clang__) +#pragma warning(pop) +#endif } value c_printtab(value ba) diff --git a/testsuite/tests/lib-bigarray-2/bigarrfstub.c b/testsuite/tests/lib-bigarray-2/bigarrfstub.c index b07106bc..4bd230c1 100644 --- a/testsuite/tests/lib-bigarray-2/bigarrfstub.c +++ b/testsuite/tests/lib-bigarray-2/bigarrfstub.c @@ -24,8 +24,15 @@ extern float ftab_[]; value fortran_filltab(value unit) { filltab_(); +#if defined(_MSC_VER) && !defined(__clang__) +#pragma warning(push) +#pragma warning(disable : 5287) +#endif return caml_ba_alloc_dims(CAML_BA_FLOAT32 | CAML_BA_FORTRAN_LAYOUT, 2, ftab_, (intnat)8, (intnat)6); +#if defined(_MSC_VER) && !defined(__clang__) +#pragma warning(pop) +#endif } value fortran_printtab(value ba) diff --git a/testsuite/tests/lib-bool/test.ml b/testsuite/tests/lib-bool/test.ml index 6a3c92bd..c3ef08ed 100644 --- a/testsuite/tests/lib-bool/test.ml +++ b/testsuite/tests/lib-bool/test.ml @@ -17,6 +17,18 @@ let test_and () = assert (!wit = 2); wit := 0; () +let test_eager_and () = + let wit = ref 0 in + assert (Bool.logand (incr wit; false) (incr wit; false) = false); + assert (!wit = 2); wit := 0; + assert (Bool.logand (incr wit; false) (incr wit; true) = false); + assert (!wit = 2); wit := 0; + assert (Bool.logand (incr wit; true) (incr wit; false) = false); + assert (!wit = 2); wit := 0; + assert (Bool.logand (incr wit; true) (incr wit; true) = true); + assert (!wit = 2); wit := 0; + () + let test_or () = let wit = ref 0 in assert (Bool.( || ) (incr wit; false) (incr wit; false) = false); @@ -29,6 +41,30 @@ let test_or () = assert (!wit = 1); wit := 0; () +let test_eager_or () = + let wit = ref 0 in + assert (Bool.logor (incr wit; false) (incr wit; false) = false); + assert (!wit = 2); wit := 0; + assert (Bool.logor (incr wit; false) (incr wit; true) = true); + assert (!wit = 2); wit := 0; + assert (Bool.logor (incr wit; true) (incr wit; false) = true); + assert (!wit = 2); wit := 0; + assert (Bool.logor (incr wit; true) (incr wit; true) = true); + assert (!wit = 2); wit := 0; + () + +let test_eager_xor () = + let wit = ref 0 in + assert (Bool.logxor (incr wit; false) (incr wit; false) = false); + assert (!wit = 2); wit := 0; + assert (Bool.logxor (incr wit; false) (incr wit; true) = true); + assert (!wit = 2); wit := 0; + assert (Bool.logxor (incr wit; true) (incr wit; false) = true); + assert (!wit = 2); wit := 0; + assert (Bool.logxor (incr wit; true) (incr wit; true) = false); + assert (!wit = 2); wit := 0; + () + let test_equal () = assert (Bool.equal false false = true); assert (Bool.equal false true = false); @@ -79,7 +115,10 @@ let test_hash () = let tests () = test_not (); test_and (); + test_eager_and (); test_or (); + test_eager_or (); + test_eager_xor (); test_equal (); test_compare (); test_to_int (); diff --git a/testsuite/tests/lib-channels/close_during_flush.ml b/testsuite/tests/lib-channels/close_during_flush.ml new file mode 100644 index 00000000..39ef2fbc --- /dev/null +++ b/testsuite/tests/lib-channels/close_during_flush.ml @@ -0,0 +1,34 @@ +(* TEST + not-windows; + include unix; + hasunix; + native; +*) + +let () = + let rd, wr = Unix.pipe () in + (* create a full pipe (so that writes block) *) + Unix.set_nonblock wr; + let buf = Bytes.make 1000 '!' in + begin match + for i = 1 to 1000 do + ignore (Unix.write wr buf 0 1000) + done + with + | () -> failwith "pipe doesn't seem to fill on this OS?!" + | exception Unix.Unix_error((EAGAIN|EWOULDBLOCK), _, _) -> () + end; + + (* block in a write, then unblock & close from a signal handler *) + Unix.clear_nonblock wr; + let ch = Unix.out_channel_of_descr wr in + output ch buf 0 1000; + let alarm_handler _ = + (* clear some space *) + Unix.read rd (Bytes.make 10_000 '?') 0 10_000 |> ignore; + close_out ch + in + Sys.signal Sys.sigalrm (Signal_handle alarm_handler) |> ignore; + Unix.alarm 1 |> ignore; + flush ch; + print_endline "ok" diff --git a/testsuite/tests/lib-channels/close_during_flush.reference b/testsuite/tests/lib-channels/close_during_flush.reference new file mode 100644 index 00000000..9766475a --- /dev/null +++ b/testsuite/tests/lib-channels/close_during_flush.reference @@ -0,0 +1 @@ +ok diff --git a/testsuite/tests/lib-char/test.ml b/testsuite/tests/lib-char/test.ml new file mode 100644 index 00000000..3f87c1c5 --- /dev/null +++ b/testsuite/tests/lib-char/test.ml @@ -0,0 +1,132 @@ +(* TEST *) + +let assert_raise_invalid_argument f v = + assert (try ignore (f v); false with Invalid_argument _ -> true) + +let test_constants () = + assert (Char.equal Char.Ascii.min '\x00'); + assert (Char.equal Char.Ascii.max '\x7F'); + () + +let test_is_valid () = + assert (not (Char.Ascii.is_valid '\x80')); + assert (Char.Ascii.is_valid '\x00'); + assert (Char.Ascii.is_valid '\x7F'); + assert (Char.Ascii.is_valid 'a'); + () + +let test_preds () = + assert (Char.Ascii.is_upper 'A'); + assert (not (Char.Ascii.is_upper 'z')); + assert (Char.Ascii.is_lower 'z'); + assert (not (Char.Ascii.is_lower 'A')); + assert (Char.Ascii.is_letter 'A'); + assert (Char.Ascii.is_letter 'z'); + assert (not (Char.Ascii.is_letter '1')); + assert (Char.Ascii.is_alphanum 'A'); + assert (Char.Ascii.is_alphanum 'z'); + assert (Char.Ascii.is_alphanum '1'); + assert (not (Char.Ascii.is_alphanum '.')); + assert (Char.Ascii.is_white ' '); + assert (not (Char.Ascii.is_white 'a')); + assert (Char.Ascii.is_blank ' '); + assert (not (Char.Ascii.is_blank '\n')); + assert (Char.Ascii.is_graphic 'a'); + assert (Char.Ascii.is_graphic '.'); + assert (not (Char.Ascii.is_graphic ' ')); + assert (Char.Ascii.is_print 'a'); + assert (Char.Ascii.is_print '.'); + assert (Char.Ascii.is_print ' '); + assert (not (Char.Ascii.is_print '\n')); + assert (Char.Ascii.is_control '\n'); + assert (Char.Ascii.is_control '\x7F'); + assert (not (Char.Ascii.is_control ' ')); + () + +let test_decimal () = + assert (Char.Ascii.is_digit '0'); + assert (not (Char.Ascii.is_digit 'A')); + assert (Char.Ascii.digit_to_int '5' = 5); + assert (Char.Ascii.digit_to_int '9' = 9); + assert_raise_invalid_argument Char.Ascii.digit_to_int 'A'; + assert (Char.Ascii.digit_of_int 5 = '5'); + assert (Char.Ascii.digit_of_int (-5) = '5'); + assert (Char.Ascii.digit_of_int 9 = '9'); + assert (Char.Ascii.digit_of_int (-9) = '9'); + assert (Char.Ascii.digit_of_int 10 = '0'); + assert (Char.Ascii.digit_of_int (-10) = '0'); + assert (Char.Ascii.digit_of_int 112 = '2'); + assert (Char.Ascii.digit_of_int (-112) = '2'); + () + +let test_hexadecimal () = + assert (Char.Ascii.is_hex_digit '0'); + assert (Char.Ascii.is_hex_digit 'A'); + assert (Char.Ascii.is_hex_digit 'a'); + assert (Char.Ascii.is_hex_digit 'F'); + assert (Char.Ascii.is_hex_digit 'f'); + assert (not (Char.Ascii.is_hex_digit 'G')); + assert (not (Char.Ascii.is_hex_digit 'g')); + assert (Char.Ascii.hex_digit_to_int '5' = 5); + assert (Char.Ascii.hex_digit_to_int 'f' = 0xF); + assert (Char.Ascii.hex_digit_to_int 'F' = 0xF); + assert (Char.Ascii.hex_digit_to_int 'a' = 0xA); + assert (Char.Ascii.hex_digit_to_int 'A' = 0xA); + assert (Char.Ascii.hex_digit_to_int 'd' = 0xD); + assert_raise_invalid_argument Char.Ascii.hex_digit_to_int 'g'; + assert_raise_invalid_argument Char.Ascii.hex_digit_to_int 'G'; + assert_raise_invalid_argument Char.Ascii.hex_digit_to_int 'z'; + assert (Char.Ascii.lower_hex_digit_of_int 5 = '5'); + assert (Char.Ascii.lower_hex_digit_of_int (-5) = '5'); + assert (Char.Ascii.lower_hex_digit_of_int 10 = 'a'); + assert (Char.Ascii.lower_hex_digit_of_int (-10) = 'a'); + assert (Char.Ascii.lower_hex_digit_of_int 15 = 'f'); + assert (Char.Ascii.lower_hex_digit_of_int (-15) = 'f'); + assert (Char.Ascii.lower_hex_digit_of_int 16 = '0'); + assert (Char.Ascii.lower_hex_digit_of_int (-16) = '0'); + assert (Char.Ascii.lower_hex_digit_of_int (255) = 'f'); + assert (Char.Ascii.lower_hex_digit_of_int (-255) = 'f'); + assert (Char.Ascii.lower_hex_digit_of_int 0x77 = '7'); + assert (Char.Ascii.lower_hex_digit_of_int 0x7A = 'a'); + assert (Char.Ascii.lower_hex_digit_of_int 0xB = 'b'); + assert (Char.Ascii.lower_hex_digit_of_int 0x2 = '2'); + assert (Char.Ascii.upper_hex_digit_of_int 5 = '5'); + assert (Char.Ascii.upper_hex_digit_of_int (-5) = '5'); + assert (Char.Ascii.upper_hex_digit_of_int 10 = 'A'); + assert (Char.Ascii.upper_hex_digit_of_int (-10) = 'A'); + assert (Char.Ascii.upper_hex_digit_of_int 15 = 'F'); + assert (Char.Ascii.upper_hex_digit_of_int (-15) = 'F'); + assert (Char.Ascii.upper_hex_digit_of_int 16 = '0'); + assert (Char.Ascii.upper_hex_digit_of_int (-16) = '0'); + assert (Char.Ascii.upper_hex_digit_of_int (255) = 'F'); + assert (Char.Ascii.upper_hex_digit_of_int (-255) = 'F'); + assert (Char.Ascii.upper_hex_digit_of_int 0x77 = '7'); + assert (Char.Ascii.upper_hex_digit_of_int 0x7A = 'A'); + assert (Char.Ascii.upper_hex_digit_of_int 0xB = 'B'); + assert (Char.Ascii.upper_hex_digit_of_int 0x2 = '2'); + () + +let test_case_mappings () = + assert (Char.Ascii.uppercase 'a' = 'A'); + assert (Char.Ascii.uppercase 'g' = 'G'); + assert (Char.Ascii.uppercase 'Z' = 'Z'); + assert (Char.Ascii.uppercase '\n' = '\n'); + assert (Char.Ascii.lowercase 'A' = 'a'); + assert (Char.Ascii.lowercase 'G' = 'g'); + assert (Char.Ascii.lowercase 'z' = 'z'); + assert (Char.Ascii.lowercase '\n' = '\n'); + () + + +let tests () = + test_constants (); + test_is_valid (); + test_preds (); + test_decimal (); + test_hexadecimal (); + test_case_mappings(); + () + +let () = + tests (); + print_endline "OK" diff --git a/testsuite/tests/lib-char/test.reference b/testsuite/tests/lib-char/test.reference new file mode 100644 index 00000000..d86bac9d --- /dev/null +++ b/testsuite/tests/lib-char/test.reference @@ -0,0 +1 @@ +OK diff --git a/testsuite/tests/lib-dynarray/test.ml b/testsuite/tests/lib-dynarray/test.ml index a0621158..c666a4f5 100644 --- a/testsuite/tests/lib-dynarray/test.ml +++ b/testsuite/tests/lib-dynarray/test.ml @@ -87,6 +87,36 @@ let () = let a = A.of_list [1; 2; 3] in assert (A.fold_right List.cons a [] = [1; 2; 3]);; +(* exists2 *) +let () = + let a = A.of_list [1; 2; 3] in + assert (A.exists2 (=) a a); + assert (not (A.exists2 (=) (A.of_list []) (A.of_list []))); + assert (A.exists2 (=) a (A.of_list [1; 4; 3])); + assert (match A.exists2 (=) a (A.of_list [1; 2]) with + | exception (Invalid_argument _) -> true + | _ -> false + ); + assert (match A.exists2 (=) (A.of_list [1; 2]) a with + | exception (Invalid_argument _) -> true + | _ -> false + );; + +(* for_all2 *) +let () = + let a = A.of_list [1; 2; 3] in + assert (A.for_all2 (=) a a); + assert (A.for_all2 (=) (A.of_list []) (A.of_list [])); + assert (not (A.for_all2 (=) a (A.of_list [1; 4; 3]))); + assert (match A.for_all2 (=) a (A.of_list [1; 2]) with + | exception (Invalid_argument _) -> true + | _ -> false + ); + assert (match A.for_all2 (=) (A.of_list [1; 2]) a with + | exception (Invalid_argument _) -> true + | _ -> false + );; + (** {1:adding Adding elements} *) (** add_last was tested above *) @@ -499,6 +529,51 @@ let () = assert (A.length a = 201); assert (A.length a = A.capacity a);; +(** unsafe_to_iarray *) + +let () = + let n = 42 in + (* With unchanged capacity *) + let a = A.unsafe_to_iarray ~capacity:n (fun t -> + for i = 0 to n - 1 do + A.add_last t i + done) + in + for i = 0 to n - 1 do + assert (Iarray.get a i = i) + done; + (* With a change in capacity *) + let a = A.unsafe_to_iarray ~capacity:n (fun t -> + for i = 0 to n + 5 do + A.add_last t i + done) + in + for i = 0 to n + 5 do + assert (Iarray.get a i = i) + done; + let a = A.unsafe_to_iarray ~capacity:n (fun t -> + for i = 0 to n / 2 do + A.add_last t i + done; + A.fit_capacity t) + in + for i = 0 to n / 2 do + assert (Iarray.get a i = i) + done;; + +(** unsafe_to_iarray with float *) + +let () = + let n = 42 in + let a = A.unsafe_to_iarray ~capacity:n (fun t -> + for i = 0 to n - 1 do + A.add_last t (Float.of_int i) + done) + in + for i = 0 to n - 1 do + assert (Float.equal (Iarray.get a i) (Float.of_int i)) + done;; + (** check that comparisons and marshalling-with-sharing work as expected. *) diff --git a/testsuite/tests/lib-dynlink-domains/main.ml b/testsuite/tests/lib-dynlink-domains/main.ml index a1393cc1..877428f2 100644 --- a/testsuite/tests/lib-dynlink-domains/main.ml +++ b/testsuite/tests/lib-dynlink-domains/main.ml @@ -2,7 +2,6 @@ include dynlink; libraries = ""; readonly_files = "store.ml main.ml Plugin_0.ml Plugin_0_0.ml Plugin_0_0_0.ml Plugin_0_0_0_0.ml Plugin_0_0_0_1.ml Plugin_0_0_0_2.ml Plugin_1.ml Plugin_1_0.ml Plugin_1_0_0.ml Plugin_1_0_0_0.ml Plugin_1_1.ml Plugin_1_2.ml Plugin_1_2_0.ml Plugin_1_2_0_0.ml Plugin_1_2_1.ml Plugin_1_2_2.ml Plugin_1_2_2_0.ml Plugin_1_2_3.ml Plugin_1_2_3_0.ml"; - not-windows; { shared-libraries; setup-ocamlc.byte-build-env; diff --git a/testsuite/tests/lib-dynlink-initializers/test10_main.byte.reference b/testsuite/tests/lib-dynlink-initializers/test10_main.byte.reference index 67749bfa..5e6f3b64 100644 --- a/testsuite/tests/lib-dynlink-initializers/test10_main.byte.reference +++ b/testsuite/tests/lib-dynlink-initializers/test10_main.byte.reference @@ -3,10 +3,10 @@ Raised at Stdlib.failwith in file "stdlib.ml", line 29, characters 17-33 Called from Test10_plugin.g in file "test10_plugin.ml", line 3, characters 2-21 Called from Test10_plugin.f in file "test10_plugin.ml", line 6, characters 2-6 Called from Test10_plugin in file "test10_plugin.ml", line 10, characters 2-6 -Called from Dynlink.Bytecode.run in file "otherlibs/dynlink/byte/dynlink.ml", line 168, characters 16-25 -Re-raised at Dynlink.Bytecode.run in file "otherlibs/dynlink/byte/dynlink.ml", lines 170-172, characters 6-39 +Called from Dynlink.Bytecode.run in file "otherlibs/dynlink/byte/dynlink.ml", line 167, characters 16-25 +Re-raised at Dynlink.Bytecode.run in file "otherlibs/dynlink/byte/dynlink.ml", lines 169-171, characters 6-39 Called from Dynlink_common.Make.load.(fun) in file "otherlibs/dynlink/dynlink_common.ml", line 356, characters 11-54 -Called from Stdlib__List.iter in file "list.ml", line 112, characters 12-15 +Called from Stdlib__List.iter in file "list.ml", line 114, characters 12-15 Called from Stdlib__Fun.protect in file "fun.ml", line 34, characters 8-15 Re-raised at Stdlib__Fun.protect in file "fun.ml", line 39, characters 6-52 Called from Test10_main in file "test10_main.ml", lines 51-53, characters 13-7 diff --git a/testsuite/tests/lib-dynlink-initializers/test10_main.native.reference b/testsuite/tests/lib-dynlink-initializers/test10_main.native.reference index 135efd88..59fadd7f 100755 --- a/testsuite/tests/lib-dynlink-initializers/test10_main.native.reference +++ b/testsuite/tests/lib-dynlink-initializers/test10_main.native.reference @@ -1,9 +1,9 @@ Error: Failure("Plugin error") Raised by primitive operation at Dynlink.Native.run.(fun) in file "otherlibs/dynlink/native/dynlink.ml", line 85, characters 12-29 Re-raised at Dynlink.Native.run.(fun) in file "otherlibs/dynlink/native/dynlink.ml", lines 87-89, characters 10-43 -Called from Stdlib__List.iter in file "list.ml", line 112, characters 12-15 +Called from Stdlib__List.iter in file "list.ml", line 114, characters 12-15 Called from Dynlink_common.Make.load.(fun) in file "otherlibs/dynlink/dynlink_common.ml", line 356, characters 11-54 -Called from Stdlib__List.iter in file "list.ml", line 112, characters 12-15 +Called from Stdlib__List.iter in file "list.ml", line 114, characters 12-15 Called from Stdlib__Fun.protect in file "fun.ml", line 34, characters 8-15 Re-raised at Stdlib__Fun.protect in file "fun.ml", line 39, characters 6-52 Called from Dynlink_common.Make.loadfile in file "otherlibs/dynlink/dynlink_common.ml" (inlined), line 364, characters 26-45 diff --git a/testsuite/tests/lib-either/test.ml b/testsuite/tests/lib-either/test.ml index 5cdaa383..e9e571de 100644 --- a/testsuite/tests/lib-either/test.ml +++ b/testsuite/tests/lib-either/test.ml @@ -19,6 +19,21 @@ List.map is_right [left 1; right true];; - : bool list = [false; true] |}];; +[get_left (Left 1); get_right (Right 2)];; +[%%expect {| +- : int list = [1; 2] +|}];; + +ignore (get_left (Right 1));; +[%%expect {| +Exception: Invalid_argument "Either.t is Right _". +|}];; + +ignore (get_right (Left 1));; +[%%expect {| +Exception: Invalid_argument "Either.t is Left _". +|}];; + [find_left (Left 1); find_left (Right 1)];; [%%expect {| - : int option list = [Some 1; None] diff --git a/testsuite/tests/lib-floatarray/floatarray.ml b/testsuite/tests/lib-floatarray/floatarray.ml index 654e15b6..ff0cc494 100644 --- a/testsuite/tests/lib-floatarray/floatarray.ml +++ b/testsuite/tests/lib-floatarray/floatarray.ml @@ -186,6 +186,8 @@ module Test (A : S) : sig end = struct (* check_inval omitted *) (* [concat] *) + assert (A.of_list [1.; 2.; 3.] + = A.concat [A.of_list [1.]; A.of_list [2.; 3.]]); let check l = let f (len, acc) n = (len + n, A.init n (fun i -> Float.of_int (len + i)) :: acc) diff --git a/testsuite/tests/lib-format/format_text.ml b/testsuite/tests/lib-format/format_text.ml new file mode 100644 index 00000000..6fa39d65 --- /dev/null +++ b/testsuite/tests/lib-format/format_text.ml @@ -0,0 +1,92 @@ +(* TEST +expect; +*) + +let () = + Format.set_geometry ~max_indent:28 ~margin:30; + Format.printf ( + Format.format_text + "@[\ +A first paragraph containing +a newline and some characters. + +A second paragraph, +split from the first one by a new line, +and with few more newlines inside. + +The end.@]@." + ) + +[%%expect {| +A first paragraph containing +a newline and some +characters. + +A second paragraph, split +from the first one by a new +line, and with few more +newlines inside. + +The end. +|}] + +let test n = + let open Format in + set_geometry ~max_indent:(n-2) ~margin:n; + printf (format_text + "@[@[qualibus @[in@] @[tenebris@] vitae quantisque periclis@] \ + @[degitur hoc aevi quod cumquest! nonne videre@] \ + @[nihil aliud sibinaturam latrare, nisi ut qui@] \ + @[corpore seiunctus dolor absit, mente fruatur@] \ + @[iucundo sensu cura semota metuque?@] %s@]@." + ) + "De rerum natura, Lucretius" +[%%expect {| +val test : int -> unit = +|}] + + +let () = test 20 +[%%expect {| +qualibus in +tenebris vitae +quantisque periclis +degitur hoc aevi +quod cumquest! +nonne videre +nihil aliud +sibinaturam +latrare, nisi ut +qui +corpore seiunctus +dolor absit, mente +fruatur +iucundo sensu cura +semota metuque? +De rerum natura, Lucretius +|}] + + +let () = test 40 +[%%expect {| +qualibus in tenebris vitae quantisque +periclis +degitur hoc aevi quod cumquest! nonne +videre +nihil aliud sibinaturam latrare, nisi +ut qui +corpore seiunctus dolor absit, mente +fruatur +iucundo sensu cura semota metuque? +De rerum natura, Lucretius +|}] + +let () = test 80 +[%%expect {| +qualibus in tenebris vitae quantisque periclis +degitur hoc aevi quod cumquest! nonne videre +nihil aliud sibinaturam latrare, nisi ut qui +corpore seiunctus dolor absit, mente fruatur +iucundo sensu cura semota metuque? +De rerum natura, Lucretius +|}] diff --git a/testsuite/tests/lib-format/unicode.ml b/testsuite/tests/lib-format/unicode.ml new file mode 100644 index 00000000..b7b0bfcc --- /dev/null +++ b/testsuite/tests/lib-format/unicode.ml @@ -0,0 +1,179 @@ +(* TEST + flags = "-I ${ocamlsrcdir}/toplevel"; + expect; +*) + + +let setup ~out_width n = + Format.set_geometry ~max_indent:(n-2) ~margin:n; + let fns = Format.get_formatter_out_functions () in + Format.set_formatter_out_functions { fns with out_width } + +let zws = "\u{200B}" + +let () = Toploop.max_printer_steps := 1 + 100 * String.length zws + +let zero_width_spaces = + let len = String.length zws in + String.init (20 * len) (fun i -> zws.[i mod len]) + +let test ~out_width n s = + setup ~out_width n; + Format.printf "@[@<0>%s%a@]@." + zero_width_spaces + Format.pp_print_text s +[%%expect {| +val setup : out_width:(string -> pos:int -> len:int -> int) -> int -> unit = + +val zws : string = "​" +val zero_width_spaces : string = "​​​​​​​​​​​​​​​​​​​​" +val test : + out_width:(string -> pos:int -> len:int -> int) -> int -> string -> unit = + +|}] + +(** Alphabetic scripts *) +let () = + test ~out_width:Format.utf_8_scalar_width 40 + "Μῆνιν ἄειδε θεὰ Πηληϊάδεω Ἀχιλῆος οὐλομένην, ἣ μυρί᾿ Ἀχαιοῖς ἄλγε᾿ ἔθηκε, \ + πολλὰς δ᾿ ἰφθίμους ψυχὰς Ἄϊδι προΐαψεν ἡρώων, αὐτοὺς δὲ ἑλώρια τεῦχε κύνεσσιν \ + οἰωνοῖσί τε πᾶσι· Διὸς δ᾿ ἐτελείετο βουλή ἐξ οὗ δὴ τὰ πρῶτα διαστήτην \ + ἐρίσαντε Ἀτρεΐδης τε ἄναξ ἀνδρῶν καὶ δῖος Ἀχιλλεύς." +[%%expect {| +​​​​​​​​​​​​​​​​​​​​Μῆνιν ἄειδε θεὰ Πηληϊάδεω Ἀχιλῆος +οὐλομένην, ἣ μυρί᾿ Ἀχαιοῖς ἄλγε᾿ ἔθηκε, +πολλὰς δ᾿ ἰφθίμους ψυχὰς Ἄϊδι προΐαψεν +ἡρώων, αὐτοὺς δὲ ἑλώρια τεῦχε κύνεσσιν +οἰωνοῖσί τε πᾶσι· Διὸς δ᾿ ἐτελείετο +βουλή ἐξ οὗ δὴ τὰ πρῶτα διαστήτην +ἐρίσαντε Ἀτρεΐδης τε ἄναξ ἀνδρῶν καὶ +δῖος Ἀχιλλεύς. +|}] + +let () = + setup ~out_width:Format.utf_8_scalar_width 40; + Format.printf + "@[Μῆνιν@ ἄειδε@ θεὰ@ Πηληϊάδεω@ Ἀχιλῆος@ οὐλομένην,@ ἣ@ μυρί᾿@ Ἀχαιοῖς@ ἄλγε᾿@ ἔθηκε,@ \ + πολλὰς@ δ᾿@ ἰφθίμους@ ψυχὰς@ Ἄϊδι@ προΐαψεν@ ἡρώων,@ αὐτοὺς@ δὲ@ ἑλώρια@ τεῦχε@ \ + κύνεσσιν@ οἰωνοῖσί@ τε@ πᾶσι·@ Διὸς@ δ᾿@ ἐτελείετο@ βουλή@ ἐξ@ οὗ@ δὴ@ τὰ@ πρῶτα@ \ + διαστήτην@ ἐρίσαντε@ Ἀτρεΐδης@ τε@ ἄναξ@ ἀνδρῶν@ καὶ@ δῖος@ Ἀχιλλεύς.@]@." +[%%expect {| +Μῆνιν ἄειδε θεὰ Πηληϊάδεω Ἀχιλῆος +οὐλομένην, ἣ μυρί᾿ Ἀχαιοῖς ἄλγε᾿ ἔθηκε, +πολλὰς δ᾿ ἰφθίμους ψυχὰς Ἄϊδι προΐαψεν +ἡρώων, αὐτοὺς δὲ ἑλώρια τεῦχε κύνεσσιν +οἰωνοῖσί τε πᾶσι· Διὸς δ᾿ ἐτελείετο +βουλή ἐξ οὗ δὴ τὰ πρῶτα διαστήτην +ἐρίσαντε Ἀτρεΐδης τε ἄναξ ἀνδρῶν καὶ +δῖος Ἀχιλλεύς. +|}] + +let () = + test ~out_width:Format.ascii_width 40 + "Μῆνιν ἄειδε θεὰ Πηληϊάδεω Ἀχιλῆος οὐλομένην, ἣ μυρί᾿ Ἀχαιοῖς ἄλγε᾿ ἔθηκε, \ + πολλὰς δ᾿ ἰφθίμους ψυχὰς Ἄϊδι προΐαψεν ἡρώων, αὐτοὺς δὲ ἑλώρια τεῦχε κύνεσσιν \ + οἰωνοῖσί τε πᾶσι· Διὸς δ᾿ ἐτελείετο βουλή ἐξ οὗ δὴ τὰ πρῶτα διαστήτην \ + ἐρίσαντε Ἀτρεΐδης τε ἄναξ ἀνδρῶν καὶ δῖος Ἀχιλλεύς." +[%%expect {| +​​​​​​​​​​​​​​​​​​​​Μῆνιν ἄειδε θεὰ +Πηληϊάδεω Ἀχιλῆος +οὐλομένην, ἣ μυρί᾿ +Ἀχαιοῖς ἄλγε᾿ +ἔθηκε, πολλὰς δ᾿ +ἰφθίμους ψυχὰς +Ἄϊδι προΐαψεν +ἡρώων, αὐτοὺς δὲ +ἑλώρια τεῦχε +κύνεσσιν οἰωνοῖσί +τε πᾶσι· Διὸς δ᾿ +ἐτελείετο βουλή ἐξ +οὗ δὴ τὰ πρῶτα +διαστήτην ἐρίσαντε +Ἀτρεΐδης τε ἄναξ +ἀνδρῶν καὶ δῖος +Ἀχιλλεύς. +|}] + +(** Vietnamese tends to use many combining diacritics *) +let () = + test ~out_width:Format.utf_8_scalar_width 40 + "Trăm năm trong cõi người ta, \ + Chữ tài chữ mệnh khéo là ghét nhau. \ + Trải qua một cuộc bể dâu, \ + Những điều trông thấy mà đau đớn lòng." +[%%expect{| +​​​​​​​​​​​​​​​​​​​​Trăm năm trong cõi người ta, Chữ tài +chữ mệnh khéo là ghét nhau. Trải qua +một cuộc bể dâu, Những điều trông thấy +mà đau đớn lòng. +|}] + +let () = + test ~out_width:Format.ascii_width 40 + "Trăm năm trong cõi người ta, \ + Chữ tài chữ mệnh khéo là ghét nhau. \ + Trải qua một cuộc bể dâu, \ + Những điều trông thấy mà đau đớn lòng." +[%%expect{| +​​​​​​​​​​​​​​​​​​​​Trăm năm trong cõi người ta, +Chữ tài chữ mệnh khéo là ghét +nhau. Trải qua một cuộc bể +dâu, Những điều trông thấy mà +đau đớn lòng. +|}] + +(** Logographic *) +let () = + test ~out_width:Format.ascii_width 40 + "めぐり逢ひ \ + 見しやそれとも \ + わかぬ間に \ + 雲隠れにし" +[%%expect {| +​​​​​​​​​​​​​​​​​​​​めぐり逢ひ 見しやそれとも +わかぬ間に 雲隠れにし +|}] + +let () = + test ~out_width:Format.utf_8_scalar_width 40 + "めぐり逢ひ \ + 見しやそれとも \ + わかぬ間に \ + 雲隠れにし" +[%%expect {| +​​​​​​​​​​​​​​​​​​​​めぐり逢ひ 見しやそれとも わかぬ間に 雲隠れにし +|}] + + + +(** The number of unicode scalar values is really not a good approximation for + abugida scripts, but those scripts width tend to be really dependent on + shaping anyway. *) +let () = + test ~out_width:Format.utf_8_scalar_width 40 + "अग्निमीळे पुरोहितं यज्ञस्य देवं रत्वीजम होतारं रत्नधातमम अग्निः \ + पूर्वेभिर्र्षिभिरीड्यो नूतनैरुत स देवानेह वक्षति" +[%%expect{| +​​​​​​​​​​​​​​​​​​​​अग्निमीळे पुरोहितं यज्ञस्य देवं रत्वीजम +होतारं रत्नधातमम अग्निः +पूर्वेभिर्र्षिभिरीड्यो नूतनैरुत स +देवानेह वक्षति +|}] + +let () = + test ~out_width:Format.ascii_width 40 + "अग्निमीळे पुरोहितं यज्ञस्य देवं रत्वीजम होतारं रत्नधातमम अग्निः \ + पूर्वेभिर्र्षिभिरीड्यो नूतनैरुत स देवानेह वक्षति" +[%%expect{| +​​​​​​​​​​​​​​​​​​​​अग्निमीळे +पुरोहितं +यज्ञस्य देवं +रत्वीजम +होतारं +रत्नधातमम +अग्निः +पूर्वेभिर्र्षिभिरीड्यो +नूतनैरुत स +देवानेह +वक्षति +|}] diff --git a/testsuite/tests/lib-list/test.ml b/testsuite/tests/lib-list/test.ml index 227c4547..772c3868 100644 --- a/testsuite/tests/lib-list/test.ml +++ b/testsuite/tests/lib-list/test.ml @@ -68,13 +68,13 @@ let () = assert (List.take 3 [1; 2; 3; 4; 5] = [1; 2; 3]); assert (List.take 3 [1; 2] = [1; 2]); assert (List.take 3 [] = []); - assert ((try List.take (-1) [1; 2] with Invalid_argument _ -> [999]) = [999]); + assert (List.take (-1) [1; 2] = []); assert (List.take 0 [1; 2] = []); assert (List.drop 6 hello_world = world); assert (List.drop 3 [1; 2; 3; 4; 5] = [4; 5]); assert (List.drop 3 [1; 2] = []); assert (List.drop 3 [] = []); - assert ((try List.drop (-1) [1; 2] with Invalid_argument _ -> [999]) = [999]); + assert (List.drop (-1) [1; 2] = [1; 2]); assert (List.drop 0 [1; 2] = [1; 2]); assert (List.take_while (fun x -> x < 3) [1; 2; 3; 4; 1; 2; 3; 4] = [1; 2]); @@ -143,6 +143,39 @@ let () = () ;; +(* Check that List.sort_uniq keeps first occurrences of duplicates. *) +let () = + let keep_first_duplicates l = + let tagged = List.combine l (List.init (List.length l) Fun.id) in + let sorted = + List.sort_uniq (fun c1 c2 -> Int.compare (fst c1) (fst c2)) tagged + in + let is_first_tag (x, y) = + (* Check whether the second component of the argument is the element + first associated by [tagged] with the first component of the + argument. *) + List.assoc x tagged = y + in + List.for_all is_first_tag sorted + in + let randlist maxlen = + let len = Random.int maxlen in + (* Take values in [0, (3 * len) / 2] to have some collisions. *) + List.init len (fun _ -> Random.int ( 1 + (3 * len) / 2 )) + in + for _ = 0 to 20 do + let l = randlist 99 in + if not (keep_first_duplicates l) then ( + Format.printf + "List.sort_uniq did not keep first duplicates when sorting the list@ \ + @[[%a]@]@." + Format.( + pp_print_list ~pp_sep:(fun out () -> fprintf out ";@ ") pp_print_int) + l; + assert false) + done +;; + (* Empty test case *) let () = assert ((List.init 0 (fun x -> x)) = []); diff --git a/testsuite/tests/lib-pair/test.ml b/testsuite/tests/lib-pair/test.ml new file mode 100644 index 00000000..0662a85b --- /dev/null +++ b/testsuite/tests/lib-pair/test.ml @@ -0,0 +1,83 @@ +(* TEST *) + +let test_make () = + let () = assert (Pair.make 1 "x" = (1, "x")) in + let () = assert (Pair.make 'e' [] = ('e', [])) in + () + +let test_fst () = + let () = assert (Pair.fst (1, "x") = 1) in + let () = assert (Pair.fst ('e', []) = 'e') in + () + +let test_snd () = + let () = assert (Pair.snd (1, "x") = "x") in + let () = assert (Pair.snd ('e', []) = []) in + () + +let test_swap () = + let () = assert (Pair.swap (1, "x") = ("x", 1)) in + let () = assert (Pair.swap ('e', []) = ([], 'e')) in + () + +let test_fold () = + let () = assert (Pair.fold (+) (2, 3) = 5) in + let is_same i s = (s = string_of_int i) in + let () = assert (Pair.fold is_same (2, "2")) in + () + +let test_map () = + let () = assert (Pair.map succ (fun a -> a ^ a) (3, "a") = (4, "aa")) in + () + +let test_iter () = + let iterator = ref 0 in + let add x = iterator := !iterator + x in + let mul x = iterator := !iterator * x in + let () = Pair.iter add mul (4, 3) in + let () = assert (!iterator = 12) in + () + +let test_map_fst () = + let () = assert (Pair.map_fst succ (1, "s") = (2, "s")) in + let () = assert (Pair.map_fst (Fun.const []) (None, 'e') = ([], 'e')) in + () + +let test_map_snd () = + let () = assert (Pair.map_snd succ ("s", 1) = ("s", 2)) in + let () = assert (Pair.map_snd (Fun.const []) ('e', None) = ('e', [])) in + () + +let test_equal () = + assert (Pair.equal (fun _ _ -> true) String.equal (3, "e") (4, "e")) ; + assert (Pair.equal Int.equal String.equal (3, "e") (4, "e") = false) + +let test_compare () = + (* reflexive *) + assert (Pair.compare Int.compare String.compare (3, "a") (3, "a") = 0) ; + (* symmetric (and total) *) + assert (Pair.compare Int.compare Char.compare (3, '3') (4, '4') + * Pair.compare Int.compare Char.compare (4, '4') (3, '3') < 0) ; + (* transitive *) + let cmp1 = Pair.compare Int.compare Char.compare (3, '3') (4, '4') in + let cmp2 = Pair.compare Int.compare Char.compare (4, '4') (5, '5') in + let cmp3 = Pair.compare Int.compare Char.compare (3, '3') (5, '5') in + if cmp1 * cmp2 > 0 then (* 3 < 4 < 5 or 3 > 4 > 5 *) + assert (cmp1 * cmp3 > 0) + +let tests () = + test_make (); + test_fst (); + test_snd (); + test_swap (); + test_fold (); + test_map (); + test_map_fst (); + test_map_snd (); + test_equal (); + test_compare (); + () + +let () = + tests (); + print_endline "OK" diff --git a/testsuite/tests/lib-pair/test.reference b/testsuite/tests/lib-pair/test.reference new file mode 100644 index 00000000..d86bac9d --- /dev/null +++ b/testsuite/tests/lib-pair/test.reference @@ -0,0 +1 @@ +OK diff --git a/testsuite/tests/lib-pqueue/test.ml b/testsuite/tests/lib-pqueue/test.ml new file mode 100644 index 00000000..3986924a --- /dev/null +++ b/testsuite/tests/lib-pqueue/test.ml @@ -0,0 +1,135 @@ +(* TEST *) + +(* testing with pairs (integer priority, string) *) +module E = struct + type t = int * string + let compare (p1,_) (p2,_) = Int.compare p1 p2 +end +module Q = Pqueue.MakeMin(E) + +let does_raise f q = + try + ignore (f q); + false + with Invalid_argument _ -> + true + +let check_is_empty q = + assert (Q.length q = 0); assert (Q.is_empty q); + assert (does_raise Q.get_min_elt q); assert (Q.min_elt q = None); + assert (Q.pop_min q = None); Q.remove_min q; assert (Q.length q = 0) + +let () = + let q = Q.create () in + check_is_empty q; + Q.add q (1, "a"); + assert (Q.length q = 1); assert (not (Q.is_empty q)); + assert (Q.get_min_elt q = (1, "a")); assert (Q.min_elt q = Some (1, "a")); + assert (Q.length q = 1); + assert (Q.pop_min q = Some (1, "a")); check_is_empty q; + Q.add q (2, "b"); + Q.add q (1, "a"); + assert (Q.get_min_elt q = (1, "a")); assert (Q.min_elt q = Some (1, "a")); + assert (Q.pop_min q = Some (1, "a")); assert (Q.length q = 1); + assert (Q.get_min_elt q = (2, "b")); assert (Q.min_elt q = Some (2, "b")); + Q.remove_min q; check_is_empty q; + Q.add q (2, "b"); + Q.add q (1, "a"); + Q.clear q; check_is_empty q; + () + +let () = + let q = Q.create () in + Q.add q (1, "a"); Q.add q (2, "b"); + let q' = Q.copy q in + Q.clear q; check_is_empty q; + assert (Q.length q' = 2) + +let () = + let q = Q.create () in + for n = 0 to 10 do + for x = n-1 downto 0 do Q.add q (x, "") done; + for x = 0 to n-1 do assert (Q.pop_min q = Some (x, "")) done; + check_is_empty q + done + +let () = + let q = Q.create () in + for n = 0 to 10 do + for x = n-1 downto 0 do Q.add q (x, "") done; + for x = 0 to n-1 do assert (Q.pop_min q = Some (x, "")) done; + check_is_empty q + done + +(* check iter_unordered and fold_unordered *) +let () = + let q = Q.create () in + for n = 0 to 10 do Q.add q (n, "") done; + let r = ref 0 in Q.iter_unordered (fun (x,_) -> r := !r + x) q; + assert (!r = 55); + assert (Q.fold_unordered (fun acc (x,_) -> acc+x) 0 q = 55) + +let () = + for n = 0 to 10 do + let a = Array.init n (fun i -> (i/3, string_of_int i)) in + let q = Q.of_array a in + assert (Q.length q = n); + for i = 0 to n - 1 do match Q.pop_min q with + | None -> assert false + | Some (x, _) -> assert (x = fst a.(i)) + done; + check_is_empty q + done + +let () = + let q = Q.create () in + let l = [2, "b"; 3, "c"; 1, "a"; 4, "d"; 0, ""] in + Q.add_iter q List.iter l; + assert (Q.min_elt q = Some (0, "")); + assert (Q.fold_unordered (fun acc (x, _) -> acc+x) 0 q = 10) + +(* check that min_elt and pop_min are consistent when several elements + have the same priority *) +let () = + let q = Q.create () in + Q.add q (1, "b"); Q.add q (1, "a"); Q.add q (1, "d"); Q.add q (1, "c"); + for _ = 1 to 4 do + let x = Q.min_elt q in assert (x = Q.pop_min q) + done; + () + +(* check that Max is indeed a max-pqueue *) +let () = + let open Pqueue.MakeMax(E) in + let q = create () in + add q (2, "b"); add q (1, "a"); add q (4, "d"); add q (3, "c"); + for i = 4 downto 1 do match pop_max q with + | None -> assert false + | Some (x, _) -> assert (x = i) + done + +(* testing with string elements *) +let () = + let open Pqueue.MakeMin(String) in + let a = [| "b"; "bar"; "a"; "aa"; "foo"; "ocaml" |] in + let n = Array.length a in + let q = create () in + for i = 0 to n - 1 do add q a.(i) done; + assert (length q = n); + Array.sort String.compare a; + for i = 0 to n - 1 do match pop_min q with + | None -> assert false + | Some x -> assert (x = a.(i)) + done; + assert (is_empty q) + +(* check the usage scenario from the .mli *) +module Prio : Pqueue.OrderedType = Int + +module PrioQueue = Pqueue.MakeMinPoly(struct + type 'a t = Prio.t * 'a + let compare (p1, _) (p2, _) = Prio.compare p1 p2 +end) + + +let () = print_endline "OK" diff --git a/testsuite/tests/lib-pqueue/test.reference b/testsuite/tests/lib-pqueue/test.reference new file mode 100644 index 00000000..d86bac9d --- /dev/null +++ b/testsuite/tests/lib-pqueue/test.reference @@ -0,0 +1 @@ +OK diff --git a/testsuite/tests/lib-result/test.ml b/testsuite/tests/lib-result/test.ml index c32c7dc3..02f68e7f 100644 --- a/testsuite/tests/lib-result/test.ml +++ b/testsuite/tests/lib-result/test.ml @@ -17,11 +17,22 @@ let test_value () = let test_get_ok_error () = assert (Result.get_ok (Ok 3) = 3); + assert (Result.get_ok' (Ok 3) = 3); assert_raise_invalid_argument Result.get_ok (Error "ha!"); + (match Result.get_ok' (Error "ha!") with + exception Invalid_argument "ha!" [@warning "-52"] -> (); + | _ -> assert false); assert (Result.get_error (Error "ha!") = "ha!"); assert_raise_invalid_argument Result.get_error (Ok 2); () +let test_error_to_failure () = + assert (Result.error_to_failure (Ok 3) = 3); + (match Result.error_to_failure (Error "ha") with + exception Failure "ha" [@warning "-52"] -> (); + | _ -> assert false); + () + let test_bind () = assert (Result.bind (Ok 3) (fun x -> Ok (succ x)) = Ok 4); assert (Result.bind (Ok 3) (fun x -> Error (strf "hu%d!" x)) = Error "hu3!"); @@ -42,6 +53,13 @@ let test_maps () = assert (Result.map_error succ (Ok 2) = Ok 2); () +let test_product () = + assert (Result.product (Ok "a") (Ok 3) = Ok ("a", 3)); + assert (Result.product (Ok "a") (Error "ha") = Error "ha"); + assert (Result.product (Error "hi") (Error "ha") = Error "hi"); + assert (Result.product (Error "hi") (Ok 3) = Error "hi"); + () + let test_fold () = assert (Result.fold ~ok:succ ~error:succ (Ok 1) = 2); assert (Result.fold ~ok:succ ~error:succ (Error 1) = 2); @@ -49,6 +67,11 @@ let test_fold () = assert (Result.(fold ~ok ~error) (Error "ha!") = (Error "ha!")); () +let test_retract () = + assert (Result.retract (Ok 3) = 3); + assert (Result.retract (Error 2) = 2); + () + let test_iters () = let count = ref 0 in let set_count x = count := x in @@ -110,19 +133,40 @@ let test_to_option_list_seq () = assert ((Result.to_seq (Error "ha!")) () = Seq.Nil); () +let test_syntax () = + let open Result.Syntax in + assert (Ok 5 = + let parse n = Ok n in + let* n0 = parse 3 in + let* n1 = parse 2 in + Ok (n0 + n1)); + assert (Ok 3 = + let+ one = Ok 1 + and+ two = Ok 2 in + one + two); + assert (Ok 1 = + let* three = Ok 3 in + let+ two = Ok 2 in + three - two); + () + let tests () = test_ok_error (); test_value (); test_get_ok_error (); + test_error_to_failure (); test_bind (); test_join (); test_maps (); + test_product (); test_fold (); + test_retract (); test_iters (); test_is_ok_error (); test_equal (); test_compare (); test_to_option_list_seq (); + test_syntax (); () let () = diff --git a/testsuite/tests/lib-runtime-events/test_corrupted.ml b/testsuite/tests/lib-runtime-events/test_corrupted.ml index 0444801b..e9a2ecff 100644 --- a/testsuite/tests/lib-runtime-events/test_corrupted.ml +++ b/testsuite/tests/lib-runtime-events/test_corrupted.ml @@ -2,7 +2,8 @@ include runtime_events; include unix; set OCAML_RUNTIME_EVENTS_PRESERVE = "1"; - libunix; + hasunix; + not-target-windows; { bytecode; }{ diff --git a/testsuite/tests/lib-runtime-events/test_dropped_events.ml b/testsuite/tests/lib-runtime-events/test_dropped_events.ml index 3dcf6fc8..2c0289f7 100644 --- a/testsuite/tests/lib-runtime-events/test_dropped_events.ml +++ b/testsuite/tests/lib-runtime-events/test_dropped_events.ml @@ -1,7 +1,7 @@ (* TEST include runtime_events; include unix; - set OCAMLRUNPARAM = "e=6"; + ocamlrunparam += ",e=6"; hasunix; { native; @@ -13,11 +13,16 @@ type Runtime_events.User.tag += Ev let ev = Runtime_events.User.register "ev" Ev Runtime_events.Type.int -let producer () = +let target_callbacks_count = 10 +let lost_events_callbacks = Atomic.make 0 + +let rec producer () = let open Runtime_events in for _ = 0 to 100000 do User.write ev 0 - done + done; + if Atomic.get lost_events_callbacks < target_callbacks_count then + producer () let ready = Atomic.make 0 @@ -34,9 +39,12 @@ let _ = wait_ready (); producer ()) +let lost_events _ _ = + Atomic.incr lost_events_callbacks + let callbacks = let open Runtime_events in - let evs = Runtime_events.Callbacks.create () + let evs = Runtime_events.Callbacks.create ~lost_events () in let id_callback d ts c i = assert (i = 0) @@ -48,7 +56,9 @@ let () Unix.sleepf 0.1; let cursor = Runtime_events.create_cursor None in wait_ready (); - for _ = 0 to 10 do - Runtime_events.read_poll cursor callbacks None - |> ignore + while Atomic.get lost_events_callbacks < target_callbacks_count do + for _ = 0 to 10 do + Runtime_events.read_poll cursor callbacks None + |> ignore + done done diff --git a/testsuite/tests/lib-runtime-events/test_external.ml b/testsuite/tests/lib-runtime-events/test_external.ml index df285e78..83f32339 100644 --- a/testsuite/tests/lib-runtime-events/test_external.ml +++ b/testsuite/tests/lib-runtime-events/test_external.ml @@ -1,7 +1,8 @@ (* TEST include runtime_events; include unix; - libunix; + hasunix; + not-target-windows; { bytecode; }{ diff --git a/testsuite/tests/lib-runtime-events/test_external_preserve.ml b/testsuite/tests/lib-runtime-events/test_external_preserve.ml index d5dd87c1..46212458 100644 --- a/testsuite/tests/lib-runtime-events/test_external_preserve.ml +++ b/testsuite/tests/lib-runtime-events/test_external_preserve.ml @@ -2,7 +2,8 @@ include runtime_events; include unix; set OCAML_RUNTIME_EVENTS_PRESERVE = "1"; - libunix; + hasunix; + not-target-windows; { bytecode; }{ diff --git a/testsuite/tests/lib-runtime-events/test_fork.ml b/testsuite/tests/lib-runtime-events/test_fork.ml index 6d6ca1ef..8d6fd825 100644 --- a/testsuite/tests/lib-runtime-events/test_fork.ml +++ b/testsuite/tests/lib-runtime-events/test_fork.ml @@ -1,7 +1,8 @@ (* TEST include runtime_events; include unix; - libunix; + hasunix; + not-target-windows; { bytecode; }{ diff --git a/testsuite/tests/lib-runtime-events/test_timestamp_monotonic.ml b/testsuite/tests/lib-runtime-events/test_timestamp_monotonic.ml new file mode 100644 index 00000000..91fa7a6c --- /dev/null +++ b/testsuite/tests/lib-runtime-events/test_timestamp_monotonic.ml @@ -0,0 +1,15 @@ + +(* TEST + include runtime_events; +*) +open Runtime_events + +let () = + start(); + + let t1 = Timestamp.get_current() |> Timestamp.to_int64 in + for _i = 0 to 1_000_000 do + ignore (Sys.opaque_identity _i : int) + done; + let t2 = Timestamp.get_current() |> Timestamp.to_int64 in + assert (Int64.succ t2 > Int64.succ t1) diff --git a/testsuite/tests/lib-runtime-events/test_user_event_signal.ml b/testsuite/tests/lib-runtime-events/test_user_event_signal.ml index 6837a887..02f7c8ff 100644 --- a/testsuite/tests/lib-runtime-events/test_user_event_signal.ml +++ b/testsuite/tests/lib-runtime-events/test_user_event_signal.ml @@ -2,7 +2,7 @@ include runtime_events; include unix; hasunix; - not-windows; + not-target-windows; { bytecode; } diff --git a/testsuite/tests/lib-runtime-events/test_user_event_unknown.ml b/testsuite/tests/lib-runtime-events/test_user_event_unknown.ml index 447b7b5c..1fa4a1d7 100644 --- a/testsuite/tests/lib-runtime-events/test_user_event_unknown.ml +++ b/testsuite/tests/lib-runtime-events/test_user_event_unknown.ml @@ -2,7 +2,8 @@ include runtime_events; include unix; set OCAML_RUNTIME_EVENTS_PRESERVE = "1"; - libunix; + hasunix; + not-target-windows; { bytecode; }{ diff --git a/testsuite/tests/lib-seq/test.ml b/testsuite/tests/lib-seq/test.ml index 2936213c..09e4aacc 100644 --- a/testsuite/tests/lib-seq/test.ml +++ b/testsuite/tests/lib-seq/test.ml @@ -20,6 +20,16 @@ let () = () ;; +(* filteri *) +let () = + assert + ([5;4] = + (List.to_seq [5;4;3;2;1;] + |> Seq.filteri (fun i _ -> i < 2) + |> List.of_seq)); + () +;; + (* unfold *) let () = let range first last = diff --git a/testsuite/tests/lib-string/test_string.ml b/testsuite/tests/lib-string/test_string.ml index 3a273132..55aad896 100644 --- a/testsuite/tests/lib-string/test_string.ml +++ b/testsuite/tests/lib-string/test_string.ml @@ -60,16 +60,75 @@ let () = while !sz <= 0 do push big l; sz += Sys.max_string_length done; try ignore (String.concat "" !l); assert false with Invalid_argument _ -> (); - assert(String.starts_with ~prefix:"foob" "foobarbaz"); - assert(String.starts_with ~prefix:"" "foobarbaz"); - assert(String.starts_with ~prefix:"" ""); - assert(not (String.starts_with ~prefix:"foobar" "bar")); - assert(not (String.starts_with ~prefix:"foo" "")); - assert(not (String.starts_with ~prefix:"fool" "foobar")); - assert(String.ends_with ~suffix:"baz" "foobarbaz"); - assert(String.ends_with ~suffix:"" "foobarbaz"); - assert(String.ends_with ~suffix:"" ""); - assert(not (String.ends_with ~suffix:"foobar" "bar")); - assert(not (String.ends_with ~suffix:"foo" "")); - assert(not (String.ends_with ~suffix:"obaz" "foobar")); end + +let () = + assert(String.starts_with ~prefix:"foob" "foobarbaz"); + assert(String.starts_with ~prefix:"" "foobarbaz"); + assert(String.starts_with ~prefix:"" ""); + assert(not (String.starts_with ~prefix:"foobar" "bar")); + assert(not (String.starts_with ~prefix:"foo" "")); + assert(not (String.starts_with ~prefix:"fool" "foobar")); + assert(String.ends_with ~suffix:"baz" "foobarbaz"); + assert(String.ends_with ~suffix:"" "foobarbaz"); + assert(String.ends_with ~suffix:"" ""); + assert(not (String.ends_with ~suffix:"foobar" "bar")); + assert(not (String.ends_with ~suffix:"foo" "")); + assert(not (String.ends_with ~suffix:"obaz" "foobar")); +;; + + +let () = + let test ?limit x y d = + assert (String.edit_distance ?limit x y = d); + assert (String.edit_distance ?limit y x = d); + assert (String.edit_distance ?limit x x = 0); + assert (String.edit_distance ?limit y y = 0); + in + test "" "" 0; + test "" "ab" 2; + test "function" "function" 0; + test "function" "fanction" 1; (* substitute *) + test "function" "fnction" 1; (* delete *) + test "function" "funiction" 1; (* insert *) + test "function" "funtcion" 1; (* transpose *) + test "function" "fantcion" 2; (* substitute + transpose *) + test "function" "fantcio" 3; (* substitute + transpose + delete *) + test "function" "efantcio" 4; (* all *) + test "fun" "function" 5; + test "fun" "function" ~limit:0 0; + test "fun" "function" ~limit:1 1; + test "fun" "function" ~limit:2 2; + test "fun" "function" ~limit:3 3; + test "fun" "function" ~limit:4 4; + test "fun" "function" ~limit:5 5; + test "fun" "function" ~limit:6 5; + test "ca" "abc" 3 (* Damerau-Levenshtein would be 2 *); + test "élément" "élment" 1; + test "OCaml🐫" "O'Caml🐪" 2; +;; + +let () = + let test ?max_dist dict s res = + let dict = fun yield -> List.iter yield dict in + assert (String.spellcheck ?max_dist dict s = res) + in + (* max_dist = 0 *) + test [""] "" [""]; + test ["a"; "b"] "" []; + test ["a"; "b"] "a" ["a"]; + test ["a"; "b"] "d" []; + test ["a"; "b"] "é" []; + test ["aa"; "aé"] "aé" ["aé"]; + test ["aa"; "aé"] "ad" []; + (* max_dist = 1 *) + test ["abc"; "abcé"] "abc" ["abc"]; + test ["abc"; "abcé"; "abcéd"] "abé" ["abc"; "abcé"]; + test ["abcdé"; "abcdéf"] "abcd" ["abcdé"]; + (* max_dist = 2 *) + test ["abcdéf"] "abcde" ["abcdéf"]; + test ["abcdéf"] "ubcde" []; + let max_dist s = if String.length s <= 1 then 1 else 2 in + test ~max_dist ["abc"] "a" []; + test ~max_dist ["abc"; "ab"; "b"] "a" ["ab"; "b"]; + () diff --git a/testsuite/tests/lib-sys/signal.ml b/testsuite/tests/lib-sys/signal.ml new file mode 100644 index 00000000..aa2cc78e --- /dev/null +++ b/testsuite/tests/lib-sys/signal.ml @@ -0,0 +1,86 @@ +(* TEST + include unix; + hasunix; + not-windows; + native; +*) +open Sys + +let () = + let r = ref false in + Sys.set_signal Sys.sigcont (Signal_handle (fun _ -> r := true)); + Unix.kill (Unix.getpid ()) Sys.sigcont; + let x = !r in + assert (x == true); (* Should trigger signal_handle for sigcont *) + r := false; + + Sys.set_signal Sys.sigcont (Signal_handle (fun _ -> r := true)); + Unix.kill (Unix.getpid ()) Sys.sigwinch; + let x = !r in + (* Sending sigwinch shouldn't trigger signal_handle for sigcont *) + assert (x == false); + r := false; + + Sys.set_signal Sys.sigwinch (Signal_handle (fun _ -> r := true)); + Unix.kill (Unix.getpid ()) Sys.sigwinch; + let x = !r in + assert (x == true); (* Should trigger signal_handle for sigwinch *) + r := false; + + Sys.set_signal Sys.sigio (Signal_handle (fun _ -> r := true)); + Unix.kill (Unix.getpid ()) Sys.sigio; + let x = !r in + assert (x == true); (* Should trigger signal_handle for sigio *) + + (* Signals should map to POSIX standard names *) + let signals = [(sighup, "SIGHUP"); + (sigint, "SIGINT"); + (sigquit, "SIGQUIT"); + (sigill, "SIGILL"); + (sigtrap, "SIGTRAP"); + (sigabrt, "SIGABRT"); + (sigfpe, "SIGFPE"); + (sigkill, "SIGKILL"); + (sigbus, "SIGBUS"); + (sigsegv, "SIGSEGV"); + (sigsys, "SIGSYS"); + (sigpipe, "SIGPIPE"); + (sigalrm, "SIGALRM"); + (sigterm, "SIGTERM"); + (sigurg, "SIGURG"); + (sigstop, "SIGSTOP"); + (sigtstp, "SIGTSTP"); + (sigcont, "SIGCONT"); + (sigchld, "SIGCHLD"); + (sigttin, "SIGTTIN"); + (sigttou, "SIGTTOU"); + (sigio, "SIGIO"); + (sigxcpu, "SIGXCPU"); + (sigxfsz, "SIGXFSZ"); + (sigvtalrm, "SIGVTALRM"); + (sigprof, "SIGPROF"); + (sigwinch, "SIGWINCH"); + (sigusr1, "SIGUSR1"); + (sigusr2, "SIGUSR2"); + (33, "SIG(33)");] in + List.iter (fun (s,str) -> assert (String.equal (Sys.signal_to_string s) str)) signals; + + r := false; + + Sys.set_signal 1 (Signal_handle (fun _ -> r := true)); + Unix.kill (Unix.getpid ()) 1; + let x = !r in + (* Should trigger signal_handle for signal corresponding to 1 SIGHUP? *) + assert (x == true); + + (* Should convert known signals between OCaml numbering and + platform numbering. *) + let platform_sighup = 1 (* SIGHUP on Linux and various BSDs *) in + let platform_signal = Sys.signal_to_int sighup in + let ocaml_signal = Sys.signal_of_int platform_sighup in + Printf.printf "SIGHUP platform_no: %d ocaml_no: %d\n" + platform_signal ocaml_signal; + assert (ocaml_signal == sighup && + platform_signal == platform_sighup); + + print_endline "Sys.set_signal works!" diff --git a/testsuite/tests/lib-sys/signal.reference b/testsuite/tests/lib-sys/signal.reference new file mode 100644 index 00000000..92d899e2 --- /dev/null +++ b/testsuite/tests/lib-sys/signal.reference @@ -0,0 +1,2 @@ +SIGHUP platform_no: 1 ocaml_no: -4 +Sys.set_signal works! diff --git a/testsuite/tests/lib-systhreads/eintr.ml b/testsuite/tests/lib-systhreads/eintr.ml index 56b7b857..b334deda 100644 --- a/testsuite/tests/lib-systhreads/eintr.ml +++ b/testsuite/tests/lib-systhreads/eintr.ml @@ -1,7 +1,7 @@ (* TEST include systhreads; hassysthreads; - not-windows; + not-target-windows; { bytecode; }{ diff --git a/testsuite/tests/lib-systhreads/test_c_thread_register.ml b/testsuite/tests/lib-systhreads/test_c_thread_register.ml index c18e49e4..912c1a51 100644 --- a/testsuite/tests/lib-systhreads/test_c_thread_register.ml +++ b/testsuite/tests/lib-systhreads/test_c_thread_register.ml @@ -1,6 +1,7 @@ (* TEST modules = "test_c_thread_register_cstubs.c"; include systhreads; + no-tsan; (* Flaky under TSan, disable until fixed (see issue #13472) *) hassysthreads; not-bsd; { diff --git a/testsuite/tests/lib-systhreads/testfork.ml b/testsuite/tests/lib-systhreads/testfork.ml index 92bcb18b..ace3e434 100644 --- a/testsuite/tests/lib-systhreads/testfork.ml +++ b/testsuite/tests/lib-systhreads/testfork.ml @@ -2,7 +2,8 @@ include systhreads; hassysthreads; not-bsd; - libunix; + hasunix; + not-target-windows; no-tsan; (* tsan limitation: starting new threads after fork is not supported *) { bytecode; diff --git a/testsuite/tests/lib-systhreads/testfork2.ml b/testsuite/tests/lib-systhreads/testfork2.ml index bea41022..07a4d0b9 100644 --- a/testsuite/tests/lib-systhreads/testfork2.ml +++ b/testsuite/tests/lib-systhreads/testfork2.ml @@ -2,7 +2,8 @@ include systhreads; hassysthreads; not-bsd; - libunix; + hasunix; + not-target-windows; { bytecode; }{ diff --git a/testsuite/tests/lib-systhreads/testpreempt.ml b/testsuite/tests/lib-systhreads/testpreempt.ml index 5b30ea94..ae2e2ca2 100644 --- a/testsuite/tests/lib-systhreads/testpreempt.ml +++ b/testsuite/tests/lib-systhreads/testpreempt.ml @@ -6,7 +6,7 @@ However, this does not seem very reliable, so that this test fails on some Windows configurations. See GPR #1533. *) - not-windows; + not-target-windows; { bytecode; }{ diff --git a/testsuite/tests/lib-systhreads/testyield.ml b/testsuite/tests/lib-systhreads/testyield.ml index 29758cac..7b4ba050 100644 --- a/testsuite/tests/lib-systhreads/testyield.ml +++ b/testsuite/tests/lib-systhreads/testyield.ml @@ -1,7 +1,7 @@ (* TEST include systhreads; hassysthreads; - not-windows; + not-target-windows; { bytecode; }{ diff --git a/testsuite/tests/lib-systhreads/threadsigmask.ml b/testsuite/tests/lib-systhreads/threadsigmask.ml index 9b84ffa8..4eea4ce4 100644 --- a/testsuite/tests/lib-systhreads/threadsigmask.ml +++ b/testsuite/tests/lib-systhreads/threadsigmask.ml @@ -1,7 +1,7 @@ (* TEST include systhreads; hassysthreads; - not-windows; + not-target-windows; { bytecode; }{ diff --git a/testsuite/tests/lib-threads/delayintr.ml b/testsuite/tests/lib-threads/delayintr.ml index 924d3179..1917bf3f 100644 --- a/testsuite/tests/lib-threads/delayintr.ml +++ b/testsuite/tests/lib-threads/delayintr.ml @@ -2,7 +2,7 @@ include systhreads; readonly_files = "sigint.c"; hassysthreads; - libunix; (* excludes mingw32/64 and msvc32/64 *) + not-target-windows; (* excludes mingw32/64 and msvc32/64 *) { program = "${test_build_directory}/delayintr.byte"; setup-ocamlc.byte-build-env; diff --git a/testsuite/tests/lib-threads/signal.ml b/testsuite/tests/lib-threads/signal.ml index 90732479..81922426 100644 --- a/testsuite/tests/lib-threads/signal.ml +++ b/testsuite/tests/lib-threads/signal.ml @@ -2,7 +2,7 @@ include systhreads; readonly_files = "sigint.c"; hassysthreads; - libunix; (* excludes mingw32/64 and msvc32/64 *) + not-target-windows; (* excludes mingw32/64 and msvc32/64 *) { program = "${test_build_directory}/signal.byte"; setup-ocamlc.byte-build-env; diff --git a/testsuite/tests/lib-threads/sockets.ml b/testsuite/tests/lib-threads/sockets.ml index 23ec204b..ad2921d6 100644 --- a/testsuite/tests/lib-threads/sockets.ml +++ b/testsuite/tests/lib-threads/sockets.ml @@ -1,7 +1,7 @@ (* TEST include systhreads; hassysthreads; - libunix; (* Broken on Windows (missing join?), needs to be fixed *) + not-target-windows; (* Broken on Windows (missing join?), needs to be fixed *) { bytecode; }{ diff --git a/testsuite/tests/lib-uchar/test.ml b/testsuite/tests/lib-uchar/test.ml index 134fdf00..7663295c 100644 --- a/testsuite/tests/lib-uchar/test.ml +++ b/testsuite/tests/lib-uchar/test.ml @@ -94,6 +94,15 @@ let test_utf_decode () = assert (Uchar.equal (Uchar.utf_decode_uchar invalid) Uchar.rep); () +let test_utf_8_decode_length_of_byte () = + assert (Uchar.utf_8_decode_length_of_byte "a".[0] = 1); + assert (Uchar.utf_8_decode_length_of_byte "é".[0] = 2); + assert (Uchar.utf_8_decode_length_of_byte "‘".[0] = 3); + assert (Uchar.utf_8_decode_length_of_byte "🐫".[0] = + Uchar.max_utf_8_decode_length); + assert (Uchar.utf_8_decode_length_of_byte "\xFF".[0] = 0); + () + let test_utf_x_byte_length () = assert (Uchar.utf_8_byte_length Uchar.min = 1); assert (Uchar.utf_16_byte_length Uchar.min = 2); @@ -119,6 +128,7 @@ let tests () = test_compare (); test_hash (); test_utf_decode (); + test_utf_8_decode_length_of_byte (); test_utf_x_byte_length (); () diff --git a/testsuite/tests/lib-unix/common/cloexec.ml b/testsuite/tests/lib-unix/common/cloexec.ml index 9723a778..3cb1d3a6 100644 --- a/testsuite/tests/lib-unix/common/cloexec.ml +++ b/testsuite/tests/lib-unix/common/cloexec.ml @@ -1,22 +1,8 @@ (* TEST include unix; readonly_files = "fdstatus_aux.c fdstatus_main.ml"; - (* - This test is temporarily disabled on the MinGW and MSVC ports, - because since fdstatus has been wrapped in an OCaml program, - it does not work as well as before. - Presumably this is because the OCaml runtime opens files, so that handles - that have actually been closed at execution look open and make the - test fail. - - One possible fix for this would be to make it possible for ocamltest to - compile C-only programs, which will be a bit of work to handle the - output of msvc and will also duplicate what the OCaml compiler itself - already does. - *) hasunix; - libunix; { program = "${test_build_directory}/cloexec.byte"; setup-ocamlc.byte-build-env; @@ -24,11 +10,19 @@ all_modules = "fdstatus_aux.c fdstatus_main.ml"; ocamlc.byte; program = "${test_build_directory}/cloexec.byte"; - all_modules = "cloexec.ml"; + all_modules = "fdstatus_aux.c cloexec.ml"; ocamlc.byte; check-ocamlc.byte-output; - run; - check-program-output; + { + arguments = "execv"; + run; + check-program-output; + }{ + not-target-windows; (* Unix.create_process doesn't pass fds on Windows *) + arguments = "create_process"; + run; + check-program-output; + } }{ program = "${test_build_directory}/cloexec.opt"; setup-ocamlopt.byte-build-env; @@ -36,43 +30,33 @@ all_modules = "fdstatus_aux.c fdstatus_main.ml"; ocamlopt.byte; program = "${test_build_directory}/cloexec.opt"; - all_modules = "cloexec.ml"; + all_modules = "fdstatus_aux.c cloexec.ml"; ocamlopt.byte; check-ocamlopt.byte-output; - run; - check-program-output; + { + arguments = "execv"; + run; + check-program-output; + }{ + not-target-windows; (* Unix.create_process doesn't pass fds on Windows *) + arguments = "create_process"; + run; + check-program-output; + } } *) -(* This is a terrible hack that plays on the internal representation - of file descriptors. The result is a number (as a string) - that the fdstatus.exe auxiliary program can use to check whether - the fd is open. Moreover, since fdstatus.exe is an OCaml program, - we must take into account that the Windows OCaml runtime opens a few handles - for its own use, hence we do likewise to try to get handle numbers - Windows will not allocate to the OCaml runtime of fdstatus.exe *) - -let string_of_fd (fd: Unix.file_descr) : string = - match Sys.os_type with - | "Unix" | "Cygwin" -> Int.to_string (Obj.magic fd : int) - | "Win32" -> - if Sys.word_size = 32 then - Int32.to_string (Obj.magic fd : int32) - else - Int64.to_string (Obj.magic fd : int64) - | _ -> assert false +external fd_of_file_descr : Unix.file_descr -> int = "caml_fd_of_filedescr" +let string_of_fd fd = Int.to_string (fd_of_file_descr fd) let status_checker = "fdstatus.exe" let _ = - let f0 = Unix.(openfile "tmp.txt" [O_WRONLY; O_CREAT; O_TRUNC] 0o600) in - let untested1 = Unix.(openfile "tmp.txt" [O_RDONLY; O_CLOEXEC] 0) in - let untested2 = Unix.(openfile "tmp.txt" [O_RDONLY; O_CLOEXEC] 0) in - let untested3 = Unix.(openfile "tmp.txt" [O_RDONLY; O_CLOEXEC] 0) in - let untested4 = Unix.(openfile "tmp.txt" [O_RDONLY; O_CLOEXEC] 0) in - let untested5 = Unix.(openfile "tmp.txt" [O_RDONLY; O_CLOEXEC] 0) in - let f1 = Unix.(openfile "tmp.txt" [O_RDONLY; O_KEEPEXEC] 0) in - let f2 = Unix.(openfile "tmp.txt" [O_RDONLY; O_CLOEXEC] 0) in + let f0 = + Unix.(openfile "tmp.txt" [O_WRONLY; O_CREAT; O_TRUNC; O_SHARE_DELETE] 0o600) + in + let f1 = Unix.(openfile "tmp.txt" [O_RDONLY; O_KEEPEXEC; O_SHARE_DELETE] 0) in + let f2 = Unix.(openfile "tmp.txt" [O_RDONLY; O_CLOEXEC; O_SHARE_DELETE] 0) in let d0 = Unix.dup f0 in let d1 = Unix.dup ~cloexec:false f1 in let d2 = Unix.dup ~cloexec:true f2 in @@ -82,31 +66,49 @@ let _ = let s0 = Unix.(socket PF_INET SOCK_STREAM 0) in let s1 = Unix.(socket ~cloexec:false PF_INET SOCK_STREAM 0) in let s2 = Unix.(socket ~cloexec:true PF_INET SOCK_STREAM 0) in - let (x0, x0') = - try Unix.(socketpair PF_UNIX SOCK_STREAM 0) - with Invalid_argument _ -> (p0, p0') in - (* socketpair not available under Win32; keep the same output *) - let (x1, x1') = - try Unix.(socketpair ~cloexec:false PF_UNIX SOCK_STREAM 0) - with Invalid_argument _ -> (p1, p1') in - let (x2, x2') = - try Unix.(socketpair ~cloexec:true PF_UNIX SOCK_STREAM 0) - with Invalid_argument _ -> (p2, p2') in + let (x0, x0') = Unix.(socketpair PF_UNIX SOCK_STREAM 0) in + let (x1, x1') = Unix.(socketpair ~cloexec:false PF_UNIX SOCK_STREAM 0) in + let (x2, x2') = Unix.(socketpair ~cloexec:true PF_UNIX SOCK_STREAM 0) in let fds = [| f0;f1;f2; d0;d1;d2; p0;p0';p1;p1';p2;p2'; s0;s1;s2; x0;x0';x1;x1';x2;x2' |] in - let untested = - [untested1; untested2; untested3; untested4; untested5] - in - let pid = - Unix.create_process + let string_fds = (Array.map string_of_fd fds) in + (* NB On Windows, as documented, execv terminates immediately, which is + usually a problem. However, ocamltest runs tests in a process group and + the test step is not terminated until _all_ processes have completed, so + we can use Unix.execv here, even on Windows. *) + if Sys.argv.(1) = "execv" then + let () = + (* The Windows implementation of exec in the CRT uses CreateProcess and + then calls _exit to terminate itself. There is a race, which can be + seen on slower machines, where the test begins running before this + call has happened, and which results in tmp.txt still being locked when + fdstatus_main.ml tries to delete it, leading to a "Permission denied" + exception. To prevent this, lock.txt is created and locked for writing + by this process. If the checker then sees that lock.txt exists, it + attempts to acquire a write lock on it, which will succeed only after + this process has completely exited and its lock has been automatically + released via process termination. + This dance is strictly done on native on Windows only, because execv + hanging on to open files in this way with a Unix kernel is a very + serious misimplementation of execv! *) + if Sys.win32 then + let lock = + Unix.(openfile "lock.txt" [O_WRONLY; O_CREAT; + O_TRUNC; O_CLOEXEC] 0o600) in + Unix.lockf lock Unix.F_LOCK 0 in + Unix.execv (Filename.concat Filename.current_dir_name status_checker) - (Array.append [| status_checker |] (Array.map string_of_fd fds)) - Unix.stdin Unix.stdout Unix.stderr in - ignore (Unix.waitpid [] pid); - let close fd = try Unix.close fd with Unix.Unix_error _ -> () in - Array.iter close fds; - List.iter close untested; - Sys.remove "tmp.txt" + (Array.append [| status_checker; Sys.argv.(1) |] string_fds) + else + let pid = + Unix.create_process + (Filename.concat Filename.current_dir_name status_checker) + (Array.append [| status_checker; Sys.argv.(1) |] string_fds) + Unix.stdin Unix.stdout Unix.stderr in + ignore (Unix.waitpid [] pid); + let close fd = try Unix.close fd with Unix.Unix_error _ -> () in + Array.iter close fds; + Sys.remove "tmp.txt" diff --git a/testsuite/tests/lib-unix/common/fdstatus_aux.c b/testsuite/tests/lib-unix/common/fdstatus_aux.c index c5b4b6bf..39ef6023 100644 --- a/testsuite/tests/lib-unix/common/fdstatus_aux.c +++ b/testsuite/tests/lib-unix/common/fdstatus_aux.c @@ -1,43 +1,20 @@ /* Check if file descriptors are open or not */ -#include -#include - #ifdef _WIN32 - -#define WIN32_LEAN_AND_MEAN -#include -#include -#include - -void process_fd(const char * s) -{ - int fd; - HANDLE h; - DWORD flags; - -#ifdef _WIN64 - h = (HANDLE) _atoi64(s); +#define UNICODE +#define _CRT_NONSTDC_NO_WARNINGS +#include #else - h = (HANDLE) atoi(s); +#include #endif - if (GetHandleInformation(h, &flags)) { - printf("open\n"); - } else if (GetLastError() == ERROR_INVALID_HANDLE) { - printf("closed\n"); - } else { - printf("error %lu\n", (unsigned long)(GetLastError())); - } -} - -#else +#include +#include #include #include #include #include #include -#include void process_fd(const char * s) { @@ -53,6 +30,7 @@ void process_fd(const char * s) fd = (int) n; if (fstat(fd, &st) != -1) { printf("open\n"); + close(fd); } else if (errno == EBADF) { printf("closed\n"); } else { @@ -60,10 +38,10 @@ void process_fd(const char * s) } } -#endif - #include #include +#include +#include CAMLprim value caml_process_fd(value CAMLnum, value CAMLfd) { @@ -72,3 +50,40 @@ CAMLprim value caml_process_fd(value CAMLnum, value CAMLfd) process_fd(String_val(CAMLfd)); CAMLreturn(Val_unit); } + +CAMLprim value caml_fd_of_filedescr(value v) +{ + CAMLparam1(v); + +#ifdef _WIN32 + int fd = caml_win32_CRT_fd_of_filedescr(v); +#else + int fd = Int_val(v); +#endif + + CAMLreturn(Val_int(fd)); +} + +CAMLprim value caml_win32_delete_on_close(value path) +{ + CAMLparam1(path); + +#ifdef _WIN32 + char_os *wpath = caml_stat_strdup_to_utf16(String_val(path)); + /* Open the file with FILE_FLAG_DELETE_ON_CLOSE - all previous calls to + Unix.openfile need to have specified Unix.O_SHARE_DELETE or this will fail. + The handle the intention "leaks" - it will be automatically closed when the + process exits, at which point Windows will delete it. */ + HANDLE h = + CreateFile(wpath, GENERIC_READ, + FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, + OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE, NULL); + caml_stat_free(wpath); + if (h == INVALID_HANDLE_VALUE) { + caml_win32_maperr(GetLastError()); + caml_uerror("delete_on_close", path); + } +#endif + + CAMLreturn(Val_unit); +} diff --git a/testsuite/tests/lib-unix/common/fdstatus_main.ml b/testsuite/tests/lib-unix/common/fdstatus_main.ml index 93f3922b..6e881fa7 100644 --- a/testsuite/tests/lib-unix/common/fdstatus_main.ml +++ b/testsuite/tests/lib-unix/common/fdstatus_main.ml @@ -1,7 +1,35 @@ -external process_fd : int -> string -> unit = "caml_process_fd" +external process_and_close_fd : int -> string -> unit = "caml_process_fd" +external delete_on_close : string -> unit = "caml_win32_delete_on_close" let () = - for i = 1 to (Array.length Sys.argv) -1 + if Sys.win32 then + (* Ensure the ancestor process has definitely terminated (and therefore + closed its handles to tmp.txt) *) + let wait_until file = + if Sys.file_exists file then + let fd = Unix.openfile file [O_RDWR] 0o600 in + Unix.lockf fd Unix.F_LOCK 0; + Unix.close fd; + Sys.remove file + in + wait_until "lock.txt" + +let () = + (* Windows virus scanning can easily get in the way here on slower VMs. When + the file is closed, systems such as Windows Defender may trigger and open + the file, preventing its deletion. There are various mitigations - the + typical one is to use a retry-loop for a couple of seconds, but given that + this really is a temporary file and we already have a C stub for the fd + checking, we use a slightly different approach and instead open the file + using FILE_FLAG_DELETE_ON_CLOSE and let Windows take care of removing the + file - after Windows Defender at al have "finished" with it *) + if Sys.argv.(1) = "execv" && Sys.win32 then + delete_on_close "tmp.txt"; + for i = 2 to (Array.length Sys.argv) -1 do - process_fd i Sys.argv.(i); - done + process_and_close_fd (i - 1) Sys.argv.(i); + done; + (* For the execv version of the test, clean-up tmp.txt - for the + Unix.create_process version, this is done by cloexec.ml *) + if Sys.argv.(1) = "execv" && not Sys.win32 then + Sys.remove "tmp.txt" diff --git a/testsuite/tests/lib-unix/common/fork_cleanup.ml b/testsuite/tests/lib-unix/common/fork_cleanup.ml index 0206c01b..b26ddd68 100644 --- a/testsuite/tests/lib-unix/common/fork_cleanup.ml +++ b/testsuite/tests/lib-unix/common/fork_cleanup.ml @@ -1,7 +1,7 @@ (* TEST include unix; hasunix; - not-windows; + not-target-windows; { bytecode; }{ diff --git a/testsuite/tests/lib-unix/common/fork_cleanup_systhreads.ml b/testsuite/tests/lib-unix/common/fork_cleanup_systhreads.ml index a25f217b..1031cdf1 100644 --- a/testsuite/tests/lib-unix/common/fork_cleanup_systhreads.ml +++ b/testsuite/tests/lib-unix/common/fork_cleanup_systhreads.ml @@ -1,7 +1,7 @@ (* TEST include systhreads; hassysthreads; - not-windows; + not-target-windows; { bytecode; }{ diff --git a/testsuite/tests/lib-unix/common/multicore_fork_domain_alone.ml b/testsuite/tests/lib-unix/common/multicore_fork_domain_alone.ml index cb208134..6551aaa7 100644 --- a/testsuite/tests/lib-unix/common/multicore_fork_domain_alone.ml +++ b/testsuite/tests/lib-unix/common/multicore_fork_domain_alone.ml @@ -1,7 +1,7 @@ (* TEST include unix; hasunix; - not-windows; + not-target-windows; { bytecode; }{ diff --git a/testsuite/tests/lib-unix/common/multicore_fork_domain_alone2.ml b/testsuite/tests/lib-unix/common/multicore_fork_domain_alone2.ml index edcf0ae0..ad26b0ec 100644 --- a/testsuite/tests/lib-unix/common/multicore_fork_domain_alone2.ml +++ b/testsuite/tests/lib-unix/common/multicore_fork_domain_alone2.ml @@ -1,7 +1,7 @@ (* TEST include unix; hasunix; - not-windows; + not-target-windows; { bytecode; }{ diff --git a/testsuite/tests/lib-unix/common/sigwait.ml b/testsuite/tests/lib-unix/common/sigwait.ml new file mode 100644 index 00000000..1cda2aa7 --- /dev/null +++ b/testsuite/tests/lib-unix/common/sigwait.ml @@ -0,0 +1,25 @@ +(* TEST + include unix; + hasunix; + not-target-windows; + { + bytecode; + }{ + native; + } +*) + +let handler _signo = + print_string "Should not happen!"; print_newline() + +let raiser () = + Unix.kill (Unix.getpid()) Sys.sigusr1 + +let _ = + Sys.set_signal Sys.sigusr1 (Sys.Signal_handle handler); + let signals_of_interest = [Sys.sigusr1; Sys.sigusr2] in + ignore (Unix.(sigprocmask SIG_BLOCK signals_of_interest)); + let d = Domain.spawn raiser in + let signo = Unix.sigwait signals_of_interest in + Domain.join d; + assert (signo = Sys.sigusr1) diff --git a/testsuite/tests/lib-unix/isatty/isatty_tty.ml b/testsuite/tests/lib-unix/isatty/isatty_tty.ml index aeed2f78..fdca4f0e 100644 --- a/testsuite/tests/lib-unix/isatty/isatty_tty.ml +++ b/testsuite/tests/lib-unix/isatty/isatty_tty.ml @@ -1,6 +1,7 @@ (* TEST include unix; - libwin32unix; + hasunix; + target-windows; { bytecode; }{ diff --git a/testsuite/tests/lib-unix/kill/unix_kill.ml b/testsuite/tests/lib-unix/kill/unix_kill.ml index 942b5bb0..53b2b738 100644 --- a/testsuite/tests/lib-unix/kill/unix_kill.ml +++ b/testsuite/tests/lib-unix/kill/unix_kill.ml @@ -1,6 +1,7 @@ (* TEST include unix; - libunix; + hasunix; + not-target-windows; (* Disabled on MacOS amd64 with TSan due to a possible infinite signal loop with TSan under MacOS diff --git a/testsuite/tests/lib-unix/win-channel-of/parallel_channel_of.ml b/testsuite/tests/lib-unix/win-channel-of/parallel_channel_of.ml index 4670a410..30739d99 100644 --- a/testsuite/tests/lib-unix/win-channel-of/parallel_channel_of.ml +++ b/testsuite/tests/lib-unix/win-channel-of/parallel_channel_of.ml @@ -1,7 +1,8 @@ (* TEST modules = "fd_of_channel.c"; include unix; - libwin32unix; + hasunix; + target-windows; { bytecode; }{ diff --git a/testsuite/tests/lib-unix/win-createprocess/test.ml b/testsuite/tests/lib-unix/win-createprocess/test.ml index d648f284..541cd89b 100644 --- a/testsuite/tests/lib-unix/win-createprocess/test.ml +++ b/testsuite/tests/lib-unix/win-createprocess/test.ml @@ -1,6 +1,7 @@ (* TEST include unix; - libwin32unix; + hasunix; + target-windows; { bytecode; }{ diff --git a/testsuite/tests/lib-unix/win-env/test_env.ml b/testsuite/tests/lib-unix/win-env/test_env.ml index 3b9ca9a4..be06e704 100644 --- a/testsuite/tests/lib-unix/win-env/test_env.ml +++ b/testsuite/tests/lib-unix/win-env/test_env.ml @@ -4,7 +4,8 @@ include unix; flags += "-strict-sequence -w +A-70 -warn-error +A"; modules = "stubs.c"; - libwin32unix; + hasunix; + target-windows; { bytecode; }{ diff --git a/testsuite/tests/lib-unix/win-socketpair/test.ml b/testsuite/tests/lib-unix/win-socketpair/test.ml index cecd4a54..3ada612e 100644 --- a/testsuite/tests/lib-unix/win-socketpair/test.ml +++ b/testsuite/tests/lib-unix/win-socketpair/test.ml @@ -1,8 +1,8 @@ (* TEST script = "sh ${test_source_directory}/has-afunix.sh"; - libwin32unix; include systhreads; hassysthreads; + target-windows; script; { output = "${test_build_directory}/program-output"; diff --git a/testsuite/tests/lib-unix/win-stat/test.ml b/testsuite/tests/lib-unix/win-stat/test.ml index a4722e23..a9e86467 100644 --- a/testsuite/tests/lib-unix/win-stat/test.ml +++ b/testsuite/tests/lib-unix/win-stat/test.ml @@ -1,7 +1,8 @@ (* TEST modules = "fakeclock.c"; include unix; - libwin32unix; + hasunix; + target-windows; { bytecode; }{ diff --git a/testsuite/tests/lib-unix/win-symlink/parallel_symlink.ml b/testsuite/tests/lib-unix/win-symlink/parallel_symlink.ml index 3d36ad19..ef00770d 100644 --- a/testsuite/tests/lib-unix/win-symlink/parallel_symlink.ml +++ b/testsuite/tests/lib-unix/win-symlink/parallel_symlink.ml @@ -1,6 +1,7 @@ (* TEST include unix; - libwin32unix; + hasunix; + target-windows; has_symlink; { bytecode; diff --git a/testsuite/tests/lib-unix/win-symlink/test.ml b/testsuite/tests/lib-unix/win-symlink/test.ml index 72426a23..169505ec 100644 --- a/testsuite/tests/lib-unix/win-symlink/test.ml +++ b/testsuite/tests/lib-unix/win-symlink/test.ml @@ -1,6 +1,7 @@ (* TEST include unix; - libwin32unix; + hasunix; + target-windows; has_symlink; { bytecode; diff --git a/testsuite/tests/local-functions/non_local.compilers.reference b/testsuite/tests/local-functions/non_local.compilers.reference index 3e514dd5..3fd2e9fe 100644 --- a/testsuite/tests/local-functions/non_local.compilers.reference +++ b/testsuite/tests/local-functions/non_local.compilers.reference @@ -1,4 +1,5 @@ File "non_local.ml", line 21, characters 16-25: 21 | let[@local] f y = x + y in ^^^^^^^^^ -Warning 55 [inlining-impossible]: Cannot inline: This function cannot be compiled into a static continuation +Warning 55 [inlining-impossible]: Cannot inline: + This function cannot be compiled into a static continuation diff --git a/testsuite/tests/match-exception-warnings/exhaustiveness_warnings.ml b/testsuite/tests/match-exception-warnings/exhaustiveness_warnings.ml index 63cd731b..b9a6d8c0 100644 --- a/testsuite/tests/match-exception-warnings/exhaustiveness_warnings.ml +++ b/testsuite/tests/match-exception-warnings/exhaustiveness_warnings.ml @@ -22,8 +22,7 @@ Lines 8-11, characters 4-16: 10 | | Some false -> () 11 | | None -> () Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -Some true + Here is an example of a case that is not matched: "Some true" val test_match_exhaustiveness : unit -> unit = |}] @@ -41,8 +40,7 @@ Lines 2-4, characters 4-30: 3 | | Some false -> () 4 | | None | exception _ -> () Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -Some true + Here is an example of a case that is not matched: "Some true" val test_match_exhaustiveness_nest1 : unit -> unit = |}] @@ -60,8 +58,7 @@ Lines 2-4, characters 4-16: 3 | | Some false | exception _ -> () 4 | | None -> () Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -Some true + Here is an example of a case that is not matched: "Some true" val test_match_exhaustiveness_nest2 : unit -> unit = |}] @@ -81,8 +78,7 @@ Lines 2-5, characters 4-30: 4 | | Some false | exception _ -> () 5 | | None | exception _ -> () Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -Some true + Here is an example of a case that is not matched: "Some true" Line 4, characters 29-30: 4 | | Some false | exception _ -> () diff --git a/testsuite/tests/match-side-effects/check_partial.ml b/testsuite/tests/match-side-effects/check_partial.ml index 53fcea45..babb22ed 100644 --- a/testsuite/tests/match-side-effects/check_partial.ml +++ b/testsuite/tests/match-side-effects/check_partial.ml @@ -1,5 +1,5 @@ (* TEST - flags = "-dlambda"; + flags = "-dlambda -dcanonical-ids"; expect; *) @@ -26,22 +26,22 @@ let lazy_total : _ * bool t -> int = function 0 type _ t = Int : int -> int t | True : bool t | False : bool t (let - (lazy_total/281 = - (function param/283 : int - (let (*match*/285 =o (field_mut 0 (field_imm 0 param/283))) - (switch* (field_imm 1 param/283) + (lazy_total/0 = + (function param/0 : int + (let (*match*/0 =o (field_mut 0 (field_imm 0 param/0))) + (switch* (field_imm 1 param/0) case int 0: 0 case int 1: (let - (*match*/293 = - (let (tag/288 =a (caml_obj_tag *match*/285)) - (if (== tag/288 250) (field_mut 0 *match*/285) - (if (|| (== tag/288 246) (== tag/288 244)) + (*match*/1 = + (let (tag/0 =a (caml_obj_tag *match*/0)) + (if (== tag/0 250) (field_mut 0 *match*/0) + (if (|| (== tag/0 246) (== tag/0 244)) (apply (field_imm 1 (global CamlinternalLazy!)) - (opaque *match*/285)) - *match*/285)))) + (opaque *match*/0)) + *match*/0)))) 12))))) - (apply (field_mut 1 (global Toploop!)) "lazy_total" lazy_total/281)) + (apply (field_mut 1 (global Toploop!)) "lazy_total" lazy_total/0)) val lazy_total : unit lazy_t ref * bool t -> int = |}];; @@ -52,29 +52,29 @@ let lazy_needs_partial : _ * bool t ref -> int = function necessary for soundness. *) [%%expect {| (let - (lazy_needs_partial/295 = - (function param/297 : int + (lazy_needs_partial/0 = + (function param/1 : int (catch (let - (*match*/298 =a (field_imm 0 param/297) - *match*/300 =o (field_mut 0 (field_imm 1 param/297))) - (switch* *match*/300 + (*match*/2 =a (field_imm 0 param/1) + *match*/3 =o (field_mut 0 (field_imm 1 param/1))) + (switch* *match*/3 case int 0: 0 case int 1: (let - (*match*/303 = - (let (tag/302 =a (caml_obj_tag *match*/298)) - (if (== tag/302 250) (field_mut 0 *match*/298) - (if (|| (== tag/302 246) (== tag/302 244)) + (*match*/4 = + (let (tag/1 =a (caml_obj_tag *match*/2)) + (if (== tag/1 250) (field_mut 0 *match*/2) + (if (|| (== tag/1 246) (== tag/1 244)) (apply (field_imm 1 (global CamlinternalLazy!)) - (opaque *match*/298)) - *match*/298))) - *match*/305 =o (field_mut 0 (field_imm 1 param/297))) - (if (isint *match*/305) (if *match*/305 12 (exit 3)) (exit 3))))) + (opaque *match*/2)) + *match*/2))) + *match*/5 =o (field_mut 0 (field_imm 1 param/1))) + (if (isint *match*/5) (if *match*/5 12 (exit 3)) (exit 3))))) with (3) - (raise (makeblock 0 (global Match_failure/20!) [0: "" 1 49]))))) + (raise (makeblock 0 (global Match_failure/0!) [0: "" 1 49]))))) (apply (field_mut 1 (global Toploop!)) "lazy_needs_partial" - lazy_needs_partial/295)) + lazy_needs_partial/0)) val lazy_needs_partial : unit lazy_t * bool t ref -> int = |}];; @@ -86,13 +86,13 @@ let guard_total : bool t ref -> int = function necessary for soundness. *) [%%expect {| (let - (guard_total/306 = - (function param/383 : int + (guard_total/0 = + (function param/2 : int (if (opaque 0) 1 - (let (*match*/384 =o (field_mut 0 param/383)) - (if (isint *match*/384) (if *match*/384 12 0) - (raise (makeblock 0 (global Match_failure/20!) [0: "" 1 38]))))))) - (apply (field_mut 1 (global Toploop!)) "guard_total" guard_total/306)) + (let (*match*/6 =o (field_mut 0 param/2)) + (if (isint *match*/6) (if *match*/6 12 0) + (raise (makeblock 0 (global Match_failure/0!) [0: "" 1 38]))))))) + (apply (field_mut 1 (global Toploop!)) "guard_total" guard_total/0)) val guard_total : bool t ref -> int = |}];; @@ -104,15 +104,15 @@ let guard_needs_partial : bool t ref -> int = function necessary for soundness. *) [%%expect {| (let - (guard_needs_partial/385 = - (function param/387 : int - (let (*match*/388 =o (field_mut 0 param/387)) - (catch (if (isint *match*/388) (if *match*/388 (exit 9) 0) (exit 9)) + (guard_needs_partial/0 = + (function param/3 : int + (let (*match*/7 =o (field_mut 0 param/3)) + (catch (if (isint *match*/7) (if *match*/7 (exit 9) 0) (exit 9)) with (9) (if (opaque 0) 1 - (if (isint *match*/388) 12 - (raise (makeblock 0 (global Match_failure/20!) [0: "" 1 46])))))))) + (if (isint *match*/7) 12 + (raise (makeblock 0 (global Match_failure/0!) [0: "" 1 46])))))))) (apply (field_mut 1 (global Toploop!)) "guard_needs_partial" - guard_needs_partial/385)) + guard_needs_partial/0)) val guard_needs_partial : bool t ref -> int = |}];; diff --git a/testsuite/tests/match-side-effects/partiality.ml b/testsuite/tests/match-side-effects/partiality.ml index b833dcb5..a8c5429d 100644 --- a/testsuite/tests/match-side-effects/partiality.ml +++ b/testsuite/tests/match-side-effects/partiality.ml @@ -1,5 +1,5 @@ (* TEST - flags = "-dlambda"; + flags = "-dlambda -dcanonical-ids"; expect; *) @@ -35,24 +35,24 @@ Lines 4-8, characters 2-32: 6 | | {a = _; b = None} -> 1 7 | | {a = _; b = _} when (x.b <- None; false) -> 2 8 | | {a = true; b = Some y} -> y -Warning 74 [degraded-to-partial-match]: This pattern-matching is compiled -as partial, even if it appears to be total. It may generate a Match_failure -exception. This typically occurs due to complex matches on mutable fields. -(see manual section 13.5.5) +Warning 74 [degraded-to-partial-match]: This pattern-matching is compiled as + partial, even if it appears to be total. It may generate a "Match_failure" + exception. This typically occurs due to complex matches on mutable fields. + (see manual section 13.5.5) (let - (f/280 = - (function x/282 : int - (if (field_int 0 x/282) - (let (*match*/286 =o (field_mut 1 x/282)) - (if *match*/286 - (if (seq (setfield_ptr 1 x/282 0) 0) 2 - (let (*match*/287 =o (field_mut 1 x/282)) - (if *match*/287 (field_imm 0 *match*/287) + (f/0 = + (function x/0 : int + (if (field_int 0 x/0) + (let (*match*/0 =o (field_mut 1 x/0)) + (if *match*/0 + (if (seq (setfield_ptr 1 x/0 0) 0) 2 + (let (*match*/1 =o (field_mut 1 x/0)) + (if *match*/1 (field_imm 0 *match*/1) (raise - (makeblock 0 (global Match_failure/20!) [0: "" 4 2]))))) + (makeblock 0 (global Match_failure/0!) [0: "" 4 2]))))) 1)) 0))) - (apply (field_mut 1 (global Toploop!)) "f" f/280)) + (apply (field_mut 1 (global Toploop!)) "f" f/0)) val f : t -> int = |}] @@ -73,11 +73,11 @@ let simple x = 0 type t = { a : bool; mutable b : int option; } (let - (simple/291 = - (function x/293 : int - (let (*match*/296 =o (field_mut 1 x/293)) - (if *match*/296 (field_imm 0 *match*/296) 1)))) - (apply (field_mut 1 (global Toploop!)) "simple" simple/291)) + (simple/0 = + (function x/1 : int + (let (*match*/2 =o (field_mut 1 x/1)) + (if *match*/2 (field_imm 0 *match*/2) 1)))) + (apply (field_mut 1 (global Toploop!)) "simple" simple/0)) val simple : t -> int = |}] @@ -99,22 +99,22 @@ Lines 2-5, characters 2-32: 3 | | {a = false; b = _} -> 0 4 | | {a = _; b = None} -> 1 5 | | {a = true; b = Some y} -> y -Warning 74 [degraded-to-partial-match]: This pattern-matching is compiled -as partial, even if it appears to be total. It may generate a Match_failure -exception. This typically occurs due to complex matches on mutable fields. -(see manual section 13.5.5) +Warning 74 [degraded-to-partial-match]: This pattern-matching is compiled as + partial, even if it appears to be total. It may generate a "Match_failure" + exception. This typically occurs due to complex matches on mutable fields. + (see manual section 13.5.5) (let - (f/297 = - (function x/298 : int - (if (field_int 0 x/298) - (let (*match*/302 =o (field_mut 1 x/298)) - (if *match*/302 (field_imm 0 *match*/302) - (let (*match*/303 =o (field_mut 1 x/298)) - (if *match*/303 - (raise (makeblock 0 (global Match_failure/20!) [0: "" 2 2])) + (f/1 = + (function x/2 : int + (if (field_int 0 x/2) + (let (*match*/3 =o (field_mut 1 x/2)) + (if *match*/3 (field_imm 0 *match*/3) + (let (*match*/4 =o (field_mut 1 x/2)) + (if *match*/4 + (raise (makeblock 0 (global Match_failure/0!) [0: "" 2 2])) 1)))) 0))) - (apply (field_mut 1 (global Toploop!)) "f" f/297)) + (apply (field_mut 1 (global Toploop!)) "f" f/1)) val f : t -> int = |}] @@ -141,28 +141,28 @@ Lines 2-6, characters 2-13: 4 | | _ when (r := None; false) -> 1 5 | | Some { contents = Some n } -> n 6 | | None -> 3 -Warning 74 [degraded-to-partial-match]: This pattern-matching is compiled -as partial, even if it appears to be total. It may generate a Match_failure -exception. This typically occurs due to complex matches on mutable fields. -(see manual section 13.5.5) +Warning 74 [degraded-to-partial-match]: This pattern-matching is compiled as + partial, even if it appears to be total. It may generate a "Match_failure" + exception. This typically occurs due to complex matches on mutable fields. + (see manual section 13.5.5) (let - (f/304 = - (function r/305 : int - (let (*match*/307 = (makeblock 0 r/305)) + (f/2 = + (function r/0 : int + (let (*match*/5 = (makeblock 0 r/0)) (catch - (if *match*/307 - (let (*match*/309 =o (field_mut 0 (field_imm 0 *match*/307))) - (if *match*/309 (exit 13) 0)) + (if *match*/5 + (let (*match*/6 =o (field_mut 0 (field_imm 0 *match*/5))) + (if *match*/6 (exit 13) 0)) (exit 13)) with (13) - (if (seq (setfield_ptr 0 r/305 0) 0) 1 - (if *match*/307 - (let (*match*/311 =o (field_mut 0 (field_imm 0 *match*/307))) - (if *match*/311 (field_imm 0 *match*/311) + (if (seq (setfield_ptr 0 r/0 0) 0) 1 + (if *match*/5 + (let (*match*/7 =o (field_mut 0 (field_imm 0 *match*/5))) + (if *match*/7 (field_imm 0 *match*/7) (raise - (makeblock 0 (global Match_failure/20!) [0: "" 2 2])))) + (makeblock 0 (global Match_failure/0!) [0: "" 2 2])))) 3)))))) - (apply (field_mut 1 (global Toploop!)) "f" f/304)) + (apply (field_mut 1 (global Toploop!)) "f" f/2)) val f : int option ref -> int = |}] @@ -183,10 +183,10 @@ let test = function 0 type _ t = Int : int -> int t | Bool : bool -> bool t (let - (test/315 = - (function param/318 : int - (if param/318 (field_imm 0 (field_imm 0 param/318)) 0))) - (apply (field_mut 1 (global Toploop!)) "test" test/315)) + (test/0 = + (function param/0 : int + (if param/0 (field_imm 0 (field_imm 0 param/0)) 0))) + (apply (field_mut 1 (global Toploop!)) "test" test/0)) val test : int t option -> int = |}] @@ -204,11 +204,11 @@ let test = function 0 type _ t = Int : int -> int t | Bool : bool -> bool t (let - (test/323 = - (function param/325 : int - (let (*match*/326 =o (field_mut 0 param/325)) - (if *match*/326 (field_imm 0 (field_imm 0 *match*/326)) 0)))) - (apply (field_mut 1 (global Toploop!)) "test" test/323)) + (test/1 = + (function param/1 : int + (let (*match*/8 =o (field_mut 0 param/1)) + (if *match*/8 (field_imm 0 (field_imm 0 *match*/8)) 0)))) + (apply (field_mut 1 (global Toploop!)) "test" test/1)) val test : int t option ref -> int = |}] @@ -229,19 +229,19 @@ let test n = 0 type _ t = Int : int -> int t | Bool : bool -> bool t (let - (test/331 = - (function n/332 : int + (test/2 = + (function n/0 : int (let - (*match*/335 = + (*match*/9 = (makeblock 0 (makeblock 0 (makemutable 0 (int) 1) [0: 42]))) - (if *match*/335 + (if *match*/9 (let - (*match*/336 =a (field_imm 0 *match*/335) - *match*/338 =o (field_mut 0 (field_imm 0 *match*/336))) - (if *match*/338 (field_imm 0 (field_imm 1 *match*/336)) - (~ (field_imm 0 (field_imm 1 *match*/336))))) + (*match*/10 =a (field_imm 0 *match*/9) + *match*/11 =o (field_mut 0 (field_imm 0 *match*/10))) + (if *match*/11 (field_imm 0 (field_imm 1 *match*/10)) + (~ (field_imm 0 (field_imm 1 *match*/10))))) 3)))) - (apply (field_mut 1 (global Toploop!)) "test" test/331)) + (apply (field_mut 1 (global Toploop!)) "test" test/2)) val test : 'a -> int = |}] @@ -272,30 +272,30 @@ Lines 2-6, characters 2-13: 4 | | _ when (r := ((), None); false) -> 1 5 | | Some { contents = ((), Some n) } -> n 6 | | None -> 3 -Warning 74 [degraded-to-partial-match]: This pattern-matching is compiled -as partial, even if it appears to be total. It may generate a Match_failure -exception. This typically occurs due to complex matches on mutable fields. -(see manual section 13.5.5) +Warning 74 [degraded-to-partial-match]: This pattern-matching is compiled as + partial, even if it appears to be total. It may generate a "Match_failure" + exception. This typically occurs due to complex matches on mutable fields. + (see manual section 13.5.5) (let - (deep/341 = - (function r/343 : int - (let (*match*/345 = (makeblock 0 r/343)) + (deep/0 = + (function r/1 : int + (let (*match*/12 = (makeblock 0 r/1)) (catch - (if *match*/345 - (let (*match*/347 =o (field_mut 0 (field_imm 0 *match*/345))) - (if (field_imm 1 *match*/347) (exit 21) 0)) + (if *match*/12 + (let (*match*/13 =o (field_mut 0 (field_imm 0 *match*/12))) + (if (field_imm 1 *match*/13) (exit 21) 0)) (exit 21)) with (21) - (if (seq (setfield_ptr 0 r/343 [0: 0 0]) 0) 1 - (if *match*/345 + (if (seq (setfield_ptr 0 r/1 [0: 0 0]) 0) 1 + (if *match*/12 (let - (*match*/351 =o (field_mut 0 (field_imm 0 *match*/345)) - *match*/353 =a (field_imm 1 *match*/351)) - (if *match*/353 (field_imm 0 *match*/353) + (*match*/14 =o (field_mut 0 (field_imm 0 *match*/12)) + *match*/15 =a (field_imm 1 *match*/14)) + (if *match*/15 (field_imm 0 *match*/15) (raise - (makeblock 0 (global Match_failure/20!) [0: "" 2 2])))) + (makeblock 0 (global Match_failure/0!) [0: "" 2 2])))) 3)))))) - (apply (field_mut 1 (global Toploop!)) "deep" deep/341)) + (apply (field_mut 1 (global Toploop!)) "deep" deep/0)) val deep : (unit * int option) ref -> int = |}] @@ -322,13 +322,13 @@ let test : type a . a t * a t -> unit = function 0 type _ t = Bool : bool t | Int : int t | Char : char t (let - (test/358 = - (function param/360 : int + (test/3 = + (function param/2 : int (catch - (if (>= (field_imm 0 param/360) 2) (exit 24) - (if (>= (field_imm 1 param/360) 2) (exit 24) 0)) + (if (>= (field_imm 0 param/2) 2) (exit 24) + (if (>= (field_imm 1 param/2) 2) (exit 24) 0)) with (24) 0))) - (apply (field_mut 1 (global Toploop!)) "test" test/358)) + (apply (field_mut 1 (global Toploop!)) "test" test/3)) val test : 'a t * 'a t -> unit = |}];; @@ -350,18 +350,18 @@ type nothing = | 0 type t = A | B | C of nothing (let - (f/370 = - (function param/371 : int + (f/3 = + (function param/3 : int (catch - (if (field_imm 0 param/371) - (switch* (field_imm 1 param/371) + (if (field_imm 0 param/3) + (switch* (field_imm 1 param/3) case int 0: 3 case int 1: (exit 27)) - (switch* (field_imm 1 param/371) + (switch* (field_imm 1 param/3) case int 0: 4 case int 1: (exit 27))) with (27) 5))) - (apply (field_mut 1 (global Toploop!)) "f" f/370)) + (apply (field_mut 1 (global Toploop!)) "f" f/3)) val f : bool * t -> int = |}];; @@ -393,45 +393,45 @@ let compare t1 t2 = 0 type t = A of int | B of string | C of string | D of string (let - (compare/381 = - (function t1/382 t2/383 : int + (compare/0 = + (function t1/0 t2/0 : int (catch - (switch* t1/382 + (switch* t1/0 case tag 0: - (switch t2/383 + (switch t2/0 case tag 0: - (apply (field_imm 8 (global Stdlib__Int!)) (field_imm 0 t1/382) - (field_imm 0 t2/383)) + (apply (field_imm 8 (global Stdlib__Int!)) (field_imm 0 t1/0) + (field_imm 0 t2/0)) default: -1) case tag 1: (catch - (switch* t2/383 + (switch* t2/0 case tag 0: (exit 31) case tag 1: (apply (field_imm 9 (global Stdlib__String!)) - (field_imm 0 t1/382) (field_imm 0 t2/383)) + (field_imm 0 t1/0) (field_imm 0 t2/0)) case tag 2: (exit 36) case tag 3: (exit 36)) with (36) -1) case tag 2: - (switch* t2/383 + (switch* t2/0 case tag 0: (exit 31) case tag 1: (exit 31) case tag 2: - (apply (field_imm 9 (global Stdlib__String!)) - (field_imm 0 t1/382) (field_imm 0 t2/383)) + (apply (field_imm 9 (global Stdlib__String!)) (field_imm 0 t1/0) + (field_imm 0 t2/0)) case tag 3: -1) case tag 3: - (switch* t2/383 + (switch* t2/0 case tag 0: (exit 31) case tag 1: (exit 31) case tag 2: 1 case tag 3: - (apply (field_imm 9 (global Stdlib__String!)) - (field_imm 0 t1/382) (field_imm 0 t2/383)))) - with (31) (switch* t2/383 case tag 0: 1 - case tag 1: 1)))) - (apply (field_mut 1 (global Toploop!)) "compare" compare/381)) + (apply (field_imm 9 (global Stdlib__String!)) (field_imm 0 t1/0) + (field_imm 0 t2/0)))) + with (31) (switch* t2/0 case tag 0: 1 + case tag 1: 1)))) + (apply (field_mut 1 (global Toploop!)) "compare" compare/0)) val compare : t -> t -> int = |}];; @@ -450,22 +450,20 @@ let f x y = (* PASS: no Match_failure generated *) [%%expect {| (let - (f/503 = - (function x/504[int] y/505[int] : int + (f/4 = + (function x/3[int] y/0[int] : int (catch (catch - (catch - (if (isint y/505) (if (!= y/505 19896) (exit 45) 0) (exit 45)) + (catch (if (isint y/0) (if (!= y/0 19896) (exit 45) 0) (exit 45)) with (45) - (if (!= x/504 19674) - (if (>= x/504 19675) (exit 44) - (if (>= y/505 19898) (exit 42) 1)) - (if (isint y/505) (if (!= y/505 19897) (exit 44) (exit 42)) + (if (!= x/3 19674) + (if (>= x/3 19675) (exit 44) (if (>= y/0 19898) (exit 42) 1)) + (if (isint y/0) (if (!= y/0 19897) (exit 44) (exit 42)) (exit 44)))) with (44) - (if (isint y/505) (if (!= y/505 19898) (exit 42) 2) (exit 42))) + (if (isint y/0) (if (!= y/0 19898) (exit 42) 2) (exit 42))) with (42) 3))) - (apply (field_mut 1 (global Toploop!)) "f" f/503)) + (apply (field_mut 1 (global Toploop!)) "f" f/4)) val f : [< `X1 | `X2 | `X3 ] -> [< `Y1 | `Y2 | `Y3 ] -> int = |}];; @@ -479,34 +477,34 @@ let check_results r1 r2 = (* PASS: no Match_failure case generated *) [%%expect {| (let - (check_results/506 = - (function r1/508 r2/509 - (let (*match*/515 = (apply r1/508 r2/509)) + (check_results/0 = + (function r1/0 r2/0 + (let (*match*/16 = (apply r1/0 r2/0)) (catch (catch - (let (r/514 =a (field_imm 0 *match*/515)) + (let (r/2 =a (field_imm 0 *match*/16)) (catch - (switch* r/514 - case tag 0: (exit 50 r/514) + (switch* r/2 + case tag 0: (exit 50 r/2) case tag 1: (catch - (if (>= (field_imm 0 r/514) 66) - (let (*match*/523 =a (field_imm 1 *match*/515)) - (switch* *match*/523 + (if (>= (field_imm 0 r/2) 66) + (let (*match*/17 =a (field_imm 1 *match*/16)) + (switch* *match*/17 case tag 0: (exit 52) case tag 1: - (let (*match*/524 =a (field_imm 0 *match*/523)) - (if (isint *match*/524) - (if (!= *match*/524 66) (exit 53) r/514) + (let (*match*/18 =a (field_imm 0 *match*/17)) + (if (isint *match*/18) + (if (!= *match*/18 66) (exit 53) r/2) (exit 53))))) - (switch* (field_imm 1 *match*/515) + (switch* (field_imm 1 *match*/16) case tag 0: (exit 52) - case tag 1: (exit 51 r/514))) - with (53) (exit 51 (field_imm 1 *match*/515)))) - with (52) (exit 50 (field_imm 1 *match*/515)))) - with (50 r/510) r/510) - with (51 r/512) r/512)))) - (apply (field_mut 1 (global Toploop!)) "check_results" check_results/506)) + case tag 1: (exit 51 r/2))) + with (53) (exit 51 (field_imm 1 *match*/16)))) + with (52) (exit 50 (field_imm 1 *match*/16)))) + with (50 r/3) r/3) + with (51 r/4) r/4)))) + (apply (field_mut 1 (global Toploop!)) "check_results" check_results/0)) val check_results : ('a -> ('b, [< `A | `B ]) result * ('b, [< `A | `B ]) result) -> 'a -> ('b, [> `A | `B ]) result = diff --git a/testsuite/tests/match-side-effects/test_contexts_code.ml b/testsuite/tests/match-side-effects/test_contexts_code.ml index 6977fd1f..efd7f265 100644 --- a/testsuite/tests/match-side-effects/test_contexts_code.ml +++ b/testsuite/tests/match-side-effects/test_contexts_code.ml @@ -1,6 +1,6 @@ (* TEST readonly_files = "contexts_1.ml contexts_2.ml contexts_3.ml"; - flags = "-dsource -dlambda"; + flags = "-dsource -dlambda -dcanonical-ids"; expect; *) @@ -31,24 +31,24 @@ let example_1 () = Result.Error 3 | { a = true; b = Either.Left y } -> Result.Ok y;; (let - (example_1/310 = - (function param/334[int] - (let (input/312 = (makemutable 0 (int,*) 1 [0: 1])) - (if (field_int 0 input/312) - (let (*match*/337 =o (field_mut 1 input/312)) - (switch* *match*/337 + (example_1/0 = + (function param/0[int] + (let (input/0 = (makemutable 0 (int,*) 1 [0: 1])) + (if (field_int 0 input/0) + (let (*match*/0 =o (field_mut 1 input/0)) + (switch* *match*/0 case tag 0: - (if (seq (setfield_ptr 1 input/312 [1: 3]) 0) [1: 3] - (let (*match*/339 =o (field_mut 1 input/312)) - (switch* *match*/339 - case tag 0: (makeblock 0 (int) (field_imm 0 *match*/339)) + (if (seq (setfield_ptr 1 input/0 [1: 3]) 0) [1: 3] + (let (*match*/1 =o (field_mut 1 input/0)) + (switch* *match*/1 + case tag 0: (makeblock 0 (int) (field_imm 0 *match*/1)) case tag 1: (raise - (makeblock 0 (global Match_failure/20!) + (makeblock 0 (global Match_failure/0!) [0: "contexts_1.ml" 17 2]))))) case tag 1: [1: 2])) [1: 1])))) - (apply (field_mut 1 (global Toploop!)) "example_1" example_1/310)) + (apply (field_mut 1 (global Toploop!)) "example_1" example_1/0)) val example_1 : unit -> (bool, int) Result.t = |}] @@ -77,25 +77,25 @@ let example_2 () = Result.Error 3 | { a = true; b = { mut = Either.Left y } } -> Result.Ok y;; (let - (example_2/346 = - (function param/350[int] - (let (input/348 = (makeblock 0 (int,*) 1 (makemutable 0 [0: 1]))) - (if (field_int 0 input/348) - (let (*match*/354 =o (field_mut 0 (field_imm 1 input/348))) - (switch* *match*/354 + (example_2/0 = + (function param/1[int] + (let (input/1 = (makeblock 0 (int,*) 1 (makemutable 0 [0: 1]))) + (if (field_int 0 input/1) + (let (*match*/2 =o (field_mut 0 (field_imm 1 input/1))) + (switch* *match*/2 case tag 0: - (if (seq (setfield_ptr 0 (field_imm 1 input/348) [1: 3]) 0) + (if (seq (setfield_ptr 0 (field_imm 1 input/1) [1: 3]) 0) [1: 3] - (let (*match*/357 =o (field_mut 0 (field_imm 1 input/348))) - (switch* *match*/357 - case tag 0: (makeblock 0 (int) (field_imm 0 *match*/357)) + (let (*match*/3 =o (field_mut 0 (field_imm 1 input/1))) + (switch* *match*/3 + case tag 0: (makeblock 0 (int) (field_imm 0 *match*/3)) case tag 1: (raise - (makeblock 0 (global Match_failure/20!) + (makeblock 0 (global Match_failure/0!) [0: "contexts_2.ml" 11 2]))))) case tag 1: [1: 2])) [1: 1])))) - (apply (field_mut 1 (global Toploop!)) "example_2" example_2/346)) + (apply (field_mut 1 (global Toploop!)) "example_2" example_2/0)) val example_2 : unit -> (bool, int) Result.t = |}] @@ -122,16 +122,16 @@ let example_3 () = Result.Error 3 | { mut = (true, Either.Left y) } -> Result.Ok y;; (let - (example_3/363 = - (function param/367[int] - (let (input/365 =mut [0: 1 [0: 1]] *match*/368 =o *input/365) - (if (field_imm 0 *match*/368) - (switch* (field_imm 1 *match*/368) + (example_3/0 = + (function param/2[int] + (let (input/2 =mut [0: 1 [0: 1]] *match*/4 =o *input/2) + (if (field_imm 0 *match*/4) + (switch* (field_imm 1 *match*/4) case tag 0: - (if (seq (assign input/365 [0: 1 [1: 3]]) 0) [1: 3] - (makeblock 0 (int) (field_imm 0 (field_imm 1 *match*/368)))) + (if (seq (assign input/2 [0: 1 [1: 3]]) 0) [1: 3] + (makeblock 0 (int) (field_imm 0 (field_imm 1 *match*/4)))) case tag 1: [1: 2]) [1: 1])))) - (apply (field_mut 1 (global Toploop!)) "example_3" example_3/363)) + (apply (field_mut 1 (global Toploop!)) "example_3" example_3/0)) val example_3 : unit -> (bool, int) Result.t = |}] diff --git a/testsuite/tests/memory-model/forbidden.ml b/testsuite/tests/memory-model/forbidden.ml index 676904c1..daf65e59 100644 --- a/testsuite/tests/memory-model/forbidden.ml +++ b/testsuite/tests/memory-model/forbidden.ml @@ -1,5 +1,6 @@ (* TEST modules = "opt.ml barrier.ml hist.ml shared.ml run.ml outcome.ml"; + multicore; not-bsd; no-tsan; (* tsan detects the intentional data races and fails *) { diff --git a/testsuite/tests/memory-model/publish.ml b/testsuite/tests/memory-model/publish.ml index a857c6cf..cd000ef6 100644 --- a/testsuite/tests/memory-model/publish.ml +++ b/testsuite/tests/memory-model/publish.ml @@ -1,5 +1,6 @@ (* TEST modules = "opt.ml barrier.ml hist.ml shared.ml run.ml outcome.ml"; + multicore; no-tsan; (* tsan detects data races and fails *) not-bsd; { diff --git a/testsuite/tests/messages/highlight_tabs.ml b/testsuite/tests/messages/highlight_tabs.ml index f9fe5a5a..253ecc44 100644 --- a/testsuite/tests/messages/highlight_tabs.ml +++ b/testsuite/tests/messages/highlight_tabs.ml @@ -9,5 +9,5 @@ Line 1, characters 10-13: 1 | let x = abc ^^^ Error: Unbound value "abc" -Hint: Did you mean "abs"? +Hint: Did you mean "abs"? |}];; diff --git a/testsuite/tests/messages/precise_locations.ml b/testsuite/tests/messages/precise_locations.ml index 62d604b1..752d1a2a 100644 --- a/testsuite/tests/messages/precise_locations.ml +++ b/testsuite/tests/messages/precise_locations.ml @@ -86,7 +86,7 @@ end);; Line 2, characters 0-9: 2 | open List ^^^^^^^^^ -Error (warning 33 [unused-open]): unused open Stdlib.List. +Error (warning 33 [unused-open]): unused open "Stdlib.List". |}];; type unknown += Foo;; diff --git a/testsuite/tests/messages/spellcheck.ml b/testsuite/tests/messages/spellcheck.ml index c403d92f..021ab6b7 100644 --- a/testsuite/tests/messages/spellcheck.ml +++ b/testsuite/tests/messages/spellcheck.ml @@ -9,7 +9,7 @@ #directery "foo/";; [%%expect {| -Unknown directive "directery". + Unknown directive "directery". Hint: Did you mean "directory"? |}];; @@ -22,7 +22,7 @@ Line 1, characters 8-19: 1 | let _ = Fun.pratect ^^^^^^^^^^^ Error: Unbound value "Fun.pratect" -Hint: Did you mean "protect"? +Hint: Did you mean "Fun.protect"? |}];; type 'a t = 'a aray @@ -31,7 +31,7 @@ Line 1, characters 15-19: 1 | type 'a t = 'a aray ^^^^ Error: Unbound type constructor "aray" -Hint: Did you mean "array"? +Hint: Did you mean "array"? |}];; module _ = Stdlib.Aray @@ -40,7 +40,7 @@ Line 1, characters 11-22: 1 | module _ = Stdlib.Aray ^^^^^^^^^^^ Error: Unbound module "Stdlib.Aray" -Hint: Did you mean "Array"? +Hint: Did you mean "Stdlib.Array"? |}];; let x = Same 42 @@ -49,7 +49,7 @@ Line 1, characters 8-12: 1 | let x = Same 42 ^^^^ Error: Unbound constructor "Same" -Hint: Did you mean "Some"? +Hint: Did you mean "Some"? |}];; let x : int option = Same 42 @@ -59,7 +59,7 @@ Line 1, characters 21-25: ^^^^ Error: This variant expression is expected to have type "int option" There is no constructor "Same" within type "option" -Hint: Did you mean "Some"? +Hint: Did you mean "Some"? |}];; let x = { content = 42 } @@ -68,7 +68,7 @@ Line 1, characters 10-17: 1 | let x = { content = 42 } ^^^^^^^ Error: Unbound record field "content" -Hint: Did you mean "contents"? +Hint: Did you mean "contents"? |}];; let x : int ref = { content = 42 } @@ -78,7 +78,7 @@ Line 1, characters 20-27: ^^^^^^^ Error: This record expression is expected to have type "int ref" There is no field "content" within type "ref" -Hint: Did you mean "contents"? +Hint: Did you mean "contents"? |}];; class foobar = object end @@ -89,7 +89,7 @@ Line 2, characters 23-29: 2 | let _ = object inherit foobaz end ^^^^^^ Error: Unbound class "foobaz" -Hint: Did you mean "foobar"? +Hint: Did you mean "foobar"? |}];; module type Foobar = sig end @@ -100,7 +100,7 @@ Line 2, characters 13-19: 2 | module Foo : Foobaz = struct end ^^^^^^ Error: Unbound module type "Foobaz" -Hint: Did you mean "Foobar"? +Hint: Did you mean "Foobar"? |}];; class type foobar = object end @@ -111,7 +111,7 @@ Line 2, characters 9-15: 2 | let _ : #foobaz = object end ^^^^^^ Error: Unbound class type "foobaz" -Hint: Did you mean "foobar"? +Hint: Did you mean "foobar"? |}];; let _ = @@ -124,7 +124,7 @@ let _ = Line 5, characters 22-33: 5 | method update n = foobaz <- n ^^^^^^^^^^^ -Error: The value "foobaz" is not an instance variable +Error: The value "foobaz" is not an instance variable Hint: Did you mean "foobar"? |}];; @@ -136,7 +136,7 @@ let _ = function (foobar | foobaz) -> () Line 1, characters 17-34: 1 | let _ = function (foobar | foobaz) -> () ^^^^^^^^^^^^^^^^^ -Error: Variable "foobar" must occur on both sides of this "|" pattern +Error: Variable "foobar" must occur on both sides of this "|" pattern Hint: Did you mean "foobaz"? |}];; @@ -148,7 +148,7 @@ Line 2, characters 13-19: 2 | let _ = fun {foobaz} -> () ^^^^^^ Error: Unbound record field "foobaz" -Hint: Did you mean "foobar"? +Hint: Did you mean "foobar"? |}];; let _ = { foobaz = 42 } [%%expect {| @@ -156,7 +156,7 @@ Line 1, characters 10-16: 1 | let _ = { foobaz = 42 } ^^^^^^ Error: Unbound record field "foobaz" -Hint: Did you mean "foobar"? +Hint: Did you mean "foobar"? |}];; let _ = fun x -> x.foobaz [%%expect {| @@ -164,7 +164,7 @@ Line 1, characters 19-25: 1 | let _ = fun x -> x.foobaz ^^^^^^ Error: Unbound record field "foobaz" -Hint: Did you mean "foobar"? +Hint: Did you mean "foobar"? |}];; type bar = Foobar of int @@ -175,7 +175,7 @@ Line 2, characters 8-14: 2 | let _ = Foobaz 42 ^^^^^^ Error: Unbound constructor "Foobaz" -Hint: Did you mean "Foobar"? +Hint: Did you mean "Foobar"? |}];; type baz = K of { foobar : int } @@ -185,7 +185,7 @@ type baz = K of { foobar : int; } Line 2, characters 12-18: 2 | let _ = K { foobaz = 42 } ^^^^^^ -Error: The field "foobaz" is not part of the record argument for the "baz.K" constructor +Error: The field "foobaz" is not part of the record argument for the "baz.K" constructor Hint: Did you mean "foobar"? |}];; @@ -198,7 +198,7 @@ Line 3, characters 17-21: 3 | method other = self#foobaz ^^^^ Error: This expression has no method "foobaz" -Hint: Did you mean "foobar"? +Hint: Did you mean "foobar"? |}];; @@ -211,5 +211,20 @@ Line 3, characters 18-35: 3 | method myself = {< foobaz = 42 >} ^^^^^^^^^^^^^^^^^ Error: Unbound instance variable "foobaz" -Hint: Did you mean "foobar"? +Hint: Did you mean "foobar"? |}];; + +let closely = () +module M = struct + let close = () +end +let () = M.closer +[%%expect {| +val closely : unit = () +module M : sig val close : unit end +Line 5, characters 9-17: +5 | let () = M.closer + ^^^^^^^^ +Error: Unbound value "M.closer" +Hint: Did you mean "M.close"? +|}] diff --git a/testsuite/tests/native-debugger/gdb-script b/testsuite/tests/native-debugger/gdb-script new file mode 100644 index 00000000..39aaecfd --- /dev/null +++ b/testsuite/tests/native-debugger/gdb-script @@ -0,0 +1,17 @@ +set disable-randomization off +break *(&caml_start_program+0) +break caml_program +break ocaml_to_c +break meander.ml:5 +set debuginfod enabled off +source gdb_test.py +run +print_backtrace +continue +print_backtrace +continue +print_backtrace +continue +print_backtrace +continue +quit diff --git a/testsuite/tests/native-debugger/gdb_test.py b/testsuite/tests/native-debugger/gdb_test.py new file mode 100644 index 00000000..43b9200f --- /dev/null +++ b/testsuite/tests/native-debugger/gdb_test.py @@ -0,0 +1,23 @@ +import re + +# Trim trailing numbers on symbols. +# +def trim_basename(name): + return re.sub(r"(caml.*)_[0-9]+", r"\1", name) + +class PrintBacktrace (gdb.Command): + """Print backtrace by walking GDB frames""" + + def __init__ (self): + super (PrintBacktrace, self).__init__ ("print_backtrace", gdb.COMMAND_USER) + + def invoke (self, arg, from_tty): + frame = gdb.selected_frame () + while (not (frame is None)): + print("frame %i: %s"% (frame.level(), trim_basename(frame.name()))) + frame = frame.older(); + +PrintBacktrace () + +# Usage: +# (gdb) print-backtrace diff --git a/testsuite/tests/native-debugger/has_gdb.sh b/testsuite/tests/native-debugger/has_gdb.sh new file mode 100755 index 00000000..50872ce5 --- /dev/null +++ b/testsuite/tests/native-debugger/has_gdb.sh @@ -0,0 +1,18 @@ +#!/bin/sh + +version () { + echo "$@" | awk -F. '{ printf("%d%03d%03d\n", $1,$2,$3); }' +} + +if ! which gdb > /dev/null 2>&1; then + echo "gdb not available" > "${ocamltest_response}" + exit ${TEST_SKIP} +else + # Linux check for GDB version + GDB_VERSION=$(gdb --version | head -n 1 | sed -E 's/^GNU gdb \(.*\) (.*)$/\1/') + if [ $(version "$GDB_VERSION") -ge $(version "12.1") ]; then + exit ${TEST_PASS} + else + exit ${TEST_SKIP} + fi +fi diff --git a/testsuite/tests/native-debugger/has_lldb.sh b/testsuite/tests/native-debugger/has_lldb.sh new file mode 100755 index 00000000..13e5f89b --- /dev/null +++ b/testsuite/tests/native-debugger/has_lldb.sh @@ -0,0 +1,38 @@ +#!/bin/bash + +OCAML_OS="$1" + +# Extract the first 4 parts of an LLDB version number +version () { + echo "$@" | awk -F. '{ printf("%d%03d%03d%03d\n", $1,$2,$3,$4); }' +} + +if ! which lldb > /dev/null 2>&1; then + echo "lldb not available" > "${ocamltest_response}" + exit ${TEST_SKIP} +else + if [ "$OCAML_OS" = "macos" ]; then + # macOS version + LLDB_VERSION=$(lldb --version |head -n 1 | awk -F'-' '{print $2}') + # We need XCode 15.3 or greater + # lldb-1500.0.404.7 + # Apple Swift version 5.10 (swiftlang-5.10.0.13 clang-1500.3.9.4) + if [ $(version "$LLDB_VERSION") -ge $(version "1500.0.404.7") ]; then + exit ${TEST_PASS} + else + exit ${TEST_SKIP} + fi + elif [ "$OCAML_OS" = "linux" ]; then + # Linux version + LLDB_VERSION=$(lldb --version |awk -F' ' '{print $3}') + if [ $(version "$LLDB_VERSION") -ge $(version "14.0.0") ]; then + exit ${TEST_PASS} + else + exit ${TEST_SKIP} + fi + else + exit ${TEST_SKIP} + fi + + +fi diff --git a/testsuite/tests/native-debugger/linux-gdb-amd64.ml b/testsuite/tests/native-debugger/linux-gdb-amd64.ml new file mode 100644 index 00000000..abe27c14 --- /dev/null +++ b/testsuite/tests/native-debugger/linux-gdb-amd64.ml @@ -0,0 +1,19 @@ +(* TEST + native-compiler; + no-tsan; (* Skip, TSan inserts extra frames into backtraces *) + linux; + arch_amd64; + script = "sh ${test_source_directory}/has_gdb.sh"; + script; + readonly_files = "meander.ml meander_c.c gdb_test.py"; + setup-ocamlopt.byte-build-env; + program = "${test_build_directory}/meander"; + flags = "-g -ccopt -O0"; + all_modules = "meander.ml meander_c.c"; + ocamlopt.byte; + debugger_script = "${test_source_directory}/gdb-script"; + gdb; + script = "sh ${test_source_directory}/sanitize.sh linux-gdb-amd64"; + script; + check-program-output; + *) diff --git a/testsuite/tests/native-debugger/linux-gdb-amd64.reference b/testsuite/tests/native-debugger/linux-gdb-amd64.reference new file mode 100644 index 00000000..637121e0 --- /dev/null +++ b/testsuite/tests/native-debugger/linux-gdb-amd64.reference @@ -0,0 +1,56 @@ +Breakpoint 1 at 0x00000000000000 +Breakpoint 2 at 0x00000000000000 +Breakpoint 3 at 0x00000000000000: file meander_c.c, line XXX. +Breakpoint 4 at 0x00000000000000: file meander.ml, line XXX. +[Thread debugging using libthread_db enabled] +Using host libthread_db library "/XXXX/libthread_db.so.1". +Breakpoint 1, +frame 0: caml_start_program +frame 1: caml_startup_common +frame 2: caml_startup_common +frame 3: caml_startup_exn +frame 4: caml_startup +frame 5: caml_main +frame 6: main +Breakpoint 2, 0x00000000000000 in caml_program () +frame 0: caml_program +frame 1: caml_start_program +frame 2: caml_startup_common +frame 3: caml_startup_common +frame 4: caml_startup_exn +frame 5: caml_startup +frame 6: caml_main +frame 7: main +Breakpoint 3, ocaml_to_c (unit=1) at meander_c.c:XX +5 caml_callback(*caml_named_value +frame 0: ocaml_to_c +frame 1: caml_c_call +frame 2: camlMeander.omain +frame 3: camlMeander.entry +frame 4: caml_program +frame 5: caml_start_program +frame 6: caml_startup_common +frame 7: caml_startup_common +frame 8: caml_startup_exn +frame 9: caml_startup +frame 10: caml_main +frame 11: main +Breakpoint 4, camlMeander.c_to_ocaml () at meander.ml:5 +5 let c_to_ocaml () = raise E1 +frame 0: camlMeander.c_to_ocaml +frame 1: caml_start_program +frame 2: caml_callback_exn +frame 3: caml_callback +frame 4: ocaml_to_c +frame 5: caml_c_call +frame 6: camlMeander.omain +frame 7: camlMeander.entry +frame 8: caml_program +frame 9: caml_start_program +frame 10: caml_startup_common +frame 11: caml_startup_common +frame 12: caml_startup_exn +frame 13: caml_startup +frame 14: caml_main +frame 15: main +[Inferior 1 (process XXXX) exited normally] diff --git a/testsuite/tests/native-debugger/linux-gdb-arm64.ml b/testsuite/tests/native-debugger/linux-gdb-arm64.ml new file mode 100644 index 00000000..0d3a3bd0 --- /dev/null +++ b/testsuite/tests/native-debugger/linux-gdb-arm64.ml @@ -0,0 +1,19 @@ +(* TEST + native-compiler; + no-tsan; (* Skip, TSan inserts extra frames into backtraces *) + linux; + arch_arm64; + script = "sh ${test_source_directory}/has_gdb.sh"; + script; + readonly_files = "meander.ml meander_c.c gdb_test.py"; + setup-ocamlopt.byte-build-env; + program = "${test_build_directory}/meander"; + flags = "-g -ccopt -O0"; + all_modules = "meander.ml meander_c.c"; + ocamlopt.byte; + debugger_script = "${test_source_directory}/gdb-script"; + gdb; + script = "sh ${test_source_directory}/sanitize.sh linux-gdb-arm64"; + script; + check-program-output; + *) diff --git a/testsuite/tests/native-debugger/linux-gdb-arm64.reference b/testsuite/tests/native-debugger/linux-gdb-arm64.reference new file mode 100644 index 00000000..637121e0 --- /dev/null +++ b/testsuite/tests/native-debugger/linux-gdb-arm64.reference @@ -0,0 +1,56 @@ +Breakpoint 1 at 0x00000000000000 +Breakpoint 2 at 0x00000000000000 +Breakpoint 3 at 0x00000000000000: file meander_c.c, line XXX. +Breakpoint 4 at 0x00000000000000: file meander.ml, line XXX. +[Thread debugging using libthread_db enabled] +Using host libthread_db library "/XXXX/libthread_db.so.1". +Breakpoint 1, +frame 0: caml_start_program +frame 1: caml_startup_common +frame 2: caml_startup_common +frame 3: caml_startup_exn +frame 4: caml_startup +frame 5: caml_main +frame 6: main +Breakpoint 2, 0x00000000000000 in caml_program () +frame 0: caml_program +frame 1: caml_start_program +frame 2: caml_startup_common +frame 3: caml_startup_common +frame 4: caml_startup_exn +frame 5: caml_startup +frame 6: caml_main +frame 7: main +Breakpoint 3, ocaml_to_c (unit=1) at meander_c.c:XX +5 caml_callback(*caml_named_value +frame 0: ocaml_to_c +frame 1: caml_c_call +frame 2: camlMeander.omain +frame 3: camlMeander.entry +frame 4: caml_program +frame 5: caml_start_program +frame 6: caml_startup_common +frame 7: caml_startup_common +frame 8: caml_startup_exn +frame 9: caml_startup +frame 10: caml_main +frame 11: main +Breakpoint 4, camlMeander.c_to_ocaml () at meander.ml:5 +5 let c_to_ocaml () = raise E1 +frame 0: camlMeander.c_to_ocaml +frame 1: caml_start_program +frame 2: caml_callback_exn +frame 3: caml_callback +frame 4: ocaml_to_c +frame 5: caml_c_call +frame 6: camlMeander.omain +frame 7: camlMeander.entry +frame 8: caml_program +frame 9: caml_start_program +frame 10: caml_startup_common +frame 11: caml_startup_common +frame 12: caml_startup_exn +frame 13: caml_startup +frame 14: caml_main +frame 15: main +[Inferior 1 (process XXXX) exited normally] diff --git a/testsuite/tests/native-debugger/linux-gdb-riscv.ml b/testsuite/tests/native-debugger/linux-gdb-riscv.ml new file mode 100644 index 00000000..17d1eaf7 --- /dev/null +++ b/testsuite/tests/native-debugger/linux-gdb-riscv.ml @@ -0,0 +1,19 @@ +(* TEST + native-compiler; + linux; + no-tsan; (* Skip, TSan inserts extra frames into backtraces *) + arch_riscv; + script = "sh ${test_source_directory}/has_gdb.sh"; + script; + readonly_files = "meander.ml meander_c.c gdb_test.py"; + setup-ocamlopt.byte-build-env; + program = "${test_build_directory}/meander"; + flags = "-g -ccopt -O0"; + all_modules = "meander.ml meander_c.c"; + ocamlopt.byte; + debugger_script = "${test_source_directory}/gdb-script"; + gdb; + script = "sh ${test_source_directory}/sanitize.sh linux-gdb-riscv"; + script; + check-program-output; + *) diff --git a/testsuite/tests/native-debugger/linux-gdb-riscv.reference b/testsuite/tests/native-debugger/linux-gdb-riscv.reference new file mode 100644 index 00000000..637121e0 --- /dev/null +++ b/testsuite/tests/native-debugger/linux-gdb-riscv.reference @@ -0,0 +1,56 @@ +Breakpoint 1 at 0x00000000000000 +Breakpoint 2 at 0x00000000000000 +Breakpoint 3 at 0x00000000000000: file meander_c.c, line XXX. +Breakpoint 4 at 0x00000000000000: file meander.ml, line XXX. +[Thread debugging using libthread_db enabled] +Using host libthread_db library "/XXXX/libthread_db.so.1". +Breakpoint 1, +frame 0: caml_start_program +frame 1: caml_startup_common +frame 2: caml_startup_common +frame 3: caml_startup_exn +frame 4: caml_startup +frame 5: caml_main +frame 6: main +Breakpoint 2, 0x00000000000000 in caml_program () +frame 0: caml_program +frame 1: caml_start_program +frame 2: caml_startup_common +frame 3: caml_startup_common +frame 4: caml_startup_exn +frame 5: caml_startup +frame 6: caml_main +frame 7: main +Breakpoint 3, ocaml_to_c (unit=1) at meander_c.c:XX +5 caml_callback(*caml_named_value +frame 0: ocaml_to_c +frame 1: caml_c_call +frame 2: camlMeander.omain +frame 3: camlMeander.entry +frame 4: caml_program +frame 5: caml_start_program +frame 6: caml_startup_common +frame 7: caml_startup_common +frame 8: caml_startup_exn +frame 9: caml_startup +frame 10: caml_main +frame 11: main +Breakpoint 4, camlMeander.c_to_ocaml () at meander.ml:5 +5 let c_to_ocaml () = raise E1 +frame 0: camlMeander.c_to_ocaml +frame 1: caml_start_program +frame 2: caml_callback_exn +frame 3: caml_callback +frame 4: ocaml_to_c +frame 5: caml_c_call +frame 6: camlMeander.omain +frame 7: camlMeander.entry +frame 8: caml_program +frame 9: caml_start_program +frame 10: caml_startup_common +frame 11: caml_startup_common +frame 12: caml_startup_exn +frame 13: caml_startup +frame 14: caml_main +frame 15: main +[Inferior 1 (process XXXX) exited normally] diff --git a/testsuite/tests/native-debugger/linux-lldb-amd64.ml b/testsuite/tests/native-debugger/linux-lldb-amd64.ml new file mode 100644 index 00000000..d14567ed --- /dev/null +++ b/testsuite/tests/native-debugger/linux-lldb-amd64.ml @@ -0,0 +1,19 @@ +(* TEST + native-compiler; + no-tsan; (* Skip, TSan inserts extra frames into backtraces *) + linux; + arch_amd64; + script = "sh ${test_source_directory}/has_lldb.sh linux"; + script; + readonly_files = "meander.ml meander_c.c lldb_test.py"; + setup-ocamlopt.byte-build-env; + program = "${test_build_directory}/meander"; + flags = "-g -ccopt -O0"; + all_modules = "meander.ml meander_c.c"; + ocamlopt.byte; + debugger_script = "${test_source_directory}/lldb-script"; + lldb; + script = "sh ${test_source_directory}/sanitize.sh linux-lldb-amd64"; + script; + check-program-output; + *) diff --git a/testsuite/tests/native-debugger/linux-lldb-amd64.reference b/testsuite/tests/native-debugger/linux-lldb-amd64.reference new file mode 100644 index 00000000..6de816d6 --- /dev/null +++ b/testsuite/tests/native-debugger/linux-lldb-amd64.reference @@ -0,0 +1,111 @@ +(lldb) target create "XXXX" +Current executable set to 'XXXX' ($ARCH). +(lldb) command source -s 0 'XXXX' +Executing commands in 'XXXX'. +(lldb) settings set target.disable-aslr false +(lldb) settings set stop-disassembly-display never +(lldb) command script import ./lldb_test.py +(lldb) create caml_start_program +Breakpoint created for regex caml_start_program. +(lldb) create caml_program +Breakpoint created for regex caml_program. +(lldb) create camlMeander[.$]c_to_ocaml* +Breakpoint created for regex camlMeander[.$]c_to_ocaml*. +(lldb) create ocaml_to_c +Breakpoint created for regex ocaml_to_c. +(lldb) run +Process XXXX launched: 'XXXX' ($ARCH) +Process XXXX stopped +* thread #1, name = 'XXXX', stop reason = breakpoint 1.1 + frame #0: 0x00000000000000 meander`caml_start_program +(lldb) backtrace +frame 0: meander`caml_start_program +frame 1: meander`caml_startup_common +frame 2: meander`caml_startup_common +frame 3: meander`caml_startup_exn +frame 4: meander`caml_startup +frame 5: meander`caml_main +frame 6: meander`main +frame 7: libc.so.6`__libc_start_call_main +frame 8: libc.so.6`__libc_start_main_impl +frame 9: meander`_start +(lldb) continue +Process XXXX resuming +Process XXXX stopped +* thread #1, name = 'XXXX', stop reason = breakpoint 2.1 + frame #0: 0x00000000000000 meander`caml_program +(lldb) backtrace +frame 0: meander`caml_program +frame 1: meander`caml_start_program +frame 2: meander`caml_startup_common +frame 3: meander`caml_startup_common +frame 4: meander`caml_startup_exn +frame 5: meander`caml_startup +frame 6: meander`caml_main +frame 7: meander`main +frame 8: libc.so.6`__libc_start_call_main +frame 9: libc.so.6`__libc_start_main_impl +frame 10: meander`_start +(lldb) continue +Process XXXX resuming +Process XXXX stopped +* thread #1, name = 'XXXX', stop reason = breakpoint 4.1 + frame #0: 0x00000000000000 meander`ocaml_to_c(unit=1) at meander_c.c:XX + 2 #include + 3 + 4 value ocaml_to_c (value unit) { +-> 5 caml_callback(*caml_named_value + ^ + 6 ("c_to_ocaml"), Val_unit); + 7 return Val_int(0); + 8 } +(lldb) backtrace +frame 0: meander`ocaml_to_c +frame 1: meander`caml_c_call +frame 2: meander`camlMeander.omain +frame 3: meander`camlMeander.entry +frame 4: meander`caml_program +frame 5: meander`caml_start_program +frame 6: meander`caml_startup_common +frame 7: meander`caml_startup_common +frame 8: meander`caml_startup_exn +frame 9: meander`caml_startup +frame 10: meander`caml_main +frame 11: meander`main +frame 12: libc.so.6`__libc_start_call_main +frame 13: libc.so.6`__libc_start_main_impl +frame 14: meander`_start +(lldb) continue +Process XXXX resuming +Process XXXX stopped +* thread #1, name = 'XXXX', stop reason = breakpoint 3.1 + frame #0: 0x00000000000000 meander`camlMeander.c_to_ocaml at meander.ml:5:20 + 2 : unit -> int = "ocaml_to_c" + 3 exception E1 + 4 exception E2 +-> 5 let c_to_ocaml () = raise E1 + ^ + 6 let _ = Callback.register + 7 "c_to_ocaml" c_to_ocaml + 8 let omain () = +(lldb) backtrace +frame 0: meander`camlMeander.c_to_ocaml +frame 1: meander`caml_start_program +frame 2: meander`caml_callback_exn +frame 3: meander`caml_callback +frame 4: meander`ocaml_to_c +frame 5: meander`caml_c_call +frame 6: meander`camlMeander.omain +frame 7: meander`camlMeander.entry +frame 8: meander`caml_program +frame 9: meander`caml_start_program +frame 10: meander`caml_startup_common +frame 11: meander`caml_startup_common +frame 12: meander`caml_startup_exn +frame 13: meander`caml_startup +frame 14: meander`caml_main +frame 15: meander`main +frame 16: libc.so.6`__libc_start_call_main +frame 17: libc.so.6`__libc_start_main_impl +frame 18: meander`_start +(lldb) quit diff --git a/testsuite/tests/native-debugger/linux-lldb-arm64.ml b/testsuite/tests/native-debugger/linux-lldb-arm64.ml new file mode 100644 index 00000000..3294e8af --- /dev/null +++ b/testsuite/tests/native-debugger/linux-lldb-arm64.ml @@ -0,0 +1,19 @@ +(* TEST + native-compiler; + no-tsan; (* Skip, TSan inserts extra frames into backtraces *) + linux; + arch_arm64; + script = "sh ${test_source_directory}/has_lldb.sh linux"; + script; + readonly_files = "meander.ml meander_c.c lldb_test.py"; + setup-ocamlopt.byte-build-env; + program = "${test_build_directory}/meander"; + flags = "-g -ccopt -O0"; + all_modules = "meander.ml meander_c.c"; + ocamlopt.byte; + debugger_script = "${test_source_directory}/lldb-script"; + lldb; + script = "sh ${test_source_directory}/sanitize.sh linux-lldb-arm64"; + script; + check-program-output; + *) diff --git a/testsuite/tests/native-debugger/linux-lldb-arm64.reference b/testsuite/tests/native-debugger/linux-lldb-arm64.reference new file mode 100644 index 00000000..0babd14f --- /dev/null +++ b/testsuite/tests/native-debugger/linux-lldb-arm64.reference @@ -0,0 +1,111 @@ +(lldb) target create "XXXX" +Current executable set to 'XXXX' (aarch64). +(lldb) command source -s 0 'XXXX' +Executing commands in 'XXXX'. +(lldb) settings set target.disable-aslr false +(lldb) settings set stop-disassembly-display never +(lldb) command script import ./lldb_test.py +(lldb) create caml_start_program +Breakpoint created for regex caml_start_program. +(lldb) create caml_program +Breakpoint created for regex caml_program. +(lldb) create camlMeander[.$]c_to_ocaml* +Breakpoint created for regex camlMeander[.$]c_to_ocaml*. +(lldb) create ocaml_to_c +Breakpoint created for regex ocaml_to_c. +(lldb) run +Process XXXX launched: 'XXXX' (aarch64) +Process XXXX stopped +* thread #1, name = 'XXXX', stop reason = breakpoint 1.1 + frame #0: 0x00000000000000 meander`caml_start_program +(lldb) backtrace +frame 0: meander`caml_start_program +frame 1: meander`caml_startup_common +frame 2: meander`caml_startup_common +frame 3: meander`caml_startup_exn +frame 4: meander`caml_startup +frame 5: meander`caml_main +frame 6: meander`main +frame 7: libc.so.6`__libc_start_call_main +frame 8: libc.so.6`__libc_start_main_impl +frame 9: meander`_start +(lldb) continue +Process XXXX resuming +Process XXXX stopped +* thread #1, name = 'XXXX', stop reason = breakpoint 2.1 + frame #0: 0x00000000000000 meander`caml_program +(lldb) backtrace +frame 0: meander`caml_program +frame 1: meander`caml_start_program +frame 2: meander`caml_startup_common +frame 3: meander`caml_startup_common +frame 4: meander`caml_startup_exn +frame 5: meander`caml_startup +frame 6: meander`caml_main +frame 7: meander`main +frame 8: libc.so.6`__libc_start_call_main +frame 9: libc.so.6`__libc_start_main_impl +frame 10: meander`_start +(lldb) continue +Process XXXX resuming +Process XXXX stopped +* thread #1, name = 'XXXX', stop reason = breakpoint 4.1 + frame #0: 0x00000000000000 meander`ocaml_to_c(unit=1) at meander_c.c:XX + 1 #include + 2 #include + 3 +-> 4 value ocaml_to_c (value unit) { + ^ + 5 caml_callback(*caml_named_value + 6 ("c_to_ocaml"), Val_unit); + 7 return Val_int(0); +(lldb) backtrace +frame 0: meander`ocaml_to_c +frame 1: meander`caml_c_call +frame 2: meander`camlMeander.omain +frame 3: meander`camlMeander.entry +frame 4: meander`caml_program +frame 5: meander`caml_start_program +frame 6: meander`caml_startup_common +frame 7: meander`caml_startup_common +frame 8: meander`caml_startup_exn +frame 9: meander`caml_startup +frame 10: meander`caml_main +frame 11: meander`main +frame 12: libc.so.6`__libc_start_call_main +frame 13: libc.so.6`__libc_start_main_impl +frame 14: meander`_start +(lldb) continue +This version of LLDB has no plugin for the language "assembler". Inspection of frame variables will be limited. +Process XXXX resuming +Process XXXX stopped +* thread #1, name = 'XXXX', stop reason = breakpoint 3.1 + frame #0: 0x00000000000000 meander`camlStd_exit.code_end at meander.ml:5 + 2 : unit -> int = "ocaml_to_c" + 3 exception E1 + 4 exception E2 +-> 5 let c_to_ocaml () = raise E1 + 6 let _ = Callback.register + 7 "c_to_ocaml" c_to_ocaml + 8 let omain () = +(lldb) backtrace +frame 0: meander`camlStd_exit.code_end +frame 1: meander`caml_start_program +frame 2: meander`caml_callback_exn +frame 3: meander`caml_callback +frame 4: meander`ocaml_to_c +frame 5: meander`caml_c_call +frame 6: meander`camlMeander.omain +frame 7: meander`camlMeander.entry +frame 8: meander`caml_program +frame 9: meander`caml_start_program +frame 10: meander`caml_startup_common +frame 11: meander`caml_startup_common +frame 12: meander`caml_startup_exn +frame 13: meander`caml_startup +frame 14: meander`caml_main +frame 15: meander`main +frame 16: libc.so.6`__libc_start_call_main +frame 17: libc.so.6`__libc_start_main_impl +frame 18: meander`_start +(lldb) quit diff --git a/testsuite/tests/native-debugger/lldb-script b/testsuite/tests/native-debugger/lldb-script new file mode 100644 index 00000000..a7aa8e04 --- /dev/null +++ b/testsuite/tests/native-debugger/lldb-script @@ -0,0 +1,16 @@ +settings set target.disable-aslr false +settings set stop-disassembly-display never +command script import ./lldb_test.py +create caml_start_program +create caml_program +create camlMeander[.$]c_to_ocaml* +create ocaml_to_c +run +backtrace +continue +backtrace +continue +backtrace +continue +backtrace +quit diff --git a/testsuite/tests/native-debugger/lldb_test.py b/testsuite/tests/native-debugger/lldb_test.py new file mode 100755 index 00000000..782dfadf --- /dev/null +++ b/testsuite/tests/native-debugger/lldb_test.py @@ -0,0 +1,57 @@ +#!/usr/bin/env python + +import lldb +import re + +# Trim trailing numbers on symbols. +# +def trim_basename(name): + return re.sub(r"(caml.*)_[0-9]+", r"\1", name) + +# Print backtrace by walking LLDB frames +# +def print_backtrace(debugger, command, result, dict): + """ + Walk process call stack printing out frame names + """ + target = debugger.GetSelectedTarget() + if target: + process = target.GetProcess() + if process: + frame_info = {} + thread = process.GetSelectedThread() + for thread in process: + for frame in thread: + print("frame %i: %s`%s"% (frame.idx, frame.module.file.basename, trim_basename(frame.name))) + else: + result.SetError('No current process for the debugger. Has a process to debug been launched?') + else: + result.SetError('No current target for the debugger. Has a process to debug been launched?') +# Usage: +# (lldb) backtrace + +# Create breakpoint at address +# lldb.target.BreakpointCreateByAddress(0x0000000100005ad0) + +# Create breakpoint on Regex +# lldb.target.BreakpointCreateByRegex("camlFib.fib_*") + +def create_breakpoint(debugger, command, result, dict): + """ + Create breakpoints based on symbol names + """ + target = debugger.GetSelectedTarget() + if target: + breakpoint = target.BreakpointCreateByRegex(command) + if (breakpoint and breakpoint.GetNumLocations() == 1): + print(f"Breakpoint created for regex {command}." ) + else: + print(f"No matches for breakpoint regex {command}.") + result.SetError(f"No matches for breakpoint regex {command}.") + else: + result.SetError('No current target for the debugger. Has a process to debug been launched?') + +def __lldb_init_module(debugger, internal_dict): + # Install commands for printing backtrace and setting breakpoints + debugger.HandleCommand('command script add -f %s.print_backtrace backtrace' % __name__) + debugger.HandleCommand('command script add -f %s.create_breakpoint create' % __name__) diff --git a/testsuite/tests/native-debugger/macos-lldb-amd64.ml b/testsuite/tests/native-debugger/macos-lldb-amd64.ml new file mode 100644 index 00000000..686407dc --- /dev/null +++ b/testsuite/tests/native-debugger/macos-lldb-amd64.ml @@ -0,0 +1,19 @@ +(* TEST + native-compiler; + no-tsan; (* Skip, TSan inserts extra frames into backtraces *) + macos; + arch_amd64; + script = "sh ${test_source_directory}/has_lldb.sh macos"; + script; + readonly_files = "meander.ml meander_c.c lldb_test.py"; + setup-ocamlopt.byte-build-env; + program = "${test_build_directory}/meander"; + flags = "-g -ccopt -O0"; + all_modules = "meander.ml meander_c.c"; + ocamlopt.byte; + debugger_script = "${test_source_directory}/lldb-script"; + lldb; + script = "sh ${test_source_directory}/sanitize.sh macos-lldb-amd64"; + script; + check-program-output; + *) diff --git a/testsuite/tests/native-debugger/macos-lldb-amd64.reference b/testsuite/tests/native-debugger/macos-lldb-amd64.reference new file mode 100644 index 00000000..0cb34b38 --- /dev/null +++ b/testsuite/tests/native-debugger/macos-lldb-amd64.reference @@ -0,0 +1,95 @@ +(lldb) target create "XXXX" +Current executable set to 'XXXX' ($ARCH). +(lldb) command source -s 0 'XXXX' +Executing commands in 'XXXX'. +(lldb) settings set target.disable-aslr false +(lldb) settings set stop-disassembly-display never +(lldb) command script import ./lldb_test.py +(lldb) create caml_start_program +Breakpoint created for regex caml_start_program. +(lldb) create caml_program +Breakpoint created for regex caml_program. +(lldb) create camlMeander[.$]c_to_ocaml* +Breakpoint created for regex camlMeander[.$]c_to_ocaml*. +(lldb) create ocaml_to_c +Breakpoint created for regex ocaml_to_c. +(lldb) run +Process XXXX stopped +* thread #1, queue = 'XXXX', stop reason = breakpoint 1.1 + frame #0: 0x00000000000000 meander`caml_start_program +Target 0: (meander) stopped. +Process XXXX launched: 'XXXX' ($ARCH) +(lldb) backtrace +frame 0: meander`caml_start_program +frame 1: meander`caml_startup_common +frame 2: meander`caml_startup_exn +frame 3: meander`caml_startup +frame 4: meander`caml_main +frame 5: meander`main +frame 6: dyld`start +(lldb) continue +Process XXXX resuming +Process XXXX stopped +* thread #1, queue = 'XXXX', stop reason = breakpoint 2.1 + frame #0: 0x00000000000000 meander`caml_program +Target 0: (meander) stopped. +(lldb) backtrace +frame 0: meander`caml_program +frame 1: meander`caml_start_program +frame 2: meander`caml_startup_common +frame 3: meander`caml_startup_exn +frame 4: meander`caml_startup +frame 5: meander`caml_main +frame 6: meander`main +frame 7: dyld`start +(lldb) continue +Process XXXX resuming +Process XXXX stopped +* thread #1, queue = 'XXXX', stop reason = breakpoint 4.1 + frame #0: 0x00000000000000 meander`ocaml_to_c(unit=1) at meander_c.c:XX [opt] + 2 #include + 3 + 4 value ocaml_to_c (value unit) { +-> 5 caml_callback(*caml_named_value + ^ + 6 ("c_to_ocaml"), Val_unit); + 7 return Val_int(0); + 8 } +Target 0: (meander) stopped. +(lldb) backtrace +frame 0: meander`ocaml_to_c +frame 1: meander`caml_c_call +frame 2: meander`camlMeander$omain +frame 3: meander`camlMeander$entry +frame 4: meander`caml_program +frame 5: meander`caml_start_program +frame 6: meander`caml_startup_common +frame 7: meander`caml_startup_exn +frame 8: meander`caml_startup +frame 9: meander`caml_main +frame 10: meander`main +frame 11: dyld`start +(lldb) continue +Process XXXX resuming +Process XXXX stopped +* thread #1, queue = 'XXXX', stop reason = breakpoint 3.1 + frame #0: 0x00000000000000 meander`camlMeander$c_to_ocaml +Target 0: (meander) stopped. +(lldb) backtrace +frame 0: meander`camlMeander$c_to_ocaml +frame 1: meander`caml_start_program +frame 2: meander`caml_callback_exn +frame 3: meander`caml_callback +frame 4: meander`ocaml_to_c +frame 5: meander`caml_c_call +frame 6: meander`camlMeander$omain +frame 7: meander`camlMeander$entry +frame 8: meander`caml_program +frame 9: meander`caml_start_program +frame 10: meander`caml_startup_common +frame 11: meander`caml_startup_exn +frame 12: meander`caml_startup +frame 13: meander`caml_main +frame 14: meander`main +frame 15: dyld`start +(lldb) quit diff --git a/testsuite/tests/native-debugger/macos-lldb-arm64.ml b/testsuite/tests/native-debugger/macos-lldb-arm64.ml new file mode 100644 index 00000000..3067749e --- /dev/null +++ b/testsuite/tests/native-debugger/macos-lldb-arm64.ml @@ -0,0 +1,19 @@ +(* TEST + native-compiler; + no-tsan; (* Skip, TSan inserts extra frames into backtraces *) + macos; + arch_arm64; + script = "sh ${test_source_directory}/has_lldb.sh macos"; + script; + readonly_files = "meander.ml meander_c.c lldb_test.py"; + setup-ocamlopt.byte-build-env; + program = "${test_build_directory}/meander"; + flags = "-g -ccopt -O0"; + all_modules = "meander.ml meander_c.c"; + ocamlopt.byte; + debugger_script = "${test_source_directory}/lldb-script"; + lldb; + script = "sh ${test_source_directory}/sanitize.sh macos-lldb-arm64"; + script; + check-program-output; + *) diff --git a/testsuite/tests/native-debugger/macos-lldb-arm64.reference b/testsuite/tests/native-debugger/macos-lldb-arm64.reference new file mode 100644 index 00000000..80abccfa --- /dev/null +++ b/testsuite/tests/native-debugger/macos-lldb-arm64.reference @@ -0,0 +1,95 @@ +(lldb) target create "XXXX" +Current executable set to 'XXXX' ($ARCH). +(lldb) command source -s 0 'XXXX' +Executing commands in 'XXXX'. +(lldb) settings set target.disable-aslr false +(lldb) settings set stop-disassembly-display never +(lldb) command script import ./lldb_test.py +(lldb) create caml_start_program +Breakpoint created for regex caml_start_program. +(lldb) create caml_program +Breakpoint created for regex caml_program. +(lldb) create camlMeander[.$]c_to_ocaml* +Breakpoint created for regex camlMeander[.$]c_to_ocaml*. +(lldb) create ocaml_to_c +Breakpoint created for regex ocaml_to_c. +(lldb) run +Process XXXX launched: 'XXXX' ($ARCH) +Process XXXX stopped +* thread #1, queue = 'XXXX', stop reason = breakpoint 1.1 + frame #0: 0x00000000000000 meander`caml_start_program +Target 0: (meander) stopped. +(lldb) backtrace +frame 0: meander`caml_start_program +frame 1: meander`caml_startup_common +frame 2: meander`caml_startup_exn +frame 3: meander`caml_startup +frame 4: meander`caml_main +frame 5: meander`main +frame 6: dyld`start +(lldb) continue +Process XXXX resuming +Process XXXX stopped +* thread #1, queue = 'XXXX', stop reason = breakpoint 2.1 + frame #0: 0x00000000000000 meander`caml_program +Target 0: (meander) stopped. +(lldb) backtrace +frame 0: meander`caml_program +frame 1: meander`caml_start_program +frame 2: meander`caml_startup_common +frame 3: meander`caml_startup_exn +frame 4: meander`caml_startup +frame 5: meander`caml_main +frame 6: meander`main +frame 7: dyld`start +(lldb) continue +Process XXXX resuming +Process XXXX stopped +* thread #1, queue = 'XXXX', stop reason = breakpoint 4.1 + frame #0: 0x00000000000000 meander`ocaml_to_c(unit=1) at meander_c.c:XX + 2 #include + 3 + 4 value ocaml_to_c (value unit) { +-> 5 caml_callback(*caml_named_value + ^ + 6 ("c_to_ocaml"), Val_unit); + 7 return Val_int(0); + 8 } +Target 0: (meander) stopped. +(lldb) backtrace +frame 0: meander`ocaml_to_c +frame 1: meander`caml_c_call +frame 2: meander`camlMeander$omain +frame 3: meander`camlMeander$entry +frame 4: meander`caml_program +frame 5: meander`caml_start_program +frame 6: meander`caml_startup_common +frame 7: meander`caml_startup_exn +frame 8: meander`caml_startup +frame 9: meander`caml_main +frame 10: meander`main +frame 11: dyld`start +(lldb) continue +Process XXXX resuming +Process XXXX stopped +* thread #1, queue = 'XXXX', stop reason = breakpoint 3.1 + frame #0: 0x00000000000000 meander`camlMeander$c_to_ocaml +Target 0: (meander) stopped. +(lldb) backtrace +frame 0: meander`camlMeander$c_to_ocaml +frame 1: meander`caml_start_program +frame 2: meander`caml_callback_exn +frame 3: meander`caml_callback +frame 4: meander`ocaml_to_c +frame 5: meander`caml_c_call +frame 6: meander`camlMeander$omain +frame 7: meander`camlMeander$entry +frame 8: meander`caml_program +frame 9: meander`caml_start_program +frame 10: meander`caml_startup_common +frame 11: meander`caml_startup_exn +frame 12: meander`caml_startup +frame 13: meander`caml_main +frame 14: meander`main +frame 15: dyld`start +(lldb) quit diff --git a/testsuite/tests/native-debugger/meander.ml b/testsuite/tests/native-debugger/meander.ml new file mode 100644 index 00000000..af213f36 --- /dev/null +++ b/testsuite/tests/native-debugger/meander.ml @@ -0,0 +1,13 @@ +external ocaml_to_c + : unit -> int = "ocaml_to_c" +exception E1 +exception E2 +let c_to_ocaml () = raise E1 +let _ = Callback.register + "c_to_ocaml" c_to_ocaml +let omain () = + try (* h1 *) + try (* h2 *) ocaml_to_c () + with E2 -> 0 + with E1 -> 42 +let _ = assert (omain () = 42) diff --git a/testsuite/tests/native-debugger/meander_c.c b/testsuite/tests/native-debugger/meander_c.c new file mode 100644 index 00000000..72d8f6cf --- /dev/null +++ b/testsuite/tests/native-debugger/meander_c.c @@ -0,0 +1,8 @@ +#include +#include + +value ocaml_to_c (value unit) { + caml_callback(*caml_named_value + ("c_to_ocaml"), Val_unit); + return Val_int(0); +} diff --git a/testsuite/tests/native-debugger/sanitize.awk b/testsuite/tests/native-debugger/sanitize.awk new file mode 100644 index 00000000..c68aafc1 --- /dev/null +++ b/testsuite/tests/native-debugger/sanitize.awk @@ -0,0 +1,61 @@ +# Replace sections of LLDB and GDB output +# This primarily looks for hex addresses, process ids, filepaths and +# other specific details of the machine the test is running on. +{ + # Replace single quoted file paths + gsub(/'(.*)'/,"'XXXX'") + + # Replace target create for executable + gsub(/target create "(.*)"/,"target create \"XXXX\"") + + # Replace hex addresses, not offset values less than 4 digits. + gsub(/0x[0-9a-f][0-9a-f][0-9a-f][0-9a-f]+/, "0x00000000000000") + + # Sanitise executable name in image lookup + gsub("5 matches found in /(.*):$", "5 matches found in XXXX") + + # Replace debug process forked by lldb + gsub("Process ([0-9]+)", "Process XXXX") + + # Replace debug process forked by gdb + gsub("[Inferior 1 (process [0-9]+) exited normally]", "[Inferior 1 (process XXXX) exited normally]") + + # Replace architecture identifiers + gsub("(x86_64)", "$ARCH") + gsub("(arm64)", "$ARCH") + gsub("(riscv64)", "$ARCH") + + # Replace offsets in disassembly output + gsub(/\<\+[0-9]+\>/, "<+XX>") + + # Replace comments with blank comments + gsub(/; [a-zA-Z0-9._+ ]+/, ";") + + # Replace line numbers in runtime files - one rule for lldb, one for gdb + # (it would be better to only match on runtime/*.c, but gsub does not + # handle ERE) + gsub(/.c:[0-9]+:[0-9]+/, ".c:XX") + gsub(/.c:[0-9]+/, ".c:XX") + + # Replace libpath. Different distributions have different naming + # schemes. + gsub(/Using host libthread_db library "\/(.*)\/libthread_db\.so\.1"\./, + "Using host libthread_db library \"/XXXX/libthread_db.so.1\".") + + # Replace line number when setting breakpoints in GDB. + gsub(/line [0-9]+/, "line XXX") + + # Work around inconsistent name mangling + gsub(/c_to_ocaml_[0-9]+/, "c_to_ocaml") + + gsub("warning: This version of LLDB", "This version of LLDB") + gsub("This version of LLDB has no plugin for the language \"assembler\". Inspection of frame variables will be limited.", "") + # Replace printed match results + gsub("1 match found in /(.*):$", "1 match found in \"XXXX\":") + + # Remove trailing blanks + gsub(/[ \t]+$/, "") + + if ($0 != "") + print $0 +} diff --git a/testsuite/tests/native-debugger/sanitize.sh b/testsuite/tests/native-debugger/sanitize.sh new file mode 100755 index 00000000..7e102b50 --- /dev/null +++ b/testsuite/tests/native-debugger/sanitize.sh @@ -0,0 +1,9 @@ +#!/bin/sh + +test_name="$1" + +awk -f ${test_source_directory}/sanitize.awk \ + ${test_build_directory}/${test_name}.opt.output > ${test_build_directory}/${test_name}.opt.awk.output + +mv ${test_build_directory}/${test_name}.opt.output ${test_build_directory}/${test_name}.opt.output.bak +cp ${test_build_directory}/${test_name}.opt.awk.output ${test_build_directory}/${test_name}.opt.output diff --git a/testsuite/tests/no-alias-deps/aliases.compilers.reference b/testsuite/tests/no-alias-deps/aliases.compilers.reference index 7cbb52c1..a1bcad32 100644 --- a/testsuite/tests/no-alias-deps/aliases.compilers.reference +++ b/testsuite/tests/no-alias-deps/aliases.compilers.reference @@ -6,5 +6,6 @@ Warning 49 [no-cmi-file]: no cmi file was found in path for module A File "aliases.ml", line 18, characters 12-13: 18 | module B' = B (* broken b.cmi *) ^ -Warning 49 [no-cmi-file]: no valid cmi file was found in path for module B. b.cmi +Warning 49 [no-cmi-file]: no valid cmi file was found in path for module B. + b.cmi is not a compiled interface diff --git a/testsuite/tests/parallel/catch_break.ml b/testsuite/tests/parallel/catch_break.ml index 7febd045..027e5c67 100644 --- a/testsuite/tests/parallel/catch_break.ml +++ b/testsuite/tests/parallel/catch_break.ml @@ -1,7 +1,7 @@ (* TEST hassysthreads; include systhreads; -not-windows; +not-target-windows; no-tsan; { bytecode; diff --git a/testsuite/tests/parallel/mctest.ml b/testsuite/tests/parallel/mctest.ml index ea339e31..8e2c51f6 100644 --- a/testsuite/tests/parallel/mctest.ml +++ b/testsuite/tests/parallel/mctest.ml @@ -1,5 +1,6 @@ (* TEST include unix; + multicore; hasunix; { bytecode; diff --git a/testsuite/tests/parallel/pingpong.ml b/testsuite/tests/parallel/pingpong.ml index eb43734a..2508df5d 100644 --- a/testsuite/tests/parallel/pingpong.ml +++ b/testsuite/tests/parallel/pingpong.ml @@ -1,4 +1,5 @@ (* TEST + multicore; no-tsan; (* TSan detects the intentional data race *) { bytecode; diff --git a/testsuite/tests/parse-errors/bigarray_index_labels.compilers.reference b/testsuite/tests/parse-errors/bigarray_index_labels.compilers.reference new file mode 100644 index 00000000..0157b9e1 --- /dev/null +++ b/testsuite/tests/parse-errors/bigarray_index_labels.compilers.reference @@ -0,0 +1,6 @@ +File "bigarray_index_labels.ml", line 13, characters 0-12: +13 | my_big_array.{(1, ~y:2)} <- 1.5;; + ^^^^^^^^^^^^ +Error: The value my_big_array has type + (float, Bigarray.float32_elt, Bigarray.c_layout) Bigarray.Array2.t + but an expression was expected of type ('a, 'b, 'c) Bigarray.Array1.t diff --git a/testsuite/tests/parse-errors/bigarray_index_labels.ml b/testsuite/tests/parse-errors/bigarray_index_labels.ml new file mode 100644 index 00000000..e4a24d26 --- /dev/null +++ b/testsuite/tests/parse-errors/bigarray_index_labels.ml @@ -0,0 +1,13 @@ +(* TEST + setup-ocamlc.byte-build-env; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + check-ocamlc.byte-output; +*) + +open Bigarray + +let my_big_array = + Bigarray.Array2.create Bigarray.float32 Bigarray.c_layout 20 20;; + +my_big_array.{(1, ~y:2)} <- 1.5;; diff --git a/testsuite/tests/parse-errors/expecting.compilers.reference b/testsuite/tests/parse-errors/expecting.compilers.reference index 2c5dae1b..55e7b7fa 100644 --- a/testsuite/tests/parse-errors/expecting.compilers.reference +++ b/testsuite/tests/parse-errors/expecting.compilers.reference @@ -1,33 +1,33 @@ Line 6, characters 9-10: 6 | | 3 as 3 -> () ^ -Error: Syntax error: "identifier" expected. +Error: Syntax error: identifier expected. Line 3, characters 9-11: 3 | | 3 :: -> () ^^ -Error: Syntax error: "pattern" expected. +Error: Syntax error: pattern expected. Line 3, characters 8-10: 3 | | 3 | -> () ^^ -Error: Syntax error: "pattern" expected. +Error: Syntax error: pattern expected. Line 3, characters 11-13: 3 | | List.( -> () ^^ -Error: Syntax error: "pattern" expected. +Error: Syntax error: pattern expected. Line 3, characters 9-10: 3 | | (3 : 3) -> () ^ -Error: Syntax error: "type" expected. +Error: Syntax error: type expected. Line 3, characters 7-8: 3 | | (3,) -> () ^ -Error: Syntax error: "pattern" expected. +Error: Syntax error: pattern expected. Line 3, characters 6-8: 3 | | ( -> () ^^ -Error: Syntax error: "operator" expected. +Error: Syntax error: operator expected. Line 3, characters 12-14: 3 | | (module -> () ^^ -Error: Syntax error: "module-expr" expected. +Error: Syntax error: module-expr expected. diff --git a/testsuite/tests/parse-errors/mismatch_struct_sig.compilers.reference b/testsuite/tests/parse-errors/mismatch_struct_sig.compilers.reference index 48737e28..1df88896 100644 --- a/testsuite/tests/parse-errors/mismatch_struct_sig.compilers.reference +++ b/testsuite/tests/parse-errors/mismatch_struct_sig.compilers.reference @@ -1,19 +1,19 @@ Line 5, characters 16-22: 5 | module type S = struct end ^^^^^^ -Error: Syntax error: "sig" expected. +Error: Syntax error: sig expected. Line 3, characters 18-24: 3 | module type S = struct end ^^^^^^ -Error: Syntax error: "sig" expected. +Error: Syntax error: sig expected. Line 3, characters 13-19: 3 | module M : struct end ^^^^^^ -Error: Syntax error: "sig" expected. +Error: Syntax error: sig expected. Line 3, characters 11-12: 3 | module M = struct end ^ -Error: Syntax error: ":" expected. +Error: Syntax error: : expected. Line 3, characters 0-2: 3 | ;; ^^ @@ -21,17 +21,17 @@ Error: Syntax error Line 2, characters 11-17: 2 | module M : struct end ^^^^^^ -Error: Syntax error: "sig" expected. +Error: Syntax error: sig expected. Line 3, characters 32-38: 3 | module M : functor (X : S) -> struct end ^^^^^^ -Error: Syntax error: "sig" expected. +Error: Syntax error: sig expected. Line 2, characters 15-18: 2 | module M = X.Y(sig end) ^^^ -Error: Syntax error: "struct" expected. +Error: Syntax error: struct expected. Line 3, characters 25-28: 3 | include module type of sig end ^^^ -Error: Syntax error: "struct" expected. +Error: Syntax error: struct expected. diff --git a/testsuite/tests/parse-errors/singleton_labeled_tuple_type.compilers.reference b/testsuite/tests/parse-errors/singleton_labeled_tuple_type.compilers.reference new file mode 100644 index 00000000..f43a31e3 --- /dev/null +++ b/testsuite/tests/parse-errors/singleton_labeled_tuple_type.compilers.reference @@ -0,0 +1,4 @@ +File "singleton_labeled_tuple_type.ml", line 7, characters 26-27: +7 | let foo (just_x : (x : int)) = just_x + ^ +Error: Syntax error diff --git a/testsuite/tests/parse-errors/singleton_labeled_tuple_type.ml b/testsuite/tests/parse-errors/singleton_labeled_tuple_type.ml new file mode 100644 index 00000000..277e9860 --- /dev/null +++ b/testsuite/tests/parse-errors/singleton_labeled_tuple_type.ml @@ -0,0 +1,7 @@ +(* TEST + setup-ocamlc.byte-build-env; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + check-ocamlc.byte-output; +*) +let foo (just_x : (x : int)) = just_x diff --git a/testsuite/tests/parse-errors/unclosed_class_signature.compilers.reference b/testsuite/tests/parse-errors/unclosed_class_signature.compilers.reference index 8167d939..3fe317b8 100644 --- a/testsuite/tests/parse-errors/unclosed_class_signature.compilers.reference +++ b/testsuite/tests/parse-errors/unclosed_class_signature.compilers.reference @@ -1,6 +1,6 @@ File "unclosed_class_signature.mli", line 11, characters 0-0: -Error: Syntax error: "end" expected +Error: Syntax error: end expected File "unclosed_class_signature.mli", line 10, characters 10-16: 10 | class c : object ^^^^^^ - This "object" might be unmatched + This object might be unmatched diff --git a/testsuite/tests/parse-errors/unclosed_class_simpl_expr1.compilers.reference b/testsuite/tests/parse-errors/unclosed_class_simpl_expr1.compilers.reference index 682dee58..e3f3f3e5 100644 --- a/testsuite/tests/parse-errors/unclosed_class_simpl_expr1.compilers.reference +++ b/testsuite/tests/parse-errors/unclosed_class_simpl_expr1.compilers.reference @@ -1,6 +1,6 @@ File "unclosed_class_simpl_expr1.ml", line 10, characters 0-0: -Error: Syntax error: "end" expected +Error: Syntax error: end expected File "unclosed_class_simpl_expr1.ml", line 8, characters 10-16: 8 | class c = object ^^^^^^ - This "object" might be unmatched + This object might be unmatched diff --git a/testsuite/tests/parse-errors/unclosed_class_simpl_expr2.compilers.reference b/testsuite/tests/parse-errors/unclosed_class_simpl_expr2.compilers.reference index b47784f1..3ec3cb11 100644 --- a/testsuite/tests/parse-errors/unclosed_class_simpl_expr2.compilers.reference +++ b/testsuite/tests/parse-errors/unclosed_class_simpl_expr2.compilers.reference @@ -1,6 +1,6 @@ File "unclosed_class_simpl_expr2.ml", line 9, characters 0-0: -Error: Syntax error: ")" expected +Error: Syntax error: ) expected File "unclosed_class_simpl_expr2.ml", line 8, characters 10-11: 8 | class c = (object end : object end ^ - This "(" might be unmatched + This ( might be unmatched diff --git a/testsuite/tests/parse-errors/unclosed_class_simpl_expr3.compilers.reference b/testsuite/tests/parse-errors/unclosed_class_simpl_expr3.compilers.reference index 0ffd51ce..932913b4 100644 --- a/testsuite/tests/parse-errors/unclosed_class_simpl_expr3.compilers.reference +++ b/testsuite/tests/parse-errors/unclosed_class_simpl_expr3.compilers.reference @@ -1,6 +1,6 @@ File "unclosed_class_simpl_expr3.ml", line 9, characters 0-0: -Error: Syntax error: ")" expected +Error: Syntax error: ) expected File "unclosed_class_simpl_expr3.ml", line 8, characters 10-11: 8 | class c = (object end ^ - This "(" might be unmatched + This ( might be unmatched diff --git a/testsuite/tests/parse-errors/unclosed_object.compilers.reference b/testsuite/tests/parse-errors/unclosed_object.compilers.reference index 3d662a29..2acd0c8c 100644 --- a/testsuite/tests/parse-errors/unclosed_object.compilers.reference +++ b/testsuite/tests/parse-errors/unclosed_object.compilers.reference @@ -1,6 +1,6 @@ File "unclosed_object.ml", line 11, characters 0-0: -Error: Syntax error: "end" expected +Error: Syntax error: end expected File "unclosed_object.ml", line 10, characters 8-14: 10 | let o = object ^^^^^^ - This "object" might be unmatched + This object might be unmatched diff --git a/testsuite/tests/parse-errors/unclosed_paren_module_expr1.compilers.reference b/testsuite/tests/parse-errors/unclosed_paren_module_expr1.compilers.reference index b564efe6..b1e04e0d 100644 --- a/testsuite/tests/parse-errors/unclosed_paren_module_expr1.compilers.reference +++ b/testsuite/tests/parse-errors/unclosed_paren_module_expr1.compilers.reference @@ -1,6 +1,6 @@ File "unclosed_paren_module_expr1.ml", line 9, characters 0-0: -Error: Syntax error: ")" expected +Error: Syntax error: ) expected File "unclosed_paren_module_expr1.ml", line 8, characters 11-12: 8 | module M = (struct end : sig end ^ - This "(" might be unmatched + This ( might be unmatched diff --git a/testsuite/tests/parse-errors/unclosed_paren_module_expr2.compilers.reference b/testsuite/tests/parse-errors/unclosed_paren_module_expr2.compilers.reference index 76a72200..4d5b8cfc 100644 --- a/testsuite/tests/parse-errors/unclosed_paren_module_expr2.compilers.reference +++ b/testsuite/tests/parse-errors/unclosed_paren_module_expr2.compilers.reference @@ -1,6 +1,6 @@ File "unclosed_paren_module_expr2.ml", line 9, characters 0-0: -Error: Syntax error: ")" expected +Error: Syntax error: ) expected File "unclosed_paren_module_expr2.ml", line 8, characters 11-12: 8 | module M = (struct end ^ - This "(" might be unmatched + This ( might be unmatched diff --git a/testsuite/tests/parse-errors/unclosed_paren_module_expr3.compilers.reference b/testsuite/tests/parse-errors/unclosed_paren_module_expr3.compilers.reference index c3d86d1d..027bc6ea 100644 --- a/testsuite/tests/parse-errors/unclosed_paren_module_expr3.compilers.reference +++ b/testsuite/tests/parse-errors/unclosed_paren_module_expr3.compilers.reference @@ -1,6 +1,6 @@ File "unclosed_paren_module_expr3.ml", line 9, characters 0-0: -Error: Syntax error: ")" expected +Error: Syntax error: ) expected File "unclosed_paren_module_expr3.ml", line 8, characters 11-12: 8 | module M = (val 3 : ^ - This "(" might be unmatched + This ( might be unmatched diff --git a/testsuite/tests/parse-errors/unclosed_paren_module_expr4.compilers.reference b/testsuite/tests/parse-errors/unclosed_paren_module_expr4.compilers.reference index 74c5ec1e..82864426 100644 --- a/testsuite/tests/parse-errors/unclosed_paren_module_expr4.compilers.reference +++ b/testsuite/tests/parse-errors/unclosed_paren_module_expr4.compilers.reference @@ -1,6 +1,6 @@ File "unclosed_paren_module_expr4.ml", line 9, characters 0-0: -Error: Syntax error: ")" expected +Error: Syntax error: ) expected File "unclosed_paren_module_expr4.ml", line 8, characters 11-12: 8 | module M = (val 3 :> ^ - This "(" might be unmatched + This ( might be unmatched diff --git a/testsuite/tests/parse-errors/unclosed_paren_module_expr5.compilers.reference b/testsuite/tests/parse-errors/unclosed_paren_module_expr5.compilers.reference index d203d12f..90d3bf47 100644 --- a/testsuite/tests/parse-errors/unclosed_paren_module_expr5.compilers.reference +++ b/testsuite/tests/parse-errors/unclosed_paren_module_expr5.compilers.reference @@ -1,6 +1,6 @@ File "unclosed_paren_module_expr5.ml", line 9, characters 0-0: -Error: Syntax error: ")" expected +Error: Syntax error: ) expected File "unclosed_paren_module_expr5.ml", line 8, characters 11-12: 8 | module M = (val 3 ^ - This "(" might be unmatched + This ( might be unmatched diff --git a/testsuite/tests/parse-errors/unclosed_paren_module_type.compilers.reference b/testsuite/tests/parse-errors/unclosed_paren_module_type.compilers.reference index ca044b5c..873a5f67 100644 --- a/testsuite/tests/parse-errors/unclosed_paren_module_type.compilers.reference +++ b/testsuite/tests/parse-errors/unclosed_paren_module_type.compilers.reference @@ -1,6 +1,6 @@ File "unclosed_paren_module_type.mli", line 9, characters 0-0: -Error: Syntax error: ")" expected +Error: Syntax error: ) expected File "unclosed_paren_module_type.mli", line 8, characters 11-12: 8 | module M : (sig end ^ - This "(" might be unmatched + This ( might be unmatched diff --git a/testsuite/tests/parse-errors/unclosed_sig.compilers.reference b/testsuite/tests/parse-errors/unclosed_sig.compilers.reference index a29de13a..80fb7fe6 100644 --- a/testsuite/tests/parse-errors/unclosed_sig.compilers.reference +++ b/testsuite/tests/parse-errors/unclosed_sig.compilers.reference @@ -1,6 +1,6 @@ File "unclosed_sig.mli", line 10, characters 0-0: -Error: Syntax error: "end" expected +Error: Syntax error: end expected File "unclosed_sig.mli", line 8, characters 11-14: 8 | module M : sig ^^^ - This "sig" might be unmatched + This sig might be unmatched diff --git a/testsuite/tests/parse-errors/unclosed_simple_expr.compilers.reference b/testsuite/tests/parse-errors/unclosed_simple_expr.compilers.reference index a19826a6..7fdfe01b 100644 --- a/testsuite/tests/parse-errors/unclosed_simple_expr.compilers.reference +++ b/testsuite/tests/parse-errors/unclosed_simple_expr.compilers.reference @@ -1,201 +1,201 @@ Line 5, characters 5-7: 5 | (3; 2;; ^^ -Error: Syntax error: ")" expected +Error: Syntax error: ) expected Line 5, characters 0-1: 5 | (3; 2;; ^ - This "(" might be unmatched + This ( might be unmatched Line 2, characters 10-12: 2 | begin 3; 2;; ^^ -Error: Syntax error: "end" expected +Error: Syntax error: end expected Line 2, characters 0-5: 2 | begin 3; 2;; ^^^^^ - This "begin" might be unmatched + This begin might be unmatched Line 2, characters 10-12: 2 | List.(3; 2;; ^^ -Error: Syntax error: ")" expected +Error: Syntax error: ) expected Line 2, characters 5-6: 2 | List.(3; 2;; ^ - This "(" might be unmatched + This ( might be unmatched Line 2, characters 17-19: 2 | simple_expr.(3; 2;; ^^ -Error: Syntax error: ")" expected +Error: Syntax error: ) expected Line 2, characters 12-13: 2 | simple_expr.(3; 2;; ^ - This "(" might be unmatched + This ( might be unmatched Line 2, characters 17-19: 2 | simple_expr.[3; 2;; ^^ -Error: Syntax error: "]" expected +Error: Syntax error: ] expected Line 2, characters 12-13: 2 | simple_expr.[3; 2;; ^ - This "[" might be unmatched + This [ might be unmatched Line 2, characters 15-17: 2 | simple_expr.%[3;; ^^ -Error: Syntax error: "]" expected +Error: Syntax error: ] expected Line 2, characters 13-14: 2 | simple_expr.%[3;; ^ - This "[" might be unmatched + This [ might be unmatched Line 2, characters 15-17: 2 | simple_expr.%(3;; ^^ -Error: Syntax error: ")" expected +Error: Syntax error: ) expected Line 2, characters 13-14: 2 | simple_expr.%(3;; ^ - This "(" might be unmatched + This ( might be unmatched Line 2, characters 15-17: 2 | simple_expr.%{3;; ^^ -Error: Syntax error: "}" expected +Error: Syntax error: } expected Line 2, characters 13-14: 2 | simple_expr.%{3;; ^ - This "{" might be unmatched + This { might be unmatched Line 2, characters 11-13: 2 | foo.Bar.%[3;; ^^ -Error: Syntax error: "]" expected +Error: Syntax error: ] expected Line 2, characters 9-10: 2 | foo.Bar.%[3;; ^ - This "[" might be unmatched + This [ might be unmatched Line 2, characters 11-13: 2 | foo.Bar.%(3;; ^^ -Error: Syntax error: ")" expected +Error: Syntax error: ) expected Line 2, characters 9-10: 2 | foo.Bar.%(3;; ^ - This "(" might be unmatched + This ( might be unmatched Line 2, characters 11-13: 2 | foo.Bar.%{3;; ^^ -Error: Syntax error: "}" expected +Error: Syntax error: } expected Line 2, characters 9-10: 2 | foo.Bar.%{3;; ^ - This "{" might be unmatched + This { might be unmatched Line 2, characters 17-19: 2 | simple_expr.{3, 2;; ^^ -Error: Syntax error: "}" expected +Error: Syntax error: } expected Line 2, characters 12-13: 2 | simple_expr.{3, 2;; ^ - This "{" might be unmatched + This { might be unmatched Line 2, characters 10-12: 2 | { x = 3; y;; ^^ -Error: Syntax error: "}" expected +Error: Syntax error: } expected Line 2, characters 0-1: 2 | { x = 3; y;; ^ - This "{" might be unmatched + This { might be unmatched Line 2, characters 16-18: 2 | List.{ x = 3; y ;; ^^ -Error: Syntax error: "}" expected +Error: Syntax error: } expected Line 2, characters 5-6: 2 | List.{ x = 3; y ;; ^ - This "{" might be unmatched + This { might be unmatched Line 2, characters 7-9: 2 | [| 3; 2;; ^^ -Error: Syntax error: "|]" expected +Error: Syntax error: |] expected Line 2, characters 0-2: 2 | [| 3; 2;; ^^ - This "[|" might be unmatched + This [| might be unmatched Line 2, characters 11-13: 2 | List.[|3; 2;; ^^ -Error: Syntax error: "|]" expected +Error: Syntax error: |] expected Line 2, characters 5-7: 2 | List.[|3; 2;; ^^ - This "[|" might be unmatched + This [| might be unmatched Line 2, characters 5-7: 2 | [3; 2;; ^^ -Error: Syntax error: "]" expected +Error: Syntax error: ] expected Line 2, characters 0-1: 2 | [3; 2;; ^ - This "[" might be unmatched + This [ might be unmatched Line 2, characters 10-12: 2 | List.[3; 2;; ^^ -Error: Syntax error: "]" expected +Error: Syntax error: ] expected Line 2, characters 5-6: 2 | List.[3; 2;; ^ - This "[" might be unmatched + This [ might be unmatched Line 2, characters 13-15: 2 | {< x = 3; y; ;; ^^ -Error: Syntax error: ">}" expected +Error: Syntax error: >} expected Line 2, characters 0-2: 2 | {< x = 3; y; ;; ^^ - This "{<" might be unmatched + This {< might be unmatched Line 2, characters 17-19: 2 | List.{< x = 3; y ;; ^^ -Error: Syntax error: ">}" expected +Error: Syntax error: >} expected Line 2, characters 5-7: 2 | List.{< x = 3; y ;; ^^ - This "{<" might be unmatched + This {< might be unmatched Line 2, characters 20-22: 2 | (module struct end :;; ^^ -Error: Syntax error: ")" expected +Error: Syntax error: ) expected Line 2, characters 0-1: 2 | (module struct end :;; ^ - This "(" might be unmatched + This ( might be unmatched Line 2, characters 25-27: 2 | List.(module struct end :;; ^^ -Error: Syntax error: ")" expected +Error: Syntax error: ) expected Line 2, characters 5-6: 2 | List.(module struct end :;; ^ - This "(" might be unmatched + This ( might be unmatched Line 2, characters 2-4: 2 | (=;; ^^ -Error: Syntax error: ")" expected +Error: Syntax error: ) expected Line 2, characters 0-1: 2 | (=;; ^ - This "(" might be unmatched + This ( might be unmatched Line 2, characters 14-16: 2 | while true do ();; ^^ -Error: Syntax error: "done" expected +Error: Syntax error: done expected Line 2, characters 11-13: 2 | while true do ();; ^^ - This "do" might be unmatched + This do might be unmatched Line 2, characters 20-22: 2 | for _ = e1 to e2 do ();; ^^ -Error: Syntax error: "done" expected +Error: Syntax error: done expected Line 2, characters 17-19: 2 | for _ = e1 to e2 do ();; ^^ - This "do" might be unmatched + This do might be unmatched diff --git a/testsuite/tests/parse-errors/unclosed_simple_pattern.compilers.reference b/testsuite/tests/parse-errors/unclosed_simple_pattern.compilers.reference index bd62e0a9..c8d2be84 100644 --- a/testsuite/tests/parse-errors/unclosed_simple_pattern.compilers.reference +++ b/testsuite/tests/parse-errors/unclosed_simple_pattern.compilers.reference @@ -1,53 +1,53 @@ Line 7, characters 0-2: 7 | ;; ^^ -Error: Syntax error: ")" expected +Error: Syntax error: ) expected Line 6, characters 9-10: 6 | | List.(_ ^ - This "(" might be unmatched + This ( might be unmatched Line 4, characters 0-2: 4 | ;; ^^ -Error: Syntax error: ")" expected +Error: Syntax error: ) expected Line 3, characters 4-5: 3 | | (_ ^ - This "(" might be unmatched + This ( might be unmatched Line 4, characters 0-2: 4 | ;; ^^ -Error: Syntax error: ")" expected +Error: Syntax error: ) expected Line 3, characters 4-5: 3 | | (_ : int ^ - This "(" might be unmatched + This ( might be unmatched Line 6, characters 18-25: 6 | | (module Foo : sig end ^^^^^^^ -Error: Syntax error: invalid package type: only module type identifier and "with type" constraints are supported +Error: Syntax error: invalid package type: only module type identifier and with type constraints are supported Line 7, characters 0-2: 7 | ;; ^^ -Error: Syntax error: "}" expected +Error: Syntax error: } expected Line 6, characters 4-5: 6 | | { foo; bar; ^ - This "{" might be unmatched + This { might be unmatched Line 4, characters 0-2: 4 | ;; ^^ -Error: Syntax error: "]" expected +Error: Syntax error: ] expected Line 3, characters 4-5: 3 | | [ 1; 2; ^ - This "[" might be unmatched + This [ might be unmatched Line 4, characters 0-2: 4 | ;; ^^ -Error: Syntax error: "|]" expected +Error: Syntax error: |] expected Line 3, characters 4-6: 3 | | [| 3; 4; ^^ - This "[|" might be unmatched + This [| might be unmatched diff --git a/testsuite/tests/parse-errors/unclosed_struct.compilers.reference b/testsuite/tests/parse-errors/unclosed_struct.compilers.reference index 4cfe356d..a4e90915 100644 --- a/testsuite/tests/parse-errors/unclosed_struct.compilers.reference +++ b/testsuite/tests/parse-errors/unclosed_struct.compilers.reference @@ -1,6 +1,6 @@ File "unclosed_struct.ml", line 10, characters 0-0: -Error: Syntax error: "end" expected +Error: Syntax error: end expected File "unclosed_struct.ml", line 8, characters 11-17: 8 | module M = struct ^^^^^^ - This "struct" might be unmatched + This struct might be unmatched diff --git a/testsuite/tests/parsetree/locations_test.compilers.reference b/testsuite/tests/parsetree/locations_test.compilers.reference index 5a6b3a48..3f7c16d9 100644 --- a/testsuite/tests/parsetree/locations_test.compilers.reference +++ b/testsuite/tests/parsetree/locations_test.compilers.reference @@ -620,20 +620,24 @@ Ptop_def expression (//toplevel//[2,1+12]..[2,1+18]) ghost Pexp_tuple [ + None expression (//toplevel//[2,1+12]..[2,1+13]) Pexp_constant constant (//toplevel//[2,1+12]..[2,1+13]) PConst_int (3,None) + None expression (//toplevel//[2,1+15]..[2,1+18]) ghost Pexp_construct "::" (//toplevel//[2,1+15]..[2,1+18]) ghost Some expression (//toplevel//[2,1+15]..[2,1+18]) ghost Pexp_tuple [ + None expression (//toplevel//[2,1+15]..[2,1+16]) Pexp_constant constant (//toplevel//[2,1+15]..[2,1+16]) PConst_int (4,None) + None expression (//toplevel//[2,1+17]..[2,1+18]) ghost Pexp_construct "[]" (//toplevel//[2,1+17]..[2,1+18]) ghost None @@ -1133,8 +1137,9 @@ Ptop_def pattern (//toplevel//[4,28+25]..[4,28+26]) Ppat_unpack "M" (//toplevel//[4,28+25]..[4,28+26]) core_type (//toplevel//[4,28+29]..[4,28+30]) - Ptyp_package "S" (//toplevel//[4,28+29]..[4,28+30]) - [] + Ptyp_package + package_type "S" (//toplevel//[4,28+29]..[4,28+30]) + [] expression (//toplevel//[4,28+35]..[4,28+37]) Pexp_construct "()" (//toplevel//[4,28+35]..[4,28+37]) None @@ -1182,7 +1187,7 @@ Ptop_def class_type (//toplevel//[4,33+2]..[4,33+12]) Pcty_signature class_signature - core_type (//toplevel//[4,33+8]..[4,33+8]) + core_type (//toplevel//[4,33+8]..[4,33+8]) ghost Ptyp_any [] ] diff --git a/testsuite/tests/parsing/attributes.compilers.reference b/testsuite/tests/parsing/attributes.compilers.reference index 3cc399fa..30fafbbf 100644 --- a/testsuite/tests/parsing/attributes.compilers.reference +++ b/testsuite/tests/parsing/attributes.compilers.reference @@ -268,16 +268,14 @@ pattern (attributes.ml[55,728+4]..[55,728+5]) Ppat_any expression (attributes.ml[55,728+8]..[55,728+31]) - Pexp_constraint - expression (attributes.ml[55,728+8]..[55,728+31]) ghost - Pexp_pack - module_expr (attributes.ml[55,728+16]..[55,728+19]) - Pmod_ident "Int" (attributes.ml[55,728+16]..[55,728+19]) - core_type (attributes.ml[55,728+22]..[55,728+30]) - attribute "foo" + Pexp_pack + module_expr (attributes.ml[55,728+16]..[55,728+19]) + Pmod_ident "Int" (attributes.ml[55,728+16]..[55,728+19]) + Some + package_type "T" (attributes.ml[55,728+22]..[55,728+23]) [] - Ptyp_package "T" (attributes.ml[55,728+22]..[55,728+23]) - [] + attribute "foo" + [] ] structure_item (attributes.ml[57,761+0]..[57,761+49]) Pstr_value Nonrec @@ -286,21 +284,19 @@ pattern (attributes.ml[57,761+4]..[57,761+5]) Ppat_any expression (attributes.ml[57,761+8]..[57,761+49]) - Pexp_constraint - expression (attributes.ml[57,761+8]..[57,761+49]) ghost - Pexp_pack - module_expr (attributes.ml[57,761+16]..[57,761+19]) - Pmod_ident "Int" (attributes.ml[57,761+16]..[57,761+19]) - core_type (attributes.ml[57,761+22]..[57,761+48]) - attribute "foo" - [] - Ptyp_package "T" (attributes.ml[57,761+22]..[57,761+23]) - [ - with type "t" (attributes.ml[57,761+34]..[57,761+35]) - core_type (attributes.ml[57,761+38]..[57,761+41]) - Ptyp_constr "int" (attributes.ml[57,761+38]..[57,761+41]) - [] - ] + Pexp_pack + module_expr (attributes.ml[57,761+16]..[57,761+19]) + Pmod_ident "Int" (attributes.ml[57,761+16]..[57,761+19]) + Some + package_type "T" (attributes.ml[57,761+22]..[57,761+23]) + [ + with type "t" (attributes.ml[57,761+34]..[57,761+35]) + core_type (attributes.ml[57,761+38]..[57,761+41]) + Ptyp_constr "int" (attributes.ml[57,761+38]..[57,761+41]) + [] + ] + attribute "foo" + [] ] structure_item (attributes.ml[59,812+0]..[60,869+26]) Pstr_value Nonrec diff --git a/testsuite/tests/parsing/broken_invariants.compilers.reference b/testsuite/tests/parsing/broken_invariants.compilers.reference index 9a394401..666e33ab 100644 --- a/testsuite/tests/parsing/broken_invariants.compilers.reference +++ b/testsuite/tests/parsing/broken_invariants.compilers.reference @@ -42,4 +42,12 @@ Line 1, characters 16-33: 1 | let g: int -> [%empty_poly_binder] = fun n x -> x;; ^^^^^^^^^^^^^^^^^ Error: broken invariant in parsetree: Explicit universal type quantification cannot be empty. +Line 2, characters 9-29: +2 | let f ([%empty_open_tuple_pat]) = ();; + ^^^^^^^^^^^^^^^^^^^^ +Error: broken invariant in parsetree: Open tuple patterns must have at least one component. +Line 1, characters 9-31: +1 | let f ([%short_closed_tuple_pat]) = ();; + ^^^^^^^^^^^^^^^^^^^^^^ +Error: broken invariant in parsetree: Closed tuple patterns must have at least two components. diff --git a/testsuite/tests/parsing/broken_invariants.ml b/testsuite/tests/parsing/broken_invariants.ml index 255a1a76..49bb1f95 100644 --- a/testsuite/tests/parsing/broken_invariants.ml +++ b/testsuite/tests/parsing/broken_invariants.ml @@ -26,6 +26,8 @@ let f (x:[%empty_poly_binder]) = 0;; let f x = (x:[%empty_poly_binder]);; let g: int -> [%empty_poly_binder] = fun n x -> x;; +let f ([%empty_open_tuple_pat]) = ();; +let f ([%short_closed_tuple_pat]) = ();; (* TEST readonly_files = "illegal_ppx.ml"; setup-ocamlc.byte-build-env; diff --git a/testsuite/tests/parsing/comments.compilers.reference b/testsuite/tests/parsing/comments.compilers.reference index 2f279525..4711479b 100644 --- a/testsuite/tests/parsing/comments.compilers.reference +++ b/testsuite/tests/parsing/comments.compilers.reference @@ -3,25 +3,26 @@ Line 3, characters 3-4: 3 | {p'|Some text|p'};; ^ -Error: Syntax error: "}" expected +Error: Syntax error: } expected Line 3, characters 0-1: 3 | {p'|Some text|p'};; ^ - This "{" might be unmatched + This { might be unmatched Line 1, characters 0-3: 1 | {A|Some other text |A};; ^^^ -Error: "A" cannot be used as a quoted string delimiter, +Error: A cannot be used as a quoted string delimiter, it must contain only lowercase letters. Line 1, characters 0-4: 1 | {À|Some other text |À};; ^^^^ -Error: "À" cannot be used as a quoted string delimiter, +Error: À cannot be used as a quoted string delimiter, it must contain only lowercase letters. val one : int = 1 val two : int = 2 val three : int = 3 val four : int = 4 val set : int = 5 +val unit : unit = () val meta : int = 6 diff --git a/testsuite/tests/parsing/comments.ml b/testsuite/tests/parsing/comments.ml index e5e2acfe..3bdf0a33 100644 --- a/testsuite/tests/parsing/comments.ml +++ b/testsuite/tests/parsing/comments.ml @@ -25,6 +25,8 @@ let four = (* We are inserting quoted litteral here {p|*)|p}, {œ|(*|œ} *) 4;; let set = (** [x < min({x'|x'∊l})] *) 5;; +let unit = let é' = ignore in é' '"';; + let meta = (* (* Reminder: quoted strings *) {é|Some text|é};; @@ -46,4 +48,6 @@ let three = let four = (* We are inserting quoted litteral here {p|*)|p}, {œ|(*|œ} *) 4;; -let set = (** [x < min({x'|x'∊l})] *) 5;; *) 6;; +let set = (** [x < min({x'|x'∊l})] *) 5;; + +let unit = let é' = ignore in é' '"';; *) 6;; diff --git a/testsuite/tests/parsing/illegal_ppx.ml b/testsuite/tests/parsing/illegal_ppx.ml index 8d65c8fe..f1493173 100644 --- a/testsuite/tests/parsing/illegal_ppx.ml +++ b/testsuite/tests/parsing/illegal_ppx.ml @@ -14,11 +14,20 @@ let missing_rhs loc = let empty_let loc = H.Str.value ~loc Asttypes.Nonrecursive [] let empty_type loc = H.Str.type_ ~loc Asttypes.Nonrecursive [] let empty_poly_binder loc = H.Typ.(poly ~loc [] (any ~loc ())) -let functor_id loc = Location.mkloc - (Longident.( Lapply (Lident "F", Lident "X"))) loc +let functor_id loc = Location.mkloc (Longident.( + Lapply (Location.mknoloc (Lident "F"), Location.mknoloc (Lident "X")))) loc let complex_record loc = H.Pat.record ~loc [functor_id loc, H.Pat.any ~loc () ] Asttypes.Closed + +let empty_open_tuple_pat loc = + let pat = H.Pat.mk Ppat_any in + H.Pat.tuple ~loc [] Open + +let short_closed_tuple_pat loc = + let pat = H.Pat.mk Ppat_any in + H.Pat.tuple ~loc [Some "baz", pat] Closed + let super = M.default_mapper let expr mapper e = match e.pexp_desc with @@ -32,6 +41,10 @@ let pat mapper p = match p.ppat_desc with | Ppat_extension ({txt="record_with_functor_fields";loc},_) -> complex_record loc + | Ppat_extension ({txt="empty_open_tuple_pat";loc},_) -> + empty_open_tuple_pat loc + | Ppat_extension ({txt="short_closed_tuple_pat";loc},_) -> + short_closed_tuple_pat loc | _ -> super.M.pat mapper p let typ mapper ty = diff --git a/testsuite/tests/parsing/int_and_float_with_modifier.compilers.reference b/testsuite/tests/parsing/int_and_float_with_modifier.compilers.reference index 16f54efc..23158d9d 100644 --- a/testsuite/tests/parsing/int_and_float_with_modifier.compilers.reference +++ b/testsuite/tests/parsing/int_and_float_with_modifier.compilers.reference @@ -103,4 +103,4 @@ File "int_and_float_with_modifier.ml", line 10, characters 2-57: 10 | 1234567890_1234567890_1234567890_1234567890_1234567890z ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: Unknown modifier "z" for literal "1234567890_1234567890_1234567890_1234567890_1234567890z" +Error: Unknown modifier z for literal 1234567890_1234567890_1234567890_1234567890_1234567890z diff --git a/testsuite/tests/parsing/latin9.compilers.reference b/testsuite/tests/parsing/latin9.compilers.reference index 89a71950..9f5bb2d1 100644 --- a/testsuite/tests/parsing/latin9.compilers.reference +++ b/testsuite/tests/parsing/latin9.compilers.reference @@ -11,13 +11,13 @@ val s : string = "ok" Line 3, characters 0-47: 3 | module Élégant (* NFD encoded *) = struct end;; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: Multiple definition of the module name "Élégant". +Error: Multiple definition of the module name Élégant. Names must be unique in a given structure or signature. val x : string = "x" Line 1, characters 9-14: 1 | let ko = {Là|x|Là};; ^^^^^ -Error: "Là" cannot be used as a quoted string delimiter, +Error: Là cannot be used as a quoted string delimiter, it must contain only lowercase letters. Line 2, characters 10-20: 2 | let x = {%âcre.name été|x|été};; diff --git a/testsuite/tests/parsing/shortcut_ext_attr.compilers.reference b/testsuite/tests/parsing/shortcut_ext_attr.compilers.reference index 0aba11b9..1d5d812f 100644 --- a/testsuite/tests/parsing/shortcut_ext_attr.compilers.reference +++ b/testsuite/tests/parsing/shortcut_ext_attr.compilers.reference @@ -6,12 +6,12 @@ pattern (shortcut_ext_attr.ml[9,170+4]..[9,170+6]) Ppat_construct "()" (shortcut_ext_attr.ml[9,170+4]..[9,170+6]) None - expression (shortcut_ext_attr.ml[10,179+2]..[30,721+31]) ghost + expression (shortcut_ext_attr.ml[10,179+2]..[30,721+31]) Pexp_extension "foo" [ - structure_item (shortcut_ext_attr.ml[10,179+2]..[30,721+31]) + structure_item (shortcut_ext_attr.ml[10,179+2]..[30,721+31]) ghost Pstr_eval - expression (shortcut_ext_attr.ml[10,179+2]..[30,721+31]) + expression (shortcut_ext_attr.ml[10,179+2]..[30,721+31]) ghost Pexp_let Nonrec [ @@ -38,9 +38,9 @@ expression (shortcut_ext_attr.ml[12,222+2]..[12,222+36]) Pexp_extension "foo" [ - structure_item (shortcut_ext_attr.ml[12,222+3]..[12,222+35]) + structure_item (shortcut_ext_attr.ml[12,222+3]..[12,222+35]) ghost Pstr_eval - expression (shortcut_ext_attr.ml[12,222+3]..[12,222+35]) + expression (shortcut_ext_attr.ml[12,222+3]..[12,222+35]) ghost attribute "foo" [] Pexp_letmodule "M" (shortcut_ext_attr.ml[12,222+24]..[12,222+25]) @@ -55,9 +55,9 @@ expression (shortcut_ext_attr.ml[13,261+2]..[13,261+30]) Pexp_extension "foo" [ - structure_item (shortcut_ext_attr.ml[13,261+3]..[13,261+29]) + structure_item (shortcut_ext_attr.ml[13,261+3]..[13,261+29]) ghost Pstr_eval - expression (shortcut_ext_attr.ml[13,261+3]..[13,261+29]) + expression (shortcut_ext_attr.ml[13,261+3]..[13,261+29]) ghost attribute "foo" [] Pexp_open Fresh @@ -72,9 +72,9 @@ expression (shortcut_ext_attr.ml[14,294+2]..[14,294+25]) Pexp_extension "foo" [ - structure_item (shortcut_ext_attr.ml[14,294+3]..[14,294+24]) + structure_item (shortcut_ext_attr.ml[14,294+3]..[14,294+24]) ghost Pstr_eval - expression (shortcut_ext_attr.ml[14,294+3]..[14,294+24]) + expression (shortcut_ext_attr.ml[14,294+3]..[14,294+24]) ghost attribute "foo" [] Pexp_function @@ -96,9 +96,9 @@ expression (shortcut_ext_attr.ml[15,322+2]..[15,322+30]) Pexp_extension "foo" [ - structure_item (shortcut_ext_attr.ml[15,322+3]..[15,322+29]) + structure_item (shortcut_ext_attr.ml[15,322+3]..[15,322+29]) ghost Pstr_eval - expression (shortcut_ext_attr.ml[15,322+3]..[15,322+29]) + expression (shortcut_ext_attr.ml[15,322+3]..[15,322+29]) ghost attribute "foo" [] Pexp_function @@ -119,9 +119,9 @@ expression (shortcut_ext_attr.ml[16,355+2]..[16,355+33]) Pexp_extension "foo" [ - structure_item (shortcut_ext_attr.ml[16,355+3]..[16,355+32]) + structure_item (shortcut_ext_attr.ml[16,355+3]..[16,355+32]) ghost Pstr_eval - expression (shortcut_ext_attr.ml[16,355+3]..[16,355+32]) + expression (shortcut_ext_attr.ml[16,355+3]..[16,355+32]) ghost attribute "foo" [] Pexp_try @@ -142,9 +142,9 @@ expression (shortcut_ext_attr.ml[17,391+2]..[17,391+35]) Pexp_extension "foo" [ - structure_item (shortcut_ext_attr.ml[17,391+3]..[17,391+34]) + structure_item (shortcut_ext_attr.ml[17,391+3]..[17,391+34]) ghost Pstr_eval - expression (shortcut_ext_attr.ml[17,391+3]..[17,391+34]) + expression (shortcut_ext_attr.ml[17,391+3]..[17,391+34]) ghost attribute "foo" [] Pexp_ifthenelse @@ -161,12 +161,12 @@ ] expression (shortcut_ext_attr.ml[18,429+2]..[30,721+31]) Pexp_sequence - expression (shortcut_ext_attr.ml[18,429+2]..[18,429+31]) ghost + expression (shortcut_ext_attr.ml[18,429+2]..[18,429+31]) Pexp_extension "foo" [ - structure_item (shortcut_ext_attr.ml[18,429+2]..[18,429+31]) + structure_item (shortcut_ext_attr.ml[18,429+2]..[18,429+31]) ghost Pstr_eval - expression (shortcut_ext_attr.ml[18,429+2]..[18,429+31]) + expression (shortcut_ext_attr.ml[18,429+2]..[18,429+31]) ghost attribute "foo" [] Pexp_while @@ -179,12 +179,12 @@ ] expression (shortcut_ext_attr.ml[19,463+2]..[30,721+31]) Pexp_sequence - expression (shortcut_ext_attr.ml[19,463+2]..[19,463+39]) ghost + expression (shortcut_ext_attr.ml[19,463+2]..[19,463+39]) Pexp_extension "foo" [ - structure_item (shortcut_ext_attr.ml[19,463+2]..[19,463+39]) + structure_item (shortcut_ext_attr.ml[19,463+2]..[19,463+39]) ghost Pstr_eval - expression (shortcut_ext_attr.ml[19,463+2]..[19,463+39]) + expression (shortcut_ext_attr.ml[19,463+2]..[19,463+39]) ghost attribute "foo" [] Pexp_for Up @@ -203,9 +203,9 @@ expression (shortcut_ext_attr.ml[20,505+2]..[30,721+31]) Pexp_extension "foo" [ - structure_item (shortcut_ext_attr.ml[20,505+2]..[30,721+31]) + structure_item (shortcut_ext_attr.ml[20,505+2]..[30,721+31]) ghost Pstr_eval - expression (shortcut_ext_attr.ml[20,505+2]..[30,721+31]) + expression (shortcut_ext_attr.ml[20,505+2]..[30,721+31]) ghost Pexp_sequence expression (shortcut_ext_attr.ml[20,505+2]..[20,505+4]) Pexp_construct "()" (shortcut_ext_attr.ml[20,505+2]..[20,505+4]) @@ -217,12 +217,12 @@ None expression (shortcut_ext_attr.ml[21,521+2]..[30,721+31]) Pexp_sequence - expression (shortcut_ext_attr.ml[21,521+2]..[21,521+23]) ghost + expression (shortcut_ext_attr.ml[21,521+2]..[21,521+23]) Pexp_extension "foo" [ - structure_item (shortcut_ext_attr.ml[21,521+2]..[21,521+23]) + structure_item (shortcut_ext_attr.ml[21,521+2]..[21,521+23]) ghost Pstr_eval - expression (shortcut_ext_attr.ml[21,521+2]..[21,521+23]) + expression (shortcut_ext_attr.ml[21,521+2]..[21,521+23]) ghost attribute "foo" [] Pexp_assert @@ -232,12 +232,12 @@ ] expression (shortcut_ext_attr.ml[22,547+2]..[30,721+31]) Pexp_sequence - expression (shortcut_ext_attr.ml[22,547+2]..[22,547+18]) ghost + expression (shortcut_ext_attr.ml[22,547+2]..[22,547+18]) Pexp_extension "foo" [ - structure_item (shortcut_ext_attr.ml[22,547+2]..[22,547+18]) + structure_item (shortcut_ext_attr.ml[22,547+2]..[22,547+18]) ghost Pstr_eval - expression (shortcut_ext_attr.ml[22,547+2]..[22,547+18]) + expression (shortcut_ext_attr.ml[22,547+2]..[22,547+18]) ghost attribute "foo" [] Pexp_lazy @@ -246,12 +246,12 @@ ] expression (shortcut_ext_attr.ml[23,568+2]..[30,721+31]) Pexp_sequence - expression (shortcut_ext_attr.ml[23,568+2]..[23,568+22]) ghost + expression (shortcut_ext_attr.ml[23,568+2]..[23,568+22]) Pexp_extension "foo" [ - structure_item (shortcut_ext_attr.ml[23,568+2]..[23,568+22]) + structure_item (shortcut_ext_attr.ml[23,568+2]..[23,568+22]) ghost Pstr_eval - expression (shortcut_ext_attr.ml[23,568+2]..[23,568+22]) + expression (shortcut_ext_attr.ml[23,568+2]..[23,568+22]) ghost attribute "foo" [] Pexp_object @@ -262,12 +262,12 @@ ] expression (shortcut_ext_attr.ml[24,593+2]..[30,721+31]) Pexp_sequence - expression (shortcut_ext_attr.ml[24,593+2]..[24,593+23]) ghost + expression (shortcut_ext_attr.ml[24,593+2]..[24,593+23]) Pexp_extension "foo" [ - structure_item (shortcut_ext_attr.ml[24,593+2]..[24,593+23]) + structure_item (shortcut_ext_attr.ml[24,593+2]..[24,593+23]) ghost Pstr_eval - expression (shortcut_ext_attr.ml[24,593+2]..[24,593+23]) + expression (shortcut_ext_attr.ml[24,593+2]..[24,593+23]) ghost attribute "foo" [] Pexp_constant @@ -276,22 +276,22 @@ ] expression (shortcut_ext_attr.ml[25,619+2]..[30,721+31]) Pexp_sequence - expression (shortcut_ext_attr.ml[25,619+2]..[25,619+17]) ghost + expression (shortcut_ext_attr.ml[25,619+2]..[25,619+17]) Pexp_extension "foo" [ - structure_item (shortcut_ext_attr.ml[25,619+2]..[25,619+17]) + structure_item (shortcut_ext_attr.ml[25,619+2]..[25,619+17]) ghost Pstr_eval - expression (shortcut_ext_attr.ml[25,619+2]..[25,619+17]) + expression (shortcut_ext_attr.ml[25,619+2]..[25,619+17]) ghost attribute "foo" [] Pexp_new "x" (shortcut_ext_attr.ml[25,619+16]..[25,619+17]) ] - expression (shortcut_ext_attr.ml[27,640+2]..[30,721+31]) ghost + expression (shortcut_ext_attr.ml[27,640+2]..[30,721+31]) Pexp_extension "foo" [ - structure_item (shortcut_ext_attr.ml[27,640+2]..[30,721+31]) + structure_item (shortcut_ext_attr.ml[27,640+2]..[30,721+31]) ghost Pstr_eval - expression (shortcut_ext_attr.ml[27,640+2]..[30,721+31]) + expression (shortcut_ext_attr.ml[27,640+2]..[30,721+31]) ghost attribute "foo" [] Pexp_match @@ -300,9 +300,9 @@ None [ - pattern (shortcut_ext_attr.ml[29,694+4]..[29,694+20]) ghost + pattern (shortcut_ext_attr.ml[29,694+4]..[29,694+20]) Ppat_extension "foo" - pattern (shortcut_ext_attr.ml[29,694+4]..[29,694+20]) + pattern (shortcut_ext_attr.ml[29,694+4]..[29,694+20]) ghost attribute "foo" [] Ppat_lazy @@ -312,9 +312,9 @@ Pexp_construct "()" (shortcut_ext_attr.ml[29,694+24]..[29,694+26]) None - pattern (shortcut_ext_attr.ml[30,721+4]..[30,721+25]) ghost + pattern (shortcut_ext_attr.ml[30,721+4]..[30,721+25]) Ppat_extension "foo" - pattern (shortcut_ext_attr.ml[30,721+4]..[30,721+25]) + pattern (shortcut_ext_attr.ml[30,721+4]..[30,721+25]) ghost attribute "foo" [] Ppat_exception @@ -460,7 +460,7 @@ [] Pcty_signature class_signature - core_type (shortcut_ext_attr.ml[50,1100+14]..[50,1100+14]) + core_type (shortcut_ext_attr.ml[50,1100+14]..[50,1100+14]) ghost Ptyp_any [ class_type_field (shortcut_ext_attr.ml[51,1115+4]..[51,1115+19]) @@ -523,13 +523,14 @@ ptype_private = Public ptype_manifest = Some - core_type (shortcut_ext_attr.ml[61,1304+2]..[61,1304+22]) ghost + core_type (shortcut_ext_attr.ml[61,1304+2]..[61,1304+22]) Ptyp_extension "foo" - core_type (shortcut_ext_attr.ml[61,1304+2]..[61,1304+22]) + core_type (shortcut_ext_attr.ml[61,1304+2]..[61,1304+22]) ghost attribute "foo" [] - Ptyp_package "M" (shortcut_ext_attr.ml[61,1304+20]..[61,1304+21]) - [] + Ptyp_package + package_type "M" (shortcut_ext_attr.ml[61,1304+20]..[61,1304+21]) + [] ] structure_item (shortcut_ext_attr.ml[64,1353+0]..[67,1409+22]) Pstr_module @@ -598,10 +599,10 @@ Pexp_ident "x" (shortcut_ext_attr.ml[77,1598+14]..[77,1598+15]) ] ] - structure_item (shortcut_ext_attr.ml[79,1615+0]..[80,1638+17]) ghost + structure_item (shortcut_ext_attr.ml[79,1615+0]..[80,1638+17]) Pstr_extension "foo" [ - structure_item (shortcut_ext_attr.ml[79,1615+0]..[80,1638+17]) + structure_item (shortcut_ext_attr.ml[79,1615+0]..[80,1638+17]) ghost Pstr_type Rec [ type_declaration "t" (shortcut_ext_attr.ml[79,1615+15]..[79,1615+16]) (shortcut_ext_attr.ml[79,1615+0]..[79,1615+22]) @@ -636,10 +637,10 @@ [] ] ] - structure_item (shortcut_ext_attr.ml[81,1656+0]..[81,1656+21]) ghost + structure_item (shortcut_ext_attr.ml[81,1656+0]..[81,1656+21]) Pstr_extension "foo" [ - structure_item (shortcut_ext_attr.ml[81,1656+0]..[81,1656+21]) + structure_item (shortcut_ext_attr.ml[81,1656+0]..[81,1656+21]) ghost Pstr_typext type_extension attribute "foo" @@ -658,10 +659,10 @@ ] ptyext_private = Public ] - structure_item (shortcut_ext_attr.ml[83,1679+0]..[83,1679+21]) ghost + structure_item (shortcut_ext_attr.ml[83,1679+0]..[83,1679+21]) Pstr_extension "foo" [ - structure_item (shortcut_ext_attr.ml[83,1679+0]..[83,1679+21]) + structure_item (shortcut_ext_attr.ml[83,1679+0]..[83,1679+21]) ghost Pstr_class [ class_declaration (shortcut_ext_attr.ml[83,1679+0]..[83,1679+21]) @@ -677,10 +678,10 @@ [] ] ] - structure_item (shortcut_ext_attr.ml[84,1701+0]..[84,1701+26]) ghost + structure_item (shortcut_ext_attr.ml[84,1701+0]..[84,1701+26]) Pstr_extension "foo" [ - structure_item (shortcut_ext_attr.ml[84,1701+0]..[84,1701+26]) + structure_item (shortcut_ext_attr.ml[84,1701+0]..[84,1701+26]) ghost Pstr_class_type [ class_type_declaration (shortcut_ext_attr.ml[84,1701+0]..[84,1701+26]) @@ -696,10 +697,10 @@ [] ] ] - structure_item (shortcut_ext_attr.ml[85,1728+0]..[85,1728+30]) ghost + structure_item (shortcut_ext_attr.ml[85,1728+0]..[85,1728+30]) Pstr_extension "foo" [ - structure_item (shortcut_ext_attr.ml[85,1728+0]..[85,1728+30]) + structure_item (shortcut_ext_attr.ml[85,1728+0]..[85,1728+30]) ghost Pstr_primitive value_description "x" (shortcut_ext_attr.ml[85,1728+19]..[85,1728+20]) (shortcut_ext_attr.ml[85,1728+0]..[85,1728+30]) attribute "foo" @@ -710,10 +711,10 @@ "" ] ] - structure_item (shortcut_ext_attr.ml[86,1759+0]..[86,1759+21]) ghost + structure_item (shortcut_ext_attr.ml[86,1759+0]..[86,1759+21]) Pstr_extension "foo" [ - structure_item (shortcut_ext_attr.ml[86,1759+0]..[86,1759+21]) + structure_item (shortcut_ext_attr.ml[86,1759+0]..[86,1759+21]) ghost Pstr_exception type_exception ptyext_constructor = @@ -726,10 +727,10 @@ [] None ] - structure_item (shortcut_ext_attr.ml[88,1782+0]..[88,1782+22]) ghost + structure_item (shortcut_ext_attr.ml[88,1782+0]..[88,1782+22]) Pstr_extension "foo" [ - structure_item (shortcut_ext_attr.ml[88,1782+0]..[88,1782+22]) + structure_item (shortcut_ext_attr.ml[88,1782+0]..[88,1782+22]) ghost Pstr_module "M" (shortcut_ext_attr.ml[88,1782+17]..[88,1782+18]) attribute "foo" @@ -737,10 +738,10 @@ module_expr (shortcut_ext_attr.ml[88,1782+21]..[88,1782+22]) Pmod_ident "M" (shortcut_ext_attr.ml[88,1782+21]..[88,1782+22]) ] - structure_item (shortcut_ext_attr.ml[89,1805+0]..[90,1836+19]) ghost + structure_item (shortcut_ext_attr.ml[89,1805+0]..[90,1836+19]) Pstr_extension "foo" [ - structure_item (shortcut_ext_attr.ml[89,1805+0]..[90,1836+19]) + structure_item (shortcut_ext_attr.ml[89,1805+0]..[90,1836+19]) ghost Pstr_recmodule [ "M" (shortcut_ext_attr.ml[89,1805+21]..[89,1805+22]) @@ -763,29 +764,29 @@ Pmty_ident "S" (shortcut_ext_attr.ml[90,1836+14]..[90,1836+15]) ] ] - structure_item (shortcut_ext_attr.ml[91,1856+0]..[91,1856+27]) ghost + structure_item (shortcut_ext_attr.ml[91,1856+0]..[91,1856+27]) Pstr_extension "foo" [ - structure_item (shortcut_ext_attr.ml[91,1856+0]..[91,1856+27]) + structure_item (shortcut_ext_attr.ml[91,1856+0]..[91,1856+27]) ghost Pstr_modtype "S" (shortcut_ext_attr.ml[91,1856+22]..[91,1856+23]) attribute "foo" [] module_type (shortcut_ext_attr.ml[91,1856+26]..[91,1856+27]) Pmty_ident "S" (shortcut_ext_attr.ml[91,1856+26]..[91,1856+27]) ] - structure_item (shortcut_ext_attr.ml[93,1885+0]..[93,1885+19]) ghost + structure_item (shortcut_ext_attr.ml[93,1885+0]..[93,1885+19]) Pstr_extension "foo" [ - structure_item (shortcut_ext_attr.ml[93,1885+0]..[93,1885+19]) + structure_item (shortcut_ext_attr.ml[93,1885+0]..[93,1885+19]) ghost Pstr_include attribute "foo" [] module_expr (shortcut_ext_attr.ml[93,1885+18]..[93,1885+19]) Pmod_ident "M" (shortcut_ext_attr.ml[93,1885+18]..[93,1885+19]) ] - structure_item (shortcut_ext_attr.ml[94,1905+0]..[94,1905+16]) ghost + structure_item (shortcut_ext_attr.ml[94,1905+0]..[94,1905+16]) Pstr_extension "foo" [ - structure_item (shortcut_ext_attr.ml[94,1905+0]..[94,1905+16]) + structure_item (shortcut_ext_attr.ml[94,1905+0]..[94,1905+16]) ghost Pstr_open Fresh module_expr (shortcut_ext_attr.ml[94,1905+15]..[94,1905+16]) Pmod_ident "M" (shortcut_ext_attr.ml[94,1905+15]..[94,1905+16]) @@ -797,10 +798,10 @@ module_type (shortcut_ext_attr.ml[97,1945+16]..[120,2341+3]) Pmty_signature [ - signature_item (shortcut_ext_attr.ml[98,1965+2]..[98,1965+21]) ghost + signature_item (shortcut_ext_attr.ml[98,1965+2]..[98,1965+21]) Psig_extension "foo" [ - signature_item (shortcut_ext_attr.ml[98,1965+2]..[98,1965+21]) + signature_item (shortcut_ext_attr.ml[98,1965+2]..[98,1965+21]) ghost Psig_value value_description "x" (shortcut_ext_attr.ml[98,1965+16]..[98,1965+17]) (shortcut_ext_attr.ml[98,1965+2]..[98,1965+21]) attribute "foo" @@ -810,10 +811,10 @@ [] [] ] - signature_item (shortcut_ext_attr.ml[99,1987+2]..[99,1987+31]) ghost + signature_item (shortcut_ext_attr.ml[99,1987+2]..[99,1987+31]) Psig_extension "foo" [ - signature_item (shortcut_ext_attr.ml[99,1987+2]..[99,1987+31]) + signature_item (shortcut_ext_attr.ml[99,1987+2]..[99,1987+31]) ghost Psig_value value_description "x" (shortcut_ext_attr.ml[99,1987+21]..[99,1987+22]) (shortcut_ext_attr.ml[99,1987+2]..[99,1987+31]) attribute "foo" @@ -825,10 +826,10 @@ "" ] ] - signature_item (shortcut_ext_attr.ml[101,2020+2]..[102,2045+20]) ghost + signature_item (shortcut_ext_attr.ml[101,2020+2]..[102,2045+20]) Psig_extension "foo" [ - signature_item (shortcut_ext_attr.ml[101,2020+2]..[102,2045+20]) + signature_item (shortcut_ext_attr.ml[101,2020+2]..[102,2045+20]) ghost Psig_type Rec [ type_declaration "t" (shortcut_ext_attr.ml[101,2020+17]..[101,2020+18]) (shortcut_ext_attr.ml[101,2020+2]..[101,2020+24]) @@ -863,10 +864,10 @@ [] ] ] - signature_item (shortcut_ext_attr.ml[103,2066+2]..[103,2066+23]) ghost + signature_item (shortcut_ext_attr.ml[103,2066+2]..[103,2066+23]) Psig_extension "foo" [ - signature_item (shortcut_ext_attr.ml[103,2066+2]..[103,2066+23]) + signature_item (shortcut_ext_attr.ml[103,2066+2]..[103,2066+23]) ghost Psig_typext type_extension attribute "foo" @@ -885,10 +886,10 @@ ] ptyext_private = Public ] - signature_item (shortcut_ext_attr.ml[105,2091+2]..[105,2091+23]) ghost + signature_item (shortcut_ext_attr.ml[105,2091+2]..[105,2091+23]) Psig_extension "foo" [ - signature_item (shortcut_ext_attr.ml[105,2091+2]..[105,2091+23]) + signature_item (shortcut_ext_attr.ml[105,2091+2]..[105,2091+23]) ghost Psig_exception type_exception ptyext_constructor = @@ -901,20 +902,20 @@ [] None ] - signature_item (shortcut_ext_attr.ml[107,2116+2]..[107,2116+24]) ghost + signature_item (shortcut_ext_attr.ml[107,2116+2]..[107,2116+24]) Psig_extension "foo" [ - signature_item (shortcut_ext_attr.ml[107,2116+2]..[107,2116+24]) + signature_item (shortcut_ext_attr.ml[107,2116+2]..[107,2116+24]) ghost Psig_module "M" (shortcut_ext_attr.ml[107,2116+19]..[107,2116+20]) attribute "foo" [] module_type (shortcut_ext_attr.ml[107,2116+23]..[107,2116+24]) Pmty_ident "S" (shortcut_ext_attr.ml[107,2116+23]..[107,2116+24]) ] - signature_item (shortcut_ext_attr.ml[108,2141+2]..[109,2170+17]) ghost + signature_item (shortcut_ext_attr.ml[108,2141+2]..[109,2170+17]) Psig_extension "foo" [ - signature_item (shortcut_ext_attr.ml[108,2141+2]..[109,2170+17]) + signature_item (shortcut_ext_attr.ml[108,2141+2]..[109,2170+17]) ghost Psig_recmodule [ "M" (shortcut_ext_attr.ml[108,2141+23]..[108,2141+24]) @@ -929,48 +930,48 @@ Pmty_ident "S" (shortcut_ext_attr.ml[109,2170+16]..[109,2170+17]) ] ] - signature_item (shortcut_ext_attr.ml[110,2188+2]..[110,2188+24]) ghost + signature_item (shortcut_ext_attr.ml[110,2188+2]..[110,2188+24]) Psig_extension "foo" [ - signature_item (shortcut_ext_attr.ml[110,2188+2]..[110,2188+24]) + signature_item (shortcut_ext_attr.ml[110,2188+2]..[110,2188+24]) ghost Psig_module "M" (shortcut_ext_attr.ml[110,2188+19]..[110,2188+20]) attribute "foo" [] module_type (shortcut_ext_attr.ml[110,2188+23]..[110,2188+24]) Pmty_alias "M" (shortcut_ext_attr.ml[110,2188+23]..[110,2188+24]) ] - signature_item (shortcut_ext_attr.ml[112,2214+2]..[112,2214+29]) ghost + signature_item (shortcut_ext_attr.ml[112,2214+2]..[112,2214+29]) Psig_extension "foo" [ - signature_item (shortcut_ext_attr.ml[112,2214+2]..[112,2214+29]) + signature_item (shortcut_ext_attr.ml[112,2214+2]..[112,2214+29]) ghost Psig_modtype "S" (shortcut_ext_attr.ml[112,2214+24]..[112,2214+25]) attribute "foo" [] module_type (shortcut_ext_attr.ml[112,2214+28]..[112,2214+29]) Pmty_ident "S" (shortcut_ext_attr.ml[112,2214+28]..[112,2214+29]) ] - signature_item (shortcut_ext_attr.ml[114,2245+2]..[114,2245+21]) ghost + signature_item (shortcut_ext_attr.ml[114,2245+2]..[114,2245+21]) Psig_extension "foo" [ - signature_item (shortcut_ext_attr.ml[114,2245+2]..[114,2245+21]) + signature_item (shortcut_ext_attr.ml[114,2245+2]..[114,2245+21]) ghost Psig_include module_type (shortcut_ext_attr.ml[114,2245+20]..[114,2245+21]) Pmty_ident "M" (shortcut_ext_attr.ml[114,2245+20]..[114,2245+21]) attribute "foo" [] ] - signature_item (shortcut_ext_attr.ml[115,2267+2]..[115,2267+18]) ghost + signature_item (shortcut_ext_attr.ml[115,2267+2]..[115,2267+18]) Psig_extension "foo" [ - signature_item (shortcut_ext_attr.ml[115,2267+2]..[115,2267+18]) + signature_item (shortcut_ext_attr.ml[115,2267+2]..[115,2267+18]) ghost Psig_open Fresh "M" (shortcut_ext_attr.ml[115,2267+17]..[115,2267+18]) attribute "foo" [] ] - signature_item (shortcut_ext_attr.ml[117,2287+2]..[117,2287+23]) ghost + signature_item (shortcut_ext_attr.ml[117,2287+2]..[117,2287+23]) Psig_extension "foo" [ - signature_item (shortcut_ext_attr.ml[117,2287+2]..[117,2287+23]) + signature_item (shortcut_ext_attr.ml[117,2287+2]..[117,2287+23]) ghost Psig_class [ class_description (shortcut_ext_attr.ml[117,2287+2]..[117,2287+23]) @@ -986,10 +987,10 @@ [] ] ] - signature_item (shortcut_ext_attr.ml[118,2311+2]..[118,2311+28]) ghost + signature_item (shortcut_ext_attr.ml[118,2311+2]..[118,2311+28]) Psig_extension "foo" [ - signature_item (shortcut_ext_attr.ml[118,2311+2]..[118,2311+28]) + signature_item (shortcut_ext_attr.ml[118,2311+2]..[118,2311+28]) ghost Psig_class_type [ class_type_declaration (shortcut_ext_attr.ml[118,2311+2]..[118,2311+28]) diff --git a/testsuite/tests/parsing/shortcut_ext_attr.ml b/testsuite/tests/parsing/shortcut_ext_attr.ml index 133d7d16..aaf0edeb 100644 --- a/testsuite/tests/parsing/shortcut_ext_attr.ml +++ b/testsuite/tests/parsing/shortcut_ext_attr.ml @@ -120,7 +120,7 @@ module type S = sig end (* TEST - flags = "-dparsetree"; + flags = "-dparsetree -dparsetree-loc-ghost-invariants"; ocamlc_byte_exit_status = "2"; setup-ocamlc.byte-build-env; ocamlc.byte; diff --git a/testsuite/tests/ppx-contexts/myppx.ml b/testsuite/tests/ppx-contexts/myppx.ml index c1945d20..579ad630 100644 --- a/testsuite/tests/ppx-contexts/myppx.ml +++ b/testsuite/tests/ppx-contexts/myppx.ml @@ -32,8 +32,8 @@ let () = !Clflags.recursive_types; Printf.eprintf "principal: %B\n" !Clflags.principal; - Printf.eprintf "transparent_modules: %B\n" - !Clflags.transparent_modules; + Printf.eprintf "no_alias_deps: %B\n" + !Clflags.no_alias_deps; Printf.eprintf "unboxed_types: %B\n" !Clflags.unboxed_types; Printf.eprintf "\n"; diff --git a/testsuite/tests/ppx-contexts/test.compilers.reference b/testsuite/tests/ppx-contexts/test.compilers.reference index e28c8597..e24f36b2 100644 --- a/testsuite/tests/ppx-contexts/test.compilers.reference +++ b/testsuite/tests/ppx-contexts/test.compilers.reference @@ -6,7 +6,7 @@ use_debug: false use_threads: true recursive_types: true principal: true -transparent_modules: false +no_alias_deps: false unboxed_types: true @@ -17,6 +17,6 @@ use_debug: true use_threads: false recursive_types: false principal: false -transparent_modules: true +no_alias_deps: true unboxed_types: false diff --git a/testsuite/tests/regression/pr11865/mkroot.ml b/testsuite/tests/regression/pr11865/mkroot.ml new file mode 100644 index 00000000..1b8e9088 --- /dev/null +++ b/testsuite/tests/regression/pr11865/mkroot.ml @@ -0,0 +1,30 @@ +(* TEST + modules = "mkroot_stubs.c"; + *) + +type 'a box +external box_make : 'a -> 'a box = "box_make" +external box_deref : 'a box -> 'a = "box_deref" + +type chain = + | Nil + | Cons of chain box + +let rec make_chain = function + | 0 -> Nil + | n -> Cons (box_make (make_chain (n-1))) + +let rec check_chain len = function + | Nil -> assert (len = 0) + | Cons ch -> check_chain (len - 1) (box_deref ch) + +let () = + let len = 1000 in + for _i = 1 to 5 do + let ch = make_chain len in + for _j = 1 to 5 do + Gc.compact (); + check_chain len ch + done + done; + print_endline "ok" diff --git a/testsuite/tests/regression/pr11865/mkroot.reference b/testsuite/tests/regression/pr11865/mkroot.reference new file mode 100644 index 00000000..9766475a --- /dev/null +++ b/testsuite/tests/regression/pr11865/mkroot.reference @@ -0,0 +1 @@ +ok diff --git a/testsuite/tests/regression/pr11865/mkroot_stubs.c b/testsuite/tests/regression/pr11865/mkroot_stubs.c new file mode 100644 index 00000000..d9a975f8 --- /dev/null +++ b/testsuite/tests/regression/pr11865/mkroot_stubs.c @@ -0,0 +1,50 @@ +#include +#include +#include +#include + +struct box { + value nongen_root; + value gen_root; +}; + +static void box_finalize(value v) +{ + struct box** r = Data_custom_val(v); + caml_remove_global_root(&(*r)->nongen_root); + caml_remove_generational_global_root(&(*r)->gen_root); + free(*r); +} + +static struct custom_operations box_ops = { + "box", + box_finalize, + custom_compare_default, + custom_hash_default, + custom_serialize_default, + custom_deserialize_default, + custom_compare_ext_default, + custom_fixed_length_default +}; + +value box_make(value v) +{ + CAMLparam1(v); + CAMLlocal1(ret); + struct box* r = malloc(sizeof(struct box)); + if (!r) caml_failwith("out of memory?"); + ret = caml_alloc_custom(&box_ops, sizeof(struct box*), 0, 1); + *((struct box**)Data_custom_val(ret)) = r; + r->nongen_root = v; + caml_register_global_root(&r->nongen_root); + r->gen_root = v; + caml_register_generational_global_root(&r->gen_root); + CAMLreturn(ret); +} + +value box_deref(value v) +{ + struct box** r = Data_custom_val(v); + if ((*r)->nongen_root != (*r)->gen_root) caml_failwith("root mismatch"); + return (*r)->gen_root; +} diff --git a/testsuite/tests/runtime-errors/syserror.ml b/testsuite/tests/runtime-errors/syserror.ml index 5cab8e3b..923fa7fd 100644 --- a/testsuite/tests/runtime-errors/syserror.ml +++ b/testsuite/tests/runtime-errors/syserror.ml @@ -5,12 +5,13 @@ ocamlc.byte; exit_status = "2"; run; + hasunix; { - libunix; + not-target-windows; reference = "${test_source_directory}/syserror.unix.reference"; check-program-output; }{ - libwin32unix; + target-windows; reference = "${test_source_directory}/syserror.win32.reference"; check-program-output; } @@ -19,12 +20,13 @@ ocamlopt.byte; exit_status = "2"; run; + hasunix; { - libunix; + not-target-windows; reference = "${test_source_directory}/syserror.unix.reference"; check-program-output; }{ - libwin32unix; + target-windows; reference = "${test_source_directory}/syserror.win32.reference"; check-program-output; } diff --git a/testsuite/tests/shadow_include/cannot_shadow_error.compilers.reference b/testsuite/tests/shadow_include/cannot_shadow_error.compilers.reference index aefebb1c..25fa2349 100644 --- a/testsuite/tests/shadow_include/cannot_shadow_error.compilers.reference +++ b/testsuite/tests/shadow_include/cannot_shadow_error.compilers.reference @@ -1,12 +1,12 @@ File "cannot_shadow_error.ml", line 24, characters 2-36: 24 | include Comparable with type t = t ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: Illegal shadowing of included type "t/2" by "t". +Error: Illegal shadowing of included type t/2 by t. File "cannot_shadow_error.ml", line 23, characters 2-19: 23 | include Printable ^^^^^^^^^^^^^^^^^ - Type "t/2" came from this include. + Type t/2 came from this include. File "cannot_shadow_error.ml", line 14, characters 2-23: 14 | val print : t -> unit ^^^^^^^^^^^^^^^^^^^^^ - The value "print" has no valid type if "t/2" is shadowed. + The value print has no valid type if t/2 is shadowed. diff --git a/testsuite/tests/shadow_include/shadow_all.ml b/testsuite/tests/shadow_include/shadow_all.ml index 40ca2a5a..31cc0288 100644 --- a/testsuite/tests/shadow_include/shadow_all.ml +++ b/testsuite/tests/shadow_include/shadow_all.ml @@ -156,27 +156,25 @@ Line 3, characters 2-26: |}] -module type Module_type = sig +module type Module_type_fail = sig include S module type U = T include S end ;; [%%expect{| -module type Module_type = - sig - module type U - type t - val unit : unit - external e : unit -> unit = "%identity" - module M : sig type t end - module type T - exception E - type ext = .. - type ext += C - class c : object end - class type ct = object end - end +Line 4, characters 2-11: +4 | include S + ^^^^^^^^^ +Error: Illegal shadowing of included module type "T/2" by "T". +Line 2, characters 2-11: +2 | include S + ^^^^^^^^^ + Module type "T/2" came from this include. +Line 3, characters 2-19: +3 | module type U = T + ^^^^^^^^^^^^^^^^^ + The module type "U" has no valid type if "T/2" is shadowed. |}] module type Module_type_fail = sig diff --git a/testsuite/tests/shape-index/index.ml b/testsuite/tests/shape-index/index.ml index 2c9650a6..71dc3c63 100644 --- a/testsuite/tests/shape-index/index.ml +++ b/testsuite/tests/shape-index/index.ml @@ -39,7 +39,7 @@ open A let y = A.x + Auxiliaire.z -let () = print_int y +let () = print_int (Stdlib.(+) y 0) let a = (module A : AS) module _ = (val a) @@ -67,3 +67,9 @@ module type MSB = sig include AS with type t := u module G := A end + +module Out = struct module In = struct let x = () end end + +let () = Out. + In + .x diff --git a/testsuite/tests/shape-index/index.reference b/testsuite/tests/shape-index/index.reference index e62b4606..9d3972ce 100644 --- a/testsuite/tests/shape-index/index.reference +++ b/testsuite/tests/shape-index/index.reference @@ -1,37 +1,50 @@ Indexed shapes: -Resolved: Index.5 : A (File "index.ml", line 68, characters 14-15) -Resolved: Index.25 : u (File "index.ml", line 67, characters 28-29) -Resolved: Index.2 : AS (File "index.ml", line 67, characters 10-12) -Resolved: Index.5 : A (File "index.ml", line 63, characters 4-5) -Resolved: Index.3 : B.t (File "index.ml", line 60, characters 15-18) -Resolved: Index.2 : AS (File "index.ml", line 59, characters 23-25) -Resolved: Index.21 : MS (File "index.ml", line 57, characters 18-20) -Resolved: Index.5 : A (File "index.ml", line 58, characters 13-14) -Resolved: Index.5 : A (File "index.ml", line 54, characters 13-14) -Resolved: Index.2 : AS (File "index.ml", line 53, characters 13-15) -Resolved: Index.3 : F(A).t (File "index.ml", line 49, characters 9-16) -Resolved: Index.5 : A (File "index.ml", line 48, characters 14-15) -Resolved: Index.14 : F (File "index.ml", line 48, characters 11-12) -Resolved: Index.13 : P (File "index.ml", line 47, characters 35-36) -Resolved: Index.2 : AS (File "index.ml", line 47, characters 14-16) -Resolved: Index.11 : a (File "index.ml", line 45, characters 16-17) -Resolved: Index.5 : A (File "index.ml", line 44, characters 16-17) -Resolved: Index.2 : AS (File "index.ml", line 44, characters 20-22) -Resolved: Index.10 : y (File "index.ml", line 42, characters 19-20) -Unresolved: CU Stdlib . "print_int"[value] : +Resolved: Index.31: Out (File "index.ml", line 73, characters 9-12) +Resolved: Index.30: Out.In (File "index.ml", lines 73-74, characters 9-4) +Resolved: Index.29: Out.In.x (File "index.ml", lines 73-75, characters 9-4) +Resolved: Index.5: A (File "index.ml", line 68, characters 14-15) +Resolved: Index.25: u (File "index.ml", line 67, characters 28-29) +Resolved: Index.2: AS (File "index.ml", line 67, characters 10-12) +Resolved: Index.5: A (File "index.ml", line 63, characters 4-5) +Alias: Index.6 -> Resolved: Index.5: + B (File "index.ml", line 60, characters 15-16) +Resolved: Index.3: B.t (File "index.ml", line 60, characters 15-18) +Resolved: Index.2: AS (File "index.ml", line 59, characters 23-25) +Resolved: Index.21: MS (File "index.ml", line 57, characters 18-20) +Resolved: Index.5: A (File "index.ml", line 58, characters 13-14) +Resolved: Index.5: A (File "index.ml", line 54, characters 13-14) +Resolved: Index.2: AS (File "index.ml", line 53, characters 13-15) +Resolved: Index.14: F (File "index.ml", line 49, characters 9-10) +Resolved: Index.5: A (File "index.ml", line 49, characters 12-13) +Resolved: Index.3: F(A).t (File "index.ml", line 49, characters 9-16) +Resolved: Index.5: A (File "index.ml", line 48, characters 14-15) +Resolved: Index.14: F (File "index.ml", line 48, characters 11-12) +Resolved: Index.13: P (File "index.ml", line 47, characters 35-36) +Resolved: Index.2: AS (File "index.ml", line 47, characters 14-16) +Resolved: Index.11: a (File "index.ml", line 45, characters 16-17) +Resolved: Index.5: A (File "index.ml", line 44, characters 16-17) +Resolved: Index.2: AS (File "index.ml", line 44, characters 20-22) +Resolved: Index.10: y (File "index.ml", line 42, characters 31-32) +Unresolved: CU Stdlib : Stdlib (File "index.ml", line 42, characters 20-26) +Unresolved: CU Stdlib . "+"[value] : + Stdlib.(+) (File "index.ml", line 42, characters 20-30) +Unresolved: CU Stdlib . "print_int"[value] : print_int (File "index.ml", line 42, characters 9-18) -Unresolved: CU Auxiliaire . "z"[value] : +Unresolved: CU Auxiliaire : + Auxiliaire (File "index.ml", line 40, characters 14-24) +Unresolved: CU Auxiliaire . "z"[value] : Auxiliaire.z (File "index.ml", line 40, characters 14-26) -Resolved: Index.4 : A.x (File "index.ml", line 40, characters 8-11) -Unresolved: CU Stdlib . "+"[value] : +Resolved: Index.5: A (File "index.ml", line 40, characters 8-9) +Resolved: Index.4: A.x (File "index.ml", line 40, characters 8-11) +Unresolved: CU Stdlib . "+"[value] : (+) (File "index.ml", line 40, characters 12-13) -Resolved: Index.5 : A (File "index.ml", line 38, characters 5-6) -Resolved: Index.3 : t (File "index.ml", line 32, characters 10-11) -Resolved: Index.5 : A (File "index.ml", line 31, characters 7-8) -Resolved: Index.5 : A (File "index.ml", line 34, characters 10-11) -Resolved: Index.5 : A (File "index.ml", line 28, characters 11-12) -Resolved: Index.3 : t (File "index.ml", line 25, characters 11-12) -Resolved: Index.0 : t (File "index.ml", line 20, characters 10-11) +Resolved: Index.5: A (File "index.ml", line 38, characters 5-6) +Resolved: Index.3: t (File "index.ml", line 32, characters 10-11) +Resolved: Index.5: A (File "index.ml", line 31, characters 7-8) +Resolved: Index.5: A (File "index.ml", line 34, characters 10-11) +Resolved: Index.5: A (File "index.ml", line 28, characters 11-12) +Resolved: Index.3: t (File "index.ml", line 25, characters 11-12) +Resolved: Index.0: t (File "index.ml", line 20, characters 10-11) Uid of decls: Index.0: t (File "index.ml", line 19, characters 7-8) @@ -61,3 +74,6 @@ Index.25: u (File "index.ml", line 66, characters 7-8) Index.26: t (File "index.ml", line 67, characters 23-24) Index.27: G (File "index.ml", line 68, characters 9-10) Index.28: MSB (File "index.ml", line 65, characters 12-15) +Index.29: x (File "index.ml", line 71, characters 43-44) +Index.30: In (File "index.ml", line 71, characters 27-29) +Index.31: Out (File "index.ml", line 71, characters 7-10) diff --git a/testsuite/tests/shape-index/index_aliases.reference b/testsuite/tests/shape-index/index_aliases.reference index ca456ec6..11657158 100644 --- a/testsuite/tests/shape-index/index_aliases.reference +++ b/testsuite/tests/shape-index/index_aliases.reference @@ -1,40 +1,47 @@ Indexed shapes: -Missing uid : t (File "index_aliases.ml", line 52, characters 9-10) -Resolved: Index_aliases.26 : +Missing uid: t (File "index_aliases.ml", line 52, characters 9-10) +Resolved: Index_aliases.26: FArg (File "index_aliases.ml", line 49, characters 5-9) -Resolved: Index_aliases.25 : +Resolved: Index_aliases.25: Arg (File "index_aliases.ml", line 48, characters 19-22) -Approximated: Index_aliases.22 : +Resolved: Index_aliases.22: + X (File "index_aliases.ml", line 48, characters 14-15) +Approximated: Index_aliases.22: X.F (File "index_aliases.ml", line 48, characters 14-17) -Missing uid : Z.s (File "index_aliases.ml", line 45, characters 8-11) -Alias: Index_aliases.23 -> Approximated: Index_aliases.22 : +Alias: Index_aliases.24 -> Alias: Index_aliases.23 -> + Approximated: Index_aliases.22: + Z (File "index_aliases.ml", line 45, characters 8-9) +Missing uid: Z.s (File "index_aliases.ml", line 45, characters 8-11) +Alias: Index_aliases.23 -> Approximated: Index_aliases.22: Y (File "index_aliases.ml", line 42, characters 11-12) -Approximated: Index_aliases.22 : +Resolved: Index_aliases.22: + X (File "index_aliases.ml", line 41, characters 11-12) +Approximated: Index_aliases.22: X.M (File "index_aliases.ml", line 41, characters 11-14) -Resolved: Index_aliases.17 : +Resolved: Index_aliases.17: x (File "index_aliases.ml", line 40, characters 16-17) -Resolved: Index_aliases.16 : +Resolved: Index_aliases.16: S (File "index_aliases.ml", line 38, characters 8-9) -Alias: Index_aliases.10 -> Alias: Index_aliases.2 -> Resolved: Index_aliases.1 - : +Alias: Index_aliases.10 -> Alias: Index_aliases.2 -> + Resolved: Index_aliases.1: G (File "index_aliases.ml", line 29, characters 8-9) -Alias: Index_aliases.2 -> Resolved: Index_aliases.1 : +Alias: Index_aliases.2 -> Resolved: Index_aliases.1: B (File "index_aliases.ml", line 28, characters 11-12) -Resolved: Index_aliases.7 : +Resolved: Index_aliases.7: C (File "index_aliases.ml", line 26, characters 11-12) -Alias: Index_aliases.2 -> Resolved: Index_aliases.1 : +Alias: Index_aliases.2 -> Resolved: Index_aliases.1: B (File "index_aliases.ml", line 25, characters 14-15) -Resolved: Index_aliases.5 : +Resolved: Index_aliases.5: F (File "index_aliases.ml", line 25, characters 12-13) -Resolved: Index_aliases.1 : +Resolved: Index_aliases.1: A (File "index_aliases.ml", line 23, characters 14-15) -Alias: Index_aliases.6 -> Resolved: Index_aliases.5 : +Alias: Index_aliases.6 -> Resolved: Index_aliases.5: F' (File "index_aliases.ml", line 23, characters 11-13) -Resolved: Index_aliases.5 : +Resolved: Index_aliases.5: F (File "index_aliases.ml", line 22, characters 12-13) -Resolved: Index_aliases.4 : +Resolved: Index_aliases.4: X (File "index_aliases.ml", line 21, characters 32-33) -Resolved: Index_aliases.1 : +Resolved: Index_aliases.1: A (File "index_aliases.ml", line 19, characters 11-12) Uid of decls: diff --git a/testsuite/tests/shape-index/index_bindingops.reference b/testsuite/tests/shape-index/index_bindingops.reference index 8892fd4e..287fe2a2 100644 --- a/testsuite/tests/shape-index/index_bindingops.reference +++ b/testsuite/tests/shape-index/index_bindingops.reference @@ -1,41 +1,47 @@ Indexed shapes: -Resolved: Index_bindingops.3 : +Resolved: Index_bindingops.3: (and+) (File "index_bindingops.ml", line 30, characters 8-14) -Resolved: Index_bindingops.0 : +Resolved: Index_bindingops.0: (let+) (File "index_bindingops.ml", line 29, characters 8-14) -Resolved: Index_bindingops.11 : +Resolved: Index_bindingops.11: man (File "index_bindingops.ml", line 27, characters 14-17) -Resolved: Index_bindingops.10 : +Resolved: Index_bindingops.10: bar (File "index_bindingops.ml", line 27, characters 8-11) -Resolved: Index_bindingops.9 : +Resolved: Index_bindingops.9: foo (File "index_bindingops.ml", line 27, characters 2-5) -Unresolved: CU Stdlib . "+"[value] : +Unresolved: CU Stdlib . "+"[value] : (+) (File "index_bindingops.ml", line 27, characters 6-7) -Unresolved: CU Stdlib . "-"[value] : +Unresolved: CU Stdlib . "-"[value] : (-) (File "index_bindingops.ml", line 27, characters 12-13) -Resolved: Index_bindingops.3 : +Resolved: Index_bindingops.3: (and+) (File "index_bindingops.ml", line 26, characters 2-6) -Resolved: Index_bindingops.3 : +Resolved: Index_bindingops.3: (and+) (File "index_bindingops.ml", line 25, characters 2-6) -Resolved: Index_bindingops.0 : +Resolved: Index_bindingops.0: (let+) (File "index_bindingops.ml", line 24, characters 2-6) -Resolved: Index_bindingops.5 : +Resolved: Index_bindingops.5: y (File "index_bindingops.ml", line 21, characters 31-32) -Resolved: Index_bindingops.7 : +Resolved: Index_bindingops.7: y (File "index_bindingops.ml", line 21, characters 27-28) -Resolved: Index_bindingops.6 : +Resolved: Index_bindingops.6: x (File "index_bindingops.ml", line 21, characters 24-25) -Unresolved: CU Stdlib . "Option"[module] . "map"[value] : +Unresolved: CU Stdlib . "Option"[module] : + Option (File "index_bindingops.ml", line 21, characters 2-8) +Unresolved: CU Stdlib . "Option"[module] . "map"[value] : Option.map (File "index_bindingops.ml", line 21, characters 2-12) -Resolved: Index_bindingops.4 : +Resolved: Index_bindingops.4: x (File "index_bindingops.ml", line 20, characters 14-15) -Unresolved: CU Stdlib . "Option"[module] . "bind"[value] : +Unresolved: CU Stdlib . "Option"[module] : + Option (File "index_bindingops.ml", line 20, characters 2-8) +Unresolved: CU Stdlib . "Option"[module] . "bind"[value] : Option.bind (File "index_bindingops.ml", line 20, characters 2-13) -Resolved: Index_bindingops.1 : +Resolved: Index_bindingops.1: x (File "index_bindingops.ml", line 17, characters 30-31) -Resolved: Index_bindingops.2 : +Resolved: Index_bindingops.2: f (File "index_bindingops.ml", line 17, characters 28-29) -Unresolved: CU Stdlib . "Option"[module] . "map"[value] : +Unresolved: CU Stdlib . "Option"[module] : + Option (File "index_bindingops.ml", line 17, characters 17-23) +Unresolved: CU Stdlib . "Option"[module] . "map"[value] : Option.map (File "index_bindingops.ml", line 17, characters 17-27) Uid of decls: diff --git a/testsuite/tests/shape-index/index_constrs.reference b/testsuite/tests/shape-index/index_constrs.reference index c8cec480..844197f9 100644 --- a/testsuite/tests/shape-index/index_constrs.reference +++ b/testsuite/tests/shape-index/index_constrs.reference @@ -1,19 +1,21 @@ Indexed shapes: -Resolved: Index_constrs.1 : +Resolved: Index_constrs.2: + M (File "index_constrs.ml", line 32, characters 32-33) +Resolved: Index_constrs.1: M.F (File "index_constrs.ml", line 32, characters 32-35) -Resolved: Index_constrs.0 : +Resolved: Index_constrs.0: E (File "index_constrs.ml", line 29, characters 14-15) -Resolved: Index_constrs.4 : +Resolved: Index_constrs.4: E (File "index_constrs.ml", line 28, characters 4-5) -Resolved: Index_constrs.7 : +Resolved: Index_constrs.7: x (File "index_constrs.ml", line 27, characters 16-17) -Resolved: Index_constrs.0 : +Resolved: Index_constrs.0: E (File "index_constrs.ml", line 26, characters 15-16) -Unresolved: CU Stdlib . "raise"[value] : +Unresolved: CU Stdlib . "raise"[value] : raise (File "index_constrs.ml", line 26, characters 9-14) -Resolved: Index_constrs.4 : +Resolved: Index_constrs.4: E (File "index_constrs.ml", line 25, characters 9-10) -Resolved: Index_constrs.0 : +Resolved: Index_constrs.0: E (File "index_constrs.ml", line 20, characters 16-17) Uid of decls: diff --git a/testsuite/tests/shape-index/index_constrs_records.ml b/testsuite/tests/shape-index/index_constrs_records.ml index c327360c..aa2046c1 100644 --- a/testsuite/tests/shape-index/index_constrs_records.ml +++ b/testsuite/tests/shape-index/index_constrs_records.ml @@ -42,3 +42,11 @@ let e = Exn { l_exn = 2} let _ = match e with | Exn { l_exn } -> l_exn | _ -> assert false + +module Mod = struct + type t = A of { lbl : int} +end +let () = + match Mod.A { lbl = 42 } with + | Mod.A { lbl = 42 } -> () + | Mod.A r -> ignore r.lbl diff --git a/testsuite/tests/shape-index/index_constrs_records.reference b/testsuite/tests/shape-index/index_constrs_records.reference index 7a6f003d..397e639f 100644 --- a/testsuite/tests/shape-index/index_constrs_records.reference +++ b/testsuite/tests/shape-index/index_constrs_records.reference @@ -1,59 +1,83 @@ Indexed shapes: -Resolved: Index_constrs_records.36 : +Resolved: Index_constrs_records.47: + r (File "index_constrs_records.ml", line 52, characters 22-23) +Resolved: Index_constrs_records.38: + lbl (File "index_constrs_records.ml", line 52, characters 24-27) +Unresolved: CU Stdlib . "ignore"[value] : + ignore (File "index_constrs_records.ml", line 52, characters 15-21) +Resolved: Index_constrs_records.45: + Mod (File "index_constrs_records.ml", line 52, characters 4-7) +Resolved: Index_constrs_records.39: + Mod.A (File "index_constrs_records.ml", line 52, characters 4-9) +Resolved: Index_constrs_records.38: + lbl (File "index_constrs_records.ml", line 51, characters 12-15) +Resolved: Index_constrs_records.45: + Mod (File "index_constrs_records.ml", line 51, characters 4-7) +Resolved: Index_constrs_records.39: + Mod.A (File "index_constrs_records.ml", line 51, characters 4-9) +Resolved: Index_constrs_records.38: + lbl (File "index_constrs_records.ml", line 50, characters 16-19) +Resolved: Index_constrs_records.45: + Mod (File "index_constrs_records.ml", line 50, characters 8-11) +Resolved: Index_constrs_records.39: + Mod.A (File "index_constrs_records.ml", line 50, characters 8-13) +Resolved: Index_constrs_records.36: l_exn (File "index_constrs_records.ml", line 43, characters 21-26) -Resolved: Index_constrs_records.32 : +Resolved: Index_constrs_records.32: l_exn (File "index_constrs_records.ml", line 43, characters 10-15) -Resolved: Index_constrs_records.33 : +Resolved: Index_constrs_records.33: Exn (File "index_constrs_records.ml", line 43, characters 4-7) -Resolved: Index_constrs_records.35 : +Resolved: Index_constrs_records.35: e (File "index_constrs_records.ml", line 42, characters 14-15) -Resolved: Index_constrs_records.32 : +Resolved: Index_constrs_records.32: l_exn (File "index_constrs_records.ml", line 41, characters 14-19) -Resolved: Index_constrs_records.33 : +Resolved: Index_constrs_records.33: Exn (File "index_constrs_records.ml", line 41, characters 8-11) -Resolved: Index_constrs_records.31 : +Resolved: Index_constrs_records.31: l_ext (File "index_constrs_records.ml", line 36, characters 21-26) -Resolved: Index_constrs_records.26 : +Resolved: Index_constrs_records.26: l_ext (File "index_constrs_records.ml", line 36, characters 10-15) -Resolved: Index_constrs_records.27 : +Resolved: Index_constrs_records.27: Ext (File "index_constrs_records.ml", line 36, characters 4-7) -Resolved: Index_constrs_records.30 : +Resolved: Index_constrs_records.30: x (File "index_constrs_records.ml", line 35, characters 22-23) -Resolved: Index_constrs_records.25 : +Resolved: Index_constrs_records.25: u (File "index_constrs_records.ml", line 35, characters 11-12) -Resolved: Index_constrs_records.25 : +Resolved: Index_constrs_records.25: u (File "index_constrs_records.ml", line 33, characters 5-6) -Resolved: Index_constrs_records.24 : +Resolved: Index_constrs_records.24: l (File "index_constrs_records.ml", line 30, characters 47-48) -Resolved: Index_constrs_records.1 : +Resolved: Index_constrs_records.1: lbl (File "index_constrs_records.ml", line 30, characters 49-52) -Resolved: Index_constrs_records.23 : +Resolved: Index_constrs_records.23: lbl (File "index_constrs_records.ml", line 30, characters 41-44) -Resolved: Index_constrs_records.22 : +Resolved: Index_constrs_records.22: l_c (File "index_constrs_records.ml", line 30, characters 35-38) -Unresolved: CU Stdlib . "+"[value] : +Unresolved: CU Stdlib . "+"[value] : (+) (File "index_constrs_records.ml", line 30, characters 39-40) -Unresolved: CU Stdlib . "+"[value] : +Unresolved: CU Stdlib . "+"[value] : (+) (File "index_constrs_records.ml", line 30, characters 45-46) -Resolved: Index_constrs_records.1 : +Resolved: Index_constrs_records.1: lbl (File "index_constrs_records.ml", line 30, characters 21-24) -Resolved: Index_constrs_records.3 : +Resolved: Index_constrs_records.3: l_c (File "index_constrs_records.ml", line 30, characters 11-14) -Resolved: Index_constrs_records.4 : +Resolved: Index_constrs_records.4: A (File "index_constrs_records.ml", line 30, characters 7-8) -Resolved: Index_constrs_records.3 : +Resolved: Index_constrs_records.3: l_c (File "index_constrs_records.ml", line 29, characters 12-15) -Resolved: Index_constrs_records.4 : +Resolved: Index_constrs_records.4: A (File "index_constrs_records.ml", line 29, characters 8-9) -Resolved: Index_constrs_records.19 : +Resolved: Index_constrs_records.19: M (File "index_constrs_records.ml", line 27, characters 5-6) -Resolved: Index_constrs_records.3 : +Resolved: Index_constrs_records.3: l_c (File "index_constrs_records.ml", line 25, characters 14-17) -Resolved: Index_constrs_records.4 : +Resolved: Index_constrs_records.19: + M (File "index_constrs_records.ml", line 25, characters 8-9) +Resolved: Index_constrs_records.4: M.A (File "index_constrs_records.ml", line 25, characters 8-11) -Resolved: Index_constrs_records.3 : +Resolved: Index_constrs_records.3: l_c (File "index_constrs_records.ml", line 22, characters 14-17) -Resolved: Index_constrs_records.4 : +Resolved: Index_constrs_records.4: A (File "index_constrs_records.ml", line 22, characters 10-11) Uid of decls: @@ -91,3 +115,11 @@ Index_constrs_records.33: Exn (File "index_constrs_records.ml", line 39, characters 10-13) Index_constrs_records.35: e (File "index_constrs_records.ml", line 41, characters 4-5) +Index_constrs_records.37: + t (File "index_constrs_records.ml", line 47, characters 7-8) +Index_constrs_records.38: + lbl (File "index_constrs_records.ml", line 47, characters 18-21) +Index_constrs_records.39: + A (File "index_constrs_records.ml", line 47, characters 11-12) +Index_constrs_records.45: + Mod (File "index_constrs_records.ml", line 46, characters 7-10) diff --git a/testsuite/tests/shape-index/index_functor.reference b/testsuite/tests/shape-index/index_functor.reference index 04746c8d..f820bf4d 100644 --- a/testsuite/tests/shape-index/index_functor.reference +++ b/testsuite/tests/shape-index/index_functor.reference @@ -1,13 +1,15 @@ Indexed shapes: -Resolved: Index_functor.3 : +Resolved: Index_functor.3: N (File "index_functor.ml", line 22, characters 8-9) -Alias: Index_functor.4 -> Resolved: Index_functor.0 : +Alias: Index_functor.4 -> Resolved: Index_functor.0: O (File "index_functor.ml", line 21, characters 8-9) -Resolved: Index_functor.0 : +Resolved: Index_functor.3: + N (File "index_functor.ml", line 20, characters 11-12) +Resolved: Index_functor.0: N.M (File "index_functor.ml", line 20, characters 11-14) -Resolved: Index_functor.2 : +Resolved: Index_functor.2: F (File "index_functor.ml", line 19, characters 11-12) -Resolved: Index_functor.0 : +Resolved: Index_functor.0: X (File "index_functor.ml", line 18, characters 43-44) Uid of decls: diff --git a/testsuite/tests/shape-index/index_labels.reference b/testsuite/tests/shape-index/index_labels.reference index ae84539a..e17c3de1 100644 --- a/testsuite/tests/shape-index/index_labels.reference +++ b/testsuite/tests/shape-index/index_labels.reference @@ -1,19 +1,14 @@ Indexed shapes: -Resolved: Index_labels.2 : +Resolved: Index_labels.2: b (File "index_labels.ml", line 26, characters 14-15) -Resolved: Index_labels.1 : - a (File "index_labels.ml", line 26, characters 6-7) -Resolved: Index_labels.3 : - x (File "index_labels.ml", line 23, characters 2-3) -Resolved: Index_labels.1 : - a (File "index_labels.ml", line 23, characters 4-5) -Resolved: Index_labels.3 : - x (File "index_labels.ml", line 22, characters 2-3) -Resolved: Index_labels.1 : - a (File "index_labels.ml", line 22, characters 4-5) -Resolved: Index_labels.2 : +Resolved: Index_labels.1: a (File "index_labels.ml", line 26, characters 6-7) +Resolved: Index_labels.3: x (File "index_labels.ml", line 23, characters 2-3) +Resolved: Index_labels.1: a (File "index_labels.ml", line 23, characters 4-5) +Resolved: Index_labels.3: x (File "index_labels.ml", line 22, characters 2-3) +Resolved: Index_labels.1: a (File "index_labels.ml", line 22, characters 4-5) +Resolved: Index_labels.2: b (File "index_labels.ml", line 20, characters 18-19) -Resolved: Index_labels.1 : +Resolved: Index_labels.1: a (File "index_labels.ml", line 20, characters 10-11) Uid of decls: diff --git a/testsuite/tests/shape-index/index_modules.reference b/testsuite/tests/shape-index/index_modules.reference index 3563c67a..e22b5a40 100644 --- a/testsuite/tests/shape-index/index_modules.reference +++ b/testsuite/tests/shape-index/index_modules.reference @@ -1,13 +1,15 @@ Indexed shapes: -Resolved: Index_modules.0 : +Resolved: Index_modules.1: + A (File "index_modules.ml", line 22, characters 17-18) +Resolved: Index_modules.0: A.x (File "index_modules.ml", line 22, characters 17-20) -Resolved: Index_modules.0 : +Resolved: Index_modules.0: x (File "index_modules.ml", line 22, characters 13-14) -Unresolved: CU Stdlib . "+"[value] : +Unresolved: CU Stdlib . "+"[value] : (+) (File "index_modules.ml", line 22, characters 15-16) -Unresolved: CU Stdlib . "print_int"[value] : +Unresolved: CU Stdlib . "print_int"[value] : print_int (File "index_modules.ml", line 22, characters 2-11) -Resolved: Index_modules.1 : +Resolved: Index_modules.1: A (File "index_modules.ml", line 21, characters 11-12) Uid of decls: diff --git a/testsuite/tests/shape-index/index_objects.reference b/testsuite/tests/shape-index/index_objects.reference index 4d44a656..91f64eb8 100644 --- a/testsuite/tests/shape-index/index_objects.reference +++ b/testsuite/tests/shape-index/index_objects.reference @@ -1,25 +1,25 @@ Indexed shapes: -Resolved: Index_objects.21 : +Resolved: Index_objects.21: ins (File "index_objects.ml", line 48, characters 21-24) -Resolved: Index_objects.28 : +Resolved: Index_objects.28: self (File "index_objects.ml", line 47, characters 20-24) -Resolved: Index_objects.26 : +Resolved: Index_objects.26: i (File "index_objects.ml", line 46, characters 28-29) -Resolved: Index_objects.21 : +Resolved: Index_objects.21: ins (File "index_objects.ml", line 46, characters 21-24) -Resolved: Index_objects.21 : +Resolved: Index_objects.21: ins (File "index_objects.ml", line 45, characters 22-25) -Resolved: Index_objects.13 : +Resolved: Index_objects.13: ct (File "index_objects.ml", line 40, characters 28-30) -Resolved: Index_objects.5 : +Resolved: Index_objects.5: c (File "index_objects.ml", line 32, characters 10-11) -Resolved: Index_objects.5 : +Resolved: Index_objects.5: c (File "index_objects.ml", line 29, characters 8-9) -Resolved: Index_objects.5 : +Resolved: Index_objects.5: c (File "index_objects.ml", line 29, characters 16-17) -Resolved: Index_objects.5 : +Resolved: Index_objects.5: c (File "index_objects.ml", line 29, characters 8-9) -Resolved: Index_objects.0 : +Resolved: Index_objects.0: o (File "index_objects.ml", line 23, characters 9-10) Uid of decls: diff --git a/testsuite/tests/shape-index/index_types.reference b/testsuite/tests/shape-index/index_types.reference index b7887fa3..644ccb4d 100644 --- a/testsuite/tests/shape-index/index_types.reference +++ b/testsuite/tests/shape-index/index_types.reference @@ -1,15 +1,13 @@ Indexed shapes: -Resolved: Index_types.9 : - t (File "index_types.ml", line 41, characters 12-13) -Resolved: Index_types.10 : - N (File "index_types.ml", line 41, characters 9-10) -Resolved: Index_types.7 : t1 (File "index_types.ml", line 37, characters 5-7) -Resolved: Index_types.4 : t2 (File "index_types.ml", line 33, characters 7-9) -Resolved: Index_types.3 : +Resolved: Index_types.9: t (File "index_types.ml", line 41, characters 12-13) +Resolved: Index_types.10: N (File "index_types.ml", line 41, characters 9-10) +Resolved: Index_types.7: t1 (File "index_types.ml", line 37, characters 5-7) +Resolved: Index_types.4: t2 (File "index_types.ml", line 33, characters 7-9) +Resolved: Index_types.3: poly (File "index_types.ml", line 29, characters 24-28) -Resolved: Index_types.0 : t (File "index_types.ml", line 25, characters 9-10) -Resolved: Index_types.0 : t (File "index_types.ml", line 20, characters 8-9) -Resolved: Index_types.0 : t (File "index_types.ml", line 20, characters 8-9) +Resolved: Index_types.0: t (File "index_types.ml", line 25, characters 9-10) +Resolved: Index_types.0: t (File "index_types.ml", line 20, characters 8-9) +Resolved: Index_types.0: t (File "index_types.ml", line 20, characters 8-9) Uid of decls: Index_types.0: t (File "index_types.ml", line 18, characters 5-6) diff --git a/testsuite/tests/shape-index/index_vb.reference b/testsuite/tests/shape-index/index_vb.reference index cb96c56c..69c9bd66 100644 --- a/testsuite/tests/shape-index/index_vb.reference +++ b/testsuite/tests/shape-index/index_vb.reference @@ -1,19 +1,19 @@ Indexed shapes: -Resolved: Index_vb.4 : c (File "index_vb.ml", line 22, characters 43-44) -Unresolved: CU Stdlib . "int_of_string"[value] : +Resolved: Index_vb.4: c (File "index_vb.ml", line 22, characters 43-44) +Unresolved: CU Stdlib . "int_of_string"[value] : int_of_string (File "index_vb.ml", line 22, characters 29-42) -Resolved: Index_vb.5 : d (File "index_vb.ml", line 22, characters 24-25) -Unresolved: CU Stdlib . "*"[value] : ( * +Resolved: Index_vb.5: d (File "index_vb.ml", line 22, characters 24-25) +Unresolved: CU Stdlib . "*"[value] : ( * ) (File "index_vb.ml", line 22, characters 26-27) -Resolved: Index_vb.3 : a (File "index_vb.ml", line 22, characters 20-21) -Unresolved: CU Stdlib . "+"[value] : +Resolved: Index_vb.3: a (File "index_vb.ml", line 22, characters 20-21) +Unresolved: CU Stdlib . "+"[value] : (+) (File "index_vb.ml", line 22, characters 22-23) -Unresolved: CU Stdlib . "print_int"[value] : +Unresolved: CU Stdlib . "print_int"[value] : print_int (File "index_vb.ml", line 22, characters 9-18) -Resolved: Index_vb.2 : b (File "index_vb.ml", line 20, characters 34-35) -Resolved: Index_vb.1 : a (File "index_vb.ml", line 20, characters 26-27) -Resolved: Index_vb.2 : b (File "index_vb.ml", line 20, characters 9-10) -Resolved: Index_vb.1 : a (File "index_vb.ml", line 20, characters 6-7) +Resolved: Index_vb.2: b (File "index_vb.ml", line 20, characters 34-35) +Resolved: Index_vb.1: a (File "index_vb.ml", line 20, characters 26-27) +Resolved: Index_vb.2: b (File "index_vb.ml", line 20, characters 9-10) +Resolved: Index_vb.1: a (File "index_vb.ml", line 20, characters 6-7) Uid of decls: Index_vb.0: t (File "index_vb.ml", line 18, characters 5-6) diff --git a/testsuite/tests/statmemprof/bigarray.ml b/testsuite/tests/statmemprof/bigarray.ml new file mode 100644 index 00000000..aa6fb9fa --- /dev/null +++ b/testsuite/tests/statmemprof/bigarray.ml @@ -0,0 +1,105 @@ +(* TEST + modules = "bigarray_stubs.c"; + include unix; + hasunix; + { + bytecode; + }{ + native; + } +*) +module MP = Gc.Memprof + +type bigstring = (char, Bigarray.int8_unsigned_elt, Bigarray.c_layout) Bigarray.Array1.t + +external static_bigstring : unit -> bigstring = "static_bigstring" +external new_bigstring : unit -> bigstring = "new_bigstring" +external malloc_bigstring : unit -> bigstring = "malloc_bigstring" + +let bigstring_create sz : bigstring = + Bigarray.Array1.create Bigarray.char Bigarray.c_layout sz + +let keep = ref [] + +let test () = + let custom_words = ref 0 in + let mmapped_words = ref 0 in + let tmp_filename = Filename.temp_file "custom_test" ".dat" in + let update words_ref size = + words_ref := !words_ref + size * Sys.word_size/8 + in + let alloc (info : MP.allocation) = + match info.source with + | Custom -> + update custom_words info.size; + Some (info.source, info.size) + | Map_file -> + update mmapped_words info.size; + Some (info.source, info.size) + | Normal | Marshal -> + None + in + let dealloc (source, size) = + match (source : MP.allocation_source) with + | Custom -> update custom_words (-size) + | Map_file -> update mmapped_words (-size) + | Normal | Marshal -> () + in + let tracker : _ MP.tracker = + { alloc_minor = alloc; + alloc_major = alloc; + promote = (fun x -> Some x); + dealloc_minor = dealloc; + dealloc_major = dealloc } + in + let _:MP.t = MP.start ~sampling_rate:1. tracker in + let log s = + Printf.printf "%20s: %d custom bytes, %d mmapped bytes\n%!" + s + !custom_words + !mmapped_words + in + let[@inline never] test_tail () = + (* This is a separate tail-called function, to ensure + that [str] is out of scope even on bytecode builds *) + keep := []; + Gc.full_major (); + log "gc" + in + let test msg str = + Sys.poll_actions (); + log msg; + keep := [str]; + (* sub and slice should not count as allocations *) + keep := Bigarray.Array1.sub str 1000 1000 :: !keep; + log "sub"; + Gc.full_major (); + keep := Bigarray.Array1.sub str 1000 1000 :: !keep; + log "slice"; + (test_tail[@tailcall]) () + in + test "Allocation" (bigstring_create 5000); + + let map_len = 64 * 1024 in + Unix.truncate tmp_filename map_len; + let fd = Unix.openfile tmp_filename [O_RDONLY] 0o600 in + test "Unix.map_file" + (Unix.map_file fd Bigarray.char Bigarray.c_layout false [| map_len |] + |> Bigarray.array1_of_genarray); + Unix.close fd; + + (* Externally managed memory, should not be tracked *) + test "CAML_BA_EXTERNAL" (static_bigstring ()); + + (* Runtime-allocated memory, should be tracked *) + test "ba_alloc NULL" (new_bigstring ()); + + (* User-allocated yet GC-managed memory, should be tracked *) + test "CAML_BA_MANAGED" (malloc_bigstring ()); + + MP.stop (); + Sys.remove tmp_filename; + assert (!custom_words = 0) + + +let () = test () diff --git a/testsuite/tests/statmemprof/bigarray.reference b/testsuite/tests/statmemprof/bigarray.reference new file mode 100644 index 00000000..fc0bf6ee --- /dev/null +++ b/testsuite/tests/statmemprof/bigarray.reference @@ -0,0 +1,20 @@ + Allocation: 5000 custom bytes, 0 mmapped bytes + sub: 5000 custom bytes, 0 mmapped bytes + slice: 5000 custom bytes, 0 mmapped bytes + gc: 0 custom bytes, 0 mmapped bytes + Unix.map_file: 0 custom bytes, 65536 mmapped bytes + sub: 0 custom bytes, 65536 mmapped bytes + slice: 0 custom bytes, 65536 mmapped bytes + gc: 0 custom bytes, 0 mmapped bytes + CAML_BA_EXTERNAL: 0 custom bytes, 0 mmapped bytes + sub: 0 custom bytes, 0 mmapped bytes + slice: 0 custom bytes, 0 mmapped bytes + gc: 0 custom bytes, 0 mmapped bytes + ba_alloc NULL: 5000 custom bytes, 0 mmapped bytes + sub: 5000 custom bytes, 0 mmapped bytes + slice: 5000 custom bytes, 0 mmapped bytes + gc: 0 custom bytes, 0 mmapped bytes + CAML_BA_MANAGED: 5000 custom bytes, 0 mmapped bytes + sub: 5000 custom bytes, 0 mmapped bytes + slice: 5000 custom bytes, 0 mmapped bytes + gc: 0 custom bytes, 0 mmapped bytes diff --git a/testsuite/tests/statmemprof/bigarray_stubs.c b/testsuite/tests/statmemprof/bigarray_stubs.c new file mode 100644 index 00000000..5d04ad30 --- /dev/null +++ b/testsuite/tests/statmemprof/bigarray_stubs.c @@ -0,0 +1,45 @@ +#include +#include + +static char buf[10000]; +value static_bigstring(value unit) +{ + intnat dim[] = { sizeof(buf) }; +#if defined(_MSC_VER) && !defined(__clang__) +#pragma warning(push) +#pragma warning(disable : 5287) +#endif + return caml_ba_alloc(CAML_BA_UINT8 | CAML_BA_C_LAYOUT | CAML_BA_EXTERNAL, + 1, buf, dim); +#if defined(_MSC_VER) && !defined(__clang__) +#pragma warning(pop) +#endif +} + +value new_bigstring(value unit) +{ + intnat dim[] = { 5000 }; +#if defined(_MSC_VER) && !defined(__clang__) +#pragma warning(push) +#pragma warning(disable : 5287) +#endif + return caml_ba_alloc(CAML_BA_UINT8 | CAML_BA_C_LAYOUT, + 1, NULL, dim); +#if defined(_MSC_VER) && !defined(__clang__) +#pragma warning(pop) +#endif +} + +value malloc_bigstring(value unit) +{ + intnat dim[] = { 5000 }; +#if defined(_MSC_VER) && !defined(__clang__) +#pragma warning(push) +#pragma warning(disable : 5287) +#endif + return caml_ba_alloc(CAML_BA_UINT8 | CAML_BA_C_LAYOUT | CAML_BA_MANAGED, + 1, malloc(dim[0]), dim); +#if defined(_MSC_VER) && !defined(__clang__) +#pragma warning(pop) +#endif +} diff --git a/testsuite/tests/statmemprof/user_data_regression.ml b/testsuite/tests/statmemprof/user_data_regression.ml new file mode 100644 index 00000000..67b12cff --- /dev/null +++ b/testsuite/tests/statmemprof/user_data_regression.ml @@ -0,0 +1,26 @@ +(* TEST + modules = "user_data_regression_stub.c"; + flags = "-g"; + ocamlrunparam += ",s=100"; + { bytecode; } + { native; } +*) + +external request_minor_gcs : unit -> unit = "request_minor_gcs" + +let deep f = + let rec loop n = if n = 0 then (f (); 0) else 1 + loop (n-1) in + ignore (loop (Random.int 100)) + +let () = + let alloc_minor (info : Gc.Memprof.allocation) = + ignore (Printexc.raw_backtrace_to_string info.callstack); + None + in + Gc.Memprof.(start ~sampling_rate:1. {null_tracker with alloc_minor}) |> ignore; + for i = 1 to 1_000 do + deep (fun () -> + request_minor_gcs (); + ignore (Sys.opaque_identity (ref 42))); + done; + print_endline "ok" diff --git a/testsuite/tests/statmemprof/user_data_regression.reference b/testsuite/tests/statmemprof/user_data_regression.reference new file mode 100644 index 00000000..9766475a --- /dev/null +++ b/testsuite/tests/statmemprof/user_data_regression.reference @@ -0,0 +1 @@ +ok diff --git a/testsuite/tests/statmemprof/user_data_regression_stub.c b/testsuite/tests/statmemprof/user_data_regression_stub.c new file mode 100644 index 00000000..614da034 --- /dev/null +++ b/testsuite/tests/statmemprof/user_data_regression_stub.c @@ -0,0 +1,13 @@ +#define CAML_INTERNALS + +#include +#include +#include + +value request_minor_gcs(value u) { + caml_alloc(1,0); + caml_request_minor_gc(); + caml_alloc(1,0); + caml_request_minor_gc(); + return Val_unit; +} diff --git a/testsuite/tests/syntactic-arity/max_arity.compilers.reference b/testsuite/tests/syntactic-arity/max_arity.compilers.reference index ba289bd0..208b8c01 100644 --- a/testsuite/tests/syntactic-arity/max_arity.compilers.reference +++ b/testsuite/tests/syntactic-arity/max_arity.compilers.reference @@ -2,4 +2,4 @@ File "max_arity.ml", line 154, characters 8-12: 154 | let _ = f ();; ^^^^ Warning 5 [ignored-partial-application]: this function application is partial, -maybe some arguments are missing. + maybe some arguments are missing. diff --git a/testsuite/tests/tmc/other_features.ml b/testsuite/tests/tmc/other_features.ml index d75e1dab..427d8ec9 100644 --- a/testsuite/tests/tmc/other_features.ml +++ b/testsuite/tests/tmc/other_features.ml @@ -22,8 +22,8 @@ Lines 6-11, characters 30-40: 9 | | C (a, b) -> 10 | let map' l = map f l in 11 | C (map' a, (map' [@tailcall]) b) -Warning 71 [unused-tmc-attribute]: This function is marked @tail_mod_cons -but is never applied in TMC position. +Warning 71 [unused-tmc-attribute]: This function is marked "@tail_mod_cons" + but is never applied in TMC position. Line 11, characters 19-39: 11 | C (map' a, (map' [@tailcall]) b) diff --git a/testsuite/tests/tmc/partial_application.compilers.reference b/testsuite/tests/tmc/partial_application.compilers.reference index 0c56e55b..b21e94cf 100644 --- a/testsuite/tests/tmc/partial_application.compilers.reference +++ b/testsuite/tests/tmc/partial_application.compilers.reference @@ -2,4 +2,4 @@ File "partial_application.ml", line 7, characters 26-36: 7 | let[@tail_mod_cons] rec f () () = () ^^^^^^^^^^ Warning 71 [unused-tmc-attribute]: This function is marked @tail_mod_cons -but is never applied in TMC position. + but is never applied in TMC position. diff --git a/testsuite/tests/tmc/tupled_function_calls.native.reference b/testsuite/tests/tmc/tupled_function_calls.native.reference index 27c794ba..16d3ed3c 100644 --- a/testsuite/tests/tmc/tupled_function_calls.native.reference +++ b/testsuite/tests/tmc/tupled_function_calls.native.reference @@ -6,7 +6,7 @@ File "tupled_function_calls.ml", lines 16-21, characters 46-57: 20 | let pair = (f, xs) in 21 | f x :: (tupled_map_not_direct[@tailcall true]) pair Warning 71 [unused-tmc-attribute]: This function is marked @tail_mod_cons -but is never applied in TMC position. + but is never applied in TMC position. File "tupled_function_calls.ml", line 21, characters 13-57: 21 | f x :: (tupled_map_not_direct[@tailcall true]) pair diff --git a/testsuite/tests/tmc/usage_warnings.ml b/testsuite/tests/tmc/usage_warnings.ml index 009210a6..dc4f5fe8 100644 --- a/testsuite/tests/tmc/usage_warnings.ml +++ b/testsuite/tests/tmc/usage_warnings.ml @@ -19,20 +19,19 @@ let[@tail_mod_cons] rec flatten = function Line 3, characters 17-40: 3 | | xs :: xss -> append xs (flatten xss) ^^^^^^^^^^^^^^^^^^^^^^^ -Warning 72 [tmc-breaks-tailcall]: This call -is in tail-modulo-cons position in a TMC function, -but the function called is not itself specialized for TMC, -so the call will not be transformed into a tail call. -Please either mark the called function with the [@tail_mod_cons] -attribute, or mark this call with the [@tailcall false] attribute -to make its non-tailness explicit. +Warning 72 [tmc-breaks-tailcall]: This call is in tail-modulo-cons position + in a TMC function, but the function called is not itself specialized for + TMC, so the call will not be transformed into a tail call. + Please either mark the called function with the "[@tail_mod_cons]" attribute, + or mark this call with the "[@tailcall false]" attribute to make its + non-tailness explicit. Lines 1-3, characters 34-40: 1 | ..................................function 2 | | [] -> [] 3 | | xs :: xss -> append xs (flatten xss) -Warning 71 [unused-tmc-attribute]: This function is marked @tail_mod_cons -but is never applied in TMC position. +Warning 71 [unused-tmc-attribute]: This function is marked "@tail_mod_cons" + but is never applied in TMC position. val flatten : 'a list list -> 'a list = |}] @@ -65,13 +64,12 @@ let[@tail_mod_cons] rec flatten = function Line 10, characters 9-30: 10 | in append_flatten xs xss ^^^^^^^^^^^^^^^^^^^^^ -Warning 72 [tmc-breaks-tailcall]: This call -is in tail-modulo-cons position in a TMC function, -but the function called is not itself specialized for TMC, -so the call will not be transformed into a tail call. -Please either mark the called function with the [@tail_mod_cons] -attribute, or mark this call with the [@tailcall false] attribute -to make its non-tailness explicit. +Warning 72 [tmc-breaks-tailcall]: This call is in tail-modulo-cons position + in a TMC function, but the function called is not itself specialized for + TMC, so the call will not be transformed into a tail call. + Please either mark the called function with the "[@tail_mod_cons]" attribute, + or mark this call with the "[@tailcall false]" attribute to make its + non-tailness explicit. Lines 1-10, characters 34-30: 1 | ..................................function @@ -84,8 +82,8 @@ Lines 1-10, characters 34-30: 8 | (* incorrect: this call to append_flatten is not transformed *) 9 | x :: append_flatten xs xss 10 | in append_flatten xs xss -Warning 71 [unused-tmc-attribute]: This function is marked @tail_mod_cons -but is never applied in TMC position. +Warning 71 [unused-tmc-attribute]: This function is marked "@tail_mod_cons" + but is never applied in TMC position. val flatten : 'a list list -> 'a list = |}] @@ -111,13 +109,12 @@ let rec flatten = function Line 13, characters 12-23: 13 | flatten xss ^^^^^^^^^^^ -Warning 72 [tmc-breaks-tailcall]: This call -is in tail-modulo-cons position in a TMC function, -but the function called is not itself specialized for TMC, -so the call will not be transformed into a tail call. -Please either mark the called function with the [@tail_mod_cons] -attribute, or mark this call with the [@tailcall false] attribute -to make its non-tailness explicit. +Warning 72 [tmc-breaks-tailcall]: This call is in tail-modulo-cons position + in a TMC function, but the function called is not itself specialized for + TMC, so the call will not be transformed into a tail call. + Please either mark the called function with the "[@tail_mod_cons]" attribute, + or mark this call with the "[@tailcall false]" attribute to make its + non-tailness explicit. val flatten : 'a list list -> 'a list = |}] @@ -166,13 +163,12 @@ Lines 20-23, characters 10-27: 21 | (* no [@tailcall false]: this should warn that 22 | the call becomes non-tailcall in the TMC version. *) 23 | (filter_1 f xs) -Warning 72 [tmc-breaks-tailcall]: This call -is in tail-modulo-cons position in a TMC function, -but the function called is not itself specialized for TMC, -so the call will not be transformed into a tail call. -Please either mark the called function with the [@tail_mod_cons] -attribute, or mark this call with the [@tailcall false] attribute -to make its non-tailness explicit. +Warning 72 [tmc-breaks-tailcall]: This call is in tail-modulo-cons position + in a TMC function, but the function called is not itself specialized for + TMC, so the call will not be transformed into a tail call. + Please either mark the called function with the "[@tail_mod_cons]" attribute, + or mark this call with the "[@tailcall false]" attribute to make its + non-tailness explicit. module Tail_calls_to_non_specialized_functions : sig @@ -250,13 +246,12 @@ end Line 16, characters 13-56: 16 | then (graft[@tailcall]) (* this should warn *) n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Warning 72 [tmc-breaks-tailcall]: This call -is in tail-modulo-cons position in a TMC function, -but the function called is not itself specialized for TMC, -so the call will not be transformed into a tail call. -Please either mark the called function with the [@tail_mod_cons] -attribute, or mark this call with the [@tailcall false] attribute -to make its non-tailness explicit. +Warning 72 [tmc-breaks-tailcall]: This call is in tail-modulo-cons position + in a TMC function, but the function called is not itself specialized for + TMC, so the call will not be transformed into a tail call. + Please either mark the called function with the "[@tail_mod_cons]" attribute, + or mark this call with the "[@tailcall false]" attribute to make its + non-tailness explicit. Line 17, characters 17-67: 17 | else Tau ((graft[@tailcall]) (* this should also warn *) n) diff --git a/testsuite/tests/tool-debugger/basic/debuggee.ml b/testsuite/tests/tool-debugger/basic/debuggee.ml index a5320cf5..59815591 100644 --- a/testsuite/tests/tool-debugger/basic/debuggee.ml +++ b/testsuite/tests/tool-debugger/basic/debuggee.ml @@ -1,7 +1,7 @@ (* TEST set foo = "bar"; flags += " -g "; - ocamldebug_script = "${test_source_directory}/input_script"; + debugger_script = "${test_source_directory}/input_script"; debugger; shared-libraries; setup-ocamlc.byte-build-env; diff --git a/testsuite/tests/tool-debugger/dynlink/host.ml b/testsuite/tests/tool-debugger/dynlink/host.ml index ef12572f..1a574f77 100644 --- a/testsuite/tests/tool-debugger/dynlink/host.ml +++ b/testsuite/tests/tool-debugger/dynlink/host.ml @@ -3,7 +3,7 @@ readonly_files = "host.ml plugin.ml"; libraries = ""; flags += " -g "; - ocamldebug_script = "${test_source_directory}/input_script"; + debugger_script = "${test_source_directory}/input_script"; debugger; shared-libraries; setup-ocamlc.byte-build-env; diff --git a/testsuite/tests/tool-debugger/find-artifacts/debuggee.ml b/testsuite/tests/tool-debugger/find-artifacts/debuggee.ml index 37544574..f9fb5fa7 100644 --- a/testsuite/tests/tool-debugger/find-artifacts/debuggee.ml +++ b/testsuite/tests/tool-debugger/find-artifacts/debuggee.ml @@ -1,5 +1,5 @@ (* TEST - ocamldebug_script = "${test_source_directory}/input_script"; + debugger_script = "${test_source_directory}/input_script"; debugger; shared-libraries; setup-ocamlc.byte-build-env; diff --git a/testsuite/tests/tool-debugger/module_named_main/main.ml b/testsuite/tests/tool-debugger/module_named_main/main.ml index 8c374be0..2a30de63 100644 --- a/testsuite/tests/tool-debugger/module_named_main/main.ml +++ b/testsuite/tests/tool-debugger/module_named_main/main.ml @@ -31,7 +31,7 @@ debug (); (* TEST flags += " -g "; - ocamldebug_script = "${test_source_directory}/input_script"; + debugger_script = "${test_source_directory}/input_script"; debugger; shared-libraries; setup-ocamlc.byte-build-env; diff --git a/testsuite/tests/tool-debugger/no_debug_event/noev.ml b/testsuite/tests/tool-debugger/no_debug_event/noev.ml index 746b310b..2b9c1881 100644 --- a/testsuite/tests/tool-debugger/no_debug_event/noev.ml +++ b/testsuite/tests/tool-debugger/no_debug_event/noev.ml @@ -1,6 +1,6 @@ (* TEST readonly_files = "a.ml b.ml"; - ocamldebug_script = "${test_source_directory}/input_script"; + debugger_script = "${test_source_directory}/input_script"; debugger; shared-libraries; setup-ocamlc.byte-build-env; diff --git a/testsuite/tests/tool-debugger/printer/debuggee.ml b/testsuite/tests/tool-debugger/printer/debuggee.ml index ab5f293a..bb170b75 100644 --- a/testsuite/tests/tool-debugger/printer/debuggee.ml +++ b/testsuite/tests/tool-debugger/printer/debuggee.ml @@ -23,7 +23,7 @@ let () = f 3 (* TEST flags += " -g "; - ocamldebug_script = "${test_source_directory}/input_script"; + debugger_script = "${test_source_directory}/input_script"; readonly_files = "printer.ml"; include debugger; debugger; diff --git a/testsuite/tests/tool-ocamlc-locations/marshalled.compilers.reference b/testsuite/tests/tool-ocamlc-locations/marshalled.compilers.reference index 73740d4e..e42888e0 100644 --- a/testsuite/tests/tool-ocamlc-locations/marshalled.compilers.reference +++ b/testsuite/tests/tool-ocamlc-locations/marshalled.compilers.reference @@ -1,5 +1,5 @@ File "foo.ml", line 1, characters 14-18: 1 | let x : int = true ^^^^ -Error: The constructor "true" has type "bool" - but an expression was expected of type "int" +Error: The constructor true has type bool + but an expression was expected of type int diff --git a/testsuite/tests/tool-ocamlc-locations/test.compilers.reference b/testsuite/tests/tool-ocamlc-locations/test.compilers.reference index a4b4096d..15ec2377 100644 --- a/testsuite/tests/tool-ocamlc-locations/test.compilers.reference +++ b/testsuite/tests/tool-ocamlc-locations/test.compilers.reference @@ -1,5 +1,5 @@ File "testloc.ml", line 3, characters 12-13: 3 | let error = 1 2 ^ -Error: This expression has type "int" +Error: This expression has type int This is not a function; it cannot be applied. diff --git a/testsuite/tests/tool-ocamlc-open/tool-ocamlc-open-error.compilers.reference b/testsuite/tests/tool-ocamlc-open/tool-ocamlc-open-error.compilers.reference index 0581688a..4a5b06c9 100644 --- a/testsuite/tests/tool-ocamlc-open/tool-ocamlc-open-error.compilers.reference +++ b/testsuite/tests/tool-ocamlc-open/tool-ocamlc-open-error.compilers.reference @@ -1,5 +1,5 @@ File "tool-ocamlc-open-error.ml", line 1: -Warning 24 [bad-module-name]: bad source file name: "Tool-ocamlc-open-error" is not a valid module name. +Warning 24 [bad-module-name]: bad source file name: Tool-ocamlc-open-error is not a valid module name. File "command line argument: -open "F("", line 1, characters 1-2: Error: Syntax error diff --git a/testsuite/tests/tool-ocamldoc/Paragraph.html.reference b/testsuite/tests/tool-ocamldoc/Paragraph.html.reference index 5e527f0c..be214185 100644 --- a/testsuite/tests/tool-ocamldoc/Paragraph.html.reference +++ b/testsuite/tests/tool-ocamldoc/Paragraph.html.reference @@ -60,8 +60,7 @@
Paragraph
-

This file tests the generation of paragraph within module comments.

- +This file tests the generation of paragraph within module comments.

diff --git a/testsuite/tests/tool-ocamlopt-save-ir/check_for_pack.compilers.reference b/testsuite/tests/tool-ocamlopt-save-ir/check_for_pack.compilers.reference index 00a4d828..df07426a 100644 --- a/testsuite/tests/tool-ocamlopt-save-ir/check_for_pack.compilers.reference +++ b/testsuite/tests/tool-ocamlopt-save-ir/check_for_pack.compilers.reference @@ -1,2 +1,2 @@ File "check_for_pack.cmir-linear", line 1: -Error: This input file cannot be compiled with "-for-pack foo": it was generated without "-for-pack". +Error: This input file cannot be compiled with -for-pack foo: it was generated without -for-pack. diff --git a/testsuite/tests/tool-toplevel/constructor_printing.ml b/testsuite/tests/tool-toplevel/constructor_printing.ml new file mode 100644 index 00000000..ee980191 --- /dev/null +++ b/testsuite/tests/tool-toplevel/constructor_printing.ml @@ -0,0 +1,130 @@ +(* TEST + expect; +*) + +module M = struct + module N = struct + type t = A | B | C + end +end +[%%expect {| +module M : sig module N : sig type t = A | B | C end end +|}] + +let it = (M.N.A, M.N.B, M.N.C) +[%%expect {| +val it : M.N.t * M.N.t * M.N.t = (M.N.A, M.N.B, M.N.C) +|}] + +open M +let it = (N.A, N.B, N.C) +[%%expect {| +val it : M.N.t * M.N.t * M.N.t = (N.A, N.B, N.C) +|}] + +open N + +let it = (A, B, C) +[%%expect {| +val it : M.N.t * M.N.t * M.N.t = (A, B, C) +|}] + + +module O = struct + module P = struct + type t = D | E | F + end +end +[%%expect {| +module O : sig module P : sig type t = D | E | F end end +|}] + +let it = (O.P.D, O.P.E, O.P.F) +[%%expect {| +val it : O.P.t * O.P.t * O.P.t = (O.P.D, O.P.E, O.P.F) +|}] + +open O.P + +let it = (D, E, F) +[%%expect {| +val it : O.P.t * O.P.t * O.P.t = (D, E, F) +|}] + +(* Introduce Q with a Sub submodule *) +module Q = struct + module Sub = struct type t = A end +end + +(* open Q: Q.Sub.A can now be printed as Sub.A *) +open Q + +(* shadow the Sub module: + Sub.A is not a valid printing choice for Q.Sub.A anymore *) +module Sub = struct end +[%%expect {| +module Q : sig module Sub : sig type t = A end end +module Sub : sig end +|}] + +(* Test the printing of Q.Sub.A *) +let it = Q.Sub.A +[%%expect {| +val it : Q.Sub.t = Q.Sub.A +|}] + +(* A "hellish example" from Florian Angeletti. *) +module M = struct + module N = struct + module A = struct + module B = struct + type t = X + end + end + module F(X:sig type t end) = struct type t = A of X.t end + end +end +open M open N open A open B +[%%expect {| +module M : + sig + module N : + sig + module A : sig module B : sig type t = X end end + module F : (X : sig type t end) -> sig type t = A of X.t end + end + end +|}] +let x = let module FB = F(B) in FB.A X +[%%expect {| +val x : M.N.F(M.N.A.B).t = M.N.F(M.N.A.B).A X +|}] + +module X__A = struct type t = A type r = { f: int } end +module X__B = struct type t = B end + +module X = struct + module A = X__A + module B = X__B +end + +let x = X__A.A, X__B.B, { X__A.f = 0 } +[%%expect {| +module X__A : sig type t = A type r = { f : int; } end +module X__B : sig type t = B end +module X : sig module A = X__A module B = X__B end +val x : X.A.t * X.B.t * X.A.r = (X.A.A, X.B.B, {X.A.f = 0}) +|}] + +open X +let y = x + +[%%expect{| +val y : X.A.t * X.B.t * X.A.r = (A.A, B.B, {A.f = 0}) +|}] + +open A +let z = x +[%%expect{| +val z : X.A.t * X.B.t * X.A.r = (A, B.B, {f = 0}) +|}] diff --git a/testsuite/tests/tool-toplevel/error_highlighting.compilers.reference b/testsuite/tests/tool-toplevel/error_highlighting.compilers.reference index fe9f7287..a52e2fcc 100644 --- a/testsuite/tests/tool-toplevel/error_highlighting.compilers.reference +++ b/testsuite/tests/tool-toplevel/error_highlighting.compilers.reference @@ -1,74 +1,74 @@ Line 9, characters 8-15: 9 | let x = (1 + 2) +. 3. in ();; ^^^^^^^ -Error: This expression has type "int" but an expression was expected of type - "float" +Error: This expression has type int but an expression was expected of type + float Line 2, characters 15-17: 2 | let x = (1 + 2 in ();; ^^ -Error: Syntax error: ")" expected +Error: Syntax error: ) expected Line 2, characters 8-9: 2 | let x = (1 + 2 in ();; ^ - This "(" might be unmatched + This ( might be unmatched Line 2, characters 14-16: 2 | let x = (1 + 2;; ^^ -Error: Syntax error: ")" expected +Error: Syntax error: ) expected Line 2, characters 8-9: 2 | let x = (1 + 2;; ^ - This "(" might be unmatched + This ( might be unmatched Line 3, characters 8-9: 3 | let y = 1 +. 2. in ^ -Error: The constant "1" has type "int" but an expression was expected of type - "float" - Hint: Did you mean "1."? +Error: The constant 1 has type int but an expression was expected of type + float +Hint: Did you mean 1.? Line 4, characters 2-4: 4 | 2 in ^^ -Error: Syntax error: ")" expected +Error: Syntax error: ) expected Line 2, characters 8-9: 2 | let x = (1 ^ - This "(" might be unmatched + This ( might be unmatched Lines 2-4, characters 8-2: 2 | ........(1 3 | + 4 | 2)... -Error: This expression has type "int" but an expression was expected of type - "float" +Error: This expression has type int but an expression was expected of type + float Line 2, characters 12-17: 2 | let x = 1 + "abc" in ^^^^^ -Error: This constant has type "string" but an expression was expected of type - "int" +Error: This constant has type string but an expression was expected of type + int File "error_highlighting_use1.ml", line 1, characters 8-15: 1 | let x = (1 + 2) +. 3. in ();; ^^^^^^^ -Error: This expression has type "int" but an expression was expected of type - "float" +Error: This expression has type int but an expression was expected of type + float File "error_highlighting_use2.ml", line 1, characters 15-17: 1 | let x = (1 + 2 in ();; ^^ -Error: Syntax error: ")" expected +Error: Syntax error: ) expected File "error_highlighting_use2.ml", line 1, characters 8-9: 1 | let x = (1 + 2 in ();; ^ - This "(" might be unmatched + This ( might be unmatched File "error_highlighting_use3.ml", line 3, characters 2-4: 3 | 2 in ^^ -Error: Syntax error: ")" expected +Error: Syntax error: ) expected File "error_highlighting_use3.ml", line 1, characters 8-9: 1 | let x = (1 ^ - This "(" might be unmatched + This ( might be unmatched File "error_highlighting_use4.ml", lines 1-3, characters 8-2: 1 | ........(1 2 | + 3 | 2)... -Error: This expression has type "int" but an expression was expected of type - "float" +Error: This expression has type int but an expression was expected of type + float diff --git a/testsuite/tests/tool-toplevel/multi_phrase_line.compilers.reference b/testsuite/tests/tool-toplevel/multi_phrase_line.compilers.reference index edb97986..7af11468 100644 --- a/testsuite/tests/tool-toplevel/multi_phrase_line.compilers.reference +++ b/testsuite/tests/tool-toplevel/multi_phrase_line.compilers.reference @@ -9,8 +9,8 @@ # * Line 2, characters 6-9: 2 | 750;; (*) comment-start warning after semicolon must be displayed once ^^^ -Warning 1 [comment-start]: this `(*' is the start of a comment. -Hint: Did you forget spaces when writing the infix operator `( * )'? +Warning 1 [comment-start]: this (* is the start of a comment. + Hint: Did you forget spaces when writing the infix operator ( * )? - : int = 750 # Line 2, characters 9-11: @@ -21,14 +21,13 @@ Error: Syntax error Line 2, characters 16-20: 2 | 11;; let x = 12+true;; 13;; (* Type error in second phrase. *) ^^^^ -Error: The constructor "true" has type "bool" - but an expression was expected of type "int" +Error: The constructor true has type bool + but an expression was expected of type int # Line 2, characters 0-22: 2 | match 14 with 15 -> ();; 16;; 17;; (* Warning + run-time error in 1st phrase. *) ^^^^^^^^^^^^^^^^^^^^^^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -0 + Here is an example of a case that is not matched: 0 Exception: Match_failure ("//toplevel//", 2, 0). - : int = 16 @@ -38,8 +37,7 @@ Line 2, characters 5-27: 2 | 18;; match 19 with 20 -> ();; 21;; (* Warning + run-time error in 2nd phrase. *) ^^^^^^^^^^^^^^^^^^^^^^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -0 + Here is an example of a case that is not matched: 0 Exception: Match_failure ("//toplevel//", 2, 5). - : int = 21 @@ -47,24 +45,21 @@ Exception: Match_failure ("//toplevel//", 2, 5). 2 | let f 22 = ();; let f 23 = ();; let f 24 = ();; (* Several warnings. *) ^^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -0 + Here is an example of a case that is not matched: 0 val f : int -> unit = Line 2, characters 22-24: 2 | let f 22 = ();; let f 23 = ();; let f 24 = ();; (* Several warnings. *) ^^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -0 + Here is an example of a case that is not matched: 0 val f : int -> unit = Line 2, characters 38-40: 2 | let f 22 = ();; let f 23 = ();; let f 24 = ();; (* Several warnings. *) ^^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -0 + Here is an example of a case that is not matched: 0 val f : int -> unit = # * * * diff --git a/testsuite/tests/tool-toplevel/pr7060.compilers.reference b/testsuite/tests/tool-toplevel/pr7060.compilers.reference index d5b58ce8..f73b0f52 100644 --- a/testsuite/tests/tool-toplevel/pr7060.compilers.reference +++ b/testsuite/tests/tool-toplevel/pr7060.compilers.reference @@ -4,8 +4,7 @@ Line 1, characters 18-54: 1 | let print_t out = function A -> Format.fprintf out "A";; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -B + Here is an example of a case that is not matched: B val print_t : Format.formatter -> t -> unit = - : t = diff --git a/testsuite/tests/tool-toplevel/redefinition_hints.compilers.reference b/testsuite/tests/tool-toplevel/redefinition_hints.compilers.reference index e24fde64..a0516745 100644 --- a/testsuite/tests/tool-toplevel/redefinition_hints.compilers.reference +++ b/testsuite/tests/tool-toplevel/redefinition_hints.compilers.reference @@ -14,16 +14,16 @@ val y : (u * v * (module S)) M.t = M.X (A, B, ) Line 2, characters 4-5: 2 | x = y;; ^ -Error: The value "y" has type "(u * v * (module S)) M.t" +Error: The value y has type (u * v * (module S)) M.t but an expression was expected of type - "(u/2 * v/2 * (module S/2)) M/2.t" - Hint: The types "v" and "u" have been defined multiple times in this + (u/2 * v/2 * (module S/2)) M/2.t + Hint: The types v and u have been defined multiple times in this toplevel session. Some toplevel values still refer to old versions of those types. Did you try to redefine them? - Hint: The module "M" has been defined multiple times in this toplevel + Hint: The module M has been defined multiple times in this toplevel session. Some toplevel values still refer to old versions of this module. Did you try to redefine them? - Hint: The module type "S" has been defined multiple times in this + Hint: The module type S has been defined multiple times in this toplevel session. Some toplevel values still refer to old versions of this module type. Did you try to redefine them? type a = A @@ -35,21 +35,21 @@ val c : a = A Line 2, characters 4-5: 2 | a = b;; ^ -Error: The value "b" has type "a/2" but an expression was expected of type "a/3" - Hint: The type "a" has been defined multiple times in this toplevel +Error: The value b has type a/2 but an expression was expected of type a/3 + Hint: The type a has been defined multiple times in this toplevel session. Some toplevel values still refer to old versions of this type. Did you try to redefine them? Line 1, characters 4-5: 1 | a = c;; ^ -Error: The value "c" has type "a" but an expression was expected of type "a/3" - Hint: The type "a" has been defined multiple times in this toplevel +Error: The value c has type a but an expression was expected of type a/3 + Hint: The type a has been defined multiple times in this toplevel session. Some toplevel values still refer to old versions of this type. Did you try to redefine them? Line 1, characters 4-5: 1 | b = c;; ^ -Error: The value "c" has type "a" but an expression was expected of type "a/2" - Hint: The type "a" has been defined multiple times in this toplevel +Error: The value c has type a but an expression was expected of type a/2 + Hint: The type a has been defined multiple times in this toplevel session. Some toplevel values still refer to old versions of this type. Did you try to redefine them? diff --git a/testsuite/tests/tool-toplevel/strings.compilers.reference b/testsuite/tests/tool-toplevel/strings.compilers.reference index cbc727fd..5fd4b42d 100644 --- a/testsuite/tests/tool-toplevel/strings.compilers.reference +++ b/testsuite/tests/tool-toplevel/strings.compilers.reference @@ -4,7 +4,6 @@ " !#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~" - : string = "\000\001\002\003\004\005\006\007\011\012\014\015\016\017\018\019\020\021\022\023\024\025\026\027\028\029\030\031\127" -- : string = -"\"Ἀχιλλεύς\r\n天照\tब्रह्मन्\t𒄑 𒂆 𒈦 𒄑 𒂆 𒈦\\" +- : string = "\"Ἀχιλλεύς\r\n天照\tब्रह्मन्\t𒄑 𒂆 𒈦 𒄑 𒂆 𒈦\\" - : string = "ایدهآل" diff --git a/testsuite/tests/translprim/comparison_table.compilers.reference b/testsuite/tests/translprim/comparison_table.compilers.reference index 1f328bf8..bf4e0d45 100644 --- a/testsuite/tests/translprim/comparison_table.compilers.reference +++ b/testsuite/tests/translprim/comparison_table.compilers.reference @@ -159,7 +159,7 @@ (apply f (field_imm 0 param) (field_imm 1 param))) map = (function f l - (apply (field_imm 19 (global Stdlib__List!)) + (apply (field_imm 20 (global Stdlib__List!)) (apply uncurry f) l))) (makeblock 0 (makeblock 0 (apply map gen_cmp vec) (apply map cmp vec)) @@ -198,7 +198,7 @@ (apply f (field_imm 0 param) (field_imm 1 param))) map = (function f l - (apply (field_imm 19 (global Stdlib__List!)) + (apply (field_imm 20 (global Stdlib__List!)) (apply uncurry f) l))) (makeblock 0 (makeblock 0 (apply map eta_gen_cmp vec) diff --git a/testsuite/tests/tsan/array_elt.reference b/testsuite/tests/tsan/array_elt.reference index 549cfd4c..a6d5ccbb 100644 --- a/testsuite/tests/tsan/array_elt.reference +++ b/testsuite/tests/tsan/array_elt.reference @@ -1,19 +1,19 @@ ================== WARNING: ThreadSanitizer: data race (pid=) Write of size 8 at by thread T1 (mutexes: write M): - #0 camlArray_elt.writer_ () - #1 camlStdlib__Domain.body_ () + #0 camlArray_elt$writer_ () + #1 camlStdlib__Domain$body_ () Previous read of size 8 at by main thread (mutexes: write M): - #0 camlArray_elt.reader_ () - #1 camlArray_elt.entry () + #0 camlArray_elt$reader_ () + #1 camlArray_elt$entry () #2 caml_program () As if synchronized via sleep: - #0 usleep () + #0 nanosleep () #1 wg_wait () - #2 camlArray_elt.writer_ () - #3 camlStdlib__Domain.body_ () + #2 camlArray_elt$writer_ () + #3 camlStdlib__Domain$body_ () Mutex M () created at: #0 pthread_mutex_init () @@ -31,10 +31,10 @@ WARNING: ThreadSanitizer: data race (pid=) #0 pthread_create () #1 caml_domain_spawn () #2 caml_c_call () - #3 camlStdlib__Domain.spawn_ () - #4 camlArray_elt.entry () + #3 camlStdlib__Domain$spawn_ () + #4 camlArray_elt$entry () #5 caml_program () -SUMMARY: ThreadSanitizer: data race (:) in camlArray_elt.writer_ +SUMMARY: ThreadSanitizer: data race (:) in camlArray_elt$writer_ ================== ThreadSanitizer: reported 1 warnings diff --git a/testsuite/tests/tsan/exn_from_c.reference b/testsuite/tests/tsan/exn_from_c.reference index 0c0007b7..6e6a1c7b 100644 --- a/testsuite/tests/tsan/exn_from_c.reference +++ b/testsuite/tests/tsan/exn_from_c.reference @@ -13,20 +13,20 @@ Leaving f ================== WARNING: ThreadSanitizer: data race (pid=) Write of size 8 at by thread T1 (mutexes: write M): - #0 camlExn_from_c.writer_ () - #1 camlStdlib__Domain.body_ () + #0 camlExn_from_c$writer_ () + #1 camlStdlib__Domain$body_ () Previous read of size 8 at by main thread (mutexes: write M): - #0 camlExn_from_c.race_ () - #1 camlExn_from_c.f_ () - #2 camlExn_from_c.entry () + #0 camlExn_from_c$race_ () + #1 camlExn_from_c$f_ () + #2 camlExn_from_c$entry () #3 caml_program () As if synchronized via sleep: - #0 usleep () + #0 nanosleep () #1 wg_wait () - #2 camlExn_from_c.writer_ () - #3 camlStdlib__Domain.body_ () + #2 camlExn_from_c$writer_ () + #3 camlStdlib__Domain$body_ () Mutex M () created at: #0 pthread_mutex_init () @@ -44,10 +44,10 @@ WARNING: ThreadSanitizer: data race (pid=) #0 pthread_create () #1 caml_domain_spawn () #2 caml_c_call () - #3 camlStdlib__Domain.spawn_ () - #4 camlExn_from_c.entry () + #3 camlStdlib__Domain$spawn_ () + #4 camlExn_from_c$entry () #5 caml_program () -SUMMARY: ThreadSanitizer: data race (:) in camlExn_from_c.writer_ +SUMMARY: ThreadSanitizer: data race (:) in camlExn_from_c$writer_ ================== ThreadSanitizer: reported 1 warnings diff --git a/testsuite/tests/tsan/exn_in_callback.reference b/testsuite/tests/tsan/exn_in_callback.reference index b882a9ba..6fdb5b26 100644 --- a/testsuite/tests/tsan/exn_in_callback.reference +++ b/testsuite/tests/tsan/exn_in_callback.reference @@ -12,20 +12,20 @@ Leaving f ================== WARNING: ThreadSanitizer: data race (pid=) Write of size 8 at by thread T1 (mutexes: write M): - #0 camlExn_in_callback.writer_ () - #1 camlStdlib__Domain.body_ () + #0 camlExn_in_callback$writer_ () + #1 camlStdlib__Domain$body_ () Previous read of size 8 at by main thread (mutexes: write M): - #0 camlExn_in_callback.race_ () - #1 camlExn_in_callback.f_ () - #2 camlExn_in_callback.entry () + #0 camlExn_in_callback$race_ () + #1 camlExn_in_callback$f_ () + #2 camlExn_in_callback$entry () #3 caml_program () As if synchronized via sleep: - #0 usleep () + #0 nanosleep () #1 wg_wait () - #2 camlExn_in_callback.writer_ () - #3 camlStdlib__Domain.body_ () + #2 camlExn_in_callback$writer_ () + #3 camlStdlib__Domain$body_ () Mutex M () created at: #0 pthread_mutex_init () @@ -43,10 +43,10 @@ WARNING: ThreadSanitizer: data race (pid=) #0 pthread_create () #1 caml_domain_spawn () #2 caml_c_call () - #3 camlStdlib__Domain.spawn_ () - #4 camlExn_in_callback.entry () + #3 camlStdlib__Domain$spawn_ () + #4 camlExn_in_callback$entry () #5 caml_program () -SUMMARY: ThreadSanitizer: data race (:) in camlExn_in_callback.writer_ +SUMMARY: ThreadSanitizer: data race (:) in camlExn_in_callback$writer_ ================== ThreadSanitizer: reported 1 warnings diff --git a/testsuite/tests/tsan/exn_reraise.reference b/testsuite/tests/tsan/exn_reraise.reference index fd562f31..5e72684b 100644 --- a/testsuite/tests/tsan/exn_reraise.reference +++ b/testsuite/tests/tsan/exn_reraise.reference @@ -12,20 +12,20 @@ Leaving f ================== WARNING: ThreadSanitizer: data race (pid=) Write of size 8 at by thread T1 (mutexes: write M): - #0 camlExn_reraise.writer_ () - #1 camlStdlib__Domain.body_ () + #0 camlExn_reraise$writer_ () + #1 camlStdlib__Domain$body_ () Previous read of size 8 at by main thread (mutexes: write M): - #0 camlExn_reraise.race_ () - #1 camlExn_reraise.f_ () - #2 camlExn_reraise.entry () + #0 camlExn_reraise$race_ () + #1 camlExn_reraise$f_ () + #2 camlExn_reraise$entry () #3 caml_program () As if synchronized via sleep: - #0 usleep () + #0 nanosleep () #1 wg_wait () - #2 camlExn_reraise.writer_ () - #3 camlStdlib__Domain.body_ () + #2 camlExn_reraise$writer_ () + #3 camlStdlib__Domain$body_ () Mutex M () created at: #0 pthread_mutex_init () @@ -43,10 +43,10 @@ WARNING: ThreadSanitizer: data race (pid=) #0 pthread_create () #1 caml_domain_spawn () #2 caml_c_call () - #3 camlStdlib__Domain.spawn_ () - #4 camlExn_reraise.entry () + #3 camlStdlib__Domain$spawn_ () + #4 camlExn_reraise$entry () #5 caml_program () -SUMMARY: ThreadSanitizer: data race (:) in camlExn_reraise.writer_ +SUMMARY: ThreadSanitizer: data race (:) in camlExn_reraise$writer_ ================== ThreadSanitizer: reported 1 warnings diff --git a/testsuite/tests/tsan/filter-locations.sh b/testsuite/tests/tsan/filter-locations.sh index 4b5403f0..e5c5be94 100755 --- a/testsuite/tests/tsan/filter-locations.sh +++ b/testsuite/tests/tsan/filter-locations.sh @@ -21,7 +21,7 @@ s/tid=[[:digit:]]+/tid=/ /#[0-9]+/ { s/(#[0-9]+) ([^ ]*) [^ ]*(\(discriminator [0-9]+\))? \(([^ ]*)\)/\1 \2 (\4)/ - s/(caml[a-zA-Z_0-9]+\.[a-zA-Z_0-9]+)_[[:digit:]]+/\1_/ + s/(caml[a-zA-Z_0-9]+\$[a-zA-Z_0-9]+)_[[:digit:]]+/\1_/ s/\((.+)+0x[[:xdigit:]]+\)/()/ s/ \(BuildId: [[:xdigit:]]+\)// } @@ -31,7 +31,7 @@ s/ M[0-9]+/ M/ /SUMMARY/ { s/data race \(.*\/.+\+0x[[:xdigit:]]+\) in /data race (:) in / s/data race .+:.+ in /data race (:) in / - s/(caml[a-zA-Z_0-9]+\.[a-zA-Z_0-9]+)_[[:digit:]]+(\+0x[[:xdigit:]]+)?/\1_/ + s/(caml[a-zA-Z_0-9]+\$[a-zA-Z_0-9]+)_[[:digit:]]+(\+0x[[:xdigit:]]+)?/\1_/ }' # To ignore differences in compiler function inlining, kill backtrace after diff --git a/testsuite/tests/tsan/perform.reference b/testsuite/tests/tsan/perform.reference index 362f0507..87261729 100644 --- a/testsuite/tests/tsan/perform.reference +++ b/testsuite/tests/tsan/perform.reference @@ -6,20 +6,20 @@ In the effect handler ================== WARNING: ThreadSanitizer: data race (pid=) Write of size 8 at by main thread (mutexes: write M): - #0 camlPerform.race_ () - #1 camlPerform.fun_ () - #2 camlPerform.main_ () - #3 camlPerform.entry () + #0 camlPerform$race_ () + #1 camlPerform$fun_ () + #2 camlPerform$main_ () + #3 camlPerform$entry () #4 caml_program () Previous read of size 8 at by thread T1 (mutexes: write M): - #0 camlPerform.other_domain_ () - #1 camlStdlib__Domain.body_ () + #0 camlPerform$other_domain_ () + #1 camlStdlib__Domain$body_ () As if synchronized via sleep: - #0 usleep () + #0 nanosleep () #1 wg_wait () - #2 camlPerform.entry () + #2 camlPerform$entry () #3 caml_program () Mutex M () created at: @@ -38,34 +38,34 @@ WARNING: ThreadSanitizer: data race (pid=) #0 pthread_create () #1 caml_domain_spawn () #2 caml_c_call () - #3 camlStdlib__Domain.spawn_ () - #4 camlPerform.entry () + #3 camlStdlib__Domain$spawn_ () + #4 camlPerform$entry () #5 caml_program () -SUMMARY: ThreadSanitizer: data race (:) in camlPerform.race_ +SUMMARY: ThreadSanitizer: data race (:) in camlPerform$race_ ================== Resuming h ================== WARNING: ThreadSanitizer: data race (pid=) Write of size 8 at by main thread (mutexes: write M): - #0 camlPerform.race_ () - #1 camlPerform.h_ () - #2 camlPerform.g_ () - #3 camlPerform.f_ () + #0 camlPerform$race_ () + #1 camlPerform$h_ () + #2 camlPerform$g_ () + #3 camlPerform$f_ () #4 caml_runstack () - #5 camlPerform.fun_ () - #6 camlPerform.main_ () - #7 camlPerform.entry () + #5 camlPerform$fun_ () + #6 camlPerform$main_ () + #7 camlPerform$entry () #8 caml_program () Previous read of size 8 at by thread T1 (mutexes: write M): - #0 camlPerform.other_domain_ () - #1 camlStdlib__Domain.body_ () + #0 camlPerform$other_domain_ () + #1 camlStdlib__Domain$body_ () As if synchronized via sleep: - #0 usleep () + #0 nanosleep () #1 wg_wait () - #2 camlPerform.entry () + #2 camlPerform$entry () #3 caml_program () Mutex M () created at: @@ -84,11 +84,11 @@ WARNING: ThreadSanitizer: data race (pid=) #0 pthread_create () #1 caml_domain_spawn () #2 caml_c_call () - #3 camlStdlib__Domain.spawn_ () - #4 camlPerform.entry () + #3 camlStdlib__Domain$spawn_ () + #4 camlPerform$entry () #5 caml_program () -SUMMARY: ThreadSanitizer: data race (:) in camlPerform.race_ +SUMMARY: ThreadSanitizer: data race (:) in camlPerform$race_ ================== Leaving h Leaving g @@ -97,21 +97,21 @@ Value handler ================== WARNING: ThreadSanitizer: data race (pid=) Write of size 8 at by main thread (mutexes: write M): - #0 camlPerform.race_ () - #1 camlPerform.fun_ () - #2 camlPerform.fun_ () - #3 camlPerform.main_ () - #4 camlPerform.entry () + #0 camlPerform$race_ () + #1 camlPerform$fun_ () + #2 camlPerform$fun_ () + #3 camlPerform$main_ () + #4 camlPerform$entry () #5 caml_program () Previous read of size 8 at by thread T1 (mutexes: write M): - #0 camlPerform.other_domain_ () - #1 camlStdlib__Domain.body_ () + #0 camlPerform$other_domain_ () + #1 camlStdlib__Domain$body_ () As if synchronized via sleep: - #0 usleep () + #0 nanosleep () #1 wg_wait () - #2 camlPerform.entry () + #2 camlPerform$entry () #3 caml_program () Mutex M () created at: @@ -130,11 +130,11 @@ WARNING: ThreadSanitizer: data race (pid=) #0 pthread_create () #1 caml_domain_spawn () #2 caml_c_call () - #3 camlStdlib__Domain.spawn_ () - #4 camlPerform.entry () + #3 camlStdlib__Domain$spawn_ () + #4 camlPerform$entry () #5 caml_program () -SUMMARY: ThreadSanitizer: data race (:) in camlPerform.race_ +SUMMARY: ThreadSanitizer: data race (:) in camlPerform$race_ ================== Handler after continue Result = 42 diff --git a/testsuite/tests/tsan/raise_through_handler.reference b/testsuite/tests/tsan/raise_through_handler.reference index eefa5475..04479223 100644 --- a/testsuite/tests/tsan/raise_through_handler.reference +++ b/testsuite/tests/tsan/raise_through_handler.reference @@ -5,20 +5,20 @@ In exception handler ================== WARNING: ThreadSanitizer: data race (pid=) Read of size 8 at by thread T1 (mutexes: write M): - #0 camlRaise_through_handler.reader_ () - #1 camlStdlib__Domain.body_ () + #0 camlRaise_through_handler$reader_ () + #1 camlStdlib__Domain$body_ () Previous write of size 8 at by main thread (mutexes: write M): - #0 camlRaise_through_handler.race_ () - #1 camlRaise_through_handler.main_ () - #2 camlRaise_through_handler.entry () + #0 camlRaise_through_handler$race_ () + #1 camlRaise_through_handler$main_ () + #2 camlRaise_through_handler$entry () #3 caml_program () As if synchronized via sleep: - #0 usleep () + #0 nanosleep () #1 wg_wait () - #2 camlRaise_through_handler.reader_ () - #3 camlStdlib__Domain.body_ () + #2 camlRaise_through_handler$reader_ () + #3 camlStdlib__Domain$body_ () Mutex M () created at: #0 pthread_mutex_init () @@ -36,11 +36,11 @@ WARNING: ThreadSanitizer: data race (pid=) #0 pthread_create () #1 caml_domain_spawn () #2 caml_c_call () - #3 camlStdlib__Domain.spawn_ () - #4 camlRaise_through_handler.entry () + #3 camlStdlib__Domain$spawn_ () + #4 camlRaise_through_handler$entry () #5 caml_program () -SUMMARY: ThreadSanitizer: data race (:) in camlRaise_through_handler.reader_ +SUMMARY: ThreadSanitizer: data race (:) in camlRaise_through_handler$reader_ ================== Result = 44 ThreadSanitizer: reported 1 warnings diff --git a/testsuite/tests/tsan/record_field.reference b/testsuite/tests/tsan/record_field.reference index aff9f632..28b09f7f 100644 --- a/testsuite/tests/tsan/record_field.reference +++ b/testsuite/tests/tsan/record_field.reference @@ -1,19 +1,19 @@ ================== WARNING: ThreadSanitizer: data race (pid=) Read of size 8 at by main thread (mutexes: write M): - #0 camlRecord_field.reader_ () - #1 camlRecord_field.entry () + #0 camlRecord_field$reader_ () + #1 camlRecord_field$entry () #2 caml_program () Previous write of size 8 at by thread T1 (mutexes: write M): - #0 camlRecord_field.writer_ () - #1 camlStdlib__Domain.body_ () + #0 camlRecord_field$writer_ () + #1 camlStdlib__Domain$body_ () As if synchronized via sleep: - #0 usleep () + #0 nanosleep () #1 wg_wait () - #2 camlRecord_field.reader_ () - #3 camlRecord_field.entry () + #2 camlRecord_field$reader_ () + #3 camlRecord_field$entry () #4 caml_program () Mutex M () created at: @@ -32,10 +32,10 @@ WARNING: ThreadSanitizer: data race (pid=) #0 pthread_create () #1 caml_domain_spawn () #2 caml_c_call () - #3 camlStdlib__Domain.spawn_ () - #4 camlRecord_field.entry () + #3 camlStdlib__Domain$spawn_ () + #4 camlRecord_field$entry () #5 caml_program () -SUMMARY: ThreadSanitizer: data race (:) in camlRecord_field.reader_ +SUMMARY: ThreadSanitizer: data race (:) in camlRecord_field$reader_ ================== ThreadSanitizer: reported 1 warnings diff --git a/testsuite/tests/tsan/reperform.reference b/testsuite/tests/tsan/reperform.reference index 0f91dcc7..508dd89a 100644 --- a/testsuite/tests/tsan/reperform.reference +++ b/testsuite/tests/tsan/reperform.reference @@ -5,21 +5,21 @@ E1 handler before continue ================== WARNING: ThreadSanitizer: data race (pid=) Write of size 8 at by main thread (mutexes: write M): - #0 camlReperform.race_ () - #1 camlReperform.fun_ () - #2 camlReperform.fiber1_ () - #3 camlReperform.main_ () - #4 camlReperform.entry () + #0 camlReperform$race_ () + #1 camlReperform$fun_ () + #2 camlReperform$fiber1_ () + #3 camlReperform$main_ () + #4 camlReperform$entry () #5 caml_program () Previous read of size 8 at by thread T1 (mutexes: write M): - #0 camlReperform.other_domain_ () - #1 camlStdlib__Domain.body_ () + #0 camlReperform$other_domain_ () + #1 camlStdlib__Domain$body_ () As if synchronized via sleep: - #0 usleep () + #0 nanosleep () #1 wg_wait () - #2 camlReperform.entry () + #2 camlReperform$entry () #3 caml_program () Mutex M () created at: @@ -38,36 +38,36 @@ WARNING: ThreadSanitizer: data race (pid=) #0 pthread_create () #1 caml_domain_spawn () #2 caml_c_call () - #3 camlStdlib__Domain.spawn_ () - #4 camlReperform.entry () + #3 camlStdlib__Domain$spawn_ () + #4 camlReperform$entry () #5 caml_program () -SUMMARY: ThreadSanitizer: data race (:) in camlReperform.race_ +SUMMARY: ThreadSanitizer: data race (:) in camlReperform$race_ ================== ================== WARNING: ThreadSanitizer: data race (pid=) Write of size 8 at by main thread (mutexes: write M): - #0 camlReperform.race_ () - #1 camlReperform.h_ () - #2 camlReperform.g_ () - #3 camlReperform.f_ () + #0 camlReperform$race_ () + #1 camlReperform$h_ () + #2 camlReperform$g_ () + #3 camlReperform$f_ () #4 caml_runstack () - #5 camlReperform.fiber2_ () + #5 camlReperform$fiber2_ () #6 caml_runstack () - #7 camlReperform.fun_ () - #8 camlReperform.fiber1_ () - #9 camlReperform.main_ () - #10 camlReperform.entry () + #7 camlReperform$fun_ () + #8 camlReperform$fiber1_ () + #9 camlReperform$main_ () + #10 camlReperform$entry () #11 caml_program () Previous read of size 8 at by thread T1 (mutexes: write M): - #0 camlReperform.other_domain_ () - #1 camlStdlib__Domain.body_ () + #0 camlReperform$other_domain_ () + #1 camlStdlib__Domain$body_ () As if synchronized via sleep: - #0 usleep () + #0 nanosleep () #1 wg_wait () - #2 camlReperform.entry () + #2 camlReperform$entry () #3 caml_program () Mutex M () created at: @@ -86,11 +86,11 @@ WARNING: ThreadSanitizer: data race (pid=) #0 pthread_create () #1 caml_domain_spawn () #2 caml_c_call () - #3 camlStdlib__Domain.spawn_ () - #4 camlReperform.entry () + #3 camlStdlib__Domain$spawn_ () + #4 camlReperform$entry () #5 caml_program () -SUMMARY: ThreadSanitizer: data race (:) in camlReperform.race_ +SUMMARY: ThreadSanitizer: data race (:) in camlReperform$race_ ================== Leaving h Leaving g @@ -101,18 +101,18 @@ Result=42 ================== WARNING: ThreadSanitizer: data race (pid=) Write of size 8 at by main thread (mutexes: write M): - #0 camlReperform.race_ () - #1 camlReperform.entry () + #0 camlReperform$race_ () + #1 camlReperform$entry () #2 caml_program () Previous read of size 8 at by thread T1 (mutexes: write M): - #0 camlReperform.other_domain_ () - #1 camlStdlib__Domain.body_ () + #0 camlReperform$other_domain_ () + #1 camlStdlib__Domain$body_ () As if synchronized via sleep: - #0 usleep () + #0 nanosleep () #1 wg_wait () - #2 camlReperform.entry () + #2 camlReperform$entry () #3 caml_program () Mutex M () created at: @@ -131,10 +131,10 @@ WARNING: ThreadSanitizer: data race (pid=) #0 pthread_create () #1 caml_domain_spawn () #2 caml_c_call () - #3 camlStdlib__Domain.spawn_ () - #4 camlReperform.entry () + #3 camlStdlib__Domain$spawn_ () + #4 camlReperform$entry () #5 caml_program () -SUMMARY: ThreadSanitizer: data race (:) in camlReperform.race_ +SUMMARY: ThreadSanitizer: data race (:) in camlReperform$race_ ================== ThreadSanitizer: reported 3 warnings diff --git a/testsuite/tests/tsan/unhandled.reference b/testsuite/tests/tsan/unhandled.reference index 3d0af2d7..02146e3e 100644 --- a/testsuite/tests/tsan/unhandled.reference +++ b/testsuite/tests/tsan/unhandled.reference @@ -2,19 +2,19 @@ Performing an unhandled effect from the main fiber ================== WARNING: ThreadSanitizer: data race (pid=) Write of size 8 at by main thread (mutexes: write M): - #0 camlUnhandled.race_ () - #1 camlUnhandled.main_ () - #2 camlUnhandled.entry () + #0 camlUnhandled$race_ () + #1 camlUnhandled$main_ () + #2 camlUnhandled$entry () #3 caml_program () Previous read of size 8 at by thread T1 (mutexes: write M): - #0 camlUnhandled.other_domain_ () - #1 camlStdlib__Domain.body_ () + #0 camlUnhandled$other_domain_ () + #1 camlStdlib__Domain$body_ () As if synchronized via sleep: - #0 usleep () + #0 nanosleep () #1 wg_wait () - #2 camlUnhandled.entry () + #2 camlUnhandled$entry () #3 caml_program () Mutex M () created at: @@ -33,11 +33,11 @@ WARNING: ThreadSanitizer: data race (pid=) #0 pthread_create () #1 caml_domain_spawn () #2 caml_c_call () - #3 camlStdlib__Domain.spawn_ () - #4 camlUnhandled.entry () + #3 camlStdlib__Domain$spawn_ () + #4 camlUnhandled$entry () #5 caml_program () -SUMMARY: ThreadSanitizer: data race (:) in camlUnhandled.race_ +SUMMARY: ThreadSanitizer: data race (:) in camlUnhandled$race_ ================== Performing an unhandled effect from another fiber Entering f @@ -46,26 +46,26 @@ Entering h ================== WARNING: ThreadSanitizer: data race (pid=) Write of size 8 at by main thread (mutexes: write M): - #0 camlUnhandled.race_ () - #1 camlUnhandled.h_ () - #2 camlUnhandled.g_ () - #3 camlUnhandled.f_ () + #0 camlUnhandled$race_ () + #1 camlUnhandled$h_ () + #2 camlUnhandled$g_ () + #3 camlUnhandled$f_ () #4 caml_runstack () - #5 camlUnhandled.fiber2_ () + #5 camlUnhandled$fiber2_ () #6 caml_runstack () - #7 camlUnhandled.fiber1_ () - #8 camlUnhandled.main_ () - #9 camlUnhandled.entry () + #7 camlUnhandled$fiber1_ () + #8 camlUnhandled$main_ () + #9 camlUnhandled$entry () #10 caml_program () Previous read of size 8 at by thread T1 (mutexes: write M): - #0 camlUnhandled.other_domain_ () - #1 camlStdlib__Domain.body_ () + #0 camlUnhandled$other_domain_ () + #1 camlStdlib__Domain$body_ () As if synchronized via sleep: - #0 usleep () + #0 nanosleep () #1 wg_wait () - #2 camlUnhandled.entry () + #2 camlUnhandled$entry () #3 caml_program () Mutex M () created at: @@ -84,11 +84,11 @@ WARNING: ThreadSanitizer: data race (pid=) #0 pthread_create () #1 caml_domain_spawn () #2 caml_c_call () - #3 camlStdlib__Domain.spawn_ () - #4 camlUnhandled.entry () + #3 camlStdlib__Domain$spawn_ () + #4 camlUnhandled$entry () #5 caml_program () -SUMMARY: ThreadSanitizer: data race (:) in camlUnhandled.race_ +SUMMARY: ThreadSanitizer: data race (:) in camlUnhandled$race_ ================== Leaving h Leaving g diff --git a/testsuite/tests/tsan/waitgroup_stubs.c b/testsuite/tests/tsan/waitgroup_stubs.c index bdaf76b3..8c5da023 100644 --- a/testsuite/tests/tsan/waitgroup_stubs.c +++ b/testsuite/tests/tsan/waitgroup_stubs.c @@ -1,12 +1,14 @@ +#define CAML_INTERNALS #include #include +#include #include #include #include #define MAX_WAITGROUP 8 -#define SPIN_WAIT_MS 10 +#define SPIN_WAIT_NSEC (10 * NSEC_PER_MSEC) /* 10 msec */ /* waitgroup inspired by Golang's `sync.WaitGroup`. This version does *not* * allow to restart a waitgroup. */ @@ -52,7 +54,12 @@ CAMLno_tsan value wg_wait(value t) * checkpoint. This allows TSan to always generate a report with a * 'As if synchronized via sleep' section. */ do { - usleep(SPIN_WAIT_MS); +#ifdef HAS_NANOSLEEP + const struct timespec ts = caml_timespec_of_nsec(SPIN_WAIT_NSEC); + nanosleep(&ts, NULL); +#else + usleep(SPIN_WAIT_NSEC / NSEC_PER_USEC); +#endif } while (wg->count != wg->limit); return Val_unit; diff --git a/testsuite/tests/typedtree/module_presence.ml b/testsuite/tests/typedtree/module_presence.ml new file mode 100644 index 00000000..4a9b536d --- /dev/null +++ b/testsuite/tests/typedtree/module_presence.ml @@ -0,0 +1,66 @@ +(* TEST + flags = "-dtypedtree -dno-locations"; + expect; +*) + +module X = struct end +[%%expect{| +[ + structure_item + Tstr_module (Present) + X/281 + module_expr + Tmod_structure + [] +] + +module X : sig end +|}] + +module X = struct end [@foo] +[%%expect{| +[ + structure_item + Tstr_module (Present) + X/282 + module_expr + attribute "foo" + [] + Tmod_structure + [] +] + +module X : sig end +|}] + +module Y = X +[%%expect{| +[ + structure_item + Tstr_module (Absent) + Y/283 + module_expr + Tmod_ident "X/282" +] + +module Y = X +|}] + +module type T = sig module Y = X end +[%%expect{| +[ + structure_item + Tstr_modtype "T/285" + module_type + Tmty_signature + [ + signature_item + Tsig_module (Absent) + Y/284 + module_type + Tmty_alias "X/282" + ] +] + +module type T = sig module Y = X end +|}] diff --git a/testsuite/tests/typeopt/nested_unboxed.ml b/testsuite/tests/typeopt/nested_unboxed.ml new file mode 100644 index 00000000..bdf9b325 --- /dev/null +++ b/testsuite/tests/typeopt/nested_unboxed.ml @@ -0,0 +1,32 @@ +(* TEST + flat-float-array; + bytecode; + native; +*) + +(* Check that the behaviour of Typeopt functions is sound when + dealing with unboxed types nested too deep *) + +module type T = sig type t val mk : unit -> t end +module F (X : T) = struct type t = { x : X.t } [@@unboxed] let mk () = { x = X.mk () } end +module F10 (X : T) = F(F(F(F(F(F(F(F(F(F(X)))))))))) +module F100 (X : T) = F10(F10(F10(F10(F10(F10(F10(F10(F10(F10(X)))))))))) + +module B = struct type t = float let mk () = 0. end +module M = F(F100(B)) + +(* M.t is 101 layers of unboxed wrappers around the type float. + The following function checks that the runtime behaviour + is consistent with that. *) + +let run () = + let x = M.mk () in + let y = lazy x in + (* x is represented by a float, so lazy values cannot be shortcut + if we are in the default mode of using flat float arrays *) + assert (Obj.tag (Obj.repr y) = Obj.forward_tag); + + let a = Array.make 10 y in + assert (Obj.tag (Obj.repr a) <> Obj.double_array_tag); + let z = Lazy.force a.(0) in + assert (x = z) diff --git a/testsuite/tests/typing-core-bugs/const_int_hint.ml b/testsuite/tests/typing-core-bugs/const_int_hint.ml index 8ebe7fd3..6c083127 100644 --- a/testsuite/tests/typing-core-bugs/const_int_hint.ml +++ b/testsuite/tests/typing-core-bugs/const_int_hint.ml @@ -9,7 +9,7 @@ Line 1, characters 19-20: ^ Error: The constant "1" has type "int" but an expression was expected of type "int32" - Hint: Did you mean "1l"? +Hint: Did you mean "1l"? |}] let _ : int32 * int32 = 42l, 43;; @@ -19,7 +19,7 @@ Line 1, characters 29-31: ^^ Error: The constant "43" has type "int" but an expression was expected of type "int32" - Hint: Did you mean "43l"? +Hint: Did you mean "43l"? |}] let _ : int32 * nativeint = 42l, 43;; @@ -29,7 +29,7 @@ Line 1, characters 33-35: ^^ Error: The constant "43" has type "int" but an expression was expected of type "nativeint" - Hint: Did you mean "43n"? +Hint: Did you mean "43n"? |}] let _ = min 6L 7;; @@ -39,7 +39,7 @@ Line 1, characters 15-16: ^ Error: The constant "7" has type "int" but an expression was expected of type "int64" - Hint: Did you mean "7L"? +Hint: Did you mean "7L"? |}] let _ : float = 123;; @@ -49,7 +49,7 @@ Line 1, characters 16-19: ^^^ Error: The constant "123" has type "int" but an expression was expected of type "float" - Hint: Did you mean "123."? +Hint: Did you mean "123."? |}] (* no hint *) @@ -73,7 +73,7 @@ Line 2, characters 4-5: ^ Error: This pattern matches values of type "int" but a pattern was expected which matches values of type "int32" - Hint: Did you mean "0l"? +Hint: Did you mean "0l"? |}] let _ : int64 -> int64 = function @@ -85,7 +85,7 @@ Line 2, characters 9-10: ^ Error: This pattern matches values of type "int" but a pattern was expected which matches values of type "int64" - Hint: Did you mean "2L"? +Hint: Did you mean "2L"? |}] (* symmetric *) @@ -96,7 +96,7 @@ Line 1, characters 16-18: ^^ Error: The constant "1L" has type "int64" but an expression was expected of type "int32" - Hint: Did you mean "1l"? +Hint: Did you mean "1l"? |}] let _ : float = 1L;; [%%expect{| @@ -105,7 +105,7 @@ Line 1, characters 16-18: ^^ Error: The constant "1L" has type "int64" but an expression was expected of type "float" - Hint: Did you mean "1."? +Hint: Did you mean "1."? |}] let _ : int64 = 1n;; [%%expect{| @@ -114,7 +114,7 @@ Line 1, characters 16-18: ^^ Error: The constant "1n" has type "nativeint" but an expression was expected of type "int64" - Hint: Did you mean "1L"? +Hint: Did you mean "1L"? |}] let _ : nativeint = 1l;; [%%expect{| @@ -123,7 +123,7 @@ Line 1, characters 20-22: ^^ Error: The constant "1l" has type "int32" but an expression was expected of type "nativeint" - Hint: Did you mean "1n"? +Hint: Did you mean "1n"? |}] (* not implemented *) @@ -153,7 +153,7 @@ Line 1, characters 23-28: ^^^^^ Error: The constant "1_000" has type "int" but an expression was expected of type "int64" - Hint: Did you mean "1_000L"? +Hint: Did you mean "1_000L"? |}] let _ : nativeint * nativeint = 0n, 0xAA_BBL;; [%%expect{| @@ -162,7 +162,7 @@ Line 1, characters 36-44: ^^^^^^^^ Error: The constant "0xAA_BBL" has type "int64" but an expression was expected of type "nativeint" - Hint: Did you mean "0xAA_BBn"? +Hint: Did you mean "0xAA_BBn"? |}] let _ : int32 -> int32 = function | 1l | 0o2_345 -> 3l @@ -173,7 +173,7 @@ Line 2, characters 9-16: ^^^^^^^ Error: This pattern matches values of type "int" but a pattern was expected which matches values of type "int32" - Hint: Did you mean "0o2_345l"? +Hint: Did you mean "0o2_345l"? |}] let _ : int32 -> int32 = fun x -> match x with | 1l | 0b1000_1101 -> 3l @@ -184,7 +184,7 @@ Line 2, characters 9-20: ^^^^^^^^^^^ Error: This pattern matches values of type "int" but a pattern was expected which matches values of type "int32" - Hint: Did you mean "0b1000_1101l"? +Hint: Did you mean "0b1000_1101l"? |}] type t1 = {f1: int32};; let _ = fun x -> x.f1 <- 1_000n;; [%%expect{| @@ -194,5 +194,5 @@ Line 1, characters 49-55: ^^^^^^ Error: The constant "1_000n" has type "nativeint" but an expression was expected of type "int32" - Hint: Did you mean "1_000l"? +Hint: Did you mean "1_000l"? |}] diff --git a/testsuite/tests/typing-core-bugs/missing_rec_hint.ml b/testsuite/tests/typing-core-bugs/missing_rec_hint.ml index 0b71248c..8ff52e26 100644 --- a/testsuite/tests/typing-core-bugs/missing_rec_hint.ml +++ b/testsuite/tests/typing-core-bugs/missing_rec_hint.ml @@ -49,7 +49,7 @@ Line 2, characters 13-19: 2 | let value2 = value2 (* typo: should be value1 *) + 1 in ^^^^^^ Error: Unbound value "value2" -Hint: Did you mean "value1"? +Hint: Did you mean "value1"? |}];; let foobar1 () = () in @@ -61,7 +61,7 @@ Line 2, characters 17-24: 2 | let foobar2 () = foobar2 () (* typo? or missing "rec"? *) in ^^^^^^^ Error: Unbound value "foobar2" -Hint: Did you mean "foobar1"? +Hint: Did you mean "foobar1"? Hint: If this is a recursive definition, you should add the "rec" keyword on line 2 |}];; diff --git a/testsuite/tests/typing-core-bugs/repeated_did_you_mean.ml b/testsuite/tests/typing-core-bugs/repeated_did_you_mean.ml index f558a324..1ee23ec8 100644 --- a/testsuite/tests/typing-core-bugs/repeated_did_you_mean.ml +++ b/testsuite/tests/typing-core-bugs/repeated_did_you_mean.ml @@ -18,5 +18,5 @@ Line 7, characters 8-11: 7 | let _ = fox;; ^^^ Error: Unbound value "fox" -Hint: Did you mean "foo"? +Hint: Did you mean "foo"? |}] diff --git a/testsuite/tests/typing-core-bugs/type_expected_explanation.ml b/testsuite/tests/typing-core-bugs/type_expected_explanation.ml index 7e904aed..146b83ce 100644 --- a/testsuite/tests/typing-core-bugs/type_expected_explanation.ml +++ b/testsuite/tests/typing-core-bugs/type_expected_explanation.ml @@ -168,7 +168,7 @@ Line 3, characters 22-26: 3 | else if x > y then [y;x] ^^^^ Error: This variant expression is expected to have type "unit" - because it is in the result of a conditional with no else branch + because it is in the result of a conditional with no else branch There is no constructor "::" within type "unit" |}];; @@ -192,6 +192,6 @@ Line 1, characters 35-39: 1 | if false then (match () with () -> true);; ^^^^ Error: This variant expression is expected to have type "unit" - because it is in the result of a conditional with no else branch + because it is in the result of a conditional with no else branch There is no constructor "true" within type "unit" |}] diff --git a/testsuite/tests/typing-deprecated/alerts.ml b/testsuite/tests/typing-deprecated/alerts.ml index e9d7d898..aa940a03 100644 --- a/testsuite/tests/typing-deprecated/alerts.ml +++ b/testsuite/tests/typing-deprecated/alerts.ml @@ -269,20 +269,20 @@ end Line 2, characters 13-25: 2 | val x: int [@@alert 42] ^^^^^^^^^^^^ -Warning 47 [attribute-payload]: illegal payload for attribute 'alert'. -Invalid payload +Warning 47 [attribute-payload]: illegal payload for attribute "alert". + Invalid payload Line 3, characters 13-29: 3 | val y: int [@@alert bla 42] ^^^^^^^^^^^^^^^^ -Warning 47 [attribute-payload]: illegal payload for attribute 'alert'. -Invalid payload +Warning 47 [attribute-payload]: illegal payload for attribute "alert". + Invalid payload Line 4, characters 13-28: 4 | val z: int [@@alert "bla"] ^^^^^^^^^^^^^^^ -Warning 47 [attribute-payload]: illegal payload for attribute 'alert'. -Ill-formed list of alert settings +Warning 47 [attribute-payload]: illegal payload for attribute "alert". + Ill-formed list of alert settings module X : sig val x : int val y : int val z : int end |}] diff --git a/testsuite/tests/typing-deprecated/deprecated.ml b/testsuite/tests/typing-deprecated/deprecated.ml index 0ac02d61..5ca2c626 100644 --- a/testsuite/tests/typing-deprecated/deprecated.ml +++ b/testsuite/tests/typing-deprecated/deprecated.ml @@ -653,8 +653,7 @@ Line 1, characters 4-31: 1 | let ([][@ocaml.ppwarning "XX"]) = [] ^^^^^^^^^^^^^^^^^^^^^^^^^^^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -_::_ + Here is an example of a case that is not matched: "_::_" |}] let[@ocaml.warning "-8-22"] ([][@ocaml.ppwarning "XX"]) = [] ;; diff --git a/testsuite/tests/typing-extension-constructor/test.ocaml.reference b/testsuite/tests/typing-extension-constructor/test.ocaml.reference index cd1e514f..276d01c8 100644 --- a/testsuite/tests/typing-extension-constructor/test.ocaml.reference +++ b/testsuite/tests/typing-extension-constructor/test.ocaml.reference @@ -6,8 +6,8 @@ module M : sig type extension_constructor = int end Line 2, characters 1-27: 2 | ([%extension_constructor A] : extension_constructor);; ^^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: This expression has type "extension_constructor/2" - but an expression was expected of type "M.extension_constructor" = "int" +Error: This expression has type extension_constructor/2 + but an expression was expected of type M.extension_constructor = int File "_none_", line 1: - Definition of type "extension_constructor/2" + Definition of type extension_constructor/2 diff --git a/testsuite/tests/typing-extensions/disambiguation.ml b/testsuite/tests/typing-extensions/disambiguation.ml index b4c40f8d..216b17eb 100644 --- a/testsuite/tests/typing-extensions/disambiguation.ml +++ b/testsuite/tests/typing-extensions/disambiguation.ml @@ -30,7 +30,7 @@ Line 1, characters 11-15: ^^^^ Error: This variant expression is expected to have type "t" There is no constructor "Alph" within type "t" -Hint: Did you mean "Aleph" or "Alpha"? +Hint: Did you mean "Aleph" or "Alpha"? |}] open M;; @@ -41,7 +41,7 @@ Line 2, characters 12-16: ^^^^ Error: This variant expression is expected to have type "M.w" There is no constructor "Alha" within type "M.w" -Hint: Did you mean "Alpha"? +Hint: Did you mean "Alpha"? |}] let z: t = Bet;; @@ -51,7 +51,7 @@ Line 1, characters 11-14: ^^^ Error: This variant expression is expected to have type "t" There is no constructor "Bet" within type "t" -Hint: Did you mean "Beth"? +Hint: Did you mean "Beth"? |}] @@ -65,7 +65,7 @@ Line 3, characters 9-13: ^^^^ Error: This variant expression is expected to have type "t" There is no constructor "Gamm" within type "t" -Hint: Did you mean "Gamma"? +Hint: Did you mean "Gamma"? |}];; raise Not_Found;; @@ -75,7 +75,7 @@ Line 1, characters 6-15: ^^^^^^^^^ Error: This variant expression is expected to have type "exn" There is no constructor "Not_Found" within type "exn" -Hint: Did you mean "Not_found"? +Hint: Did you mean "Not_found"? |}] (** Aliasing *) @@ -156,7 +156,7 @@ Line 7, characters 13-17: ^^^^ Error: This variant expression is expected to have type "P.p" There is no constructor "Alha" within type "x" -Hint: Did you mean "Alpha"? +Hint: Did you mean "Alpha"? |}] module M = struct type t = .. type t += T end @@ -197,7 +197,7 @@ Line 3, characters 8-12: ^^^^ Error: This variant expression is expected to have type "exn" There is no constructor "Locl" within type "exn" -Hint: Did you mean "Local"? +Hint: Did you mean "Local"? |}] let x = @@ -241,8 +241,8 @@ type b = Unique Line 7, characters 8-14: 7 | let x = Unique;; ^^^^^^ -Warning 41 [ambiguous-name]: Unique belongs to several types: b M.s t a -The first one was selected. Please disambiguate if this is wrong. +Warning 41 [ambiguous-name]: "Unique" belongs to several types: "b" "M.s" "t" "a". + The first one was selected. Please disambiguate if this is wrong. val x : b = Unique |}] diff --git a/testsuite/tests/typing-extensions/floatarray.ml b/testsuite/tests/typing-extensions/floatarray.ml new file mode 100644 index 00000000..b51bba86 --- /dev/null +++ b/testsuite/tests/typing-extensions/floatarray.ml @@ -0,0 +1,73 @@ +(* TEST + expect; +*) + +let x = [|1.;2.|] +;; +[%%expect {| +val x : float array = [|1.; 2.|] +|}] + +let x : floatarray = [|1.; 2.|] +;; +[%%expect {| +val x : floatarray = [|1.; 2.|] +|}] + +let x = ([|1.; 2.|] : floatarray) +;; +[%%expect {| +val x : floatarray = [|1.; 2.|] +|}] + +let f (a : floatarray) = match a with [|x|] -> x | _ -> assert false +;; +[%%expect {| +val f : floatarray -> float = +|}] + +let _ = f [|1.|] +;; +[%%expect {| +- : float = 1. +|}] + +(* Does not work without the annotation *) + +let f a = match a with [|_|] -> Float.Array.length a | _ -> assert false +;; +[%%expect {| +Line 1, characters 51-52: +1 | let f a = match a with [|_|] -> Float.Array.length a | _ -> assert false + ^ +Error: The value "a" has type "'a array" but an expression was expected of type + "Float.Array.t" = "floatarray" +|}] + +type s = floatarray +type t = s +let x : t = [||] +;; +[%%expect {| +type s = floatarray +type t = s +val x : t = [||] +|}] + +let f a = + let _ = Float.Array.length a in + match a with + | [||] -> () + | _ -> () +;; +[%%expect{| +val f : Float.Array.t -> unit = +|}, Principal{| +Line 4, characters 4-8: +4 | | [||] -> () + ^^^^ +Warning 18 [not-principal]: this type-based array disambiguation is not + principal. + +val f : Float.Array.t -> unit = +|}] diff --git a/testsuite/tests/typing-extensions/iarray.ml b/testsuite/tests/typing-extensions/iarray.ml new file mode 100644 index 00000000..2389f7d4 --- /dev/null +++ b/testsuite/tests/typing-extensions/iarray.ml @@ -0,0 +1,88 @@ +(* TEST + expect; +*) + +(** Create some immutable and mutable arrays *) + +let iarray : int iarray = [|1;2;3;4;5|];; +let ifarray : float iarray = [|1.5;2.5;3.5;4.5;5.5|];; + +let marray : int array = [|1;2;3;4;5|];; +let mfarray : float array = [|1.5;2.5;3.5;4.5;5.5|];; + +[%%expect{| +val iarray : int iarray = [|1; 2; 3; 4; 5|] +val ifarray : float iarray = [|1.5; 2.5; 3.5; 4.5; 5.5|] +val marray : int array = [|1; 2; 3; 4; 5|] +val mfarray : float array = [|1.5; 2.5; 3.5; 4.5; 5.5|] +|}];; + +(** Pattern-match on some immutable arrays, and check the typing of array + patterns, both mutable and immutable *) + +match iarray with +| [||] -> "empty" +| [|1;2;3;4;5|] -> "1--5" +| _ -> "who knows?" +;; +[%%expect{| +- : string = "1--5" +|}];; + +match ifarray with +| [||] -> "empty" +| [|1.5;2.5;3.5;4.5;5.5|] -> "1.5--5.5" +| _ -> "who knows?" +;; +[%%expect{| +- : string = "1.5--5.5" +|}];; + +match iarray with +| [||] -> "empty" +| [|1;2;3;4;6|] -> "1--5" +| _ -> "who knows?" +;; +[%%expect{| +- : string = "who knows?" +|}];; + +match ifarray with +| [||] -> "empty" +| [|1;2;3;4;5|] -> "1--5" +| _ -> "who knows?" +;; +[%%expect{| +Line 3, characters 4-5: +3 | | [|1;2;3;4;5|] -> "1--5" + ^ +Error: This pattern matches values of type "int" + but a pattern was expected which matches values of type "float" +Hint: Did you mean "1."? +|}];; + +match marray with +| ([||] : _ iarray) -> "empty" +| [|1;2;3;4;5|] -> "1--5" +| _ -> "who knows?" +;; +[%%expect{| +Line 2, characters 2-19: +2 | | ([||] : _ iarray) -> "empty" + ^^^^^^^^^^^^^^^^^ +Error: This pattern matches values of type "'a iarray" + but a pattern was expected which matches values of type "int array" +|}];; + +match iarray with +| ([||] : _ array) -> "empty" +| [|1;2;3;4;5|] -> "1--5" +| _ -> "who knows?" +;; +[%%expect{| +Line 2, characters 2-18: +2 | | ([||] : _ array) -> "empty" + ^^^^^^^^^^^^^^^^ +Error: This pattern matches values of type "'a array" + but a pattern was expected which matches values of type "int iarray" +|}];; diff --git a/testsuite/tests/typing-extensions/open_types.ml b/testsuite/tests/typing-extensions/open_types.ml index 0109ccd2..34ab0777 100644 --- a/testsuite/tests/typing-extensions/open_types.ml +++ b/testsuite/tests/typing-extensions/open_types.ml @@ -308,10 +308,10 @@ Line 3, characters 8-26: 3 | let f = function Foo -> () ^^^^^^^^^^^^^^^^^^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -*extension* -Matching over values of extensible variant types (the *extension* above) -must include a wild card pattern in order to be exhaustive. + Here is an example of a case that is not matched: + "*extension*" + Matching over values of extensible variant types (the *extension* above) + must include a wild card pattern in order to be exhaustive. val f : foo -> unit = |}] @@ -330,10 +330,10 @@ Lines 1-4, characters 8-11: 3 | | _::_::_ -> 3 4 | | [] -> 2 Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -*extension*::[] -Matching over values of extensible variant types (the *extension* above) -must include a wild card pattern in order to be exhaustive. + Here is an example of a case that is not matched: + "*extension*::[]" + Matching over values of extensible variant types (the *extension* above) + must include a wild card pattern in order to be exhaustive. val f : foo list -> int = |}] @@ -354,10 +354,10 @@ Line 1, characters 8-62: 1 | let f = function IPair (i, j) -> Format.sprintf "(%d, %d)" i j ;; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -*extension* -Matching over values of extensible variant types (the *extension* above) -must include a wild card pattern in order to be exhaustive. + Here is an example of a case that is not matched: + "*extension*" + Matching over values of extensible variant types (the *extension* above) + must include a wild card pattern in order to be exhaustive. val f : t -> string = |}] diff --git a/testsuite/tests/typing-fstclassmod/scope_escape.ml b/testsuite/tests/typing-fstclassmod/scope_escape.ml index d46a69ac..11a61734 100644 --- a/testsuite/tests/typing-fstclassmod/scope_escape.ml +++ b/testsuite/tests/typing-fstclassmod/scope_escape.ml @@ -40,24 +40,6 @@ and (module A : S) = in ();; [%%expect{| -Lines 2-6, characters 2-22: -2 | ..let (module K : S with type t = A.t) = k in -3 | (module struct -4 | type t = K.t -5 | end : S -6 | with type t = K.t) -Error: This expression has type "(module S with type t = A.t)" - but an expression was expected of type "'a" - The type constructor "A.t" would escape its scope -|}, Principal{| -Lines 8-12, characters 2-6: - 8 | ..(module struct - 9 | type t = unit -10 | -11 | let x = () -12 | end) -Warning 18 [not-principal]: this module packing is not principal. - Lines 2-6, characters 2-22: 2 | ..let (module K : S with type t = A.t) = k in 3 | (module struct @@ -114,21 +96,6 @@ let f () = ;; [%%expect{| module type S = sig type t val x : t end -Line 15, characters 8-10: -15 | unify () - ^^ -Error: The constructor "()" has type "unit" - but an expression was expected of type "M.t" -|}, Principal{| -module type S = sig type t val x : t end -Lines 8-12, characters 4-8: - 8 | ....(module struct - 9 | type t = unit -10 | -11 | let x = () -12 | end) -Warning 18 [not-principal]: this module packing is not principal. - Line 15, characters 8-10: 15 | unify () ^^ diff --git a/testsuite/tests/typing-gadts/didier.ml b/testsuite/tests/typing-gadts/didier.ml index 1907a6e8..938ae270 100644 --- a/testsuite/tests/typing-gadts/didier.ml +++ b/testsuite/tests/typing-gadts/didier.ml @@ -16,8 +16,7 @@ Lines 6-7, characters 2-13: 6 | ..match tag with 7 | | Bool -> x Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -Int + Here is an example of a case that is not matched: "Int" val fbool : 't -> 't ty -> 't = |}];; @@ -33,8 +32,7 @@ Lines 2-3, characters 2-16: 2 | ..match tag with 3 | | Int -> x > 0 Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -Bool + Here is an example of a case that is not matched: "Bool" val fint : 't -> 't ty -> bool = |}];; diff --git a/testsuite/tests/typing-gadts/pr10189.ml b/testsuite/tests/typing-gadts/pr10189.ml index 49400dbc..d77d1357 100644 --- a/testsuite/tests/typing-gadts/pr10189.ml +++ b/testsuite/tests/typing-gadts/pr10189.ml @@ -55,8 +55,7 @@ Line 6, characters 2-20: 6 | let None = y in () ;; ^^^^^^^^^^^^^^^^^^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -Some A + Here is an example of a case that is not matched: "Some A" val g : M.j t option -> unit = |}] @@ -83,8 +82,7 @@ Line 9, characters 2-20: 9 | let None = y in () ;; ^^^^^^^^^^^^^^^^^^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -Some A + Here is an example of a case that is not matched: "Some A" val g : M.j t option -> unit = |}] @@ -110,8 +108,7 @@ Line 9, characters 2-20: 9 | let None = y in () ;; ^^^^^^^^^^^^^^^^^^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -Some A + Here is an example of a case that is not matched: "Some A" val g : 'a M.j t option -> unit = |}] @@ -174,3 +171,36 @@ Line 7, characters 33-34: Error: This match case could not be refuted. Here is an example of a value that would reach it: "A" |}] + +module rec M: sig + type x + type 'a t = A constraint 'a = x > +end = struct + type x + type 'a t = A constraint 'a = 'a > +end +[%%expect {| +Lines 4-7, characters 6-3: +4 | ......struct +5 | type x +6 | type 'a t = A constraint 'a = 'a > +7 | end +Error: Signature mismatch: + Modules do not match: + sig + type x = M.x + type 'b t = 'b M.t = A constraint 'b = < x : 'a. 'a -> 'a > + end + is not included in + sig type x type 'b t = A constraint 'b = < x : 'a. 'a -> x > end + Type declarations do not match: + type 'b t = 'b M.t = A constraint 'b = < x : 'a. 'a -> 'a > + is not included in + type 'b t = A constraint 'b = < x : 'a. 'a -> x > + Their parameters differ + The type "< x : 'a. 'a -> 'a >" is not equal to the type + "< x : 'a. 'a -> x >" + Type "'a" is not equal to type "x" = "M.x" + The method "x" has type "'a. 'a -> 'a", but the expected method type was + "'a. 'a -> x" +|}] diff --git a/testsuite/tests/typing-gadts/pr13579.ml b/testsuite/tests/typing-gadts/pr13579.ml index 1835f935..cd1073bf 100644 --- a/testsuite/tests/typing-gadts/pr13579.ml +++ b/testsuite/tests/typing-gadts/pr13579.ml @@ -63,8 +63,7 @@ Line 1, characters 6-18: 1 | let f (W: _ M.p t) = () ^^^^^^^^^^^^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -W2 + Here is an example of a case that is not matched: "W2" val f : int M.p t -> unit = |}] diff --git a/testsuite/tests/typing-gadts/pr5785.ml b/testsuite/tests/typing-gadts/pr5785.ml index 5ebe57c4..6a31ef62 100644 --- a/testsuite/tests/typing-gadts/pr5785.ml +++ b/testsuite/tests/typing-gadts/pr5785.ml @@ -18,8 +18,7 @@ Lines 7-9, characters 43-24: 8 | | One, One -> "two" 9 | | Two, Two -> "four" Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -(One, Two) + Here is an example of a case that is not matched: "(One, Two)" module Add : (T : sig type two end) -> diff --git a/testsuite/tests/typing-gadts/pr5906.ml b/testsuite/tests/typing-gadts/pr5906.ml index 30d37273..19ecdf73 100644 --- a/testsuite/tests/typing-gadts/pr5906.ml +++ b/testsuite/tests/typing-gadts/pr5906.ml @@ -34,8 +34,7 @@ Lines 12-16, characters 2-36: 15 | | Leq, Bool x, Bool y -> Bool (x <= y) 16 | | Add, Int x, Int y -> Int (x + y) Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -(Eq, Int _, _) + Here is an example of a case that is not matched: "(Eq, Int _, _)" val eval : ('a, 'b, 'c) binop -> 'a constant -> 'b constant -> 'c constant = diff --git a/testsuite/tests/typing-gadts/pr5981.ml b/testsuite/tests/typing-gadts/pr5981.ml index 3a24badc..02a48149 100644 --- a/testsuite/tests/typing-gadts/pr5981.ml +++ b/testsuite/tests/typing-gadts/pr5981.ml @@ -16,8 +16,7 @@ Lines 7-8, characters 47-21: 7 | ...............................................match l, r with 8 | | A, B -> "f A B" Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -(A, A) + Here is an example of a case that is not matched: "(A, A)" module F : (S : sig type 'a t end) -> @@ -44,8 +43,7 @@ Lines 10-11, characters 15-21: 10 | ...............match l, r with 11 | | A, B -> "f A B" Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -(A, A) + Here is an example of a case that is not matched: "(A, A)" module F : (S : sig type 'a t end) -> diff --git a/testsuite/tests/typing-gadts/pr5989.ml b/testsuite/tests/typing-gadts/pr5989.ml index a23ade09..bc119e6d 100644 --- a/testsuite/tests/typing-gadts/pr5989.ml +++ b/testsuite/tests/typing-gadts/pr5989.ml @@ -29,8 +29,7 @@ Lines 16-17, characters 39-16: 16 | .......................................function 17 | | Any -> "Any" Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -Eq + Here is an example of a case that is not matched: "Eq" val f : (M.s, [ `A | `B ]) t -> string = Exception: Match_failure ("", 16, 39). @@ -60,8 +59,7 @@ Lines 12-13, characters 49-16: 12 | .................................................function 13 | | Any -> "Any" Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -Eq + Here is an example of a case that is not matched: "Eq" val f : (N.s, < a : int; b : bool >) t -> string = |}];; diff --git a/testsuite/tests/typing-gadts/pr5997.ml b/testsuite/tests/typing-gadts/pr5997.ml index 907a3944..9703b76c 100644 --- a/testsuite/tests/typing-gadts/pr5997.ml +++ b/testsuite/tests/typing-gadts/pr5997.ml @@ -26,8 +26,7 @@ Line 16, characters 0-33: 16 | match M.comp with | Diff -> false;; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -Eq + Here is an example of a case that is not matched: "Eq" Exception: Match_failure ("", 16, 0). |}];; @@ -50,8 +49,7 @@ Line 11, characters 0-33: 11 | match M.comp with | Diff -> false;; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -Eq + Here is an example of a case that is not matched: "Eq" Exception: Match_failure ("", 11, 0). |}];; diff --git a/testsuite/tests/typing-gadts/pr6241.ml b/testsuite/tests/typing-gadts/pr6241.ml index 1d134a77..af7e8508 100644 --- a/testsuite/tests/typing-gadts/pr6241.ml +++ b/testsuite/tests/typing-gadts/pr6241.ml @@ -25,8 +25,7 @@ Lines 8-9, characters 52-13: 8 | ....................................................function 9 | | B s -> s Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -A + Here is an example of a case that is not matched: "A" module M : (A : sig module type T end) (B : sig module type T end) -> diff --git a/testsuite/tests/typing-gadts/pr6993_bad.ml b/testsuite/tests/typing-gadts/pr6993_bad.ml index adfe73b7..f25499ba 100644 --- a/testsuite/tests/typing-gadts/pr6993_bad.ml +++ b/testsuite/tests/typing-gadts/pr6993_bad.ml @@ -21,8 +21,7 @@ Line 2, characters 36-66: 2 | let f : ('a list, 'a) eqp -> unit = function N s -> print_string s;; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -Y + Here is an example of a case that is not matched: "Y" val f : ('a list, 'a) eqp -> unit = module rec A : sig type t = B.t list end diff --git a/testsuite/tests/typing-gadts/pr7016.ml b/testsuite/tests/typing-gadts/pr7016.ml index 78277e05..89c57aa8 100644 --- a/testsuite/tests/typing-gadts/pr7016.ml +++ b/testsuite/tests/typing-gadts/pr7016.ml @@ -15,8 +15,7 @@ Line 5, characters 9-39: 5 | let get1 (Cons (x, _) : (_ * 'a, 'a) t) = x ;; (* warn, cf PR#6993 *) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -Nil + Here is an example of a case that is not matched: "Nil" val get1 : ('b * 'a, 'a) t -> 'b = |}];; diff --git a/testsuite/tests/typing-gadts/pr7234.ml b/testsuite/tests/typing-gadts/pr7234.ml index 58f3742e..5cc6c784 100644 --- a/testsuite/tests/typing-gadts/pr7234.ml +++ b/testsuite/tests/typing-gadts/pr7234.ml @@ -12,8 +12,7 @@ Line 3, characters 15-36: 3 | let f (type a) (Neq n : (a, a t) eq) = n;; (* warn! *) ^^^^^^^^^^^^^^^^^^^^^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -Eq + Here is an example of a case that is not matched: "Eq" val f : ('a, 'a t) eq -> int = |}];; @@ -26,8 +25,7 @@ Line 2, characters 16-39: 2 | let f (type a) (Neq n : (a, a T.t) eq) = n (* warn! *) ^^^^^^^^^^^^^^^^^^^^^^^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -Eq + Here is an example of a case that is not matched: "Eq" module F : (T : sig type _ t end) -> sig val f : ('a, 'a T.t) eq -> int end |}];; diff --git a/testsuite/tests/typing-gadts/pr7269.ml b/testsuite/tests/typing-gadts/pr7269.ml index 5d6d57f5..b4db2606 100644 --- a/testsuite/tests/typing-gadts/pr7269.ml +++ b/testsuite/tests/typing-gadts/pr7269.ml @@ -15,8 +15,7 @@ Line 4, characters 6-28: 4 | let f (T (`Other msg) : s t) = print_string msg;; ^^^^^^^^^^^^^^^^^^^^^^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -T (`Conj _) + Here is an example of a case that is not matched: "T (`Conj _)" val f : s t -> unit = Exception: Match_failure ("", 4, 6). @@ -44,8 +43,7 @@ Line 11, characters 12-59: 11 | let () = M.(match x with T (`Other msg) -> print_string msg);; (* warn *) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -T (`Conj _) + Here is an example of a case that is not matched: "T (`Conj _)" Exception: Match_failure ("", 11, 12). |}];; @@ -77,8 +75,7 @@ Line 13, characters 25-37: 13 | let () = M.(e { ex = fun (`Other msg) -> print_string msg });; (* warn *) ^^^^^^^^^^^^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -`Conj _ + Here is an example of a case that is not matched: "`Conj _" Exception: Match_failure ("", 13, 25). |}];; diff --git a/testsuite/tests/typing-gadts/pr7390.ml b/testsuite/tests/typing-gadts/pr7390.ml index 8d019307..212be38e 100644 --- a/testsuite/tests/typing-gadts/pr7390.ml +++ b/testsuite/tests/typing-gadts/pr7390.ml @@ -25,8 +25,7 @@ Line 2, characters 6-23: 2 | fun (Either (Y a, N)) -> a;; ^^^^^^^^^^^^^^^^^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -Either (N, Y _) + Here is an example of a case that is not matched: "Either (N, Y _)" val f : filled either -> string = |}] diff --git a/testsuite/tests/typing-gadts/pr7432.ml b/testsuite/tests/typing-gadts/pr7432.ml index 9e290331..7baba736 100644 --- a/testsuite/tests/typing-gadts/pr7432.ml +++ b/testsuite/tests/typing-gadts/pr7432.ml @@ -25,8 +25,7 @@ Line 2, characters 2-30: 2 | function `R {silly} -> silly ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -`L Refl + Here is an example of a case that is not matched: "`L Refl" val f : [ `L of (s, t) eql | `R of silly ] -> 'a = |}] diff --git a/testsuite/tests/typing-gadts/pr9019.ml b/testsuite/tests/typing-gadts/pr9019.ml index 47e408a2..459d6583 100644 --- a/testsuite/tests/typing-gadts/pr9019.ml +++ b/testsuite/tests/typing-gadts/pr9019.ml @@ -37,8 +37,7 @@ Lines 4-8, characters 2-18: 7 | | _, AB, B -> 3 8 | | _, MAB, B -> 4 Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -(AB, MAB, A) + Here is an example of a case that is not matched: "(AB, MAB, A)" val f : 'x M.t -> 'x M.t -> 'x -> int = |}] @@ -170,8 +169,7 @@ Lines 9-11, characters 2-37: 10 | | Not_A, A_or_B, `B i -> print_int i 11 | | _, A_or_B, `A s -> print_string s Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -(A, A_or_B, `B _) + Here is an example of a case that is not matched: "(A, A_or_B, `B _)" val f : 'x a -> 'x a_or_b -> 'x -> unit = |}] @@ -202,8 +200,8 @@ Lines 9-11, characters 2-18: 10 | | B, `B String_option, Some s -> print_string s 11 | | A, `A, _ -> () Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -(B, `B String_option, None) + Here is an example of a case that is not matched: + "(B, `B String_option, None)" val f : ('x, 'y ty) b -> 'x -> 'y -> unit = |}] @@ -223,8 +221,7 @@ Line 2, characters 18-44: 2 | let f (x : _ a) = match x with `A None -> ();; ^^^^^^^^^^^^^^^^^^^^^^^^^^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -`A (Some _) + Here is an example of a case that is not matched: "`A (Some _)" val f : 'a option a -> unit = |}] @@ -235,8 +232,7 @@ Line 1, characters 23-47: 1 | let f (x : [> `A] a) = match x with `A `B -> ();; ^^^^^^^^^^^^^^^^^^^^^^^^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -`A `A + Here is an example of a case that is not matched: "`A `A" val f : [< `A | `B > `A ] a -> unit = |}] diff --git a/testsuite/tests/typing-gadts/principality-and-gadts.ml b/testsuite/tests/typing-gadts/principality-and-gadts.ml index 1c994798..870341cd 100644 --- a/testsuite/tests/typing-gadts/principality-and-gadts.ml +++ b/testsuite/tests/typing-gadts/principality-and-gadts.ml @@ -23,8 +23,7 @@ Line 1, characters 8-35: 1 | let f = function Sigma (M, A) -> ();; ^^^^^^^^^^^^^^^^^^^^^^^^^^^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -Sigma (M, B) + Here is an example of a case that is not matched: "Sigma (M, B)" val f : dyn -> unit = |}];; @@ -48,14 +47,14 @@ val f : 'a t -> 'a -> int = Line 4, characters 4-10: 4 | | IntLit, n -> n+1 ^^^^^^ -Warning 18 [not-principal]: typing this pattern requires considering int and a as equal. -But the knowledge of these types is not principal. +Warning 18 [not-principal]: typing this pattern requires considering + "int" and "a" as equal. But the knowledge of these types is not principal. Line 5, characters 4-11: 5 | | BoolLit, b -> 1 ^^^^^^^ -Warning 18 [not-principal]: typing this pattern requires considering bool and a as equal. -But the knowledge of these types is not principal. +Warning 18 [not-principal]: typing this pattern requires considering + "bool" and "a" as equal. But the knowledge of these types is not principal. val f : 'a t -> 'a -> int = |}] @@ -72,8 +71,8 @@ val f : 'a t -> 'a -> int = Line 4, characters 4-10: 4 | | IntLit, n -> n+1 ^^^^^^ -Warning 18 [not-principal]: typing this pattern requires considering int and a as equal. -But the knowledge of these types is not principal. +Warning 18 [not-principal]: typing this pattern requires considering + "int" and "a" as equal. But the knowledge of these types is not principal. val f : 'a t -> 'a -> int = |}] @@ -141,8 +140,9 @@ val f1 : unit ab M.t -> bool = Line 4, characters 4-7: 4 | | MAB -> false;; ^^^ -Warning 18 [not-principal]: typing this pattern requires considering unit M.mab and unit ab as equal. -But the knowledge of these types is not principal. +Warning 18 [not-principal]: typing this pattern requires considering + "unit M.mab" and "unit ab" as equal. But the knowledge of these types is not + principal. val f1 : unit ab M.t -> bool = |}] @@ -158,14 +158,15 @@ val f2 : 'x M.t -> bool = Line 4, characters 4-6: 4 | | AB -> true ^^ -Warning 18 [not-principal]: typing this pattern requires considering unit ab and x as equal. -But the knowledge of these types is not principal. +Warning 18 [not-principal]: typing this pattern requires considering + "unit ab" and "x" as equal. But the knowledge of these types is not principal. Line 5, characters 4-7: 5 | | MAB -> false;; ^^^ -Warning 18 [not-principal]: typing this pattern requires considering unit M.mab and x as equal. -But the knowledge of these types is not principal. +Warning 18 [not-principal]: typing this pattern requires considering + "unit M.mab" and "x" as equal. But the knowledge of these types is not + principal. val f2 : 'x M.t -> bool = |}] @@ -182,8 +183,9 @@ val f3 : unit ab M.t -> bool = Line 5, characters 4-7: 5 | | MAB -> false;; ^^^ -Warning 18 [not-principal]: typing this pattern requires considering unit M.mab and unit ab as equal. -But the knowledge of these types is not principal. +Warning 18 [not-principal]: typing this pattern requires considering + "unit M.mab" and "unit ab" as equal. But the knowledge of these types is not + principal. val f3 : unit ab M.t -> bool = |}] @@ -210,8 +212,9 @@ val g2 : ('x, int option) eq -> 'x -> int option = Line 3, characters 7-11: 3 | let Refl = e in x;; ^^^^ -Warning 18 [not-principal]: typing this pattern requires considering x and int option as equal. -But the knowledge of these types is not principal. +Warning 18 [not-principal]: typing this pattern requires considering + "x" and "int option" as equal. But the knowledge of these types is not + principal. val g2 : ('x, int option) eq -> 'x -> int option = |}] @@ -242,8 +245,8 @@ let () = Line 3, characters 27-28: 3 | | [ { a = 3; _ } ; { b = F; _ }] -> () ^ -Warning 18 [not-principal]: typing this pattern requires considering Foo.t and int as equal. -But the knowledge of these types is not principal. +Warning 18 [not-principal]: typing this pattern requires considering + "Foo.t" and "int" as equal. But the knowledge of these types is not principal. |}] let () = @@ -277,8 +280,8 @@ let () = Line 3, characters 26-31: 3 | | [ { a = 3; _ }; { b = Refl3 ; _ }] -> () ^^^^^ -Warning 18 [not-principal]: typing this pattern requires considering int and Foo.t as equal. -But the knowledge of these types is not principal. +Warning 18 [not-principal]: typing this pattern requires considering + "int" and "Foo.t" as equal. But the knowledge of these types is not principal. |}] let () = @@ -291,8 +294,8 @@ let () = Line 3, characters 12-17: 3 | | [ { b = Refl3 ; _ }; { a = 3; _ } ] -> () ^^^^^ -Warning 18 [not-principal]: typing this pattern requires considering int and Foo.t as equal. -But the knowledge of these types is not principal. +Warning 18 [not-principal]: typing this pattern requires considering + "int" and "Foo.t" as equal. But the knowledge of these types is not principal. |}] (* Unify with 'a first *) @@ -312,8 +315,8 @@ let () = Line 3, characters 26-31: 3 | | [ { a = 3; _ }; { b = Refl3 ; _ }] -> () ^^^^^ -Warning 18 [not-principal]: typing this pattern requires considering int and Foo.t as equal. -But the knowledge of these types is not principal. +Warning 18 [not-principal]: typing this pattern requires considering + "int" and "Foo.t" as equal. But the knowledge of these types is not principal. |}] let () = @@ -325,8 +328,8 @@ let () = Line 3, characters 12-17: 3 | | [ { b = Refl3 ; _ }; { a = 3; _ } ] -> () ^^^^^ -Warning 18 [not-principal]: typing this pattern requires considering int and Foo.t as equal. -But the knowledge of these types is not principal. +Warning 18 [not-principal]: typing this pattern requires considering + "int" and "Foo.t" as equal. But the knowledge of these types is not principal. |}] @@ -357,8 +360,8 @@ val foo : M.t foo -> M.t = Line 3, characters 18-23: 3 | | { x = x; eq = Refl3 } -> x ^^^^^ -Warning 18 [not-principal]: typing this pattern requires considering M.t and N.t as equal. -But the knowledge of these types is not principal. +Warning 18 [not-principal]: typing this pattern requires considering + "M.t" and "N.t" as equal. But the knowledge of these types is not principal. val foo : M.t foo -> M.t = |}] @@ -373,8 +376,8 @@ val foo : int foo -> int = Line 3, characters 26-31: 3 | | { x = (x : int); eq = Refl3 } -> x ^^^^^ -Warning 18 [not-principal]: typing this pattern requires considering M.t and N.t as equal. -But the knowledge of these types is not principal. +Warning 18 [not-principal]: typing this pattern requires considering + "M.t" and "N.t" as equal. But the knowledge of these types is not principal. val foo : int foo -> int = |}] @@ -395,8 +398,8 @@ Error: This pattern matches values of type "N.t foo" Line 3, characters 26-31: 3 | | { x = (x : N.t); eq = Refl3 } -> x ^^^^^ -Warning 18 [not-principal]: typing this pattern requires considering M.t and N.t as equal. -But the knowledge of these types is not principal. +Warning 18 [not-principal]: typing this pattern requires considering + "M.t" and "N.t" as equal. But the knowledge of these types is not principal. Line 3, characters 4-33: 3 | | { x = (x : N.t); eq = Refl3 } -> x @@ -417,8 +420,8 @@ val foo : string foo -> string = Line 3, characters 29-34: 3 | | { x = (x : string); eq = Refl3 } -> x ^^^^^ -Warning 18 [not-principal]: typing this pattern requires considering M.t and N.t as equal. -But the knowledge of these types is not principal. +Warning 18 [not-principal]: typing this pattern requires considering + "M.t" and "N.t" as equal. But the knowledge of these types is not principal. val foo : string foo -> string = |}] diff --git a/testsuite/tests/typing-gadts/syntactic-arity.ml b/testsuite/tests/typing-gadts/syntactic-arity.ml index 295749cf..48d11d0a 100644 --- a/testsuite/tests/typing-gadts/syntactic-arity.ml +++ b/testsuite/tests/typing-gadts/syntactic-arity.ml @@ -33,8 +33,7 @@ Line 1, characters 14-21: ^^^^^^^ Error: This expression has type "'a -> 'b" but an expression was expected of type "string" - Hint: This function application is partial, - maybe some arguments are missing. +Hint: This function application is partial, maybe some arguments are missing. |}];; (* And the fully polymorphic definition is rejected. *) @@ -91,8 +90,7 @@ Line 5, characters 16-48: 5 | let ok (type a) (Eq : (a, int -> int) eq_or_not) : a = ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -Neq + Here is an example of a case that is not matched: "Neq" val ok : ('a -> 'b, int -> int) eq_or_not -> 'a -> 'b = |}];; @@ -105,8 +103,7 @@ Line 2, characters 6-38: 2 | fun (Eq : (a, int -> int) eq_or_not) x -> x + 1;; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -Neq + Here is an example of a case that is not matched: "Neq" Line 2, characters 2-49: 2 | fun (Eq : (a, int -> int) eq_or_not) x -> x + 1;; diff --git a/testsuite/tests/typing-gadts/test.ml b/testsuite/tests/typing-gadts/test.ml index 46e4b98a..b252e7b6 100644 --- a/testsuite/tests/typing-gadts/test.ml +++ b/testsuite/tests/typing-gadts/test.ml @@ -107,16 +107,14 @@ Lines 11-12, characters 6-19: 11 | ......function 12 | | C2 x -> x Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -C1 _ + Here is an example of a case that is not matched: "C1 _" Lines 24-26, characters 6-30: 24 | ......function 25 | | Foo _ , Foo _ -> true 26 | | Bar _, Bar _ -> true Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -(Foo _, Bar _) + Here is an example of a case that is not matched: "(Foo _, Bar _)" module Nonexhaustive : sig @@ -163,15 +161,13 @@ Line 2, characters 10-18: 2 | class c (Some x) = object method x : int = x end ^^^^^^^^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -None + Here is an example of a case that is not matched: "None" Line 4, characters 10-18: 4 | class d (Just x) = object method x : int = x end ^^^^^^^^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -Nothing + Here is an example of a case that is not matched: "Nothing" module PR6862 : sig @@ -200,7 +196,7 @@ Line 4, characters 43-44: 4 | let g : int t -> int = function I -> 1 | _ -> 2 (* warn *) ^ Warning 56 [unreachable-case]: this match case is unreachable. -Consider replacing it with a refutation case ' -> .' + Consider replacing it with a refutation case " -> ." module PR6220 : sig @@ -269,8 +265,7 @@ Lines 8-9, characters 4-33: 8 | ....match x with 9 | | String s -> print_endline s................. Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -Any + Here is an example of a case that is not matched: "Any" module PR6801 : sig @@ -933,8 +928,7 @@ Lines 2-8, characters 2-16: 7 | | TA, D 0 -> -1 8 | | TA, D z -> z Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -(TE TC, D [| 0. |]) + Here is an example of a case that is not matched: "(TE TC, D [| 0. |])" val f : 'a ty -> 'a t -> int = |}];; @@ -998,8 +992,8 @@ Lines 4-10, characters 2-29: 9 | | {left=TA; right=D 0} -> -1 10 | | {left=TA; right=D z} -> z Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -{left=TE TC; right=D [| 0. |]} + Here is an example of a case that is not matched: + "{left=TE TC; right=D [| 0. |]}" val f : 'a ty -> 'a t -> int = |}];; diff --git a/testsuite/tests/typing-gadts/unexpected_existentials.ml b/testsuite/tests/typing-gadts/unexpected_existentials.ml index e176cc92..1287d712 100644 --- a/testsuite/tests/typing-gadts/unexpected_existentials.ml +++ b/testsuite/tests/typing-gadts/unexpected_existentials.ml @@ -24,7 +24,7 @@ let () = Line 2, characters 6-11: 2 | let Any x = Any () and () = () in ^^^^^ -Error: Existential types are not allowed in "let ... and ..." bindings, +Error: Existential types are not allowed in grouped ("let ... and ...") bindings, but the constructor "Any" introduces existential types. |}] @@ -102,7 +102,7 @@ let () = Line 2, characters 6-11: 2 | let Any x = Any () and () = () in ^^^^^ -Error: Existential types are not allowed in "let ... and ..." bindings, +Error: Existential types are not allowed in grouped ("let ... and ...") bindings, but the constructor "Any" introduces existential types. |}] diff --git a/testsuite/tests/typing-gadts/yallop_bugs.ml b/testsuite/tests/typing-gadts/yallop_bugs.ml index a745aec5..94de66ee 100644 --- a/testsuite/tests/typing-gadts/yallop_bugs.ml +++ b/testsuite/tests/typing-gadts/yallop_bugs.ml @@ -37,13 +37,60 @@ let magic : 'a 'b. 'a -> 'b = (downcast bad_proof ((object method m = x end) :> < >)) # m ;; [%%expect{| -Line 1, characters 0-36: +Line 1, characters 18-36: 1 | type (_, +_) eq = Refl : ('a, 'a) eq - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: In this GADT definition, the variance of some parameter - cannot be checked + ^^^^^^^^^^^^^^^^^^ +Error: In this GADT constructor definition, the variance of the 2nd parameter + cannot be checked, because the type variable "'a" appears + in other parameters. + In GADTS, covariant or contravariant type parameters must not depend + on other parameters. |}];; +type (_, +_) eq2 = Neq : ('a, 'b) eq2 | Refl : ('a, 'a) eq2 +;; +[%%expect{| +Line 1, characters 38-59: +1 | type (_, +_) eq2 = Neq : ('a, 'b) eq2 | Refl : ('a, 'a) eq2 + ^^^^^^^^^^^^^^^^^^^^^ +Error: In this GADT constructor definition, the variance of the 2nd parameter + cannot be checked, because the type variable "'a" appears + in other parameters. + In GADTS, covariant or contravariant type parameters must not depend + on other parameters. +|}];; + +type q +type (_, +_) eq3 = Refl : ('a, q) eq3 +;; +[%%expect{| +type q +Line 2, characters 19-37: +2 | type (_, +_) eq3 = Refl : ('a, q) eq3 + ^^^^^^^^^^^^^^^^^^ +Error: In this GADT constructor definition, the variance of the 2nd parameter + cannot be checked, because it is instantiated to the type "q". + Covariant or contravariant type parameters may only appear + as type variables in GADT constructor definitions. +|}];; + +type (_, +_) eq_ext = .. +type (_,_) eq_ext += Refl : ('a, 'a) eq_ext +;; +[%%expect{| +type (_, +_) eq_ext = .. +Line 2, characters 21-43: +2 | type (_,_) eq_ext += Refl : ('a, 'a) eq_ext + ^^^^^^^^^^^^^^^^^^^^^^ +Error: In this GADT constructor definition, the variance of the 2nd parameter + cannot be checked, because the type variable "'a" appears + in other parameters. + In GADTS, covariant or contravariant type parameters must not depend + on other parameters. +|}];; + +(* Record patterns *) + (* Record patterns *) type _ t = @@ -61,8 +108,7 @@ Lines 5-7, characters 39-23: 6 | | BoolLit, false -> false 7 | | IntLit , 6 -> false Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -(BoolLit, true) + Here is an example of a case that is not matched: "(BoolLit, true)" val check : 's t * 's -> bool = |}];; @@ -80,8 +126,7 @@ Lines 3-5, characters 45-38: 4 | | {fst = BoolLit; snd = false} -> false 5 | | {fst = IntLit ; snd = 6} -> false Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -{fst=BoolLit; snd=true} + Here is an example of a case that is not matched: "{fst=BoolLit; snd=true}" val check : ('s t, 's) pair -> bool = |}];; diff --git a/testsuite/tests/typing-labeled-tuples/labeled_tuple_patterns.ml b/testsuite/tests/typing-labeled-tuples/labeled_tuple_patterns.ml new file mode 100644 index 00000000..810e7e85 --- /dev/null +++ b/testsuite/tests/typing-labeled-tuples/labeled_tuple_patterns.ml @@ -0,0 +1,641 @@ +(* TEST + expect; +*) + +(* Test match statements with exception patterns *) +exception Odd + +let x_must_be_even (~x, y) = + if x mod 2 = 1 then + raise Odd + else + (~x, y) + +let foo xy k_good k_bad = + match x_must_be_even xy with + | (~x, y) -> k_good () + | exception Odd -> k_bad () +[%%expect{| +exception Odd +val x_must_be_even : (x:int * 'a) -> x:int * 'a = +val foo : (x:int * 'a) -> (unit -> 'b) -> (unit -> 'b) -> 'b = +|}] + +(* Test correctness *) +let _ = foo (~x:2, 5) (fun () -> true) (fun () -> false) +let _ = foo (~x:3, 5) (fun () -> false) (fun () -> true) +[%%expect{| +- : bool = true +- : bool = true +|}] + +(* Test that the actions occur outside of the exception handler *) +let _ = + try + foo (~x:2, 5) (fun () -> raise Odd) (fun () -> false) + with Odd -> true +let _ = + try + foo (~x:3, 5) (fun () -> false) (fun () -> raise Odd) + with Odd -> true +[%%expect{| +- : bool = true +- : bool = true +|}] + +(* Labeled tuple pattern *) +let (~x:x0, ~y:y0, _) = ~x: 1, ~y: 2, "ignore me" +[%%expect{| +val x0 : int = 1 +val y0 : int = 2 +|}] + +(* Pattern with punning and type annotation *) +let (~(x:int), ~y, _) = ~x: 1, ~y: 2, "ignore me" +[%%expect{| +val x : int = 1 +val y : int = 2 +|}] + +(* Patterns in functions *) +let f = fun (~foo, ~bar:bar) -> foo * 10 + bar +let bar = 5 +let _ = f (~foo:1, ~bar) +[%%expect{| +val f : (foo:int * bar:int) -> int = +val bar : int = 5 +- : int = 15 +|}] + +(* Correct annotation *) +let f : (foo:int * bar:int) -> int = + fun (~foo, ~bar:bar) -> foo * 10 + bar +[%%expect{| +val f : (foo:int * bar:int) -> int = +|}] + +let f = fun (~foo, ~bar:bar) : (foo:int * bar:int) -> foo * 10 + bar +[%%expect{| +Line 1, characters 54-68: +1 | let f = fun (~foo, ~bar:bar) : (foo:int * bar:int) -> foo * 10 + bar + ^^^^^^^^^^^^^^ +Error: This expression has type "int" but an expression was expected of type + "foo:int * bar:int" +|}] + +(* Missing label *) +let f : (int * bar:int) -> int = fun (~foo, ~bar:bar) -> foo * 10 + bar +[%%expect{| +Line 1, characters 37-53: +1 | let f : (int * bar:int) -> int = fun (~foo, ~bar:bar) -> foo * 10 + bar + ^^^^^^^^^^^^^^^^ +Error: This pattern was expected to match values of type "int * bar:int", + but it is missing an unlabeled component. +|}] + +let f = fun (~foo, ~bar:bar) : (foo:int * int) -> foo * 10 + bar +[%%expect{| +Line 1, characters 50-64: +1 | let f = fun (~foo, ~bar:bar) : (foo:int * int) -> foo * 10 + bar + ^^^^^^^^^^^^^^ +Error: This expression has type "int" but an expression was expected of type + "foo:int * int" +|}] + +(* Wrong label *) +let f : (foo:int * foo':int) -> int = + fun (~foo, ~bar:bar) -> foo * 10 + bar +[%%expect{| +Line 2, characters 7-23: +2 | fun (~foo, ~bar:bar) -> foo * 10 + bar + ^^^^^^^^^^^^^^^^ +Error: This pattern was expected to match values of type "foo:int * foo':int", + but it is missing a component with label "foo'". + Hint: use .. to ignore some components. +|}] + +(* Wrong type *) +let f : (foo:float * foo':int) -> int = + fun (~foo, ~bar:bar) -> foo * 10 + bar +[%%expect{| +Line 2, characters 7-23: +2 | fun (~foo, ~bar:bar) -> foo * 10 + bar + ^^^^^^^^^^^^^^^^ +Error: This pattern was expected to match values of type + "foo:float * foo':int", but it is missing a component with label "foo'". + Hint: use .. to ignore some components. +|}] + +(* Annotated pattern *) +let f (~x,y : (x:int * int)) : int = x + y +[%%expect{| +val f : (x:int * int) -> int = +|}] + +(* Misannotated pattern *) +let f (~x,y : (int * int)) : int = x + y +[%%expect{| +Line 1, characters 7-11: +1 | let f (~x,y : (int * int)) : int = x + y + ^^^^ +Error: This pattern was expected to match values of type "int * int", + but it is missing an unlabeled component. +|}] + +let f (~x,y : (int * x:int)) : int = x + y +[%%expect{| +val f : int * x:int -> int = +|}] + +(* Annotation within pattern *) +let f (~(x:int),y : (x:int * int)) : int = x + y +[%%expect{| +val f : (x:int * int) -> int = +|}] + +let f (~(x:int),y) = x + y +[%%expect{| +val f : (x:int * int) -> int = +|}] + +let f (~x:(x0:int),y) = x0 + y +[%%expect{| +val f : (x:int * int) -> int = +|}] + +(* Misannotation within pattern *) +let f (~(x:float),y) = x + y +[%%expect{| +Line 1, characters 23-24: +1 | let f (~(x:float),y) = x + y + ^ +Error: The value "x" has type "float" but an expression was expected of type "int" +|}] +(* Reordering in functions *) +type xy = (x:int * y:int) +type yx = (y:int * x:int) +let xy_id (pt : xy) = pt +let yx_id (pt : yx) = pt +[%%expect{| +type xy = x:int * y:int +type yx = y:int * x:int +val xy_id : xy -> xy = +val yx_id : yx -> yx = +|}] + +let xy_id (~y, ~x) : xy = ~x, ~y +[%%expect{| +val xy_id : (y:int * x:int) -> xy = +|}] + + +let swap (~x, ~y) = ~y, ~x +[%%expect{| +val swap : (x:'a * y:'b) -> y:'b * x:'a = +|}] + +let swap (~y, ~x : xy) = ~y, ~x +[%%expect{| +val swap : xy -> y:int * x:int = +|}] + +let swap (~x, ~y) = (~x, ~y : yx) +[%%expect{| +Line 1, characters 21-27: +1 | let swap (~x, ~y) = (~x, ~y : yx) + ^^^^^^ +Error: This expression has type "x:'a * y:'b" + but an expression was expected of type "yx" = "y:int * x:int" + Labels "x" and "y" do not match +|}] + +let swap (pt : xy) : yx = pt +[%%expect{| +Line 1, characters 26-28: +1 | let swap (pt : xy) : yx = pt + ^^ +Error: The value "pt" has type "xy" = "x:int * y:int" + but an expression was expected of type "yx" = "y:int * x:int" + Labels "x" and "y" do not match +|}] + +let swap : xy -> yx = Fun.id +[%%expect{| +Line 1, characters 22-28: +1 | let swap : xy -> yx = Fun.id + ^^^^^^ +Error: The value "Fun.id" has type "xy -> xy" + but an expression was expected of type "xy -> yx" + Type "xy" = "x:int * y:int" is not compatible with type "yx" = "y:int * x:int" + Labels "x" and "y" do not match +|}] + +let swap : xy -> yx = xy_id +[%%expect{| +Line 1, characters 22-27: +1 | let swap : xy -> yx = xy_id + ^^^^^ +Error: The value "xy_id" has type "(y:int * x:int) -> xy" + but an expression was expected of type "xy -> yx" + Type "y:int * x:int" is not compatible with type "xy" = "x:int * y:int" + Labels "y" and "x" do not match +|}] + +let swap : xy -> yx = yx_id +[%%expect{| +Line 1, characters 22-27: +1 | let swap : xy -> yx = yx_id + ^^^^^ +Error: The value "yx_id" has type "yx -> yx" + but an expression was expected of type "xy -> yx" + Type "yx" = "y:int * x:int" is not compatible with type "xy" = "x:int * y:int" + Labels "y" and "x" do not match +|}] + +(* Reordering and partial matches *) +let lt = ~x:1, 2, ~y:3, ~z:4, 5, 6 + +(* Full match, in order *) +let matches = + let ~x, k1, ~y, ~z, k2, k3 = lt in + x, k1, y, z, k2, k3 +[%%expect{| +val lt : x:int * int * y:int * z:int * int * int = + (~x:1, 2, ~y:3, ~z:4, 5, 6) +val matches : int * int * int * int * int * int = (1, 2, 3, 4, 5, 6) +|}] + +(* Full match, over-bound *) +let matches = + let ~x, k1, ~y, ~z, x, k3 = lt in + () +[%%expect{| +Line 2, characters 22-23: +2 | let ~x, k1, ~y, ~z, x, k3 = lt in + ^ +Error: Variable "x" is bound several times in this matching +|}] + +let matches = + let ~x, k1, ~y, ~z:x, k2, k3 = lt in + () +[%%expect{| +Line 2, characters 21-22: +2 | let ~x, k1, ~y, ~z:x, k2, k3 = lt in + ^ +Error: Variable "x" is bound several times in this matching +|}] + +(* Full match, missing label *) +let matches = + let ~x, k1, ~y, k2, k3 = lt in + () +[%%expect{| +Line 2, characters 6-24: +2 | let ~x, k1, ~y, k2, k3 = lt in + ^^^^^^^^^^^^^^^^^^ +Error: This pattern was expected to match values of type + "x:int * int * y:int * z:int * int * int", + but it is missing a component with label "z". + Hint: use .. to ignore some components. +|}] + +(* Full match, wrong label *) +let matches = + let ~x, k1, ~y, ~w, k2, k3 = lt in + () +[%%expect{| +Line 2, characters 6-28: +2 | let ~x, k1, ~y, ~w, k2, k3 = lt in + ^^^^^^^^^^^^^^^^^^^^^^ +Error: This pattern was expected to match values of type + "x:int * int * y:int * z:int * int * int", + but it is missing a component with label "z". + Hint: use .. to ignore some components. +|}] + +(* Full match, extra label *) +let matches = + let ~x, k1, ~y, ~z, ~w, k2, k3 = lt in + () +[%%expect{| +Line 2, characters 6-32: +2 | let ~x, k1, ~y, ~z, ~w, k2, k3 = lt in + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: This pattern was expected to match values of type + "x:int * int * y:int * z:int * int * int", + but it contains an extra component with label "w". +|}] + +(* Full match, extra unlabeled label *) +let matches = + let ~x, k1, ~y, ~z, k2, k3, k4 = lt in + x, y, z +[%%expect{| +Line 2, characters 6-32: +2 | let ~x, k1, ~y, ~z, k2, k3, k4 = lt in + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: This pattern was expected to match values of type + "x:int * int * y:int * z:int * int * int", + but it contains an extra unlabeled component. +|}] + +(* Partial match *) +let matches = + let ~x, ~z, .. = lt in + x, z +[%%expect{| +val matches : int * int = (1, 4) +|}] + +(* Partial match, reordered *) +let matches = + let ~z, ~x, .. = lt in + x, z +[%%expect{| +val matches : int * int = (1, 4) +|}] + +(* Partial match, reordered, over-bound *) +let matches = + let ~z:x, ~x, .. = lt in + x +[%%expect{| +Line 2, characters 9-10: +2 | let ~z:x, ~x, .. = lt in + ^ +Error: Variable "x" is bound several times in this matching +|}] + +(* Partial match one *) +let matches = + let ~z, .. = lt in + z +[%%expect{| +val matches : int = 4 +|}] + +(* Partial match all *) +let matches = + let ~x, k1, ~y, ~z, k2, k3, .. = lt in + x, k1, y, z, k2, k3 +[%%expect{| +Line 2, characters 7-33: +2 | let ~x, k1, ~y, ~z, k2, k3, .. = lt in + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +Warning 75 [unnecessarily-partial-tuple-pattern]: This tuple pattern + unnecessarily ends in "..", as it explicitly matches all components of its + expected type. + +val matches : int * int * int * int * int * int = (1, 2, 3, 4, 5, 6) +|}] + +(* Partial match bad name *) +let matches = + let ~w, ~y, ~x, .. = lt in + () +[%%expect{| +Line 2, characters 7-21: +2 | let ~w, ~y, ~x, .. = lt in + ^^^^^^^^^^^^^^ +Error: This pattern was expected to match values of type + "x:int * int * y:int * z:int * int * int", + but it contains an extra component with label "w". +|}] + +(* Nested pattern *) +let f (z, (~y, ~x)) = x, y, z +[%%expect{| +val f : 'a * (y:'b * x:'c) -> 'c * 'b * 'a = +|}] + +(* Non-principally known patterns *) + +let f (z, (~y, ~x, ..)) = x, y, z +[%%expect{| +Line 1, characters 10-22: +1 | let f (z, (~y, ~x, ..)) = x, y, z + ^^^^^^^^^^^^ +Error: Could not determine the type of this partial tuple pattern. +|}] + +let f (~x, ~y, ..) = x, y +[%%expect{| +Line 1, characters 6-18: +1 | let f (~x, ~y, ..) = x, y + ^^^^^^^^^^^^ +Error: Could not determine the type of this partial tuple pattern. +|}] + +(* Labeled tuples nested in records *) + +let x = ref (~x:1, ~y:2, 3, ~z:4) + +(* Good match *) +let _1234 = match x with +| { contents = ~x:x0, ~y, w, ~z:x } -> x0, y, w, x +[%%expect{| +val x : (x:int * y:int * int * z:int) ref = + {contents = (~x:1, ~y:2, 3, ~z:4)} +val _1234 : int * int * int * int = (1, 2, 3, 4) +|}] + +(* Good partial match *) +let _1 = match x with +| { contents = ~y, ..} -> y +[%%expect{| +val _1 : int = 2 +|}] + +(* Wrong label *) +let () = match x with +| { contents = ~w , .. } -> w +[%%expect{| +Line 2, characters 15-22: +2 | | { contents = ~w , .. } -> w + ^^^^^^^ +Error: This pattern was expected to match values of type + "x:int * y:int * int * z:int", + but it contains an extra component with label "w". +|}] + +(* Missing unlabeled element *) +let () = match x with +| { contents = ~x, ~y, ~z } -> y +[%%expect{| +Line 2, characters 15-25: +2 | | { contents = ~x, ~y, ~z } -> y + ^^^^^^^^^^ +Error: This pattern was expected to match values of type + "x:int * y:int * int * z:int", but it is missing an unlabeled component. +|}] + +(* Extra unlabeled element *) +let () = match x with +| { contents = ~x, ~y, w1, ~z, w2 } -> y +[%%expect{| +Line 2, characters 15-33: +2 | | { contents = ~x, ~y, w1, ~z, w2 } -> y + ^^^^^^^^^^^^^^^^^^ +Error: This pattern was expected to match values of type + "x:int * y:int * int * z:int", + but it contains an extra unlabeled component. +|}] + +(* Extra unlabeled element, open *) +let () = match x with +| { contents = ~x, ~y, w1, ~z, w2, .. } -> y +[%%expect{| +Line 2, characters 15-37: +2 | | { contents = ~x, ~y, w1, ~z, w2, .. } -> y + ^^^^^^^^^^^^^^^^^^^^^^ +Error: This pattern was expected to match values of type + "x:int * y:int * int * z:int", + but it contains an extra unlabeled component. +|}] + +(* Missing label *) +let () = match x with +| { contents = ~x, ~y, w } -> y +[%%expect{| +Line 2, characters 15-24: +2 | | { contents = ~x, ~y, w } -> y + ^^^^^^^^^ +Error: This pattern was expected to match values of type + "x:int * y:int * int * z:int", + but it is missing a component with label "z". + Hint: use .. to ignore some components. +|}] + +(* Extra label *) +let () = match x with +| { contents = ~z, ~y, ~w, ~x } -> y +[%%expect{| +Line 2, characters 15-29: +2 | | { contents = ~z, ~y, ~w, ~x } -> y + ^^^^^^^^^^^^^^ +Error: This pattern was expected to match values of type + "x:int * y:int * int * z:int", but it is missing an unlabeled component. +|}] + +(* Behavior w.r.t whether types are principally known *) + +let f (z : (x:_ * y:_)) = + match z with + | ~y, ~x -> x + y +[%%expect{| +val f : (x:int * y:int) -> int = +|}] + +let f = function ~x, ~y -> x + y + +let g z = + (f z, match z with ~y, ~x -> x + y) +[%%expect{| +val f : (x:int * y:int) -> int = +val g : (x:int * y:int) -> int * int = +|}, Principal{| +val f : (x:int * y:int) -> int = +Line 4, characters 21-27: +4 | (f z, match z with ~y, ~x -> x + y) + ^^^^^^ +Error: This pattern matches values of type "y:'a * x:'b" + but a pattern was expected which matches values of type "x:int * y:int" + Labels "y" and "x" do not match +|}] + +let f = function ~x, ~y -> x + y + +let g z = + match z with ~y, ~x -> x + y, f z +[%%expect{| +val f : (x:int * y:int) -> int = +Line 4, characters 34-35: +4 | match z with ~y, ~x -> x + y, f z + ^ +Error: The value "z" has type "y:int * x:int" + but an expression was expected of type "x:int * y:int" + Labels "y" and "x" do not match +|}] + +(* More re-ordering stress tests *) +type t = + x1:int * + y2:int * + int * + x4:int * + x5:int * + y6:int * + y7:int * + int * + int * + y10:int * + x11:int + +let t : t = ~x1:1, ~y2:2, 3, ~x4:4, ~x5:5, ~y6:6, ~y7:7, 8, 9, ~y10:10, ~x11:11 + +let _ = + let (~y2, ~y7, ~y10, ..) = t in + y2, y7, y10 +[%%expect{| +type t = + x1:int * y2:int * int * x4:int * x5:int * y6:int * y7:int * int * + int * y10:int * x11:int +val t : t = + (~x1:1, ~y2:2, 3, ~x4:4, ~x5:5, ~y6:6, ~y7:7, 8, 9, ~y10:10, ~x11:11) +- : int * int * int = (2, 7, 10) +|}] + +let _ = + let (a, b, c, ..) = t in + (a, b, c) +[%%expect{| +- : int * int * int = (3, 8, 9) +|}] + +let _ = + let (n3, ~y6:n6, ~y7, ~x1:n1, ..) = t in + (n1, n6, n3, y7) +[%%expect{| +- : int * int * int * int = (1, 6, 3, 7) +|}] + +let _ = + let (~x4, ~x1, ~x11, ~x5, ..) = t in + (x1, x4, x5, x11) +[%%expect{| +- : int * int * int * int = (1, 4, 5, 11) +|}] + +let _ = + let (~y2:n2, ~y6:n6, n3, ~x1:n1, ~y7:n7, n8, + ~y10:n10, ~x4:n4, ~x5:n5, ~x11:n11, n9) = + t + in + (n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11) +[%%expect{| +- : int * int * int * int * int * int * int * int * int * int * int = +(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11) +|}] + +let _ = + let (n3, n8, n9, ~y2:n2, ~y6:n6, ~y7:n7, + ~y10:n10, ~x1:n1, ~x4:n4, ~x5:n5, ~x11:n11) = + t + in + (n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11) +[%%expect{| +- : int * int * int * int * int * int * int * int * int * int * int = +(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11) +|}] + +let _ = + let (~x1:n1, ~y2:n2, n3, ~x4:n4, ~x5:n5, + ~y6:n6, ~y7:n7, n8, n9, ~y10:n10, ~x11:n11) = + t + in + (n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11) +[%%expect{| +- : int * int * int * int * int * int * int * int * int * int * int = +(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11) +|}] diff --git a/testsuite/tests/typing-labeled-tuples/labeled_tuples.ml b/testsuite/tests/typing-labeled-tuples/labeled_tuples.ml new file mode 100644 index 00000000..38f5b484 --- /dev/null +++ b/testsuite/tests/typing-labeled-tuples/labeled_tuples.ml @@ -0,0 +1,569 @@ +(* TEST + expect; +*) + +(* Basic expressions *) +let x = ~x:1, ~y:2 + +[%%expect{| +val x : x:int * y:int = (~x:1, ~y:2) +|}];; + +let z = 5 +let punned = 2 +let _ = ~x: 5, 2, ~z, ~(punned:int) +[%%expect{| +val z : int = 5 +val punned : int = 2 +- : x:int * int * z:int * punned:int = (~x:5, 2, ~z:5, ~punned:2) +|}] + +(* Basic annotations *) +let (x : x:int * y:int) = ~x:1, ~y:2 +[%%expect{| +val x : x:int * y:int = (~x:1, ~y:2) +|}] + +let (x : x:int * int) = ~x:1, 2 +[%%expect{| +val x : x:int * int = (~x:1, 2) +|}] + +(* Incorrect annotations *) +let (x : int * int) = ~x:1, 2 +[%%expect{| +Line 1, characters 22-29: +1 | let (x : int * int) = ~x:1, 2 + ^^^^^^^ +Error: This expression has type "x:'a * 'b" + but an expression was expected of type "int * int" + The first tuple element is labeled "x", + but an unlabeled element was expected +|}] + +let (x : x:string * int) = ~x:1, 2 +[%%expect{| +Line 1, characters 30-31: +1 | let (x : x:string * int) = ~x:1, 2 + ^ +Error: The constant "1" has type "int" but an expression was expected of type + "string" +|}] + +let (x : int * y:int) = ~x:1, 2 +[%%expect{| +Line 1, characters 24-31: +1 | let (x : int * y:int) = ~x:1, 2 + ^^^^^^^ +Error: This expression has type "x:'a * 'b" + but an expression was expected of type "int * y:int" + The first tuple element is labeled "x", + but an unlabeled element was expected +|}] + +(* Happy case *) +let foo b = if b then + ~a: "s", 10, ~c: "hi" +else + ~a: "5", 10, ~c: "hi" +[%%expect{| +val foo : bool -> a:string * int * c:string = +|}] + +(* Missing label (the type vars in the error aren't ideal, but the same thing + happens when unifying normal tuples of different lengths) *) +let foo b = if b then + ~a: "s", 10, "hi" +else + ~a: "5", 10, ~c: "hi" +[%%expect{| +Line 4, characters 3-24: +4 | ~a: "5", 10, ~c: "hi" + ^^^^^^^^^^^^^^^^^^^^^ +Error: This expression has type "a:string * int * c:'a" + but an expression was expected of type "a:string * int * string" + The first tuple element is labeled "c", + but an unlabeled element was expected +|}] + +(* Missing labeled component *) +let foo b = if b then + ~a: "s", 10 +else + ~a: "5", 10, ~c: "hi" +[%%expect{| +Line 4, characters 3-24: +4 | ~a: "5", 10, ~c: "hi" + ^^^^^^^^^^^^^^^^^^^^^ +Error: This expression has type "a:'a * 'b * c:'c" + but an expression was expected of type "a:string * int" +|}] + +(* Wrong label *) +let foo b = if b then + ~a: "s", 10, ~b: "hi" +else + ~a: "5", 10, ~c: "hi" +[%%expect{| +Line 4, characters 3-24: +4 | ~a: "5", 10, ~c: "hi" + ^^^^^^^^^^^^^^^^^^^^^ +Error: This expression has type "a:string * int * c:'a" + but an expression was expected of type "a:string * int * b:string" + Labels "c" and "b" do not match +|}] + +(* Repeated labels *) +type t = x:int * bool * x:int +[%%expect{| +Line 1, characters 9-29: +1 | type t = x:int * bool * x:int + ^^^^^^^^^^^^^^^^^^^^ +Error: This tuple type has two labels named "x" +|}] + +let _ = 1, ~x:2, 3, ~x:4 +[%%expect{| +Line 1, characters 8-24: +1 | let _ = 1, ~x:2, 3, ~x:4 + ^^^^^^^^^^^^^^^^ +Error: This tuple expression has two labels named "x" +|}] + +let f (a, ~x, b, ~x:c) = () +[%%expect{| +Line 1, characters 6-22: +1 | let f (a, ~x, b, ~x:c) = () + ^^^^^^^^^^^^^^^^ +Error: This tuple pattern has two labels named "x" +|}] + +(* Types in function argument/return *) +let default = ~x: 1, ~y: 2 +let choose_pt replace_with_default pt = + if replace_with_default then + default + else + pt +[%%expect{| +val default : x:int * y:int = (~x:1, ~y:2) +val choose_pt : bool -> (x:int * y:int) -> x:int * y:int = +|}] + +(* Application happy case *) +let a = choose_pt true (~x: 5, ~y: 6) +[%%expect{| +val a : x:int * y:int = (~x:1, ~y:2) +|}] + +(* Wrong order *) +let a = choose_pt true (~y: 6, ~x: 5) +[%%expect{| +Line 1, characters 23-37: +1 | let a = choose_pt true (~y: 6, ~x: 5) + ^^^^^^^^^^^^^^ +Error: This expression has type "y:'a * x:'b" + but an expression was expected of type "x:int * y:int" + Labels "y" and "x" do not match +|}] + +(* Mutually-recursive definitions *) +let rec a = 1, ~lbl:b +and b = 2, ~lbl:a +[%%expect{| +Line 2, characters 16-17: +2 | and b = 2, ~lbl:a + ^ +Error: The value "a" has type "int * lbl:(int * lbl:'a)" + but an expression was expected of type "'a" + The type variable "'a" occurs inside "int * lbl:(int * lbl:'a)" +|}] + +let rec l = ~lbl: 5, ~lbl2: 10 :: l +[%%expect{| +val l : (lbl:int * lbl2:int) list = [(~lbl:5, ~lbl2:10); ] +|}] + +(* Tuple containing labeled tuples *) +let tup = (~a:1, ~b:2), (~b:3, ~a:4), 5 +[%%expect{| +val tup : (a:int * b:int) * (b:int * a:int) * int = + ((~a:1, ~b:2), (~b:3, ~a:4), 5) +|}] + +(* Polymorphic variant containing labeled tuple *) +let a = `Some (~a: 1, ~b:2, 3) +[%%expect{| +val a : [> `Some of a:int * b:int * int ] = `Some (~a:1, ~b:2, 3) +|}] + +(* List of labeled tuples *) +let lst = ~a: 1, ~b: 2 :: [] +[%%expect{| +val lst : (a:int * b:int) list = [(~a:1, ~b:2)] +|}] + +(* Ref of labeled tuple *) +let x = ref (~x:"hello", 5) +[%%expect{| +val x : (x:string * int) ref = {contents = (~x:"hello", 5)} +|}] + +(* Polymorphic record containing a labeled tuple *) +type 'a box = {thing: 'a} +let boxed = {thing = "hello", ~x:5} +[%%expect{| +type 'a box = { thing : 'a; } +val boxed : (string * x:int) box = {thing = ("hello", ~x:5)} +|}] + +(* Punned tuple components with type annotations. *) +let x = 42 +let y = "hi" + +let z = ~x, ~(y:string);; +[%%expect{| +val x : int = 42 +val y : string = "hi" +val z : x:int * y:string = (~x:42, ~y:"hi") +|}];; + +let z = ~(x:int), ~y:"baz";; +[%%expect{| +val z : x:int * y:string = (~x:42, ~y:"baz") +|}];; + +let z = ~(x:string), ~y:"baz";; +[%%expect{| +Line 1, characters 10-11: +1 | let z = ~(x:string), ~y:"baz";; + ^ +Error: The value "x" has type "int" but an expression was expected of type "string" +|}];; + +(* Take a [a:'a * b:'a] and an int, and returns a + [swapped:[a:'a * b:'a] * same:bool]. + The swapped component is the input with the [a] and [b] components swapped + as many times as the input int. The second component is whether the first + equals the input. *) +let rec swap (~a, ~b) = + function + | 0 -> ~swapped:(~a, ~b), ~same:true + | n -> swap' (~a:b, ~b:a) (n-1) +and swap' (~a, ~b) = + function + | 0 -> ~swapped:(~a, ~b), ~same:false + | n -> swap (~a:b, ~b:a) (n-1) +[%%expect{| +val swap : (a:'a * b:'a) -> int -> swapped:(a:'a * b:'a) * same:bool = +val swap' : (a:'a * b:'a) -> int -> swapped:(a:'a * b:'a) * same:bool = +|}] + +let foobar = swap (~a:"foo", ~b:"bar") 86 +let barfoo = swap (~a:"foo", ~b:"bar") 87 +[%%expect{| +val foobar : swapped:(a:string * b:string) * same:bool = + (~swapped:(~a:"foo", ~b:"bar"), ~same:true) +val barfoo : swapped:(a:string * b:string) * same:bool = + (~swapped:(~a:"bar", ~b:"foo"), ~same:false) +|}] + +(* Labeled tuple type annotations *) +(* Bad type *) +let x: string * a:int * int = ~lbl:5, "hi" +[%%expect{| +Line 1, characters 30-42: +1 | let x: string * a:int * int = ~lbl:5, "hi" + ^^^^^^^^^^^^ +Error: This expression has type "lbl:'a * 'b" + but an expression was expected of type "string * a:int * int" +|}] + +(* Well-typed *) +let x: string * a:int * int = "hi", ~a:1, 2 +[%%expect{| +val x : string * a:int * int = ("hi", ~a:1, 2) +|}] + +(* Function type *) +let mk_x : (foo:unit * bar:unit) -> string * a:int * int = fun _ -> x +[%%expect{| +val mk_x : (foo:unit * bar:unit) -> string * a:int * int = +|}] + +let x = mk_x (~foo:(), ~bar:()) +[%%expect{| +val x : string * a:int * int = ("hi", ~a:1, 2) +|}] + +(* Labeled tuples in records *) + +type bad_t = {x : lbl:bad_type * int} +[%%expect{| +Line 1, characters 22-30: +1 | type bad_t = {x : lbl:bad_type * int} + ^^^^^^^^ +Error: Unbound type constructor "bad_type" +Hint: Did you mean "bad_t"? +|}] + +type tx = { x : foo:int * bar:int } +type tx_unlabeled = { x : int * int } +[%%expect{| +type tx = { x : foo:int * bar:int; } +type tx_unlabeled = { x : int * int; } +|}] + + +let _ = { x = ~foo:1, ~bar:2} +[%%expect{| +Line 1, characters 14-28: +1 | let _ = { x = ~foo:1, ~bar:2} + ^^^^^^^^^^^^^^ +Error: This expression has type "foo:'a * bar:'b" + but an expression was expected of type "int * int" + The first tuple element is labeled "foo", + but an unlabeled element was expected +|}] + +let _ : tx = { x = ~foo:1, ~bar:2 } +[%%expect{| +- : tx = {x = (~foo:1, ~bar:2)} +|}] + +let _ : tx = {x = 1, ~bar:2} +[%%expect{| +Line 1, characters 18-27: +1 | let _ : tx = {x = 1, ~bar:2} + ^^^^^^^^^ +Error: This expression has type "'a * bar:'b" + but an expression was expected of type "foo:int * bar:int" + A label "foo" was expected +|}] + +let _ : tx = { x = ~foo:1, 2} +[%%expect{| +Line 1, characters 19-28: +1 | let _ : tx = { x = ~foo:1, 2} + ^^^^^^^^^ +Error: This expression has type "foo:int * 'a" + but an expression was expected of type "foo:int * bar:int" + A label "bar" was expected +|}] + +let _ : tx = { x = 1, 2} +[%%expect{| +Line 1, characters 19-23: +1 | let _ : tx = { x = 1, 2} + ^^^^ +Error: This expression has type "'a * 'b" + but an expression was expected of type "foo:int * bar:int" + A label "foo" was expected +|}] + +let _ = { x = 1, 2 } +[%%expect{| +- : tx_unlabeled = {x = (1, 2)} +|}] + +(* Module inclusion *) + +module IntString : sig + type t + val mk : (x: int * string) -> t + val unwrap : t -> x:int * string +end = struct + type t = string * x:int + let mk (~x, s) = s, ~x + let unwrap (s, ~x) = ~x, s +end +[%%expect{| +module IntString : + sig + type t + val mk : (x:int * string) -> t + val unwrap : t -> x:int * string + end +|}] + +module Stringable = struct + module type Has_unwrap = sig + type t + val unwrap : t -> x: int * string + end + + module type Has_to_string = sig + include Has_unwrap + val to_string : t -> string + end + + module Make (M : Has_unwrap) : Has_to_string with type t := M.t = struct + include M + let to_string int_string = + let (~x, s) = unwrap int_string in + (Int.to_string x) ^ " " ^ s + end +end +[%%expect{| +module Stringable : + sig + module type Has_unwrap = sig type t val unwrap : t -> x:int * string end + module type Has_to_string = + sig + type t + val unwrap : t -> x:int * string + val to_string : t -> string + end + module Make : + (M : Has_unwrap) -> + sig + val unwrap : M.t -> x:int * string + val to_string : M.t -> string + end + end +|}] + +module StringableIntString = struct + module T = struct + include IntString + end + include T + include Stringable.Make(T) +end +[%%expect{| +module StringableIntString : + sig + module T : + sig + type t = IntString.t + val mk : (x:int * string) -> t + val unwrap : t -> x:int * string + end + type t = IntString.t + val mk : (x:int * string) -> t + val unwrap : T.t -> x:int * string + val to_string : T.t -> string + end +|}] + +let _ = StringableIntString.to_string (StringableIntString.mk (~x:1, "hi")) +[%%expect{| +- : string = "1 hi" +|}] + +module M : sig + val f : (x:int * string) -> x:int * string + val mk : unit -> x:bool * y:string +end = struct + let f x = x + let mk () = ~x:false, ~y:"hi" +end + +(* Module inclusion failure *) +module X_int_int = struct + type t = x:int * int +end +[%%expect{| +module M : + sig + val f : (x:int * string) -> x:int * string + val mk : unit -> x:bool * y:string + end +module X_int_int : sig type t = x:int * int end +|}] + +module Y_int_int : sig + type t = y:int * int +end = struct + include X_int_int +end +[%%expect{| +Lines 3-5, characters 6-3: +3 | ......struct +4 | include X_int_int +5 | end +Error: Signature mismatch: + Modules do not match: + sig type t = x:int * int end + is not included in + sig type t = y:int * int end + Type declarations do not match: + type t = x:int * int + is not included in + type t = y:int * int + The type "x:int * int" is not equal to the type "y:int * int" +|}] + +module Int_int : sig + type t = int * int +end = X_int_int +[%%expect{| +Line 3, characters 6-15: +3 | end = X_int_int + ^^^^^^^^^ +Error: Signature mismatch: + Modules do not match: + sig type t = x:int * int end + is not included in + sig type t = int * int end + Type declarations do not match: + type t = x:int * int + is not included in + type t = int * int + The type "x:int * int" is not equal to the type "int * int" +|}] + +(* Recursive modules *) +module rec Tree : sig + type t = Leaf of string | Branch of string * TwoTrees.t + val in_order : t -> string list +end = struct + type t = Leaf of string | Branch of string * TwoTrees.t + let rec in_order = function + | Leaf s -> [s] + | Branch (s, (~left, ~right)) -> (in_order left) @ [s] @ (in_order right) +end +and TwoTrees : sig + type t = left:Tree.t * right:Tree.t +end = struct + type t = left:Tree.t * right:Tree.t +end +[%%expect{| +module rec Tree : + sig + type t = Leaf of string | Branch of string * TwoTrees.t + val in_order : t -> string list + end +and TwoTrees : sig type t = left:Tree.t * right:Tree.t end +|}] + +let leaf s = Tree.Leaf s +let tree_abc = Tree.Branch ("b", (~left:(leaf "a"), ~right:(leaf "c"))) +let tree_abcde = Tree.Branch ("d", (~left:tree_abc, ~right:(leaf "e"))) +let _ = Tree.in_order tree_abcde +[%%expect{| +val leaf : string -> Tree.t = +val tree_abc : Tree.t = + Tree.Branch ("b", (~left:Tree.Leaf "a", ~right:Tree.Leaf "c")) +val tree_abcde : Tree.t = + Tree.Branch ("d", + (~left:Tree.Branch ("b", (~left:Tree.Leaf "a", ~right:Tree.Leaf "c")), + ~right:Tree.Leaf "e")) +- : string list = ["a"; "b"; "c"; "d"; "e"] +|}] + +(* Motivating example *) +let sum_and_product ints = + let init = ~sum:0, ~product:1 in + List.fold_left (fun (~sum, ~product) elem -> + let sum = elem + sum in + let product = elem * product in + ~sum, ~product + ) init ints +let _ = sum_and_product [1;2;3;4] +let _ = sum_and_product [1;-10;2;] +[%%expect{| +val sum_and_product : int list -> sum:int * product:int = +- : sum:int * product:int = (~sum:10, ~product:24) +- : sum:int * product:int = (~sum:-7, ~product:-20) +|}] diff --git a/testsuite/tests/typing-labeled-tuples/labeled_tuples_and_constructors.ml b/testsuite/tests/typing-labeled-tuples/labeled_tuples_and_constructors.ml new file mode 100644 index 00000000..ce84357f --- /dev/null +++ b/testsuite/tests/typing-labeled-tuples/labeled_tuples_and_constructors.ml @@ -0,0 +1,88 @@ +(* TEST + expect; +*) + +(* Constructor with labeled arguments (disallowed) *) + +type ('a, 'b) pair = Pair of 'a * 'b +let x = Pair (~x: 5, 2) + +[%%expect{| +type ('a, 'b) pair = Pair of 'a * 'b +Line 2, characters 8-23: +2 | let x = Pair (~x: 5, 2) + ^^^^^^^^^^^^^^^ +Error: Constructors cannot have labeled arguments. + Consider using an inline record instead. +|}] + +(* Labeled tuple pattern in constructor pattern, with the same arity as the + constructor. This is intentionally disallowed. *) +let f = function +| Pair (~x:5, 2) -> true +| _ -> false +[%%expect{| +Line 2, characters 2-16: +2 | | Pair (~x:5, 2) -> true + ^^^^^^^^^^^^^^ +Error: Constructors cannot have labeled arguments. + Consider using an inline record instead. +|}] + +(* Labeled tuple patterns in constructor patterns with that can unify with the + constructor pattern type. *) +let f = function +| Some (~x:5, 2) -> true +| _ -> false +[%%expect{| +val f : (x:int * int) option -> bool = +|}] + + +type t = Foo of (x:int * int) +let f = function +| Foo (~x:5, 2) -> true +| _ -> false +[%%expect{| +type t = Foo of (x:int * int) +val f : t -> bool = +|}] + +let _ = f (Foo (~x:5,2)) +let _ = f (Foo (~x:4,2)) +let _ = f (Foo (~x:5,1)) +[%%expect{| +- : bool = true +- : bool = false +- : bool = false +|}] + +let _ = f (Foo (5,1)) +[%%expect{| +Line 1, characters 15-20: +1 | let _ = f (Foo (5,1)) + ^^^^^ +Error: This expression has type "'a * 'b" + but an expression was expected of type "x:int * int" + A label "x" was expected +|}] + +let _ = f (Foo (5,~x:1)) +[%%expect{| +Line 1, characters 15-23: +1 | let _ = f (Foo (5,~x:1)) + ^^^^^^^^ +Error: This expression has type "'a * x:'b" + but an expression was expected of type "x:int * int" + A label "x" was expected +|}] + +let _ = f (Foo (5,~y:1)) +[%%expect{| +Line 1, characters 15-23: +1 | let _ = f (Foo (5,~y:1)) + ^^^^^^^^ +Error: This expression has type "'a * y:'b" + but an expression was expected of type "x:int * int" + A label "x" was expected +|}] diff --git a/testsuite/tests/typing-labeled-tuples/labeled_tuples_dsource.ml b/testsuite/tests/typing-labeled-tuples/labeled_tuples_dsource.ml new file mode 100644 index 00000000..851e1ce9 --- /dev/null +++ b/testsuite/tests/typing-labeled-tuples/labeled_tuples_dsource.ml @@ -0,0 +1,33 @@ +(* TEST + flags += "-dsource"; + expect; +*) +let x = ~x:1, ~y:2 +[%%expect{| + +let x = (~x:1, ~y:2);; +val x : x:int * y:int = (~x:1, ~y:2) +|}] + +(* Attribute should prevent punning *) +let z = 5 +let y = ~z, ~z':z, ~z1:(z [@attr]) +[%%expect{| + +let z = 5;; +val z : int = 5 + +let y = (~z, ~z':z, ~z1:((z)[@attr ]));; +val y : z:int * z':int * z1:int = (~z:5, ~z':5, ~z1:5) +|}] + +let (~x:x0, ~s, ~(y:int), ..) : x:int * s:string * y:int * string = + ~x: 1, ~s: "a", ~y: 2, "ignore me" +[%%expect{| + +let (~x:x0, ~s, ~y:(y : int), ..) : (x:int * s:string * y:int * string) = + (~x:1, ~s:"a", ~y:2, "ignore me");; +val x0 : int = 1 +val s : string = "a" +val y : int = 2 +|}] diff --git a/testsuite/tests/typing-misc-bugs/pr6303_bad.compilers.reference b/testsuite/tests/typing-misc-bugs/pr6303_bad.compilers.reference index 0ac56bd3..4015458e 100644 --- a/testsuite/tests/typing-misc-bugs/pr6303_bad.compilers.reference +++ b/testsuite/tests/typing-misc-bugs/pr6303_bad.compilers.reference @@ -1,6 +1,6 @@ File "pr6303_bad.ml", line 11, characters 22-23: 11 | let r' : string foo = r ^ -Error: The value "r" has type "int foo" but an expression was expected of type - "string foo" - Type "int" is not compatible with type "string" +Error: The value r has type int foo but an expression was expected of type + string foo + Type int is not compatible with type string diff --git a/testsuite/tests/typing-misc-bugs/pr6946_bad.compilers.reference b/testsuite/tests/typing-misc-bugs/pr6946_bad.compilers.reference index 1f13792f..608d9a23 100644 --- a/testsuite/tests/typing-misc-bugs/pr6946_bad.compilers.reference +++ b/testsuite/tests/typing-misc-bugs/pr6946_bad.compilers.reference @@ -1,5 +1,5 @@ File "pr6946_bad.ml", line 10, characters 8-11: 10 | let _ = foo ();; ^^^ -Error: This expression has type "int" +Error: This expression has type int This is not a function; it cannot be applied. diff --git a/testsuite/tests/typing-misc/build_as_type.ml b/testsuite/tests/typing-misc/build_as_type.ml index 6d98c8e9..e4e1c2e4 100644 --- a/testsuite/tests/typing-misc/build_as_type.ml +++ b/testsuite/tests/typing-misc/build_as_type.ml @@ -73,8 +73,7 @@ Lines 5-7, characters 4-7: 6 | | `A -> () 7 | end Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -`B + Here is an example of a case that is not matched: "`B" val f : t -> unit = |}] @@ -130,8 +129,7 @@ Lines 5-7, characters 4-7: 6 | | `A -> () 7 | end Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -`B + Here is an example of a case that is not matched: "`B" val f : t -> unit = |}] @@ -151,8 +149,7 @@ Lines 5-7, characters 4-7: 6 | | `A -> () 7 | end Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -`B + Here is an example of a case that is not matched: "`B" val f : t -> unit = |}] diff --git a/testsuite/tests/typing-misc/coerce_principal.ml b/testsuite/tests/typing-misc/coerce_principal.ml new file mode 100644 index 00000000..2bd71337 --- /dev/null +++ b/testsuite/tests/typing-misc/coerce_principal.ml @@ -0,0 +1,18 @@ +(* TEST + expect; +*) + +type t1 = A +type t2 = A + +[%%expect{| +type t1 = A +type t2 = A +|}] + +let f x = match (x :> t1) with + | A -> 1 + +[%%expect{| +val f : t1 -> int = +|}] diff --git a/testsuite/tests/typing-misc/constraints.ml b/testsuite/tests/typing-misc/constraints.ml index 01b7e41b..5f09a6c1 100644 --- a/testsuite/tests/typing-misc/constraints.ml +++ b/testsuite/tests/typing-misc/constraints.ml @@ -1,5 +1,6 @@ (* TEST - expect; + flags = "-i-variance"; + expect; *) type 'a t = [`A of 'a t t] as 'a;; (* fails *) @@ -50,9 +51,9 @@ Error: The definition of "t" contains a cycle: |}];; type 'a t = [`A of 'a] as 'a;; [%%expect{| -type 'a t = 'a constraint 'a = [ `A of 'a ] +type !'a t = 'a constraint 'a = [ `A of 'a ] |}, Principal{| -type 'a t = [ `A of 'b ] as 'b constraint 'a = [ `A of 'a ] +type !'a t = [ `A of 'b ] as 'b constraint 'a = [ `A of 'a ] |}];; type 'a v = [`A of u v] constraint 'a = t and t = u and u = t;; (* fails *) [%%expect{| @@ -67,7 +68,7 @@ Error: The type abbreviation "t" is cyclic: type 'a t = 'a;; let f (x : 'a t as 'a) = ();; (* ok *) [%%expect{| -type 'a t = 'a +type +!'a t = 'a val f : 'a -> unit = |}];; @@ -114,8 +115,8 @@ let _ = PR6505a.y#bang;; (* fails *) [%%expect{| module PR6505a : sig - type 'o is_an_object = 'o constraint 'o = < .. > - type ('a, 'b) abs = 'b constraint 'a = 'b is_an_object + type !'o is_an_object = 'o constraint 'o = < .. > + type (!'a, !'b) abs = 'b constraint 'a = 'b is_an_object constraint 'b = < .. > val y : (< > is_an_object, < > is_an_object) abs end @@ -128,8 +129,8 @@ Error: This expression has type |}, Principal{| module PR6505a : sig - type 'o is_an_object = 'o constraint 'o = < .. > - type ('a, 'b) abs = 'b constraint 'a = 'b is_an_object + type !'o is_an_object = 'o constraint 'o = < .. > + type (!'a, !'b) abs = 'b constraint 'a = 'b is_an_object constraint 'b = < .. > val y : (< >, < >) abs end @@ -149,8 +150,8 @@ let () = print_endline (match PR6505b.x with `Bar s -> s);; (* fails *) [%%expect{| module PR6505b : sig - type 'o is_an_object = 'o constraint 'o = [> ] - type ('a, 'o) abs = 'o constraint 'a = 'o is_an_object + type !'o is_an_object = 'o constraint 'o = [> ] + type (!'a, !'o) abs = 'o constraint 'a = 'o is_an_object constraint 'o = [> ] val x : (([> `Foo of int ] as 'a) is_an_object, 'a is_an_object) abs end @@ -158,8 +159,7 @@ Line 6, characters 23-57: 6 | let () = print_endline (match PR6505b.x with `Bar s -> s);; (* fails *) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -`Foo _ + Here is an example of a case that is not matched: "`Foo _" Exception: Match_failure ("", 6, 23). |}] @@ -263,7 +263,7 @@ sig type !'a t = 'b constraint 'a = 'b s end [%%expect{| -module type S = sig type !'a s type 'a t = 'b constraint 'a = 'b s end +module type S = sig type !'a s type !'a t = 'b constraint 'a = 'b s end |}] (* This still causes a stack overflow *) @@ -317,13 +317,14 @@ Error: The class constraints are not consistent. type ('node,'self) extension = < node: 'node; self: 'self > as 'self type 'ext node = < > constraint 'ext = ('ext node, 'self) extension;; [%%expect{| -type ('node, 'a) extension = 'a constraint 'a = < node : 'node; self : 'a > -type 'a node = < > +type (+!'node, !'a) extension = 'a + constraint 'a = < node : 'node; self : 'a > +type !'a node = < > constraint 'a = ('a node, < node : 'a node; self : 'b > as 'b) extension |}, Principal{| -type ('node, 'a) extension = < node : 'node; self : 'b > as 'b +type (+!'node, !'a) extension = < node : 'node; self : 'b > as 'b constraint 'a = < node : 'node; self : 'a > -type 'a node = < > +type !'a node = < > constraint 'a = ('a node, < node : 'a node; self : 'b > as 'b) extension |}] @@ -352,7 +353,7 @@ Exception: Failure "Default_extension failure". type 'a t = 'b constraint 'a = < x : 'b > type u = < x : u > t [%%expect{| -type 'a t = 'b constraint 'a = < x : 'b > +type !'a t = 'b constraint 'a = < x : 'b > Line 2, characters 0-20: 2 | type u = < x : u > t ^^^^^^^^^^^^^^^^^^^^ @@ -374,8 +375,8 @@ type ('a, 'self) obj = [%%expect {| type foo = Foo type bar = Bar -type _ tag = Foo_tag : foo tag | Bar_tag : bar tag -type ('a, 'self) obj = 'self +type !_ tag = Foo_tag : foo tag | Bar_tag : bar tag +type (+!'a, !'self) obj = 'self constraint 'self = < bar : bar -> 'a; foo : foo -> 'a; .. > |}] @@ -423,7 +424,7 @@ Error: The type abbreviation "cycle" is cyclic: type 'a t = [`Foo] type 'a cstr constraint 'a = float [%%expect{| -type 'a t = [ `Foo ] +type +-'a t = [ `Foo ] type 'a cstr constraint 'a = float |}] @@ -459,7 +460,41 @@ type 'a x = [ `X of 'e ] constraint 'a = 'e list type p = private [> a x] and a = int list [%%expect{| -type 'a x = [ `X of 'e ] constraint 'a = 'e list +type !'a x = [ `X of 'e ] constraint 'a = 'e list type p = private [> a x ] and a = int list |}] + +(* PR #13605 *) + +type 'a t3 = < m : 'b. (int -> 'b) as 'a > + +[%%expect{| +Line 1, characters 23-40: +1 | type 'a t3 = < m : 'b. (int -> 'b) as 'a > + ^^^^^^^^^^^^^^^^^ +Error: This type "'a" should be an instance of type "int -> 'b" + The universal variable "'b" would escape its scope +|}] + +type 'a t4 = < m : 'b. int -> ('b as 'a) > * 'a + +[%%expect{| +Line 1, characters 31-39: +1 | type 'a t4 = < m : 'b. int -> ('b as 'a) > * 'a + ^^^^^^^^ +Error: This type "'a" should be an instance of type "'b" + The universal variable "'b" would escape its scope +|}] + +class type ['a] c = object + method m : 'b. (int -> 'b) as 'a +end + +[%%expect{| +Line 2, characters 17-34: +2 | method m : 'b. (int -> 'b) as 'a + ^^^^^^^^^^^^^^^^^ +Error: This type "'a" should be an instance of type "int -> 'b" + The universal variable "'b" would escape its scope +|}] diff --git a/testsuite/tests/typing-misc/disambiguate_principality.ml b/testsuite/tests/typing-misc/disambiguate_principality.ml index 33ea6279..20a941b4 100644 --- a/testsuite/tests/typing-misc/disambiguate_principality.ml +++ b/testsuite/tests/typing-misc/disambiguate_principality.ml @@ -38,7 +38,7 @@ Line 3, characters 2-20: 3 | { x with lbl = 4 } ^^^^^^^^^^^^^^^^^^ Warning 23 [useless-record-with]: all the fields are explicitly listed in this record: -the 'with' clause is useless. + the "with" clause is useless. val after_a : M.r = {M.lbl = 4} |}] @@ -53,7 +53,8 @@ val b : unit = () Line 3, characters 7-18: 3 | x := { lbl = 4 } ^^^^^^^^^^^ -Warning 18 [not-principal]: this type-based record disambiguation is not principal. +Warning 18 [not-principal]: this type-based record disambiguation is not + principal. val b : unit = () |}] @@ -119,7 +120,8 @@ val h : M.r -> unit = Line 4, characters 4-15: 4 | | { lbl = _ } -> () ^^^^^^^^^^^ -Warning 18 [not-principal]: this type-based record disambiguation is not principal. +Warning 18 [not-principal]: this type-based record disambiguation is not + principal. Line 4, characters 4-15: 4 | | { lbl = _ } -> () @@ -157,7 +159,8 @@ val j : M.r -> unit = Line 4, characters 4-15: 4 | | { lbl = _ } -> () ^^^^^^^^^^^ -Warning 18 [not-principal]: this type-based record disambiguation is not principal. +Warning 18 [not-principal]: this type-based record disambiguation is not + principal. Line 4, characters 4-15: 4 | | { lbl = _ } -> () @@ -214,7 +217,8 @@ val n : M.r ref -> unit = Line 4, characters 17-28: 4 | | { contents = { lbl = _ } } -> () ^^^^^^^^^^^ -Warning 18 [not-principal]: this type-based record disambiguation is not principal. +Warning 18 [not-principal]: this type-based record disambiguation is not + principal. Line 4, characters 4-30: 4 | | { contents = { lbl = _ } } -> () @@ -252,7 +256,8 @@ val p : M.r ref -> unit = Line 4, characters 17-28: 4 | | { contents = { lbl = _ } } -> () ^^^^^^^^^^^ -Warning 18 [not-principal]: this type-based record disambiguation is not principal. +Warning 18 [not-principal]: this type-based record disambiguation is not + principal. Line 4, characters 4-30: 4 | | { contents = { lbl = _ } } -> () @@ -294,7 +299,8 @@ val s : M.r ref -> unit = Line 4, characters 9-20: 4 | x := { lbl = 4 } ^^^^^^^^^^^ -Warning 18 [not-principal]: this type-based record disambiguation is not principal. +Warning 18 [not-principal]: this type-based record disambiguation is not + principal. val s : M.r ref -> unit = |}] @@ -309,7 +315,8 @@ val t : M.r ref -> unit = Line 3, characters 9-20: 3 | x := { lbl = 4 } ^^^^^^^^^^^ -Warning 18 [not-principal]: this type-based record disambiguation is not principal. +Warning 18 [not-principal]: this type-based record disambiguation is not + principal. val t : M.r ref -> unit = |}] @@ -360,7 +367,8 @@ val b : unit = () Line 3, characters 7-8: 3 | x := B ^ -Warning 18 [not-principal]: this type-based constructor disambiguation is not principal. +Warning 18 [not-principal]: this type-based constructor disambiguation is not + principal. val b : unit = () |}] @@ -405,7 +413,8 @@ val h : M.t -> unit = Line 4, characters 4-5: 4 | | B -> () ^ -Warning 18 [not-principal]: this type-based constructor disambiguation is not principal. +Warning 18 [not-principal]: this type-based constructor disambiguation is not + principal. val h : M.t -> unit = |}] @@ -433,7 +442,8 @@ val j : M.t -> unit = Line 4, characters 4-5: 4 | | B -> () ^ -Warning 18 [not-principal]: this type-based constructor disambiguation is not principal. +Warning 18 [not-principal]: this type-based constructor disambiguation is not + principal. val j : M.t -> unit = |}] @@ -485,7 +495,8 @@ val n : M.t ref -> unit = Line 4, characters 17-18: 4 | | { contents = A } -> () ^ -Warning 18 [not-principal]: this type-based constructor disambiguation is not principal. +Warning 18 [not-principal]: this type-based constructor disambiguation is not + principal. Line 4, characters 4-20: 4 | | { contents = A } -> () @@ -523,7 +534,8 @@ val p : M.t ref -> unit = Line 4, characters 17-18: 4 | | { contents = A } -> () ^ -Warning 18 [not-principal]: this type-based constructor disambiguation is not principal. +Warning 18 [not-principal]: this type-based constructor disambiguation is not + principal. Line 4, characters 4-20: 4 | | { contents = A } -> () @@ -556,7 +568,8 @@ val s : M.t ref -> unit = Line 4, characters 9-10: 4 | x := A ^ -Warning 18 [not-principal]: this type-based constructor disambiguation is not principal. +Warning 18 [not-principal]: this type-based constructor disambiguation is not + principal. val s : M.t ref -> unit = |}] @@ -571,23 +584,22 @@ Lines 1-3, characters 8-10: 2 | | ({ contents = M.A } : M.t ref) as x -> 3 | x := B Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -{contents=B} + Here is an example of a case that is not matched: "{contents=B}" val t : M.t ref -> unit = |}, Principal{| Line 3, characters 9-10: 3 | x := B ^ -Warning 18 [not-principal]: this type-based constructor disambiguation is not principal. +Warning 18 [not-principal]: this type-based constructor disambiguation is not + principal. Lines 1-3, characters 8-10: 1 | ........function 2 | | ({ contents = M.A } : M.t ref) as x -> 3 | x := B Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -{contents=B} + Here is an example of a case that is not matched: "{contents=B}" val t : M.t ref -> unit = |}] diff --git a/testsuite/tests/typing-misc/empty_variant.ml b/testsuite/tests/typing-misc/empty_variant.ml index 6b2f7b82..fe6146c6 100644 --- a/testsuite/tests/typing-misc/empty_variant.ml +++ b/testsuite/tests/typing-misc/empty_variant.ml @@ -58,8 +58,7 @@ Lines 16-17, characters 8-18: 16 | ........match abc with 17 | | A _ -> 1 Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -C () + Here is an example of a case that is not matched: "C ()" val f : unit -> unit = |}] @@ -74,8 +73,7 @@ Line 3, characters 22-42: 3 | let g (x:nothing t) = match x with A -> () ^^^^^^^^^^^^^^^^^^^^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -C + Here is an example of a case that is not matched: "C" val g : nothing t -> unit = |}] diff --git a/testsuite/tests/typing-misc/injectivity.ml b/testsuite/tests/typing-misc/injectivity.ml index 325c96f1..8de36662 100644 --- a/testsuite/tests/typing-misc/injectivity.ml +++ b/testsuite/tests/typing-misc/injectivity.ml @@ -1,4 +1,5 @@ (* TEST + flags = "-i-variance"; expect; *) @@ -13,19 +14,27 @@ type !+ 'a t = private 'a type !-'a t = private 'a -> unit type ! +'a t = private 'a type ! -'a t = private 'a -> unit +type +-!'a t = A +type !+-'a t +type -+! 'a t = A +type !-+ 'a t [%%expect{| -type 'a t = private 'a ref -type +'a t = private 'a -type -'a t = private 'a -> unit -type +'a t = private 'a -type -'a t = private 'a -> unit -type +'a t = private 'a -type -'a t = private 'a -> unit -type +'a t = private 'a -type -'a t = private 'a -> unit +type !'a t = private 'a ref +type +!'a t = private 'a +type -!'a t = private 'a -> unit +type +!'a t = private 'a +type -!'a t = private 'a -> unit +type +!'a t = private 'a +type -!'a t = private 'a -> unit +type +!'a t = private 'a +type -!'a t = private 'a -> unit +type +-!'a t = A +type +-!'a t +type +-!'a t = A +type +-!'a t |}] (* Expect doesn't support syntax errors -type -+ 'a t +type +- ! 'a t [%%expect] type -!! 'a t [%%expect] @@ -40,8 +49,8 @@ module M : sig type +!'a t end type _ t = M : 'a -> 'a M.t t (* OK *) type 'a u = 'b constraint 'a = 'b M.t [%%expect{| -type _ t = M : 'a -> 'a M.t t -type 'a u = 'b constraint 'a = 'b M.t +type !_ t = M : 'a -> 'a M.t t +type !'a u = 'b constraint 'a = 'b M.t |}] (* Without the injectivity annotation, the cannot be defined *) @@ -64,7 +73,7 @@ Line 1, characters 0-37: 1 | type 'a u = 'b constraint 'a = 'b N.t ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: In the definition - "type 'a u = 'b constraint 'a = 'b N.t" + "type !'a u = 'b constraint 'a = 'b N.t" the type variable "'b" cannot be deduced from the type parameters. |}] @@ -76,11 +85,11 @@ Line 1, characters 33-59: ^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: Signature mismatch: Modules do not match: - sig type 'a t = int end + sig type +-'a t = int end is not included in sig type +!'a t end Type declarations do not match: - type 'a t = int + type +-'a t = int is not included in type +!'a t Their variances do not agree. @@ -90,7 +99,7 @@ Error: Signature mismatch: type !'a t = 'a list type !'a u = int [%%expect{| -type 'a t = 'a list +type +!'a t = 'a list Line 2, characters 0-16: 2 | type !'a u = int ^^^^^^^^^^^^^^^^ @@ -101,7 +110,7 @@ Error: In this definition, expected parameter variances are not satisfied. type !'a t = private 'a list type !'a t = private int [%%expect{| -type 'a t = private 'a list +type !'a t = private 'a list Line 2, characters 0-24: 2 | type !'a t = private int ^^^^^^^^^^^^^^^^^^^^^^^^ @@ -116,7 +125,7 @@ module M : sig type !'a t = private < m : int ; .. > end = type 'a u = M : 'a -> 'a M.t u [%%expect{| module M : sig type !'a t = private < m : int; .. > end -type 'a u = M : 'a -> 'a M.t u +type !'a u = M : 'a -> 'a M.t u |}] module M : sig type 'a t = private < m : int ; .. > end = struct type 'a t = < m : int ; n : 'a > end @@ -138,11 +147,11 @@ Line 2, characters 2-36: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: Signature mismatch: Modules do not match: - sig type 'a t = < m : int > end + sig type +-'a t = < m : int > end is not included in sig type !'a t = private < m : int; .. > end Type declarations do not match: - type 'a t = < m : int > + type +-'a t = < m : int > is not included in type !'a t Their variances do not agree. @@ -152,22 +161,22 @@ Error: Signature mismatch: type 'a t = 'b constraint 'a = type !'b u = t [%%expect{| -type 'a t = 'b constraint 'a = < b : 'b > -type 'b u = < b : 'b > t +type !'a t = 'b constraint 'a = < b : 'b > +type !'b u = < b : 'b > t |}] (* Ignore injectivity for nominal types *) type !_ t = X [%%expect{| -type _ t = X +type +-!_ t = X |}] (* Beware of constrained parameters *) type (_,_) eq = Refl : ('a,'a) eq type !'a t = private 'b constraint 'a = < b : 'b > (* OK *) [%%expect{| -type (_, _) eq = Refl : ('a, 'a) eq -type 'a t = private 'b constraint 'a = < b : 'b > +type (!_, !_) eq = Refl : ('a, 'a) eq +type !'a t = private 'b constraint 'a = < b : 'b > |}] type !'a t = private 'b constraint 'a = < b : 'b; c : 'c > (* KO *) @@ -184,6 +193,30 @@ Error: In this definition, expected parameter variances are not satisfied. but it is unrestricted. |}] +(* Injective bivariance in a signature is respected in its structures *) +type +-!'a u;; +module M : sig type +-!'a t end = struct type 'a t = 'a u end;; +module M : sig type +-!'a t end = struct type 'a t = A end;; +module M : sig type +-!'a t end = struct type 'a t = int end;; + [%%expect{| +type +-!'a u +module M : sig type +-!'a t end +module M : sig type +-!'a t end +Line 4, characters 34-60: +4 | module M : sig type +-!'a t end = struct type 'a t = int end;; + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: Signature mismatch: + Modules do not match: + sig type +-'a t = int end + is not included in + sig type +-!'a t end + Type declarations do not match: + type +-'a t = int + is not included in + type +-!'a t + Their variances do not agree. +|}] + (* One cannot assume that abstract types are not injective *) module F(X : sig type 'a t end) = struct type 'a u = unit constraint 'a = 'b X.t @@ -204,8 +237,8 @@ Error: In the GADT constructor type 'a t = unit type !'a u = int constraint 'a = 'b t [%%expect{| -type 'a t = unit -type 'a u = int constraint 'a = 'b t +type +-'a t = unit +type !'a u = int constraint 'a = 'b t |}] module F(X : sig type 'a t end) = struct type !'a u = 'b constraint 'a = constraint 'b = _ X.t @@ -213,7 +246,7 @@ end [%%expect{| module F : (X : sig type 'a t end) -> - sig type 'a u = 'b X.t constraint 'a = < b : 'b X.t > end + sig type !'a u = 'b X.t constraint 'a = < b : 'b X.t > end |}] (* But not too clever *) module F(X : sig type 'a t end) = struct @@ -233,7 +266,7 @@ end [%%expect{| module F : (X : sig type 'a t end) -> - sig type 'a u = 'b X.t constraint 'a = < b : 'b X.t > end + sig type !'a u = 'b X.t constraint 'a = < b : 'b X.t > end |}, Principal{| Line 2, characters 2-51: 2 | type !'a u = 'b constraint 'a = @@ -293,14 +326,14 @@ let d = Dyn (int_vec_vec, v) let Some v' = undyn int_vec_vec d [%%expect{| -type (_, _) eq = Refl : ('a, 'a) eq +type (!_, !_) eq = Refl : ('a, 'a) eq module Vec : sig type +!'a t val make : int -> (int -> 'a) -> 'a t val get : 'a t -> int -> 'a end -type _ ty = +type !_ ty = Int : int ty | Fun : 'a ty * 'b ty -> ('a -> 'b) ty | Vec : 'a ty -> 'a Vec.t ty @@ -314,8 +347,7 @@ Line 47, characters 4-11: 47 | let Some v' = undyn int_vec_vec d ^^^^^^^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -None + Here is an example of a case that is not matched: "None" val v' : int Vec.t Vec.t = |}] @@ -340,14 +372,13 @@ let eq_int_any : type a. unit -> (int, a) eq = fun () -> let Vec Int = vec_ty in Refl [%%expect{| module Vec : sig type +!'a t val eqt : ('a t, 'b t) eq end -type _ ty = Int : int ty | Vec : 'a ty -> 'a Vec.t ty +type !_ ty = Int : int ty | Vec : 'a ty -> 'a Vec.t ty val coe : ('a, 'b) eq -> 'a ty -> 'b ty = Line 17, characters 2-30: 17 | let Vec Int = vec_ty in Refl ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -Vec (Vec Int) + Here is an example of a case that is not matched: "Vec (Vec Int)" val eq_int_any : unit -> (int, 'a) eq = |}] @@ -356,17 +387,17 @@ val eq_int_any : unit -> (int, 'a) eq = type 'a t = 'b constraint 'a = class type ['a] ct = object method m : 'b constraint 'a = < b : 'b > end [%%expect{| -type 'a t = 'b constraint 'a = < b : 'b > -class type ['a] ct = object constraint 'a = < b : 'b > method m : 'b end +type !'a t = 'b constraint 'a = < b : 'b > +class type [!'a] ct = object constraint 'a = < b : 'b > method m : 'b end |}] type _ u = M : 'a -> 'a t u (* OK *) [%%expect{| -type _ u = M : < b : 'a > -> < b : 'a > t u +type !_ u = M : < b : 'a > -> < b : 'a > t u |}] type _ v = M : 'a -> 'a ct v (* OK *) [%%expect{| -type _ v = M : < b : 'a > -> < b : 'a > ct v +type !_ v = M : < b : 'a > -> < b : 'a > ct v |}] type 'a t = 'b constraint 'a = @@ -394,7 +425,7 @@ struct let uninj : type a b. (a X.t, b X.t) eql -> (a, b) eql = fun Refl -> Refl let coerce : type a b. (a, b) eql -> a -> b = fun Refl x -> x;; [%%expect{| -type (_, _) eql = Refl : ('a, 'a) eql +type (!_, !_) eql = Refl : ('a, 'a) eql module Uninj : (X : sig type !'a t end) -> sig val uninj : ('a X.t, 'b X.t) eql -> ('a, 'b) eql end @@ -425,9 +456,9 @@ let x_eq_y : (int R.t, string R.t) eql = Refl let boom = let module U = Uninj(R) in print_endline (coerce (U.uninj x_eq_y) 0) ;; [%%expect{| -Line 1, characters 18-21: +Line 1, characters 18-19: 1 | let x_eq_y : (int R.t, string R.t) eql = Refl - ^^^ + ^ Error: Unbound module "R" |}] @@ -440,7 +471,7 @@ end = A ;; [%%expect{| -module rec A : sig type _ t = Foo : 'a -> 'a A.s t type 'a s = T of 'a end +module rec A : sig type !_ t = Foo : 'a -> 'a A.s t type +!'a s = T of 'a end |}] (* #12878 *) diff --git a/testsuite/tests/typing-misc/labels.ml b/testsuite/tests/typing-misc/labels.ml index 83311100..35587ac9 100644 --- a/testsuite/tests/typing-misc/labels.ml +++ b/testsuite/tests/typing-misc/labels.ml @@ -10,7 +10,7 @@ val f : x:int -> int = Line 2, characters 5-6: 2 | f ?x:0;; ^ -Warning 43 [nonoptional-label]: the label x is not optional. +Warning 43 [nonoptional-label]: the label "x" is not optional. - : int = 1 |}];; diff --git a/testsuite/tests/typing-misc/polyvars.ml b/testsuite/tests/typing-misc/polyvars.ml index 77f87cd9..6bc6fc05 100644 --- a/testsuite/tests/typing-misc/polyvars.ml +++ b/testsuite/tests/typing-misc/polyvars.ml @@ -75,16 +75,15 @@ Line 9, characters 0-41: 9 | function (`A|`B), _ -> 0 | _,(`A|`B) -> 1;; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -(`AnyOtherTag, `AnyOtherTag) + Here is an example of a case that is not matched: + "(`AnyOtherTag, `AnyOtherTag)" - : [> `A | `B ] * [> `A | `B ] -> int = Line 10, characters 0-29: 10 | function `B,1 -> 1 | _,1 -> 2;; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -(_, 0) + Here is an example of a case that is not matched: "(_, 0)" Line 10, characters 21-24: 10 | function `B,1 -> 1 | _,1 -> 2;; @@ -96,8 +95,7 @@ Line 11, characters 0-29: 11 | function 1,`B -> 1 | 1,_ -> 2;; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -(0, _) + Here is an example of a case that is not matched: "(0, _)" Line 11, characters 21-24: 11 | function 1,`B -> 1 | 1,_ -> 2;; @@ -126,7 +124,7 @@ let f (x : [`A | `B] as 'a) (y : [> 'a]) = ();; Line 1, characters 61-63: 1 | let f : ([`A | `B ] as 'a) -> [> 'a] -> unit = fun x (y : [> 'a]) -> ();; ^^ -Error: The type "'a" does not expand to a polymorphic variant type +Error: The type "'a" does not expand to a polymorphic variant type Hint: Did you mean "`a"? |}] @@ -145,8 +143,7 @@ Line 2, characters 0-24: 2 | function (`A x : t) -> x;; ^^^^^^^^^^^^^^^^^^^^^^^^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -` + Here is an example of a case that is not matched: "`" - : t -> string = |}] @@ -157,8 +154,8 @@ Line 1, characters 8-76: 1 | let f = function `AnyOtherTag, _ -> 1 | _, (`AnyOtherTag|`AnyOtherTag') -> 2;; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -(`AnyOtherTag', `AnyOtherTag'') + Here is an example of a case that is not matched: + "(`AnyOtherTag', `AnyOtherTag'')" val f : [> `AnyOtherTag ] * [> `AnyOtherTag | `AnyOtherTag' ] -> int = |}] @@ -287,3 +284,26 @@ Error: The value "x" has type "[ `A | `R of rt ]" "[< `A | `R of 'a ] as 'a" The second variant type does not allow tag(s) "`B" |}] + + +(** [subtype_row] errors *) + +(* #13706 *) +let f x = (x : [ `Foo of int ] :> [ `Foo | `Bar ]) +[%%expect{| +Line 4, characters 10-50: +4 | let f x = (x : [ `Foo of int ] :> [ `Foo | `Bar ]) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: Type "[ `Foo of int ]" is not a subtype of "[ `Bar | `Foo ]" + Types for tag "`Foo" are incompatible +|}] + +let f x = (x : [ `Foo of int ] list :> [ `Foo | `Bar ] list) +[%%expect{| +Line 1, characters 10-60: +1 | let f x = (x : [ `Foo of int ] list :> [ `Foo | `Bar ] list) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: Type "[ `Foo of int ] list" is not a subtype of "[ `Bar | `Foo ] list" + Type "[ `Foo of int ]" is not a subtype of "[ `Bar | `Foo ]" + Types for tag "`Foo" are incompatible +|}] diff --git a/testsuite/tests/typing-misc/pr6416.ml b/testsuite/tests/typing-misc/pr6416.ml index 9fb2eae6..f6d25afc 100644 --- a/testsuite/tests/typing-misc/pr6416.ml +++ b/testsuite/tests/typing-misc/pr6416.ml @@ -396,9 +396,9 @@ module Foo : sig type info = { doc : unit; } type t = { info : info; } end Line 5, characters 38-41: 5 | let add_extra_info arg = arg.Foo.info.doc ^^^ -Warning 40 [name-out-of-scope]: doc was selected from type Foo.info. -It is not visible in the current scope, and will not -be selected if the type becomes unknown. +Warning 40 [name-out-of-scope]: "doc" was selected from type "Foo.info". + It is not visible in the current scope, and will not be selected + if the type becomes unknown. val add_extra_info : Foo.t -> unit = |}] @@ -419,9 +419,9 @@ module Bar : sig end Line 8, characters 38-41: 8 | let add_extra_info arg = arg.Foo.info.doc ^^^ -Warning 40 [name-out-of-scope]: doc was selected from type Bar/2.info. -It is not visible in the current scope, and will not -be selected if the type becomes unknown. +Warning 40 [name-out-of-scope]: "doc" was selected from type "Bar/2.info". + It is not visible in the current scope, and will not be selected + if the type becomes unknown. val add_extra_info : Foo.t -> unit = |}] diff --git a/testsuite/tests/typing-misc/pr6939-no-flat-float-array.ml b/testsuite/tests/typing-misc/pr6939-no-flat-float-array.ml index a3d139ac..8d981717 100644 --- a/testsuite/tests/typing-misc/pr6939-no-flat-float-array.ml +++ b/testsuite/tests/typing-misc/pr6939-no-flat-float-array.ml @@ -18,7 +18,7 @@ let rec x = let u = [|y|] in 10. and y = 1.;; Line 1, characters 16-17: 1 | let rec x = let u = [|y|] in 10. and y = 1.;; ^ -Warning 26 [unused-var]: unused variable u. +Warning 26 [unused-var]: unused variable "u". val x : float = 10. val y : float = 1. diff --git a/testsuite/tests/typing-misc/printing.ml b/testsuite/tests/typing-misc/printing.ml index ff390212..2eec8b24 100644 --- a/testsuite/tests/typing-misc/printing.ml +++ b/testsuite/tests/typing-misc/printing.ml @@ -9,7 +9,7 @@ type t = [ 'A_name | `Hi ];; Line 1, characters 11-18: 1 | type t = [ 'A_name | `Hi ];; ^^^^^^^ -Error: The type "'A_name" does not expand to a polymorphic variant type +Error: The type "'A_name" does not expand to a polymorphic variant type Hint: Did you mean "`A_name"? |}];; diff --git a/testsuite/tests/typing-misc/records.ml b/testsuite/tests/typing-misc/records.ml index 55c8f37e..125331e8 100644 --- a/testsuite/tests/typing-misc/records.ml +++ b/testsuite/tests/typing-misc/records.ml @@ -108,17 +108,17 @@ type foo = { x: int };; let r : foo = { ZZZ.x = 2 };; [%%expect{| type foo = { x : int; } -Line 2, characters 16-21: +Line 2, characters 16-19: 2 | let r : foo = { ZZZ.x = 2 };; - ^^^^^ + ^^^ Error: Unbound module "ZZZ" |}];; (ZZZ.X : int option);; [%%expect{| -Line 1, characters 1-6: +Line 1, characters 1-4: 1 | (ZZZ.X : int option);; - ^^^^^ + ^^^ Error: Unbound module "ZZZ" |}];; @@ -171,7 +171,7 @@ Line 1, characters 8-44: 1 | let r = { (assert false) with contents = 1 } ;; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Warning 23 [useless-record-with]: all the fields are explicitly listed in this record: -the 'with' clause is useless. + the "with" clause is useless. Exception: Assert_failure ("", 1, 10). |}] @@ -278,9 +278,9 @@ let f () = { f1 = 0 [%%expect{| type t = { f1 : int; f2 : int; } -Line 4, characters 10-20: +Line 4, characters 10-17: 4 | ; Coq__10.f2 = 0 } - ^^^^^^^^^^ + ^^^^^^^ Error: Unbound module "Coq__10" |}] @@ -294,9 +294,9 @@ let f () = { f1 = 0 [%%expect{| module Coq__11 : sig type t = { f1 : int; f2 : int; f3 : int; } end -Line 6, characters 13-23: +Line 6, characters 13-20: 6 | ; Coq__10.f2 = 0 - ^^^^^^^^^^ + ^^^^^^^ Error: Unbound module "Coq__10" -Hint: Did you mean "Coq__11"? +Hint: Did you mean "Coq__11"? |}] diff --git a/testsuite/tests/typing-misc/type_approx.ml b/testsuite/tests/typing-misc/type_approx.ml new file mode 100644 index 00000000..cabe5f9d --- /dev/null +++ b/testsuite/tests/typing-misc/type_approx.ml @@ -0,0 +1,12 @@ +(* TEST +expect; +*) + +let rec g x = let x, y = f x in x + y +and f x = (0:int), (1.:float) +[%%expect{| +Line 1, characters 36-37: +1 | let rec g x = let x, y = f x in x + y + ^ +Error: The value "y" has type "float" but an expression was expected of type "int" +|}] diff --git a/testsuite/tests/typing-misc/typecore_empty_polyvariant_error.compilers.reference b/testsuite/tests/typing-misc/typecore_empty_polyvariant_error.compilers.reference index 07c3ed8e..39673507 100644 --- a/testsuite/tests/typing-misc/typecore_empty_polyvariant_error.compilers.reference +++ b/testsuite/tests/typing-misc/typecore_empty_polyvariant_error.compilers.reference @@ -2,5 +2,5 @@ type t = [ ] Line 1, characters 31-32: 1 | let f: 'a. t -> 'a = function #t -> . ;; ^ -Error: The type "t" is not a variant type +Error: The type t is not a variant type diff --git a/testsuite/tests/typing-misc/typecore_nolabel_errors.ml b/testsuite/tests/typing-misc/typecore_nolabel_errors.ml index a99aa498..e41ef302 100644 --- a/testsuite/tests/typing-misc/typecore_nolabel_errors.ml +++ b/testsuite/tests/typing-misc/typecore_nolabel_errors.ml @@ -37,7 +37,7 @@ Line 2, characters 13-17: Error: The function applied to this argument has type ?x:'a -> a:'b -> ?y:'c -> z:'d -> unit -> unit This argument cannot be applied with label "?y" - Since OCaml 4.11, optional arguments do not commute when -nolabels is given +Since OCaml 4.11, optional arguments do not commute when -nolabels is given |}] let f (g: ?x:_ -> _) = g ~y:None ?x:None; g ?x:None () @@ -48,7 +48,7 @@ Line 1, characters 28-32: ^^^^ Error: The function applied to this argument has type ?x:'a -> 'b This argument cannot be applied with label "~y" - Since OCaml 4.11, optional arguments do not commute when -nolabels is given +Since OCaml 4.11, optional arguments do not commute when -nolabels is given |}] (** Show that optional arguments can be commuted, to some degree. *) @@ -71,7 +71,7 @@ Line 1, characters 7-8: Error: The function applied to this argument has type ?a:int -> ?b:int -> ?c:int -> x:int -> int -> int This argument cannot be applied with label "~c" - Since OCaml 4.11, optional arguments do not commute when -nolabels is given +Since OCaml 4.11, optional arguments do not commute when -nolabels is given |}] ;; @@ -86,7 +86,7 @@ Line 1, characters 14-15: Error: The function applied to this argument has type ?c:int -> x:int -> int -> int This argument cannot be applied without label - Since OCaml 4.11, optional arguments do not commute when -nolabels is given +Since OCaml 4.11, optional arguments do not commute when -nolabels is given |}] ;; @@ -98,7 +98,7 @@ Line 1, characters 12-13: Error: The function applied to this argument has type ?b:int -> ?c:int -> x:int -> int -> int This argument cannot be applied with label "~c" - Since OCaml 4.11, optional arguments do not commute when -nolabels is given +Since OCaml 4.11, optional arguments do not commute when -nolabels is given |}] ;; @@ -110,7 +110,7 @@ Line 1, characters 7-8: Error: The function applied to this argument has type ?a:int -> ?b:int -> ?c:int -> x:int -> int -> int This argument cannot be applied with label "~b" - Since OCaml 4.11, optional arguments do not commute when -nolabels is given +Since OCaml 4.11, optional arguments do not commute when -nolabels is given |}] ;; @@ -131,6 +131,6 @@ Line 1, characters 5-6: Error: The function applied to this argument has type ?x:'a -> ?y:'b -> unit -> unit This argument cannot be applied with label "~y" - Since OCaml 4.11, optional arguments do not commute when -nolabels is given +Since OCaml 4.11, optional arguments do not commute when -nolabels is given |}] ;; diff --git a/testsuite/tests/typing-misc/typetexp_errors.ml b/testsuite/tests/typing-misc/typetexp_errors.ml index ac18cd58..aa495164 100644 --- a/testsuite/tests/typing-misc/typetexp_errors.ml +++ b/testsuite/tests/typing-misc/typetexp_errors.ml @@ -8,7 +8,7 @@ Line 1, characters 32-35: 1 | type ('a,'at,'any,'en) t = A of 'an ^^^ Error: The type variable "'an" is unbound in this type declaration. -Hint: Did you mean "'a", "'any", "'at" or "'en"? +Hint: Did you mean "'a", "'any", "'at" or "'en"? |} ] @@ -20,8 +20,7 @@ Line 1, characters 18-53: Error: The constructor "`C" is missing from the upper bound (between "<" and ">") of this polymorphic variant but is present in its lower bound (after ">"). - Hint: Either add "`C" in the upper bound, or remove it - from the lower bound. +Hint: Either add "`C" in the upper bound, or remove it from the lower bound. |}] type ('_a) underscored = A of '_a @@ -32,6 +31,14 @@ Line 1, characters 6-9: Error: The type variable name "'_a" is not allowed in programs |}] +type underscored_bis = (int -> int as '_a) +[%%expect{| +Line 1, characters 38-41: +1 | type underscored_bis = (int -> int as '_a) + ^^^ +Error: The type variable name "'_a" is not allowed in programs +|}] + (* The next two hit the unification error case at the end of Typetexp.globalize_used_variables. *) let f (x: int as 'a) (y: float as 'a) = (x,y) diff --git a/testsuite/tests/typing-misc/variance.ml b/testsuite/tests/typing-misc/variance.ml index a41db4f2..1b4025aa 100644 --- a/testsuite/tests/typing-misc/variance.ml +++ b/testsuite/tests/typing-misc/variance.ml @@ -1,15 +1,40 @@ (* TEST + flags = "-i-variance"; expect; *) +(* Syntax *) +type +'a t;; +type -'a t;; +type +-'a t;; +type -+'a t;; +type + 'a t;; +type - 'a t;; +type +- 'a t;; +type -+ 'a t;; +[%%expect{| +type +'a t +type -'a t +type +-'a t +type +-'a t +type +'a t +type -'a t +type +-'a t +type +-'a t +|}] +(* Expect doesn't support syntax errors +type + - 'a t +[%%expect] +*) + (* #8698 *) (* Actually, this is not a bug *) type +'a t = [> `Foo of 'a -> unit] as 'a;; [%%expect{| -type 'a t = 'a constraint 'a = [> `Foo of 'a -> unit ] +type !'a t = 'a constraint 'a = [> `Foo of 'a -> unit ] |}, Principal{| -type +'a t = 'a constraint 'a = [> `Foo of 'a -> unit ] +type +!'a t = 'a constraint 'a = [> `Foo of 'a -> unit ] |}] (* strengthening *) @@ -17,14 +42,14 @@ type +'a t = 'a constraint 'a = [> `Foo of 'a -> unit ] type 'a t = (('a -> unit) -> unit);; let tl = !(ref ([] : 'a t list));; [%%expect{| -type 'a t = ('a -> unit) -> unit +type +!'a t = ('a -> unit) -> unit val tl : '_a t list = [] |}] type 'a u = U of (('a -> unit) -> unit);; let ul = !(ref ([] : 'a u list));; [%%expect{| -type 'a u = U of (('a -> unit) -> unit) +type +!'a u = U of (('a -> unit) -> unit) val ul : 'a u list = [] |}] @@ -34,7 +59,7 @@ module type s = sig type t end;; type !'a t = (module s with type t = 'a);; [%%expect{| module type s = sig type t end -type 'a t = (module s with type t = 'a) +type !'a t = (module s with type t = 'a) |}] (* Composition *) @@ -123,3 +148,120 @@ Error: In this definition, expected parameter variances are not satisfied. The 1st type parameter was expected to be covariant, but it is invariant. |}] + + +(* #14200 *) + +module M : sig + type 'a t = private string + type foo = private int + type bar = private int + val foo : foo t +end = struct + type 'a t = string + type foo = private int + type bar = private int + let foo = "foo" +end;; +[%%expect{| +module M : + sig + type 'a t = private string + type foo = private int + type bar = private int + val foo : foo t + end +|}] + +module Coerce : sig + type +'a pos = private string + type -'a neg = private string + + val p : 'a M.t -> 'a pos + val pn : 'a pos -> 'a neg + val n : 'a neg -> 'a M.t +end = struct + type 'a pos = 'a M.t + type 'a neg = 'a M.t + + let p = Fun.id + let pn = Fun.id + let n = Fun.id +end + +let bar : M.bar M.t = + M.foo + |> Coerce.p + |> (fun t -> (t :> int Coerce.pos)) + |> Coerce.pn + |> (fun t -> (t :> M.bar Coerce.neg)) + |> Coerce.n ;; +[%%expect{| +Lines 8-15, characters 6-3: + 8 | ......struct + 9 | type 'a pos = 'a M.t +10 | type 'a neg = 'a M.t +11 | +12 | let p = Fun.id +13 | let pn = Fun.id +14 | let n = Fun.id +15 | end +Error: Signature mismatch: + Modules do not match: + sig + type 'a pos = 'a M.t + type 'a neg = 'a M.t + val p : 'a -> 'a + val pn : 'a -> 'a + val n : 'a -> 'a + end + is not included in + sig + type +'a pos = private string + type -'a neg = private string + val p : 'a M.t -> 'a pos + val pn : 'a pos -> 'a neg + val n : 'a neg -> 'a M.t + end + Type declarations do not match: + type 'a pos = 'a M.t + is not included in + type +'a pos = private string + Their variances do not agree. +|}] + +type 'a priv = private int + +module Bad : sig + type +-'a t = private int + val inj : 'a priv -> 'a t + val prj : 'a t -> 'a priv +end = struct + type 'a t = 'a priv + let inj = Fun.id + let prj = Fun.id +end +let cast x = x |> Bad.inj |> (fun x -> (x :> _ M.t)) |> Bad.prj;; +[%%expect{| +type 'a priv = private int +Lines 7-11, characters 6-3: + 7 | ......struct + 8 | type 'a t = 'a priv + 9 | let inj = Fun.id +10 | let prj = Fun.id +11 | end +Error: Signature mismatch: + Modules do not match: + sig type 'a t = 'a priv val inj : 'a -> 'a val prj : 'a -> 'a end + is not included in + sig + type +-'a t = private int + val inj : 'a priv -> 'a t + val prj : 'a t -> 'a priv + end + Type declarations do not match: + type 'a t = 'a priv + is not included in + type +-'a t = private int + Their variances do not agree. +|}] diff --git a/testsuite/tests/typing-missing-cmi/test.compilers.reference b/testsuite/tests/typing-missing-cmi/test.compilers.reference index 08becbce..99f8d1e2 100644 --- a/testsuite/tests/typing-missing-cmi/test.compilers.reference +++ b/testsuite/tests/typing-missing-cmi/test.compilers.reference @@ -1,8 +1,8 @@ File "main.ml", line 1, characters 14-17: 1 | let _ = A.a = B.b ^^^ -Error: The value "B.b" has type "M.b" but an expression was expected of type "M.a" - Type "M.b" is abstract because no corresponding cmi file was found +Error: The value B.b has type M.b but an expression was expected of type M.a + Type M.b is abstract because no corresponding cmi file was found in path. - Type "M.a" is abstract because no corresponding cmi file was found + Type M.a is abstract because no corresponding cmi file was found in path. diff --git a/testsuite/tests/typing-modules-bugs/pr10693_bad.compilers.reference b/testsuite/tests/typing-modules-bugs/pr10693_bad.compilers.reference index 37c39f5c..f05bbef1 100644 --- a/testsuite/tests/typing-modules-bugs/pr10693_bad.compilers.reference +++ b/testsuite/tests/typing-modules-bugs/pr10693_bad.compilers.reference @@ -6,7 +6,7 @@ Error: Signature mismatch: sig val x : 'a option module M : Dep -> S end is not included in S - In module "M": + In module M: Modules do not match: Dep -> S is not included in @@ -15,7 +15,7 @@ Error: Signature mismatch: val x : X.t option module M : (Y : Dep) -> sig val x : X.t option end end - In module "M": + In module M: Modules do not match: S is not included in @@ -23,7 +23,7 @@ Error: Signature mismatch: val x : X.t option module M : (Y : Dep) -> sig val x : X.t option end end - In module "M.M": + In module M.M: Modules do not match: (X : Dep) -> sig @@ -32,7 +32,7 @@ Error: Signature mismatch: end is not included in (Y : Dep) -> sig val x : X.t option end - In module "M.M": + In module M.M: Modules do not match: sig val x : X.t option @@ -40,16 +40,16 @@ Error: Signature mismatch: end is not included in sig val x : X.t option end - In module "M.M": + In module M.M: Values do not match: val x : X.t option is not included in val x : X/2.t option - The type "X.t option" is not compatible with the type "X/2.t option" - Type "X.t" is not compatible with type "X/2.t" + The type X.t option is not compatible with the type X/2.t option + Type X.t is not compatible with type X/2.t File "_none_", line 1: - Definition of module "X" + Definition of module X File "_none_", line 1: - Definition of module "X/2" + Definition of module X/2 File "pr10693_bad.ml", line 17, characters 6-24: Expected declaration File "pr10693_bad.ml", line 15, characters 4-22: Actual declaration diff --git a/testsuite/tests/typing-modules-bugs/pr6293_bad.compilers.reference b/testsuite/tests/typing-modules-bugs/pr6293_bad.compilers.reference index 2ef32eed..f185b5c9 100644 --- a/testsuite/tests/typing-modules-bugs/pr6293_bad.compilers.reference +++ b/testsuite/tests/typing-modules-bugs/pr6293_bad.compilers.reference @@ -1,7 +1,7 @@ File "pr6293_bad.ml", line 10, characters 18-37: 10 | let f (module M : S with type t = int) = { M.a = 0 };; ^^^^^^^^^^^^^^^^^^^ -Error: In this "with" constraint, the new definition of "t" +Error: In this with constraint, the new definition of t does not match its original definition in the constrained signature: Type declarations do not match: type t = int diff --git a/testsuite/tests/typing-modules-bugs/pr6752_bad.compilers.reference b/testsuite/tests/typing-modules-bugs/pr6752_bad.compilers.reference index 78ce7144..0818ef69 100644 --- a/testsuite/tests/typing-modules-bugs/pr6752_bad.compilers.reference +++ b/testsuite/tests/typing-modules-bugs/pr6752_bad.compilers.reference @@ -1,6 +1,6 @@ File "pr6752_bad.ml", line 26, characters 31-40: 26 | let q' : Common0.msg Queue.t = Common0.q ^^^^^^^^^ -Error: The value "Common0.q" has type "'a Queue.t" - but an expression was expected of type "Common0.msg Queue.t" - The type constructor "Common0.msg" would escape its scope +Error: The value Common0.q has type 'a Queue.t + but an expression was expected of type Common0.msg Queue.t + The type constructor Common0.msg would escape its scope diff --git a/testsuite/tests/typing-modules-bugs/pr6899_first_bad.compilers.reference b/testsuite/tests/typing-modules-bugs/pr6899_first_bad.compilers.reference index f57c3e76..dd02da68 100644 --- a/testsuite/tests/typing-modules-bugs/pr6899_first_bad.compilers.reference +++ b/testsuite/tests/typing-modules-bugs/pr6899_first_bad.compilers.reference @@ -1,6 +1,6 @@ File "pr6899_first_bad.ml", line 9, characters 4-17: 9 | let should_reject = ^^^^^^^^^^^^^ -Error: The type of this expression, "'_weak1 -> '_weak2 -> unit", - contains the non-generalizable type variable(s): "'_weak2", "'_weak1". +Error: The type of this expression, '_weak1 -> '_weak2 -> unit, + contains the non-generalizable type variable(s): '_weak2, '_weak1. (see manual section 6.1.2) diff --git a/testsuite/tests/typing-modules-bugs/pr6899_second_bad.compilers.reference b/testsuite/tests/typing-modules-bugs/pr6899_second_bad.compilers.reference index 9ff4c3c5..3c414af3 100644 --- a/testsuite/tests/typing-modules-bugs/pr6899_second_bad.compilers.reference +++ b/testsuite/tests/typing-modules-bugs/pr6899_second_bad.compilers.reference @@ -1,6 +1,6 @@ File "pr6899_second_bad.ml", line 12, characters 6-9: 12 | let bar = wrap () ^^^ -Error: The type of this expression, "([< `Test ] as '_weak1) -> unit", - contains the non-generalizable type variable(s): "'_weak1". +Error: The type of this expression, ([< `Test ] as '_weak1) -> unit, + contains the non-generalizable type variable(s): '_weak1. (see manual section 6.1.2) diff --git a/testsuite/tests/typing-modules-bugs/pr6992_bad.compilers.reference b/testsuite/tests/typing-modules-bugs/pr6992_bad.compilers.reference index 942be04f..ba71d875 100644 --- a/testsuite/tests/typing-modules-bugs/pr6992_bad.compilers.reference +++ b/testsuite/tests/typing-modules-bugs/pr6992_bad.compilers.reference @@ -1,6 +1,6 @@ File "pr6992_bad.ml", line 16, characters 69-71: 16 | let uniq (type a) (type b) (Eq : a fix) (Eq : b fix) : (a, b) eq = Eq ^^ -Error: The constructor "Eq" has type "(a, a) eq" - but an expression was expected of type "(a, b) eq" - Type "a" is not compatible with type "b" +Error: The constructor Eq has type (a, a) eq + but an expression was expected of type (a, b) eq + Type a is not compatible with type b diff --git a/testsuite/tests/typing-modules-bugs/pr7414_2_bad.compilers.reference b/testsuite/tests/typing-modules-bugs/pr7414_2_bad.compilers.reference index 7028884d..4eee34d8 100644 --- a/testsuite/tests/typing-modules-bugs/pr7414_2_bad.compilers.reference +++ b/testsuite/tests/typing-modules-bugs/pr7414_2_bad.compilers.reference @@ -12,8 +12,8 @@ Error: Modules do not match: val r : '_weak1 list ref ref is not included in val r : Choice.t list ref ref - The type "'_weak1 list ref ref" is not compatible with the type - "Choice.t list ref ref" - The type constructor "Choice.t" would escape its scope + The type '_weak1 list ref ref is not compatible with the type + Choice.t list ref ref + The type constructor Choice.t would escape its scope File "pr7414_2_bad.ml", line 29, characters 2-31: Expected declaration File "pr7414_2_bad.ml", line 40, characters 8-9: Actual declaration diff --git a/testsuite/tests/typing-modules-bugs/pr7414_bad.compilers.reference b/testsuite/tests/typing-modules-bugs/pr7414_bad.compilers.reference index dd896a08..04df28b3 100644 --- a/testsuite/tests/typing-modules-bugs/pr7414_bad.compilers.reference +++ b/testsuite/tests/typing-modules-bugs/pr7414_bad.compilers.reference @@ -12,8 +12,8 @@ Error: Modules do not match: val r : '_weak1 list ref ref is not included in val r : Choice.t list ref ref - The type "'_weak1 list ref ref" is not compatible with the type - "Choice.t list ref ref" - The type constructor "Choice.t" would escape its scope + The type '_weak1 list ref ref is not compatible with the type + Choice.t list ref ref + The type constructor Choice.t would escape its scope File "pr7414_bad.ml", line 38, characters 2-31: Expected declaration File "pr7414_bad.ml", line 33, characters 6-7: Actual declaration diff --git a/testsuite/tests/typing-modules-bugs/pr9695_bad.compilers.reference b/testsuite/tests/typing-modules-bugs/pr9695_bad.compilers.reference index 39f13032..d52aba54 100644 --- a/testsuite/tests/typing-modules-bugs/pr9695_bad.compilers.reference +++ b/testsuite/tests/typing-modules-bugs/pr9695_bad.compilers.reference @@ -1,4 +1,4 @@ File "pr9695_bad.ml", line 10, characters 18-19: 10 | let () = let open A in x ^ -Error: This is an alias for module "MissingModule", which is missing +Error: This is an alias for module MissingModule, which is missing diff --git a/testsuite/tests/typing-modules/Test.ml b/testsuite/tests/typing-modules/Test.ml index ce983751..5925e8d2 100644 --- a/testsuite/tests/typing-modules/Test.ml +++ b/testsuite/tests/typing-modules/Test.ml @@ -120,9 +120,9 @@ module F(X : sig end) = struct let x = 3 end;; F.x;; (* fail *) [%%expect{| module F : (X : sig end) -> sig val x : int end -Line 2, characters 0-3: +Line 2, characters 0-1: 2 | F.x;; (* fail *) - ^^^ + ^ Error: The module "F" is a functor, it cannot have any components |}];; diff --git a/testsuite/tests/typing-modules/aliases.ml b/testsuite/tests/typing-modules/aliases.ml index e093ac2c..2acd82d2 100644 --- a/testsuite/tests/typing-modules/aliases.ml +++ b/testsuite/tests/typing-modules/aliases.ml @@ -15,14 +15,38 @@ module C = Char - : char = 'B' module C' : sig + type t = char external code : char -> int = "%identity" val chr : int -> char val escaped : char -> string - val lowercase_ascii : char -> char - val uppercase_ascii : char -> char - type t = char val compare : t -> t -> int val equal : t -> t -> bool + module Ascii : + sig + val min : char + val max : char + val is_valid : char -> bool + val is_upper : char -> bool + val is_lower : char -> bool + val is_letter : char -> bool + val is_alphanum : char -> bool + val is_white : char -> bool + val is_blank : char -> bool + val is_graphic : char -> bool + val is_print : char -> bool + val is_control : char -> bool + val is_digit : char -> bool + val digit_to_int : char -> int + val digit_of_int : int -> char + val is_hex_digit : char -> bool + val hex_digit_to_int : char -> int + val lower_hex_digit_of_int : int -> char + val upper_hex_digit_of_int : int -> char + val uppercase : char -> char + val lowercase : char -> char + end + val lowercase_ascii : char -> char + val uppercase_ascii : char -> char val seeded_hash : int -> t -> int val hash : t -> int external unsafe_chr : int -> char = "%identity" @@ -30,14 +54,15 @@ module C' : - : char = 'B' module C3 : sig + type t = char external code : char -> int = "%identity" val chr : int -> char val escaped : char -> string - val lowercase_ascii : char -> char - val uppercase_ascii : char -> char - type t = char val compare : t -> t -> int val equal : t -> t -> bool + module Ascii = Char.Ascii + val lowercase_ascii : char -> char + val uppercase_ascii : char -> char val seeded_hash : int -> t -> int val hash : t -> int external unsafe_chr : int -> char = "%identity" @@ -59,28 +84,30 @@ C4.chr 66;; module F : (X : sig end) -> sig + type t = char external code : char -> int = "%identity" val chr : int -> char val escaped : char -> string - val lowercase_ascii : char -> char - val uppercase_ascii : char -> char - type t = char val compare : t -> t -> int val equal : t -> t -> bool + module Ascii = Char.Ascii + val lowercase_ascii : char -> char + val uppercase_ascii : char -> char val seeded_hash : int -> t -> int val hash : t -> int external unsafe_chr : int -> char = "%identity" end module C4 : sig + type t = char external code : char -> int = "%identity" val chr : int -> char val escaped : char -> string - val lowercase_ascii : char -> char - val uppercase_ascii : char -> char - type t = char val compare : t -> t -> int val equal : t -> t -> bool + module Ascii = Char.Ascii + val lowercase_ascii : char -> char + val uppercase_ascii : char -> char val seeded_hash : int -> t -> int val hash : t -> int external unsafe_chr : int -> char = "%identity" diff --git a/testsuite/tests/typing-modules/applicative_functor_type.ml b/testsuite/tests/typing-modules/applicative_functor_type.ml index 1aa096f9..b10586ce 100644 --- a/testsuite/tests/typing-modules/applicative_functor_type.ml +++ b/testsuite/tests/typing-modules/applicative_functor_type.ml @@ -16,9 +16,9 @@ module M : sig type t val equal : 'a -> 'a -> bool end type t = Set.Make(M).t [%%expect{| -Line 1, characters 9-22: +Line 1, characters 9-20: 1 | type t = Set.Make(M).t - ^^^^^^^^^^^^^ + ^^^^^^^^^^^ Error: Modules do not match: sig type t = M.t val equal : 'a -> 'a -> bool end is not included in Set.OrderedType @@ -37,9 +37,9 @@ module F : (X : sig type t = M.t val equal : unit end) -> sig type t end type t = F(M).t [%%expect{| -Line 1, characters 9-15: +Line 1, characters 9-13: 1 | type t = F(M).t - ^^^^^^ + ^^^^ Error: Modules do not match: sig type t = M.t val equal : 'a -> 'a -> bool end is not included in sig type t = M.t val equal : unit end @@ -59,9 +59,9 @@ module Generative : () -> sig type t end type t = Generative(M).t [%%expect{| -Line 1, characters 9-24: +Line 1, characters 9-19: 1 | type t = Generative(M).t - ^^^^^^^^^^^^^^^ + ^^^^^^^^^^ Error: The functor "Generative" is generative, it cannot be applied in type expressions |}] @@ -72,8 +72,8 @@ module F(X : sig module type S module F : S end) = struct type t = X.F(Parsing).t end [%%expect{| -Line 2, characters 11-25: +Line 2, characters 11-14: 2 | type t = X.F(Parsing).t - ^^^^^^^^^^^^^^ + ^^^ Error: The module "X.F" is abstract, it cannot be applied |}] diff --git a/testsuite/tests/typing-modules/firstclass.ml b/testsuite/tests/typing-modules/firstclass.ml index a4295887..87edd3f7 100644 --- a/testsuite/tests/typing-modules/firstclass.ml +++ b/testsuite/tests/typing-modules/firstclass.ml @@ -146,3 +146,23 @@ Error: Type "(module Nested_coercion)" is not a subtype of The two first-class module types differ by a coercion of the primitive "%identity" to a value, in module "M". |}] + +(* Test if it is typed correctly *) +module type T = sig type t end + +let valid_fcm = (module Int : T) + +[%%expect{| +module type T = sig type t end +val valid_fcm : (module T) = +|}] + +(* Test location in the error message *) +let x = (module struct end : T with type t2 = int);; + +[%%expect{| +Line 1, characters 29-49: +1 | let x = (module struct end : T with type t2 = int);; + ^^^^^^^^^^^^^^^^^^^^ +Error: The signature constrained by "with" has no component named "t2" +|}] diff --git a/testsuite/tests/typing-modules/functors.ml b/testsuite/tests/typing-modules/functors.ml index e9d83c59..e41bb22c 100644 --- a/testsuite/tests/typing-modules/functors.ml +++ b/testsuite/tests/typing-modules/functors.ml @@ -14,8 +14,8 @@ module type z = sig type z end module type w = sig type w end module type empty = sig end - module Empty = struct end + module X: x = struct type x end module Y: y = struct type y end module Z: z = struct type z end @@ -176,9 +176,9 @@ type u = F(X)(Z).t module F : (X : sig type x end) (Y : sig type y end) (Z : sig type z end) -> sig type t = X of X.x | Y of Y.y | Z of Z.z end -Line 4, characters 9-18: +Line 4, characters 9-16: 4 | type u = F(X)(Z).t - ^^^^^^^^^ + ^^^^^^^ Error: The functor application "F(X)(Z)" is ill-typed. These arguments: X Z @@ -581,9 +581,9 @@ module M = struct end [%%expect {| module F : (X : a) -> sig type t end -Line 6, characters 13-19: +Line 6, characters 13-17: 6 | type t = F(X).t - ^^^^^^ + ^^^^ Error: Modules do not match: a is not included in a/2 Line 3, characters 2-15: Definition of module type "a" @@ -1051,9 +1051,9 @@ module type Arg = module X : Honorificabilitudinitatibus module Y : A end -Line 14, characters 11-29: +Line 14, characters 11-27: 14 | type u = G(X)(Y)(X)(Y)(X).t - ^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^ Error: The functor application "G(X)(Y)(X)(Y)(X)" is ill-typed. These arguments: A.X A.Y A.X A.Y A.X @@ -1255,9 +1255,9 @@ Error: This application of the functor "F" is ill-typed. F : (X : sig type witness module type t module M : t end) -> X.t is not included in $T6 = sig type witness module type t module M : t end - Modules do not match: (X : $S1) -> ... is not included in -> ... - An extra argument is provided of module type - $S1 = sig type witness module type t module M : t end + This module should not be a functor, a structure was expected. + Moreover, the type of the functor body is incompatible with the + expected module type. |}] (** Divergent arities *) @@ -1613,9 +1613,9 @@ type fine = Bar(A)(FiveArgsExt)(B)(AExt).a type broken1 = Bar(B)(FiveArgsExt)(B)(AExt).a [%%expect{| -Line 1, characters 15-45: +Line 1, characters 15-43: 1 | type broken1 = Bar(B)(FiveArgsExt)(B)(AExt).a - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: The functor application "Bar(B)(FiveArgsExt)(B)(AExt)" is ill-typed. These arguments: B FiveArgsExt B AExt @@ -1633,9 +1633,9 @@ Error: The functor application "Bar(B)(FiveArgsExt)(B)(AExt)" is ill-typed. type broken2 = Bar(A)(FiveArgsExt)(TY)(TY)(TY)(TY)(TY).a [%%expect{| -Line 1, characters 15-56: +Line 1, characters 15-54: 1 | type broken2 = Bar(A)(FiveArgsExt)(TY)(TY)(TY)(TY)(TY).a - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: The functor application "Bar(A)(FiveArgsExt)(TY)(TY)(TY)(TY)(TY)" is ill-typed. These arguments: A FiveArgsExt TY TY TY TY TY @@ -2022,9 +2022,9 @@ Error: This module is not a functor, it cannot be applied. let f (x:Set.Make(Set)(A).t) = x [%%expect {| -Line 1, characters 9-27: +Line 1, characters 9-25: 1 | let f (x:Set.Make(Set)(A).t) = x - ^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^ Error: The functor application "Set.Make(Set)(A)" is ill-typed. These arguments: Set A @@ -2048,3 +2048,207 @@ Error: The functor application "Set.Make(Set)(A)" is ill-typed. File "set.mli", line 55, characters 4-31: Expected declaration 2. The following extra argument is provided A : sig type a = A.a end |}] + + +module F(X:a -> a): a = X +[%%expect {| +Line 1, characters 24-25: +1 | module F(X:a -> a): a = X + ^ +Error: Signature mismatch: + This module should not be a functor, a module with an abstract module + type was expected. + Hint: Did you forget to apply the functor? +|}] + +module F(X:a -> a): empty = X +[%%expect {| +Line 1, characters 28-29: +1 | module F(X:a -> a): empty = X + ^ +Error: Signature mismatch: + This module should not be a functor, a structure was expected. + Moreover, the type of the functor body is incompatible with the + expected module type. +|}] + + +module F_empty(_:empty) = Empty +module M: empty = F_empty +[%%expect {| +module F_empty : empty -> sig end +Line 2, characters 18-25: +2 | module M: empty = F_empty + ^^^^^^^ +Error: Signature mismatch: + This module should not be a functor, a structure was expected. + Hint: Did you forget to apply the functor? +|}] + +module M: x = F_empty +[%%expect {| +Line 1, characters 14-21: +1 | module M: x = F_empty + ^^^^^^^ +Error: Signature mismatch: + This module should not be a functor, a structure was expected. + Moreover, the type of the functor body is incompatible with the + expected module type. +|}] + + +module F(X:empty -> empty) = Empty +module G(X:empty) = Empty +module A = F(Empty) +[%%expect {| +module F : (X : empty -> empty) -> sig end +module G : (X : empty) -> sig end +Line 3, characters 11-19: +3 | module A = F(Empty) + ^^^^^^^^ +Error: Modules do not match: sig end is not included in empty -> empty + This module should not be a structure, a functor was expected. +|}] + +module B = G(F_empty) +[%%expect {| +Line 1, characters 11-21: +1 | module B = G(F_empty) + ^^^^^^^^^^ +Error: Modules do not match: (Arg : empty) -> sig end is not included in + empty + This module should not be a functor, a structure was expected. + Hint: Did you forget to apply the functor? +|}] + +module F(X:a): sig module F:empty -> empty end = struct module F = X end +[%%expect {| +Line 1, characters 49-72: +1 | module F(X:a): sig module F:empty -> empty end = struct module F = X end + ^^^^^^^^^^^^^^^^^^^^^^^ +Error: Signature mismatch: + Modules do not match: + sig module F : a end + is not included in + sig module F : empty -> empty end + In module "F": + Modules do not match: a is not included in empty -> empty +|}] + +(** Incorrect hint: the compatibility check consider that [X.T] can not be equal + to [x] but this is false. However, anyone using abstract module types can + handle a slightly wrong hint. *) +module F(G: functor(X:sig module type T module I:T end) -> X.T): x = G +[%%expect {| +Line 1, characters 69-70: +1 | module F(G: functor(X:sig module type T module I:T end) -> X.T): x = G + ^ +Error: Signature mismatch: + This module should not be a functor, a structure was expected. + Moreover, the type of the functor body is incompatible with the + expected module type. +|}] + +(** Keeping equations *) + +module M: sig + type t + module Inner: sig type t end + module F(X:sig val f: t val g: Inner.t val h:float end):sig end +end = struct + type t + module Inner= struct type t end + module F(X:sig val f: t val g: Inner.t val h:int end)= struct end +end +[%%expect {| +Lines 7-11, characters 6-3: + 7 | ......struct + 8 | type t + 9 | module Inner= struct type t end +10 | module F(X:sig val f: t val g: Inner.t val h:int end)= struct end +11 | end +Error: Signature mismatch: + Modules do not match: + sig + type t + module Inner : sig type t end + module F : + (X : sig val f : t val g : Inner.t val h : int end) -> sig end + end + is not included in + sig + type t + module Inner : sig type t end + module F : + (X : sig val f : t val g : Inner.t val h : float end) -> sig end + end + In module "F": + Modules do not match: + (X : $S1) -> ... + is not included in + (X : $T1) -> ... + Module types do not match: + $S1 = sig val f : t val g : Inner.t val h : int end + does not include + $T1 = sig val f : t val g : Inner.t val h : float end + Values do not match: val h : float is not included in val h : int + The type "float" is not compatible with the type "int" +|}] + +module M: sig + type t + module Inner: sig type t end + module F + (A:a) + (X:sig val f: t val h:int end) + (A:a) + (Y:sig val f: Inner.t val h:int end) + + :sig end +end = struct + type t + module Inner= struct type t end + module F + (X:sig val f: t val h:int end) + (A:a) + (Y:sig val f: Inner.t val h:int end) + = struct end +end +[%%expect {| +Lines 11-19, characters 6-3: +11 | ......struct +12 | type t +13 | module Inner= struct type t end +14 | module F +15 | (X:sig val f: t val h:int end) +16 | (A:a) +17 | (Y:sig val f: Inner.t val h:int end) +18 | = struct end +19 | end +Error: Signature mismatch: + Modules do not match: + sig + type t + module Inner : sig type t end + module F : + (X : sig val f : t val h : int end) (A : a) + (Y : sig val f : Inner.t val h : int end) -> sig end + end + is not included in + sig + type t + module Inner : sig type t end + module F : + (A : a) (X : sig val f : t val h : int end) (A : a) + (Y : sig val f : Inner.t val h : int end) -> sig end + end + In module "F": + Modules do not match: + (X : $S2) (A : a) (Y : $S4) -> ... + is not included in + (A : a) (X : $T2) (A : a) (Y : $T4) -> ... + 1. An argument appears to be missing with module type a + 2. Module types $S2 and $T2 match + 3. Module types a and a match + 4. Module types $S4 and $T4 match +|}] diff --git a/testsuite/tests/typing-modules/generative.ml b/testsuite/tests/typing-modules/generative.ml index fd6d9c05..73b35b20 100644 --- a/testsuite/tests/typing-modules/generative.ml +++ b/testsuite/tests/typing-modules/generative.ml @@ -51,7 +51,7 @@ Line 3, characters 14-24: 3 | module M2 = F(struct end);; (* accepted with a warning *) ^^^^^^^^^^ Warning 73 [generative-application-expects-unit]: A generative functor -should be applied to '()'; using '(struct end)' is deprecated. + should be applied to "()"; using "(struct end)" is deprecated. module M2 : S |}];; diff --git a/testsuite/tests/typing-modules/module_type_substitution.ml b/testsuite/tests/typing-modules/module_type_substitution.ml index 6f5035ba..26eb4cec 100644 --- a/testsuite/tests/typing-modules/module_type_substitution.ml +++ b/testsuite/tests/typing-modules/module_type_substitution.ml @@ -367,3 +367,225 @@ Error: The module type "t" is not a valid type for a packed module: it is defined as a local substitution (temporary name) for an anonymous module type. (see manual section 12.7.3) |}] + +(** Approximation and substitutions **) + +(* Approximating a signature with a constraint should merge the approximated + constraint (abstract, non destructive case) *) +module type Test_Abstract = sig + module type S := sig + module type A + module X' : A + end + + module rec X : (S with module type A = sig type t end) + and Y : sig type u = X.X'.t end +end +[%%expect {| +module type Test_Abstract = + sig + module rec X : sig module type A = sig type t end module X' : A end + and Y : sig type u = X.X'.t end + end +|}] + + +(* Approximating a signature with a constraint should merge the approximated + constraint (abstract, destructive case) *) +module type Test_Abstract_Destructive = sig + module type S := sig + module type A + module X' : A + end + + module rec X : (S with module type A := sig type t end) + and Y : sig type u = X.X'.t end +end +[%%expect {| +module type Test_Abstract_Destructive = + sig + module rec X : sig module X' : sig type t end end + and Y : sig type u = X.X'.t end + end +|}] + + +(* Approximating a signature with a constraint should merge the approximated + constraint (concrete, non destructive case) *) +module type Test_Concrete = sig + module type S := sig + module type A = sig type t type u end + module X' : A + end + + module rec X : (S with module type A = sig type u type t end) + and Y : sig type v = X.X'.t end +end +[%%expect {| +module type Test_Concrete = + sig + module rec X : + sig module type A = sig type u type t end module X' : A end + and Y : sig type v = X.X'.t end + end +|}] + +(* Approximating a signature with a constraint should merge the approximated + constraint (concrete, destructive case) *) +module type Test_Concrete_Destructive = sig + module type S := sig + module type A = sig type t type u end + module X' : A + end + + module rec X : (S with module type A := sig type u type t end) + and Y : sig type v = X.X'.t end +end +[%%expect {| +module type Test_Concrete_Destructive = + sig + module rec X : sig module X' : sig type u type t end end + and Y : sig type v = X.X'.t end + end +|}] + + +(* Approximating a signature with a constraint should merge the approximated + constraint (deep, abstract, non destructive case) *) +module type Test_Deep_Abstract = sig + module type S := sig + module M : sig + module type A + module X1 : A + end + module X2 : M.A + end + + module rec X : (S with module type M.A = sig type t end) + and Y : sig type u = X.X2.t * X.M.X1.t end +end +[%%expect {| +module type Test_Deep_Abstract = + sig + module rec X : + sig + module M : sig module type A = sig type t end module X1 : A end + module X2 : M.A + end + and Y : sig type u = X.X2.t * X.M.X1.t end + end +|}] + + +(* Approximating a signature with a constraint should merge the approximated + constraint (deep, abstract, destructive case) *) +module type Test_Deep_Abstract_Destructive = sig + module type S := sig + module M : sig + module type A + module X1 : A + end + module X2 : M.A + end + + module rec X : (S with module type M.A := sig type t end) + and Y : sig type u = X.X2.t * X.M.X1.t end +end +[%%expect {| +module type Test_Deep_Abstract_Destructive = + sig + module rec X : + sig + module M : sig module X1 : sig type t end end + module X2 : sig type t end + end + and Y : sig type u = X.X2.t * X.M.X1.t end + end +|}] + + +(* Approximating a signature with a constraint should merge the approximated + constraint (deep, concrete, non destructive case) *) +module type Test_Deep_Concrete = sig + module type S := sig + module M : sig + module type A = sig type t type u end + module X1 : A + end + module X2 : M.A + end + + module rec X : (S with module type M.A = sig type u type t end) + and Y : sig type u = X.X2.t * X.M.X1.t end +end +[%%expect {| +module type Test_Deep_Concrete = + sig + module rec X : + sig + module M : + sig module type A = sig type u type t end module X1 : A end + module X2 : M.A + end + and Y : sig type u = X.X2.t * X.M.X1.t end + end +|}] + + +(* Approximating a signature with a constraint should merge the approximated + constraint (deep, concrete, destructive case) *) +module type Test_Deep_Concrete_Destructive = sig + module type S := sig + module M : sig + module type A = sig type t type u end + module X1 : A + end + module X2 : M.A + end + + module rec X : (S with module type M.A := sig type u type t end) + and Y : sig type u = X.X2.t * X.M.X1.t end +end +[%%expect {| +module type Test_Deep_Concrete_Destructive = + sig + module rec X : + sig + module M : sig module X1 : sig type u type t end end + module X2 : sig type u type t end + end + and Y : sig type u = X.X2.t * X.M.X1.t end + end +|}] + + +(* Invalid substitutions might be accepted during the approximation phase, but + should be rejected during typechecking of signatures (before typechecking of + module bodies) *) +module type Test = sig + module rec X : (sig + module type A = sig type t = bool end + module X' : A + end with module type A = sig type t = int end) + and Y : sig type u = X.X'.t end +end +[%%expect {| +Lines 2-5, characters 18-49: +2 | ..................sig +3 | module type A = sig type t = bool end +4 | module X' : A +5 | end with module type A = sig type t = int end. +Error: In this "with" constraint, the new definition of "A" + does not match its original definition in the constrained signature: + At position "module type A = " + Module types do not match: + sig type t = bool end + is not equal to + sig type t = int end + At position "module type A = " + Type declarations do not match: + type t = bool + is not included in + type t = int + The type "bool" is not equal to the type "int" +|}] diff --git a/testsuite/tests/typing-modules/nondep.ml b/testsuite/tests/typing-modules/nondep.ml index 5f4d7d47..8a05e17e 100644 --- a/testsuite/tests/typing-modules/nondep.ml +++ b/testsuite/tests/typing-modules/nondep.ml @@ -56,3 +56,18 @@ module M : module Not_ok : sig type t end end |}] + +module Avoidance_fail = (functor (Y:sig type t end) -> struct + module type A = sig type u = Y.t end + end)(struct type t end) + +[%%expect{| +Lines 1-3, characters 24-34: +1 | ........................(functor (Y:sig type t end) -> struct +2 | module type A = sig type u = Y.t end +3 | end)(struct type t end) +Error: This functor has type + "(Y : sig type t end) -> sig module type A = sig type u = Y.t end end" + The parameter cannot be eliminated in the result type. + Please bind the argument to a module identifier. +|}] diff --git a/testsuite/tests/typing-modules/package_constraint.ml b/testsuite/tests/typing-modules/package_constraint.ml index 6044ed7f..68d7dfdb 100644 --- a/testsuite/tests/typing-modules/package_constraint.ml +++ b/testsuite/tests/typing-modules/package_constraint.ml @@ -47,9 +47,9 @@ type m2 = (module S with type t = string);; [%%expect{| module type S = sig type t [@@immediate] end type m1 = (module S with type t = int) -Line 6, characters 10-41: +Line 6, characters 18-40: 6 | type m2 = (module S with type t = string);; - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^ Error: In this "with" constraint, the new definition of "t" does not match its original definition in the constrained signature: Type declarations do not match: @@ -67,9 +67,9 @@ end type m = (module S with type t = string);; [%%expect{| module type S = sig type t = int end -Line 5, characters 9-40: +Line 5, characters 17-39: 5 | type m = (module S with type t = string);; - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^ Error: In the constrained signature, type "t" is defined to be "int". Package "with" constraints may only be used on abstract types. |}];; @@ -83,9 +83,9 @@ end type m = (module S with type t = int);; [%%expect{| module type S = sig type t = int end -Line 5, characters 9-37: +Line 5, characters 17-36: 5 | type m = (module S with type t = int);; - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^ Error: In the constrained signature, type "t" is defined to be "int". Package "with" constraints may only be used on abstract types. |}];; @@ -103,9 +103,9 @@ type m = (module S with type P.t = int);; [%%expect{| module M : sig type t end module type S = sig module P = M end -Line 9, characters 9-39: +Line 9, characters 17-38: 9 | type m = (module S with type P.t = int);; - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^ Error: In the constrained signature, type "P.t" is defined to be "M.t". Package "with" constraints may only be used on abstract types. |}];; @@ -122,9 +122,9 @@ type t1 = int and t2 = (module S with type t = t1);; [%%expect{| module type S = sig type t [@@immediate] end -Line 6, characters 9-36: +Line 6, characters 17-35: 6 | and t2 = (module S with type t = t1);; - ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^ Error: In this "with" constraint, the new definition of "t" does not match its original definition in the constrained signature: Type declarations do not match: @@ -190,9 +190,9 @@ module type Private_row = sig type a and t = private [< `A | `B ] and b and d = private [< `C ] end module type Test = sig type a and t = [ `A ] and b and d = private [< `C ] end -Line 13, characters 12-54: +Line 13, characters 20-52: 13 | type fail = (module Private_row with type t = [ `A ] ) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: In the constrained signature, type "t" is defined to be "[< `A | `B ]". Package "with" constraints may only be used on abstract types. |}] @@ -206,36 +206,47 @@ end type t1 = (module Private_row with type t = [ `A ]) [%%expect{| module type Private_row = sig type t = private [< `A ] end -Line 5, characters 10-51: +Line 5, characters 18-50: 5 | type t1 = (module Private_row with type t = [ `A ]) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: In the constrained signature, type "t" is defined to be "[< `A ]". Package "with" constraints may only be used on abstract types. |}] type t2 = (module Private_row with type t = [< `A ]) [%%expect{| -Line 1, characters 10-52: +Line 1, characters 18-51: 1 | type t2 = (module Private_row with type t = [< `A ]) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: In the constrained signature, type "t" is defined to be "[< `A ]". Package "with" constraints may only be used on abstract types. |}] type 'a t3 = (module Private_row with type t = [< `A ]) as 'a [%%expect{| -Line 1, characters 13-55: +Line 1, characters 21-54: 1 | type 'a t3 = (module Private_row with type t = [< `A ]) as 'a - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: In the constrained signature, type "t" is defined to be "[< `A ]". Package "with" constraints may only be used on abstract types. |}] type 'a t4 = (module Private_row with type t = [< `A ] as 'a) [%%expect{| -Line 1, characters 13-61: +Line 1, characters 21-60: 1 | type 'a t4 = (module Private_row with type t = [< `A ] as 'a) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: In the constrained signature, type "t" is defined to be "[< `A ]". Package "with" constraints may only be used on abstract types. |}] + +(** Issue 13778: constraining a type should count as using it *) +module X: sig + type t +end = struct + module type S = sig type s end + type t = (module S with type s = int) +end +[%%expect {| +module X : sig type t end +|}] diff --git a/testsuite/tests/typing-modules/pr13099/test.compilers.reference b/testsuite/tests/typing-modules/pr13099/test.compilers.reference index 095c842c..3485ef27 100644 --- a/testsuite/tests/typing-modules/pr13099/test.compilers.reference +++ b/testsuite/tests/typing-modules/pr13099/test.compilers.reference @@ -2,7 +2,7 @@ File "lib2_client.ml", line 19, characters 11-36: 19 | module _ = F (struct type t = T end) ^^^^^^^^^^^^^^^^^^^^^^^^^ Error: This functor has type - "(T : sig type t end) -> - sig type t = Lib1_client__X.t val f : T.t -> unit end" + (T : sig type t end) -> + sig type t = Lib1_client__X.t val f : T.t -> unit end The parameter cannot be eliminated in the result type. Please bind the argument to a module identifier. diff --git a/testsuite/tests/typing-modules/pr6633.ml b/testsuite/tests/typing-modules/pr6633.ml index 20961e79..a3de460e 100644 --- a/testsuite/tests/typing-modules/pr6633.ml +++ b/testsuite/tests/typing-modules/pr6633.ml @@ -26,7 +26,7 @@ Line 2, characters 26-32: 2 | module Foo = functor (E : EqualF) -> struct end;; ^^^^^^ Error: Unbound module type "EqualF" -Hint: Did you mean "Equals"? +Hint: Did you mean "Equals"? |}] (* If a module is used as a module type it should trigger the hint @@ -49,9 +49,9 @@ module type S = sig type t val show: t -> string end let f (x: S.t ) = ();; [%%expect{| module type S = sig type t val show : t -> string end -Line 2, characters 10-13: +Line 2, characters 10-11: 2 | let f (x: S.t ) = ();; - ^^^ + ^ Error: Unbound module "S" Hint: There is a module type named "S", but module types are not modules |}] @@ -65,5 +65,5 @@ Line 2, characters 25-27: 2 | class c = object inherit ct end ^^ Error: Unbound class "ct" -Hint: There is a class type named "ct", but classes are not class types +Hint: There is a class type named "ct", but classes are not class types. |}] diff --git a/testsuite/tests/typing-modules/pr7207.ml b/testsuite/tests/typing-modules/pr7207.ml index 193deceb..b22d5da3 100644 --- a/testsuite/tests/typing-modules/pr7207.ml +++ b/testsuite/tests/typing-modules/pr7207.ml @@ -6,8 +6,8 @@ module F (X : sig end) = struct type t = int end;; type t = F(Does_not_exist).t;; [%%expect{| module F : (X : sig end) -> sig type t = int end -Line 2, characters 9-28: +Line 2, characters 11-25: 2 | type t = F(Does_not_exist).t;; - ^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^ Error: Unbound module "Does_not_exist" |}];; diff --git a/testsuite/tests/typing-modules/pr7726.ml b/testsuite/tests/typing-modules/pr7726.ml index f6dde342..92b8b7d9 100644 --- a/testsuite/tests/typing-modules/pr7726.ml +++ b/testsuite/tests/typing-modules/pr7726.ml @@ -93,9 +93,9 @@ Error: In the signature of this functor application: |}] type t = Fix(Id).Fixed.t;; [%%expect{| -Line 1, characters 9-24: +Line 1, characters 9-16: 1 | type t = Fix(Id).Fixed.t;; - ^^^^^^^^^^^^^^^ + ^^^^^^^ Error: In the signature of Fix(Id): The definition of "Fixed.t" contains a cycle: "Id(Fixed).t" = "Fixed.t", @@ -104,9 +104,9 @@ Error: In the signature of Fix(Id): |}] let f (x : Fix(Id).Fixed.t) = x;; [%%expect{| -Line 1, characters 11-26: +Line 1, characters 11-18: 1 | let f (x : Fix(Id).Fixed.t) = x;; - ^^^^^^^^^^^^^^^ + ^^^^^^^ Error: In the signature of Fix(Id): The definition of "Fixed.t" contains a cycle: "Id(Fixed).t" = "Fixed.t", @@ -137,9 +137,9 @@ type t = F(M).t;; [%%expect{| module F : () -> sig type t end module M : sig end -Line 3, characters 9-15: +Line 3, characters 9-10: 3 | type t = F(M).t;; - ^^^^^^ + ^ Error: The functor "F" is generative, it cannot be applied in type expressions |}] @@ -155,9 +155,9 @@ module Fix2 : module rec Fixed : sig type t = F(Fixed).t end module R : (X : sig end) -> sig type t = Fixed.t end end -Line 5, characters 11-26: +Line 5, characters 11-19: 5 | let f (x : Fix2(Id).R(M).t) = x;; - ^^^^^^^^^^^^^^^ + ^^^^^^^^ Error: In the signature of Fix2(Id): The definition of "Fixed.t" contains a cycle: "Id(Fixed).t" = "Fixed.t", diff --git a/testsuite/tests/typing-modules/pr7851.ml b/testsuite/tests/typing-modules/pr7851.ml index 53172f2f..beae3305 100644 --- a/testsuite/tests/typing-modules/pr7851.ml +++ b/testsuite/tests/typing-modules/pr7851.ml @@ -40,9 +40,9 @@ let bool_of_int x = bool_of_int 3;; [%%expect{| -Line 2, characters 28-32: +Line 2, characters 28-30: 2 | let (E y : M1.u) = (E x : M1.t) in - ^^^^ + ^^ Error: Unbound module "M1" |}] diff --git a/testsuite/tests/typing-modules/recursive.ml b/testsuite/tests/typing-modules/recursive.ml index bd44df5b..44c97979 100644 --- a/testsuite/tests/typing-modules/recursive.ml +++ b/testsuite/tests/typing-modules/recursive.ml @@ -12,3 +12,27 @@ Line 1, characters 0-39: Error: The type abbreviation "T.t" is cyclic: "T.t" = "T.t" |}] + +(* Cyclic module type definitions should throw an error *) +module rec X : (sig module type A = X.A end) + = struct module type A end +[%%expect {| +Line 1, characters 36-37: +1 | module rec X : (sig module type A = X.A end) + ^ +Error: This module type is recursive. This use of the recursive module "X" + within its own definition makes the module type of "X" depend on itself. + Such recursive definitions of module types are not allowed. +|}] + +(* Cyclic module type definitions should throw an error *) +module rec X : (sig module type A := X.A end) + = struct end +[%%expect {| +Line 1, characters 37-38: +1 | module rec X : (sig module type A := X.A end) + ^ +Error: This module type is recursive. This use of the recursive module "X" + within its own definition makes the module type of "X" depend on itself. + Such recursive definitions of module types are not allowed. +|}] diff --git a/testsuite/tests/typing-objects-bugs/pr3968_bad.compilers.reference b/testsuite/tests/typing-objects-bugs/pr3968_bad.compilers.reference index 2bb04d8b..02f578db 100644 --- a/testsuite/tests/typing-objects-bugs/pr3968_bad.compilers.reference +++ b/testsuite/tests/typing-objects-bugs/pr3968_bad.compilers.reference @@ -29,16 +29,16 @@ Error: The class type is not matched by the class type object method eval : (string, exp) Hashtbl.t -> expr end The method eval has type - "(string, exp) Hashtbl.t -> + (string, exp) Hashtbl.t -> ([> `App of [ `Abs of string * 'a | `App of expr * expr ] * exp ] - as 'a)" - but is expected to have type "(string, exp) Hashtbl.t -> expr" + as 'a) + but is expected to have type (string, exp) Hashtbl.t -> expr Type - "[> `App of [ `Abs of string * 'a | `App of expr * expr ] * exp ] - as 'a" + [> `App of [ `Abs of string * 'a | `App of expr * expr ] * exp ] + as 'a is not compatible with type - "expr" = "[ `Abs of string * expr | `App of expr * expr ]" - Type "exp" = "< eval : (string, exp) Hashtbl.t -> expr >" + expr = [ `Abs of string * expr | `App of expr * expr ] + Type exp = < eval : (string, exp) Hashtbl.t -> expr > is not compatible with type - "expr" = "[ `Abs of string * expr | `App of expr * expr ]" - Types for tag "`App" are incompatible + expr = [ `Abs of string * expr | `App of expr * expr ] + Types for tag `App are incompatible diff --git a/testsuite/tests/typing-objects-bugs/pr4018_bad.compilers.reference b/testsuite/tests/typing-objects-bugs/pr4018_bad.compilers.reference index 192310f1..9db3b5e0 100644 --- a/testsuite/tests/typing-objects-bugs/pr4018_bad.compilers.reference +++ b/testsuite/tests/typing-objects-bugs/pr4018_bad.compilers.reference @@ -1,25 +1,25 @@ File "pr4018_bad.ml", line 42, characters 11-17: 42 | let f (x : entity entity_container) = () ^^^^^^ -Error: This type "entity" = "< destroy_subject : id subject; entity_id : id >" +Error: This type entity = < destroy_subject : id subject; entity_id : id > should be an instance of type - "< destroy_subject : < add_observer : 'a entity_container -> 'b; .. >; + < destroy_subject : < add_observer : 'a entity_container -> 'b; .. >; .. > - as 'a" + as 'a Type - "id subject" = - "< add_observer : (id subject, id) observer -> unit; - notify_observers : id -> unit >" + id subject = + < add_observer : (id subject, id) observer -> unit; + notify_observers : id -> unit > is not compatible with type - "< add_observer : < destroy_subject : 'c; .. > entity_container -> 'b; + < add_observer : < destroy_subject : 'c; .. > entity_container -> 'b; .. > - as 'c" - Type "(id subject, id) observer" = "< notify : id subject -> id -> unit >" + as 'c + Type (id subject, id) observer = < notify : id subject -> id -> unit > is not compatible with type - "(< destroy_subject : < add_observer : 'd -> 'b; .. >; .. > as 'a) - entity_container as 'd" = - "< add_entity : 'a -> 'b; notify : 'a -> id -> unit >" - The method "add_observer" has type "(id subject, id) observer -> unit", + (< destroy_subject : < add_observer : 'd -> 'b; .. >; .. > as 'a) + entity_container as 'd = + < add_entity : 'a -> 'b; notify : 'a -> id -> unit > + The method add_observer has type (id subject, id) observer -> unit, but the expected method type was - "< destroy_subject : < add_observer : 'e; .. >; .. > entity_container -> - 'b as 'e" + < destroy_subject : < add_observer : 'e; .. >; .. > entity_container -> + 'b as 'e diff --git a/testsuite/tests/typing-objects-bugs/pr4435_bad.compilers.reference b/testsuite/tests/typing-objects-bugs/pr4435_bad.compilers.reference index e4f7e6c2..4a75d176 100644 --- a/testsuite/tests/typing-objects-bugs/pr4435_bad.compilers.reference +++ b/testsuite/tests/typing-objects-bugs/pr4435_bad.compilers.reference @@ -1,5 +1,5 @@ File "pr4435_bad.ml", line 14, characters 6-7: 14 | class c (v : int) = ^ -Error: Multiple definition of the class name "c". +Error: Multiple definition of the class name c. Names must be unique in a given structure or signature. diff --git a/testsuite/tests/typing-objects-bugs/pr4824a_bad.compilers.reference b/testsuite/tests/typing-objects-bugs/pr4824a_bad.compilers.reference index 854ab844..8c644ef0 100644 --- a/testsuite/tests/typing-objects-bugs/pr4824a_bad.compilers.reference +++ b/testsuite/tests/typing-objects-bugs/pr4824a_bad.compilers.reference @@ -7,4 +7,4 @@ Error: Signature mismatch: class c : 'a -> object val x : 'a end does not match class c : 'a -> object val x : 'b end - The instance variable x has type "'a" but is expected to have type "'b" + The instance variable x has type 'a but is expected to have type 'b diff --git a/testsuite/tests/typing-objects-bugs/pr7284_bad.compilers.reference b/testsuite/tests/typing-objects-bugs/pr7284_bad.compilers.reference index 648d3fea..138a1c74 100644 --- a/testsuite/tests/typing-objects-bugs/pr7284_bad.compilers.reference +++ b/testsuite/tests/typing-objects-bugs/pr7284_bad.compilers.reference @@ -2,5 +2,4 @@ File "pr7284_bad.ml", line 35, characters 30-62: 35 | let f : X.v1 wit -> unit = function V1 s -> print_endline s ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error (warning 8 [partial-match]): this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -V2 _ + Here is an example of a case that is not matched: V2 _ diff --git a/testsuite/tests/typing-objects/Exemples.ml b/testsuite/tests/typing-objects/Exemples.ml index b54165e8..825f4dd8 100644 --- a/testsuite/tests/typing-objects/Exemples.ml +++ b/testsuite/tests/typing-objects/Exemples.ml @@ -290,8 +290,8 @@ end;; Line 3, characters 2-36: 3 | inherit printable_point y as super ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Warning 13 [instance-variable-override]: the following instance variables are overridden by the class printable_point : - x +Warning 13 [instance-variable-override]: the following instance variables + are overridden by the class "printable_point": "x" class printable_color_point : int -> diff --git a/testsuite/tests/typing-objects/Tests.ml b/testsuite/tests/typing-objects/Tests.ml index 3f9a7073..d9ecba01 100644 --- a/testsuite/tests/typing-objects/Tests.ml +++ b/testsuite/tests/typing-objects/Tests.ml @@ -483,24 +483,24 @@ end;; Line 3, characters 2-13: 3 | inherit c 5 ^^^^^^^^^^^ -Warning 13 [instance-variable-override]: the following instance variables are overridden by the class c : - x +Warning 13 [instance-variable-override]: the following instance variables + are overridden by the class "c": "x" Line 4, characters 6-7: 4 | val y = 3 ^ -Warning 13 [instance-variable-override]: the instance variable y is overridden. +Warning 13 [instance-variable-override]: the instance variable "y" is overridden. Line 6, characters 2-13: 6 | inherit d 7 ^^^^^^^^^^^ -Warning 13 [instance-variable-override]: the following instance variables are overridden by the class d : - t z +Warning 13 [instance-variable-override]: the following instance variables + are overridden by the class "d": "t" "z" Line 7, characters 6-7: 7 | val u = 3 ^ -Warning 13 [instance-variable-override]: the instance variable u is overridden. +Warning 13 [instance-variable-override]: the instance variable "u" is overridden. class e : unit -> @@ -731,6 +731,9 @@ Error: Multiple definition of the type name "t". fun x -> (x :> < m : 'a -> 'a > as 'a);; [%%expect{| - : < m : (< m : 'a > as 'b) -> 'b as 'a; .. > -> 'b = +|}, Principal{| +- : < m : < m : 'a > -> < m : 'a > as 'a; .. > -> (< m : 'b -> 'b > as 'b) = + |}];; fun x -> (x : int -> bool :> 'a -> 'a);; @@ -935,8 +938,8 @@ class a = object val x = 3 val y = x + 2 end;; Line 1, characters 35-36: 1 | class a = object val x = 3 val y = x + 2 end;; ^ -Error: The instance variable "x" - cannot be accessed from the definition of another instance variable +Error: The instance variable "x" cannot be accessed from the definition of + another instance variable |}];; class a = object (self) val x = self#m method m = 3 end;; @@ -944,8 +947,8 @@ class a = object (self) val x = self#m method m = 3 end;; Line 1, characters 32-36: 1 | class a = object (self) val x = self#m method m = 3 end;; ^^^^ -Error: The self variable "self" - cannot be accessed from the definition of an instance variable +Error: The self variable "self" cannot be accessed from the + definition of an instance variable |}];; class a = object method m = 3 end @@ -955,8 +958,8 @@ class a : object method m : int end Line 2, characters 44-49: 2 | class b = object inherit a as super val x = super#m end;; ^^^^^ -Error: The ancestor variable "super" - cannot be accessed from the definition of an instance variable +Error: The ancestor variable "super" cannot be accessed from + the definition of an instance variable |}];; (* Some more tests of class idiosyncrasies *) @@ -990,7 +993,7 @@ class c = object Line 4, characters 17-23: 4 | method n = self#m ^^^^^^ -Warning 17 [undeclared-virtual-method]: the virtual method m is not declared. +Warning 17 [undeclared-virtual-method]: the virtual method "m" is not declared. class c : object method m : int method n : int end |}];; @@ -1156,8 +1159,8 @@ val has_foo : < foo : 'a; .. > -> unit = Line 3, characters 10-75: 3 | class c = object (self) method private foo = 5 initializer has_foo self end;; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Warning 15 [implicit-public-methods]: the following private methods were made public implicitly: - foo. +Warning 15 [implicit-public-methods]: the following private methods were made + public implicitly: "foo". class c : object method foo : int end |}];; diff --git a/testsuite/tests/typing-objects/field_kind.ml b/testsuite/tests/typing-objects/field_kind.ml index 53dea44b..ca8961a9 100644 --- a/testsuite/tests/typing-objects/field_kind.ml +++ b/testsuite/tests/typing-objects/field_kind.ml @@ -29,8 +29,8 @@ Lines 2-5, characters 2-5: 3 | method private x = 3 4 | method m : type a. a t -> 's -> a = fun Int other -> (other#x : int) 5 | end.. -Warning 15 [implicit-public-methods]: the following private methods were made public implicitly: - x. +Warning 15 [implicit-public-methods]: the following private methods were made + public implicitly: "x". val o' : < m : 'a. 'a t -> 'b -> 'a; x : int > as 'b = val aargh : unit = () @@ -47,8 +47,8 @@ Lines 2-5, characters 2-5: 3 | method private x = 3 4 | method m : 's -> int = fun other -> (other#x : int) 5 | end.. -Warning 15 [implicit-public-methods]: the following private methods were made public implicitly: - x. +Warning 15 [implicit-public-methods]: the following private methods were made + public implicitly: "x". val o2 : < m : 'a -> int; x : int > as 'a = |}] @@ -68,8 +68,8 @@ Lines 2-6, characters 2-5: 4 | method m : 's -> int = fun other -> 5 | let module M = struct let other = other end in (M.other#x : int) 6 | end.. -Warning 15 [implicit-public-methods]: the following private methods were made public implicitly: - x. +Warning 15 [implicit-public-methods]: the following private methods were made + public implicitly: "x". val o3 : < m : 'a -> int; x : int > as 'a = val aargh : unit = () diff --git a/testsuite/tests/typing-objects/pr6383.ml b/testsuite/tests/typing-objects/pr6383.ml index 3b05b2c9..26d25781 100644 --- a/testsuite/tests/typing-objects/pr6383.ml +++ b/testsuite/tests/typing-objects/pr6383.ml @@ -4,8 +4,8 @@ let f (x: #M.foo) = 0;; [%%expect{| -Line 1, characters 11-16: +Line 1, characters 11-12: 1 | let f (x: #M.foo) = 0;; - ^^^^^ + ^ Error: Unbound module "M" |}];; diff --git a/testsuite/tests/typing-ocamlc-i/pervasives_leitmotiv.compilers.reference b/testsuite/tests/typing-ocamlc-i/pervasives_leitmotiv.compilers.reference index cbd6419a..d71b72e5 100644 --- a/testsuite/tests/typing-ocamlc-i/pervasives_leitmotiv.compilers.reference +++ b/testsuite/tests/typing-ocamlc-i/pervasives_leitmotiv.compilers.reference @@ -1,13 +1,13 @@ File "pervasives_leitmotiv.ml", line 1: -Warning 63 [erroneous-printed-signature]: The printed interface differs from the inferred interface. -The inferred interface contained items which could not be printed -properly due to name collisions between identifiers. -File "pervasives_leitmotiv.ml", lines 10-12, characters 0-3: +Warning 63 [erroneous-printed-signature]: The printed interface differs from + the inferred interface. The inferred interface contained items which could + not be printed properly due to name collisions between identifiers. + File "pervasives_leitmotiv.ml", lines 10-12, characters 0-3: Definition of module Stdlib File "_none_", line 1: Definition of module Stdlib/2 -Beware that this warning is purely informational and will not catch -all instances of erroneous printed interface. + Beware that this warning is purely informational and will not catch all + instances of erroneous printed interface. type fpclass = A module Stdlib : sig type fpclass = B end val f : fpclass -> Stdlib.fpclass -> Stdlib/2.fpclass diff --git a/testsuite/tests/typing-ocamlc-i/pr4791.compilers.reference b/testsuite/tests/typing-ocamlc-i/pr4791.compilers.reference index fa14e4a8..ebb01d0a 100644 --- a/testsuite/tests/typing-ocamlc-i/pr4791.compilers.reference +++ b/testsuite/tests/typing-ocamlc-i/pr4791.compilers.reference @@ -1,12 +1,12 @@ File "pr4791.ml", line 1: -Warning 63 [erroneous-printed-signature]: The printed interface differs from the inferred interface. -The inferred interface contained items which could not be printed -properly due to name collisions between identifiers. -File "pr4791.ml", line 11, characters 2-12: +Warning 63 [erroneous-printed-signature]: The printed interface differs from + the inferred interface. The inferred interface contained items which could + not be printed properly due to name collisions between identifiers. + File "pr4791.ml", line 11, characters 2-12: Definition of type t File "pr4791.ml", line 8, characters 0-10: Definition of type t/2 -Beware that this warning is purely informational and will not catch -all instances of erroneous printed interface. + Beware that this warning is purely informational and will not catch all + instances of erroneous printed interface. type t = A module B : sig type t = B val f : t/2 -> t end diff --git a/testsuite/tests/typing-ocamlc-i/pr6323.compilers.reference b/testsuite/tests/typing-ocamlc-i/pr6323.compilers.reference index 6c09f3c1..46f0ff86 100644 --- a/testsuite/tests/typing-ocamlc-i/pr6323.compilers.reference +++ b/testsuite/tests/typing-ocamlc-i/pr6323.compilers.reference @@ -1,13 +1,13 @@ File "pr6323.ml", line 1: -Warning 63 [erroneous-printed-signature]: The printed interface differs from the inferred interface. -The inferred interface contained items which could not be printed -properly due to name collisions between identifiers. -File "pr6323.ml", line 15, characters 2-24: +Warning 63 [erroneous-printed-signature]: The printed interface differs from + the inferred interface. The inferred interface contained items which could + not be printed properly due to name collisions between identifiers. + File "pr6323.ml", line 15, characters 2-24: Definition of type t File "pr6323.ml", line 8, characters 0-26: Definition of type t/2 -Beware that this warning is purely informational and will not catch -all instances of erroneous printed interface. + Beware that this warning is purely informational and will not catch all + instances of erroneous printed interface. type 'a t = B of 'a t list val foo : 'a -> 'b t list -> 'c t list module DT : diff --git a/testsuite/tests/typing-ocamlc-i/pr7402.compilers.reference b/testsuite/tests/typing-ocamlc-i/pr7402.compilers.reference index 2d0717a8..0fff2c5e 100644 --- a/testsuite/tests/typing-ocamlc-i/pr7402.compilers.reference +++ b/testsuite/tests/typing-ocamlc-i/pr7402.compilers.reference @@ -1,12 +1,12 @@ File "pr7402.ml", line 1: -Warning 63 [erroneous-printed-signature]: The printed interface differs from the inferred interface. -The inferred interface contained items which could not be printed -properly due to name collisions between identifiers. -File "pr7402.ml", lines 14-16, characters 0-5: +Warning 63 [erroneous-printed-signature]: The printed interface differs from + the inferred interface. The inferred interface contained items which could + not be printed properly due to name collisions between identifiers. + File "pr7402.ml", lines 14-16, characters 0-5: Definition of module M File "pr7402.ml", lines 8-11, characters 0-3: Definition of module M/2 -Beware that this warning is purely informational and will not catch -all instances of erroneous printed interface. + Beware that this warning is purely informational and will not catch all + instances of erroneous printed interface. module M : sig type t val v : t end module F : sig module M : sig val v : M.t end val v : M/2.t end diff --git a/testsuite/tests/typing-ocamlc-i/pr7620_bad.compilers.reference b/testsuite/tests/typing-ocamlc-i/pr7620_bad.compilers.reference index 19c542d8..8b0b100b 100644 --- a/testsuite/tests/typing-ocamlc-i/pr7620_bad.compilers.reference +++ b/testsuite/tests/typing-ocamlc-i/pr7620_bad.compilers.reference @@ -1,6 +1,6 @@ File "pr7620_bad.ml", line 10, characters 17-19: 10 | (function `A | `B -> () : 'a) (`A : [`A]); ^^ -Error: This pattern matches values of type "[? `B ]" - but a pattern was expected which matches values of type "[ `A ]" - The second variant type does not allow tag(s) "`B" +Error: This pattern matches values of type [? `B ] + but a pattern was expected which matches values of type [ `A ] + The second variant type does not allow tag(s) `B diff --git a/testsuite/tests/typing-poly/poly.ml b/testsuite/tests/typing-poly/poly.ml index b494eae3..5df78b0a 100644 --- a/testsuite/tests/typing-poly/poly.ml +++ b/testsuite/tests/typing-poly/poly.ml @@ -53,8 +53,7 @@ Lines 1-4, characters 0-24: 3 | | {pv=5::_} -> "int" 4 | | {pv=true::_} -> "bool" Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -{pv=false::_} + Here is an example of a case that is not matched: "{pv=false::_}" - : string = "OK" |}];; @@ -71,8 +70,7 @@ Lines 1-4, characters 0-20: 3 | | {pv=true::_} -> "bool" 4 | | {pv=5::_} -> "int" Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -{pv=0::_} + Here is an example of a case that is not matched: "{pv=0::_}" - : string = "OK" |}];; @@ -306,7 +304,8 @@ class ['a] ostream1 : Line 8, characters 4-16: 8 | self#tl#fold ~f ~init:(f self#hd init) ^^^^^^^^^^^^ -Warning 18 [not-principal]: this use of a polymorphic method is not principal. +Warning 18 [not-principal]: this use of a polymorphic method is not + principal. class ['a] ostream1 : hd:'a -> @@ -1110,8 +1109,8 @@ val f : unit -> c = Line 4, characters 11-60: 4 | let f () = object method private n = 1 method m = {<>}#n end;; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Warning 15 [implicit-public-methods]: the following private methods were made public implicitly: - n. +Warning 15 [implicit-public-methods]: the following private methods were made + public implicitly: "n". val f : unit -> < m : int; n : int > = Line 5, characters 27-39: @@ -1286,21 +1285,24 @@ val f : < m : 'a. 'a -> 'a > -> < m : 'a. 'a -> 'a > = Line 2, characters 9-16: 2 | fun x -> (f x)#m;; (* Warning 18 *) ^^^^^^^ -Warning 18 [not-principal]: this use of a polymorphic method is not principal. +Warning 18 [not-principal]: this use of a polymorphic method is not + principal. - : < m : 'a. 'a -> 'a > -> 'b -> 'b = val f : < m : 'a. 'a -> 'a > * 'b -> < m : 'a. 'a -> 'a > = Line 4, characters 9-20: 4 | fun x -> (f (x,x))#m;; (* Warning 18 *) ^^^^^^^^^^^ -Warning 18 [not-principal]: this use of a polymorphic method is not principal. +Warning 18 [not-principal]: this use of a polymorphic method is not + principal. - : < m : 'a. 'a -> 'a > -> 'b -> 'b = val f : < m : 'a. 'a -> 'a > -> < m : 'a. 'a -> 'a > array = Line 6, characters 9-20: 6 | fun x -> (f x).(0)#m;; (* Warning 18 *) ^^^^^^^^^^^ -Warning 18 [not-principal]: this use of a polymorphic method is not principal. +Warning 18 [not-principal]: this use of a polymorphic method is not + principal. - : < m : 'a. 'a -> 'a > -> 'b -> 'b = |}];; @@ -1330,13 +1332,15 @@ val just : 'a option -> 'a = Line 4, characters 42-62: 4 | let f x = let l = [Some x; (None : u)] in (just(List.hd l))#id;; ^^^^^^^^^^^^^^^^^^^^ -Warning 18 [not-principal]: this use of a polymorphic method is not principal. +Warning 18 [not-principal]: this use of a polymorphic method is not + principal. val f : c -> 'a -> 'a = Line 7, characters 36-47: 7 | let x = List.hd [Some x; none] in (just x)#id;; ^^^^^^^^^^^ -Warning 18 [not-principal]: this use of a polymorphic method is not principal. +Warning 18 [not-principal]: this use of a polymorphic method is not + principal. val g : c -> 'a -> 'a = val h : < id : 'a; .. > -> 'a = diff --git a/testsuite/tests/typing-poly/pr11544.ml b/testsuite/tests/typing-poly/pr11544.ml new file mode 100644 index 00000000..7714fb7d --- /dev/null +++ b/testsuite/tests/typing-poly/pr11544.ml @@ -0,0 +1,11 @@ +(* TEST + expect; +*) + +module M = struct type t = T end +let poly3 : 'b. M.t -> 'b -> 'b = + fun T x -> x +[%%expect {| +module M : sig type t = T end +val poly3 : M.t -> 'b -> 'b = +|}];; diff --git a/testsuite/tests/typing-polyvariants-bugs-2/pr3918c.compilers.reference b/testsuite/tests/typing-polyvariants-bugs-2/pr3918c.compilers.reference index 3b63f5a3..11108491 100644 --- a/testsuite/tests/typing-polyvariants-bugs-2/pr3918c.compilers.reference +++ b/testsuite/tests/typing-polyvariants-bugs-2/pr3918c.compilers.reference @@ -1,5 +1,5 @@ File "pr3918c.ml", line 24, characters 11-12: 24 | let f x = (x : 'a vlist :> 'b vlist) ^ -Error: The value "x" has type "'b Pr3918b.vlist" - but an expression was expected of type "'b Pr3918b.vlist" +Error: The value x has type 'b Pr3918b.vlist + but an expression was expected of type 'b Pr3918b.vlist diff --git a/testsuite/tests/typing-polyvariants-bugs/pr5057a_bad.compilers.reference b/testsuite/tests/typing-polyvariants-bugs/pr5057a_bad.compilers.reference index 7e1b4509..a7575d7d 100644 --- a/testsuite/tests/typing-polyvariants-bugs/pr5057a_bad.compilers.reference +++ b/testsuite/tests/typing-polyvariants-bugs/pr5057a_bad.compilers.reference @@ -1,6 +1,6 @@ File "pr5057a_bad.ml", line 14, characters 48-49: 14 | let _ = match flag with `A -> T.mem | `B r -> r in ^ -Error: The value "r" has type "'a" but an expression was expected of type - "int -> T.t -> bool" - The type constructor "T.t" would escape its scope +Error: The value r has type 'a but an expression was expected of type + int -> T.t -> bool + The type constructor T.t would escape its scope diff --git a/testsuite/tests/typing-polyvariants-bugs/pr7824.ml b/testsuite/tests/typing-polyvariants-bugs/pr7824.ml index f2901c3b..24ad0b36 100644 --- a/testsuite/tests/typing-polyvariants-bugs/pr7824.ml +++ b/testsuite/tests/typing-polyvariants-bugs/pr7824.ml @@ -41,8 +41,7 @@ Lines 4-5, characters 2-38: 4 | ..match [] with 5 | | _::_ -> (x :> [`A | `C] Element.t) Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -[] + Here is an example of a case that is not matched: "[]" val f : [ `A ] Element.t -> [ `A | `C ] Element.t = |}];; diff --git a/testsuite/tests/typing-polyvariants-bugs/pr8575.ml b/testsuite/tests/typing-polyvariants-bugs/pr8575.ml index 1cb1bc3b..1e6650a2 100644 --- a/testsuite/tests/typing-polyvariants-bugs/pr8575.ml +++ b/testsuite/tests/typing-polyvariants-bugs/pr8575.ml @@ -18,7 +18,8 @@ val test : unit -> [> `A_t of A.t | `Onoes ] = Line 5, characters 49-50: 5 | | B -> if Random.bool () then `Onoes else `A_t B;; ^ -Warning 18 [not-principal]: this type-based constructor disambiguation is not principal. +Warning 18 [not-principal]: this type-based constructor disambiguation is not + principal. val test : unit -> [> `A_t of A.t | `Onoes ] = |}] @@ -34,7 +35,8 @@ val test : unit -> [> `A_t of A.t | `Onoes ] = Line 5, characters 49-50: 5 | | B -> if Random.bool () then `Onoes else `A_t B;; ^ -Warning 18 [not-principal]: this type-based constructor disambiguation is not principal. +Warning 18 [not-principal]: this type-based constructor disambiguation is not + principal. val test : unit -> [> `A_t of A.t | `Onoes ] = |}] diff --git a/testsuite/tests/typing-private-bugs/pr5026_bad.compilers.reference b/testsuite/tests/typing-private-bugs/pr5026_bad.compilers.reference index 48e507ac..7a6e4c71 100644 --- a/testsuite/tests/typing-private-bugs/pr5026_bad.compilers.reference +++ b/testsuite/tests/typing-private-bugs/pr5026_bad.compilers.reference @@ -1,6 +1,6 @@ File "pr5026_bad.ml", line 11, characters 0-36: 11 | type -'typing wrapped = private sexp ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: The type abbreviation "wrapped" is cyclic: - "'a wrapped" = "sexp", - "sexp" = "untyped wrapped" +Error: The type abbreviation wrapped is cyclic: + 'a wrapped = sexp, + sexp = untyped wrapped diff --git a/testsuite/tests/typing-private/invalid_private_row.ml b/testsuite/tests/typing-private/invalid_private_row.ml index bda5833b..c73300cd 100644 --- a/testsuite/tests/typing-private/invalid_private_row.ml +++ b/testsuite/tests/typing-private/invalid_private_row.ml @@ -18,9 +18,8 @@ Error: This private row type declaration is invalid. The type expression on the right-hand side reduces to "[ `A | `B | `C | `D | `E ]" which does not have a free row type variable. - Hint: If you intended to define a private type abbreviation, - write explicitly - "private [ `A | `B | `C | `D | `E ]" +Hint: If you intended to define a private type abbreviation, write explicitly + "private [ `A | `B | `C | `D | `E ]" |}] type u = private < x:int; .. > as 'a constraint 'a = < x: int > ;; @@ -32,9 +31,8 @@ Error: This private row type declaration is invalid. The type expression on the right-hand side reduces to "< x : int >" which does not have a free row type variable. - Hint: If you intended to define a private type abbreviation, - write explicitly - "private < x : int >" +Hint: If you intended to define a private type abbreviation, write explicitly + "private < x : int >" |}] type u = private [> `A ] as 'a constraint 'a = [< `A ] ;; @@ -46,7 +44,6 @@ Error: This private row type declaration is invalid. The type expression on the right-hand side reduces to "[ `A ]" which does not have a free row type variable. - Hint: If you intended to define a private type abbreviation, - write explicitly - "private [ `A ]" +Hint: If you intended to define a private type abbreviation, write explicitly + "private [ `A ]" |}] diff --git a/testsuite/tests/typing-private/private.compilers.principal.reference b/testsuite/tests/typing-private/private.compilers.principal.reference index 480e6f92..c84b279c 100644 --- a/testsuite/tests/typing-private/private.compilers.principal.reference +++ b/testsuite/tests/typing-private/private.compilers.principal.reference @@ -3,8 +3,8 @@ module F0 : sig type t = private int end Line 2, characters 20-21: 2 | let f (x : F0.t) = (x : Foobar.t);; (* fails *) ^ -Error: The value "x" has type "F0.t" but an expression was expected of type - "Foobar.t" +Error: The value x has type F0.t but an expression was expected of type + Foobar.t module F = Foobar val f : F.t -> Foobar.t = module M : sig type t = < m : int > end @@ -13,7 +13,7 @@ module M2 : sig type t = private < m : int; .. > end Line 1, characters 19-20: 1 | fun (x : M1.t) -> (x : M2.t);; (* fails *) ^ -Error: The value "x" has type "M1.t" but an expression was expected of type "M2.t" +Error: The value x has type M1.t but an expression was expected of type M2.t module M3 : sig type t = private M1.t end - : M3.t -> M1.t = - : M3.t -> M.t = @@ -29,7 +29,7 @@ Error: Signature mismatch: type t = M2.t is not included in type t = private M3.t - The type "M2.t" is not equal to the type "M3.t" + The type M2.t is not equal to the type M3.t Line 1, characters 44-45: 1 | module M4 : sig type t = private M3.t end = M;; (* fails *) ^ @@ -42,7 +42,7 @@ Error: Signature mismatch: type t = < m : int > is not included in type t = private M3.t - The type "< m : int >" is not equal to the type "M3.t" + The type < m : int > is not equal to the type M3.t Line 1, characters 44-46: 1 | module M4 : sig type t = private M3.t end = M1;; (* might be ok *) ^^ @@ -55,7 +55,7 @@ Error: Signature mismatch: type t = M1.t is not included in type t = private M3.t - The type "M1.t" is not equal to the type "M3.t" + The type M1.t is not equal to the type M3.t module M5 : sig type t = private M1.t end Line 1, characters 53-55: 1 | module M6 : sig type t = private < n:int; .. > end = M1;; (* fails *) @@ -69,7 +69,7 @@ Error: Signature mismatch: type t = M1.t is not included in type t = private < n : int; .. > - The implementation is missing the method "n" + The implementation is missing the method n Line 3, characters 2-51: 3 | struct type t = int let f (x : int) = (x : t) end;; (* must fail *) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -82,7 +82,7 @@ Error: Signature mismatch: type t = int is not included in type t = private Foobar.t - The type "int" is not equal to the type "Foobar.t" + The type int is not equal to the type Foobar.t module M : sig type t = private T of int val mk : int -> t end module M1 : sig type t = M.t val mk : int -> t end module M2 : sig type t = M.t val mk : int -> t end @@ -90,7 +90,7 @@ module M3 : sig type t = M.t val mk : int -> t end Line 3, characters 4-27: 3 | type t = M.t = T of int ^^^^^^^^^^^^^^^^^^^^^^^ -Error: This variant or record definition does not match that of type "M.t" +Error: This variant or record definition does not match that of type M.t Private variant constructor(s) would be revealed. module M5 : sig type t = M.t = private T of int val mk : int -> t end module M6 : sig type t = private T of int val mk : int -> t end @@ -106,7 +106,7 @@ val f : Test2.t -> unit = Line 1, characters 8-15: 1 | let a = Test2.A;; (* fail *) ^^^^^^^ -Error: Cannot create values of the private type "Test2.t" +Error: Cannot create values of the private type Test2.t Line 3, characters 40-63: 3 | module Test2 : module type of Test with type t = private Test.t = Test;; ^^^^^^^^^^^^^^^^^^^^^^^ @@ -123,7 +123,7 @@ Error: Type declarations do not match: is not included in type 'a t Their parameters differ - The type "< x : int; .. >" is not equal to the type "'a" + The type < x : int; .. > is not equal to the type 'a type 'a t = private 'a constraint 'a = < x : int; .. > type t = [ `Closed ] type nonrec t = private [> t ] diff --git a/testsuite/tests/typing-private/private.compilers.reference b/testsuite/tests/typing-private/private.compilers.reference index 8ef031ab..861cf4b7 100644 --- a/testsuite/tests/typing-private/private.compilers.reference +++ b/testsuite/tests/typing-private/private.compilers.reference @@ -3,8 +3,8 @@ module F0 : sig type t = private int end Line 2, characters 20-21: 2 | let f (x : F0.t) = (x : Foobar.t);; (* fails *) ^ -Error: The value "x" has type "F0.t" but an expression was expected of type - "Foobar.t" +Error: The value x has type F0.t but an expression was expected of type + Foobar.t module F = Foobar val f : F.t -> Foobar.t = module M : sig type t = < m : int > end @@ -13,7 +13,7 @@ module M2 : sig type t = private < m : int; .. > end Line 1, characters 19-20: 1 | fun (x : M1.t) -> (x : M2.t);; (* fails *) ^ -Error: The value "x" has type "M1.t" but an expression was expected of type "M2.t" +Error: The value x has type M1.t but an expression was expected of type M2.t module M3 : sig type t = private M1.t end - : M3.t -> M1.t = - : M3.t -> M.t = @@ -29,7 +29,7 @@ Error: Signature mismatch: type t = M2.t is not included in type t = private M3.t - The type "M2.t" is not equal to the type "M3.t" + The type M2.t is not equal to the type M3.t Line 1, characters 44-45: 1 | module M4 : sig type t = private M3.t end = M;; (* fails *) ^ @@ -42,7 +42,7 @@ Error: Signature mismatch: type t = < m : int > is not included in type t = private M3.t - The type "< m : int >" is not equal to the type "M3.t" + The type < m : int > is not equal to the type M3.t Line 1, characters 44-46: 1 | module M4 : sig type t = private M3.t end = M1;; (* might be ok *) ^^ @@ -55,7 +55,7 @@ Error: Signature mismatch: type t = M1.t is not included in type t = private M3.t - The type "M1.t" is not equal to the type "M3.t" + The type M1.t is not equal to the type M3.t module M5 : sig type t = private M1.t end Line 1, characters 53-55: 1 | module M6 : sig type t = private < n:int; .. > end = M1;; (* fails *) @@ -69,7 +69,7 @@ Error: Signature mismatch: type t = M1.t is not included in type t = private < n : int; .. > - The implementation is missing the method "n" + The implementation is missing the method n Line 3, characters 2-51: 3 | struct type t = int let f (x : int) = (x : t) end;; (* must fail *) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -82,7 +82,7 @@ Error: Signature mismatch: type t = int is not included in type t = private Foobar.t - The type "int" is not equal to the type "Foobar.t" + The type int is not equal to the type Foobar.t module M : sig type t = private T of int val mk : int -> t end module M1 : sig type t = M.t val mk : int -> t end module M2 : sig type t = M.t val mk : int -> t end @@ -90,7 +90,7 @@ module M3 : sig type t = M.t val mk : int -> t end Line 3, characters 4-27: 3 | type t = M.t = T of int ^^^^^^^^^^^^^^^^^^^^^^^ -Error: This variant or record definition does not match that of type "M.t" +Error: This variant or record definition does not match that of type M.t Private variant constructor(s) would be revealed. module M5 : sig type t = M.t = private T of int val mk : int -> t end module M6 : sig type t = private T of int val mk : int -> t end @@ -106,7 +106,7 @@ val f : Test2.t -> unit = Line 1, characters 8-15: 1 | let a = Test2.A;; (* fail *) ^^^^^^^ -Error: Cannot create values of the private type "Test2.t" +Error: Cannot create values of the private type Test2.t Line 3, characters 40-63: 3 | module Test2 : module type of Test with type t = private Test.t = Test;; ^^^^^^^^^^^^^^^^^^^^^^^ @@ -123,7 +123,7 @@ Error: Type declarations do not match: is not included in type 'a t Their parameters differ - The type "'b t as 'b" is not equal to the type "'a" + The type 'b t as 'b is not equal to the type 'a type 'a t = private 'a constraint 'a = < x : int; .. > type t = [ `Closed ] type nonrec t = private [> t ] diff --git a/testsuite/tests/typing-recmod/gpr1626.ml b/testsuite/tests/typing-recmod/gpr1626.ml index 69429ec1..c50f88f7 100644 --- a/testsuite/tests/typing-recmod/gpr1626.ml +++ b/testsuite/tests/typing-recmod/gpr1626.ml @@ -12,5 +12,18 @@ module rec M : S with module M := M = M;; Line 1, characters 34-35: 1 | module rec M : S with module M := M = M;; ^ -Error: Illegal recursive module reference +Error: This module type is recursive. This use of the recursive module "M" + within its own definition makes the module type of "M" depend on itself. + Such recursive definitions of module types are not allowed. +|}];; + +module rec M : S = M and P : S with module M := M = P;; +[%%expect{| +Line 1, characters 48-49: +1 | module rec M : S = M and P : S with module M := M = P;; + ^ +Error: This module type is recursive. This use of the recursive module "M" + within the definition of the module "P" + makes the module type of "P" depend on the module type of "M". + Such recursive definitions of module types are not allowed. |}];; diff --git a/testsuite/tests/typing-recmod/pr6491.ml b/testsuite/tests/typing-recmod/pr6491.ml index 2d6dcb96..53dfe2a1 100644 --- a/testsuite/tests/typing-recmod/pr6491.ml +++ b/testsuite/tests/typing-recmod/pr6491.ml @@ -6,10 +6,28 @@ module rec Foo : sig class type c = object method x : int end end = Foo and Bar : sig class type c = object inherit Foo.c end end = Bar and Baz : sig class type c = object inherit Bar.c end end = Baz;; [%%expect {| -Line 2, characters 44-49: +Line 2, characters 44-47: 2 | and Bar : sig class type c = object inherit Foo.c end end = Bar - ^^^^^ -Error: Illegal recursive module reference + ^^^ +Error: This class type is recursive. This use of the class type "Foo.c" + from the recursive module "Foo" within the definition of + the class type "c" in the recursive module "Bar" + makes the module type of "Bar" depend on the module type of "Foo". + Such recursive definitions of class types within recursive modules + are not allowed. +|}] + +module rec Foo : sig class type c = object inherit Foo.c end end = Foo;; +[%%expect {| +Line 1, characters 51-54: +1 | module rec Foo : sig class type c = object inherit Foo.c end end = Foo;; + ^^^ +Error: This class type is recursive. This use of the class type "Foo.c" + from the recursive module "Foo" within the definition of + the class type "c" in the recursive module "Foo" + makes the module type of "Foo" depend on itself. + Such recursive definitions of class types within recursive modules + are not allowed. |}] module rec Foo : sig class type c = object method x : int end end = Foo @@ -20,10 +38,15 @@ let foo (x : Foo.c) = x#x let bar (x : Bar.c) = x#x let baz (x : Baz.c) = x#x;; [%%expect{| -Line 2, characters 29-34: +Line 2, characters 29-32: 2 | and Bar : sig class type c = Foo.c end = Bar - ^^^^^ -Error: Illegal recursive module reference + ^^^ +Error: This class type is recursive. This use of the class type "Foo.c" + from the recursive module "Foo" within the definition of + the class type "c" in the recursive module "Bar" + makes the module type of "Bar" depend on the module type of "Foo". + Such recursive definitions of class types within recursive modules + are not allowed. |}] (* #12480 *) diff --git a/testsuite/tests/typing-recmod/t01bad.compilers.reference b/testsuite/tests/typing-recmod/t01bad.compilers.reference index 97cc2cd6..22419c19 100644 --- a/testsuite/tests/typing-recmod/t01bad.compilers.reference +++ b/testsuite/tests/typing-recmod/t01bad.compilers.reference @@ -1,5 +1,5 @@ File "t01bad.ml", line 10, characters 0-61: 10 | module rec A : sig type t = A.t end = struct type t = A.t end;; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: The type abbreviation "A.t" is cyclic: - "A.t" = "A.t" +Error: The type abbreviation A.t is cyclic: + A.t = A.t diff --git a/testsuite/tests/typing-recmod/t02bad.compilers.reference b/testsuite/tests/typing-recmod/t02bad.compilers.reference index ab572051..3dff0612 100644 --- a/testsuite/tests/typing-recmod/t02bad.compilers.reference +++ b/testsuite/tests/typing-recmod/t02bad.compilers.reference @@ -1,7 +1,7 @@ File "t02bad.ml", line 10, characters 0-61: 10 | module rec A : sig type t = B.t end = struct type t = B.t end ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: The definition of "A.t" contains a cycle: - "B.t" = "A.t", - "A.t" = "B.t", - "B.t" = "A.t" +Error: The definition of A.t contains a cycle: + B.t = A.t, + A.t = B.t, + B.t = A.t diff --git a/testsuite/tests/typing-recmod/t04bad.compilers.reference b/testsuite/tests/typing-recmod/t04bad.compilers.reference index 370ebcf3..ff9564bc 100644 --- a/testsuite/tests/typing-recmod/t04bad.compilers.reference +++ b/testsuite/tests/typing-recmod/t04bad.compilers.reference @@ -1,7 +1,7 @@ File "t04bad.ml", line 10, characters 0-73: 10 | module rec A : sig type t = int * A.t end = struct type t = int * A.t end;; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: The type abbreviation "A.t" is cyclic: - "int * A.t" contains "A.t", - "A.t" = "int * A.t", - "int * A.t" contains "A.t" +Error: The type abbreviation A.t is cyclic: + int * A.t contains A.t, + A.t = int * A.t, + int * A.t contains A.t diff --git a/testsuite/tests/typing-recmod/t05bad.compilers.reference b/testsuite/tests/typing-recmod/t05bad.compilers.reference index e00321cc..cf799747 100644 --- a/testsuite/tests/typing-recmod/t05bad.compilers.reference +++ b/testsuite/tests/typing-recmod/t05bad.compilers.reference @@ -1,9 +1,9 @@ File "t05bad.ml", line 10, characters 0-75: 10 | module rec A : sig type t = B.t -> int end = struct type t = B.t -> int end ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: The definition of "A.t" contains a cycle: - "B.t -> int" contains "B.t", - "B.t" = "A.t", - "A.t" = "B.t -> int", - "B.t -> int" contains "B.t", - "B.t" = "A.t" +Error: The definition of A.t contains a cycle: + B.t -> int contains B.t, + B.t = A.t, + A.t = B.t -> int, + B.t -> int contains B.t, + B.t = A.t diff --git a/testsuite/tests/typing-recmod/t07bad.compilers.reference b/testsuite/tests/typing-recmod/t07bad.compilers.reference index 40f51dab..78fa7b85 100644 --- a/testsuite/tests/typing-recmod/t07bad.compilers.reference +++ b/testsuite/tests/typing-recmod/t07bad.compilers.reference @@ -2,8 +2,8 @@ File "t07bad.ml", lines 10-11, characters 0-54: 10 | module rec A : sig type 'a t = end 11 | = struct type 'a t = end.. Error: This recursive type is not regular. - The type constructor "A.t" is defined as - type "'a A.t" + The type constructor A.t is defined as + type 'a A.t but it is used as - "'a list A.t". + 'a list A.t. All uses need to match the definition for the recursive type to be regular. diff --git a/testsuite/tests/typing-recmod/t08bad.compilers.reference b/testsuite/tests/typing-recmod/t08bad.compilers.reference index a91c692d..389c049f 100644 --- a/testsuite/tests/typing-recmod/t08bad.compilers.reference +++ b/testsuite/tests/typing-recmod/t08bad.compilers.reference @@ -2,11 +2,11 @@ File "t08bad.ml", lines 10-11, characters 0-71: 10 | module rec A : sig type 'a t = end 11 | = struct type 'a t = end Error: This recursive type is not regular. - The type constructor "A.t" is defined as - type "'a A.t" + The type constructor A.t is defined as + type 'a A.t but it is used as - "'a array A.t" + 'a array A.t after the following expansion(s): - "< m : 'a list B.t; n : 'a array B.t >" contains "'a array B.t", - "'a array B.t" = "'a array A.t" + < m : 'a list B.t; n : 'a array B.t > contains 'a array B.t, + 'a array B.t = 'a array A.t All uses need to match the definition for the recursive type to be regular. diff --git a/testsuite/tests/typing-recmod/t09bad.compilers.reference b/testsuite/tests/typing-recmod/t09bad.compilers.reference index 199c9335..4c24e1fa 100644 --- a/testsuite/tests/typing-recmod/t09bad.compilers.reference +++ b/testsuite/tests/typing-recmod/t09bad.compilers.reference @@ -2,11 +2,11 @@ File "t09bad.ml", lines 10-11, characters 0-44: 10 | module rec A : sig type 'a t = 'a B.t end 11 | = struct type 'a t = 'a B.t end Error: This recursive type is not regular. - The type constructor "A.t" is defined as - type "'a A.t" + The type constructor A.t is defined as + type 'a A.t but it is used as - "'a array A.t" + 'a array A.t after the following expansion(s): - "'a B.t" = "< m : 'a list A.t; n : 'a array A.t >", - "< m : 'a list A.t; n : 'a array A.t >" contains "'a array A.t" + 'a B.t = < m : 'a list A.t; n : 'a array A.t >, + < m : 'a list A.t; n : 'a array A.t > contains 'a array A.t All uses need to match the definition for the recursive type to be regular. diff --git a/testsuite/tests/typing-recmod/t11bad.compilers.reference b/testsuite/tests/typing-recmod/t11bad.compilers.reference index 76f2cd82..360bc743 100644 --- a/testsuite/tests/typing-recmod/t11bad.compilers.reference +++ b/testsuite/tests/typing-recmod/t11bad.compilers.reference @@ -2,8 +2,8 @@ File "t11bad.ml", lines 12-13, characters 7-55: 12 | .......and B : sig type 'a t = end 13 | = struct type 'a t = end.. Error: This recursive type is not regular. - The type constructor "B.t" is defined as - type "'a B.t" + The type constructor B.t is defined as + type 'a B.t but it is used as - "'a array B.t". + 'a array B.t. All uses need to match the definition for the recursive type to be regular. diff --git a/testsuite/tests/typing-recmod/t12bad.compilers.reference b/testsuite/tests/typing-recmod/t12bad.compilers.reference index 24dc24d8..b1adf92f 100644 --- a/testsuite/tests/typing-recmod/t12bad.compilers.reference +++ b/testsuite/tests/typing-recmod/t12bad.compilers.reference @@ -10,8 +10,8 @@ File "t12bad.ml", lines 10-21, characters 0-7: 20 | end 21 | end.. Error: This recursive type is not regular. - The type constructor "M.c" is defined as - type "'a M.c" + The type constructor M.c is defined as + type 'a M.c but it is used as - "'b M.c". + 'b M.c. All uses need to match the definition for the recursive type to be regular. diff --git a/testsuite/tests/typing-recmod/t14bad.compilers.reference b/testsuite/tests/typing-recmod/t14bad.compilers.reference index 09b0ecdd..a85182ad 100644 --- a/testsuite/tests/typing-recmod/t14bad.compilers.reference +++ b/testsuite/tests/typing-recmod/t14bad.compilers.reference @@ -1,6 +1,6 @@ File "t14bad.ml", line 23, characters 2-43: 23 | module rec U : T with type D.t = U'.t = U ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: The definition of "U.D.t" contains a cycle: - "U'.t" = "U'.t", - "U'.t" = "U'.t" +Error: The definition of U.D.t contains a cycle: + U'.t = U'.t, + U'.t = U'.t diff --git a/testsuite/tests/typing-recmod/t15bad.compilers.reference b/testsuite/tests/typing-recmod/t15bad.compilers.reference index 9034d4be..9cfc37f4 100644 --- a/testsuite/tests/typing-recmod/t15bad.compilers.reference +++ b/testsuite/tests/typing-recmod/t15bad.compilers.reference @@ -1,5 +1,5 @@ File "t15bad.ml", line 11, characters 0-61: 11 | module rec M : S' with type t = M.t = struct type t = M.t end;; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: The type abbreviation "M.t" is cyclic: - "M.t" = "M.t" +Error: The type abbreviation M.t is cyclic: + M.t = M.t diff --git a/testsuite/tests/typing-recordarg/recordarg.ocaml.reference b/testsuite/tests/typing-recordarg/recordarg.ocaml.reference index 6512690e..c6a5fb53 100644 --- a/testsuite/tests/typing-recordarg/recordarg.ocaml.reference +++ b/testsuite/tests/typing-recordarg/recordarg.ocaml.reference @@ -9,7 +9,7 @@ val f : t -> t = Line 1, characters 14-15: 1 | let f () = A {a = 1};; (* customized error message *) ^ -Error: The field "a" is not part of the record argument for the "t.A" constructor +Error: The field a is not part of the record argument for the t.A constructor val f : unit -> t = type _ t = A : { x : 'a; y : 'b; } -> 'a t val f : 'a t -> 'a t = @@ -33,12 +33,12 @@ Error: This expression creates fresh types. Line 5, characters 2-29: 5 | exception A of {x : string} ^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: Multiple definition of the extension constructor name "A". +Error: Multiple definition of the extension constructor name A. Names must be unique in a given structure or signature. Line 4, characters 2-29: 4 | exception A of {x : string} ^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: Multiple definition of the extension constructor name "A". +Error: Multiple definition of the extension constructor name A. Names must be unique in a given structure or signature. module M1 : sig exception A of { x : int; } end module M : sig exception A of { x : int; } end @@ -50,7 +50,7 @@ module X2 : sig type t = .. end Line 3, characters 15-28: 3 | type X2.t += A of {x: int} ^^^^^^^^^^^^^ -Error: Multiple definition of the extension constructor name "A". +Error: Multiple definition of the extension constructor name A. Names must be unique in a given structure or signature. type _ c = C : [ `A ] c type t = T : { x : [< `A ] c; } -> t diff --git a/testsuite/tests/typing-rectypes-bugs/pr5343_bad.compilers.reference b/testsuite/tests/typing-rectypes-bugs/pr5343_bad.compilers.reference index 64a76ce8..c337ce2d 100644 --- a/testsuite/tests/typing-rectypes-bugs/pr5343_bad.compilers.reference +++ b/testsuite/tests/typing-rectypes-bugs/pr5343_bad.compilers.reference @@ -1,6 +1,6 @@ File "pr5343_bad.ml", line 11, characters 2-14: 11 | type u = u t and v = v t ^^^^^^^^^^^^ -Error: The type abbreviation "u" is cyclic: - "u" = "u t", - "u t" contains "u" +Error: The type abbreviation u is cyclic: + u = u t, + u t contains u diff --git a/testsuite/tests/typing-rectypes-bugs/pr6174_bad.compilers.reference b/testsuite/tests/typing-rectypes-bugs/pr6174_bad.compilers.reference index c19e73d9..6d2376b4 100644 --- a/testsuite/tests/typing-rectypes-bugs/pr6174_bad.compilers.reference +++ b/testsuite/tests/typing-rectypes-bugs/pr6174_bad.compilers.reference @@ -1,5 +1,5 @@ File "pr6174_bad.ml", line 11, characters 24-25: 11 | fun C k -> k (fun x -> x);; ^ -Error: The value "x" has type "$0" but an expression was expected of type - "$1" = "($2 -> $1) -> $1" +Error: The value x has type $0 but an expression was expected of type + $1 = ($2 -> $1) -> $1 diff --git a/testsuite/tests/typing-rectypes-bugs/pr6870_bad.compilers.reference b/testsuite/tests/typing-rectypes-bugs/pr6870_bad.compilers.reference index 2a2b2da1..4f677f7c 100644 --- a/testsuite/tests/typing-rectypes-bugs/pr6870_bad.compilers.reference +++ b/testsuite/tests/typing-rectypes-bugs/pr6870_bad.compilers.reference @@ -1,6 +1,6 @@ File "pr6870_bad.ml", line 10, characters 48-50: 10 | module Fix (T : T) = struct type r = ('r T.t as 'r) end ^^ -Error: This alias is bound to type "'a T.t" but is used as an instance of type - "'a" - The type variable "'a" occurs inside "'a T.t" +Error: This alias is bound to type 'a T.t but is used as an instance of type + 'a + The type variable 'a occurs inside 'a T.t diff --git a/testsuite/tests/typing-safe-linking/b_bad.compilers.reference b/testsuite/tests/typing-safe-linking/b_bad.compilers.reference index 0aa0954c..8faf0925 100644 --- a/testsuite/tests/typing-safe-linking/b_bad.compilers.reference +++ b/testsuite/tests/typing-safe-linking/b_bad.compilers.reference @@ -2,10 +2,9 @@ File "b_bad.ml", lines 13-14, characters 29-28: 13 | .............................function 14 | A.X s -> print_endline s Error (warning 8 [partial-match]): this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -Y + Here is an example of a case that is not matched: Y File "b_bad.ml", line 18, characters 11-14: 18 | let () = f A.y ^^^ -Error: Unbound value "A.y" +Error: Unbound value A.y diff --git a/testsuite/tests/typing-short-paths/pr5918.compilers.reference b/testsuite/tests/typing-short-paths/pr5918.compilers.reference index 623a4190..268cb427 100644 --- a/testsuite/tests/typing-short-paths/pr5918.compilers.reference +++ b/testsuite/tests/typing-short-paths/pr5918.compilers.reference @@ -1,5 +1,5 @@ Line 10, characters 9-19: 10 | let _ = { a = () } ^^^^^^^^^^ -Error: Some record fields are undefined: "b" +Error: Some record fields are undefined: b diff --git a/testsuite/tests/typing-short-paths/short-paths.compilers.reference b/testsuite/tests/typing-short-paths/short-paths.compilers.reference index bdcc2542..81e6f1e3 100644 --- a/testsuite/tests/typing-short-paths/short-paths.compilers.reference +++ b/testsuite/tests/typing-short-paths/short-paths.compilers.reference @@ -69,8 +69,8 @@ val x : 'a Int.Map.t = Line 1, characters 8-9: 1 | let y = x + x ;; ^ -Error: The value "x" has type "'a Int.Map.t" - but an expression was expected of type "int" +Error: The value x has type 'a Int.Map.t + but an expression was expected of type int module M : sig type t = A type u = C end module N : sig type t = B end - : M.t = A @@ -99,7 +99,7 @@ Error: Signature mismatch: type t = int is not included in type t = string - The type "t" is not equal to the type "string" + The type t is not equal to the type string module A : sig module B : sig type t = T end end module M2 : sig type u = A.B.t type foo = int type v = u end diff --git a/testsuite/tests/typing-sigsubst/sig_local_aliases.ml b/testsuite/tests/typing-sigsubst/sig_local_aliases.ml index 5b101a91..705729fc 100644 --- a/testsuite/tests/typing-sigsubst/sig_local_aliases.ml +++ b/testsuite/tests/typing-sigsubst/sig_local_aliases.ml @@ -50,16 +50,16 @@ Line 2, characters 14-22: 2 | module M := Funct(M) ^^^^^^^^ Error: Unbound module "Funct" -Hint: Did you mean "Fun"? +Hint: Did you mean "Fun"? |}] module type Reject2 = sig module M := F(N) end;; [%%expect{| -Line 2, characters 14-18: +Line 2, characters 16-17: 2 | module M := F(N) - ^^^^ + ^ Error: Unbound module "N" |}] diff --git a/testsuite/tests/typing-sigsubst/sig_local_aliases_syntax_errors.compilers.reference b/testsuite/tests/typing-sigsubst/sig_local_aliases_syntax_errors.compilers.reference index 0a9fac90..4c7ce951 100644 --- a/testsuite/tests/typing-sigsubst/sig_local_aliases_syntax_errors.compilers.reference +++ b/testsuite/tests/typing-sigsubst/sig_local_aliases_syntax_errors.compilers.reference @@ -1,20 +1,20 @@ Line 6, characters 2-14: 6 | type t1 := A ^^^^^^^^^^^^ -Error: Only type synonyms are allowed on the right of ":=" +Error: Only type synonyms are allowed on the right of := Line 3, characters 2-24: 3 | type t2 := { x : int } ^^^^^^^^^^^^^^^^^^^^^^ -Error: Only type synonyms are allowed on the right of ":=" +Error: Only type synonyms are allowed on the right of := Line 3, characters 15-18: 3 | module M1 := sig end ^^^ -Error: Syntax error: "module path" expected. +Error: Syntax error: module path expected. module F : (X : sig type t end) -> sig type t = X.t end Line 3, characters 17-23: 3 | module M2 := F(struct type t = int end) ^^^^^^ -Error: Syntax error: "module path" expected. +Error: Syntax error: module path expected. Line 2, characters 7-9: 2 | type t := int;; ^^ @@ -30,5 +30,5 @@ Error: Syntax error Line 3, characters 7-13: 3 | type nonrec t := int ^^^^^^ -Error: Syntax error: "nonrec flag" not expected. +Error: Syntax error: nonrec flag not expected. diff --git a/testsuite/tests/typing-sigsubst/test_locations.compilers.reference b/testsuite/tests/typing-sigsubst/test_locations.compilers.reference index 4cbf02eb..d91e52c8 100644 --- a/testsuite/tests/typing-sigsubst/test_locations.compilers.reference +++ b/testsuite/tests/typing-sigsubst/test_locations.compilers.reference @@ -7,7 +7,7 @@ Error: Signature mismatch: type elt = String.t is not included in type elt = unit - The type "String.t" = "string" is not equal to the type "unit" + The type String.t = string is not equal to the type unit File "test_loc_type_eq.ml", line 1, characters 31-46: Expected declaration File "test_functor.ml", line 8, characters 45-61: Actual declaration @@ -27,7 +27,7 @@ Error: Signature mismatch: type elt = String.t is not included in type elt = unit - The type "String.t" = "string" is not equal to the type "unit" + The type String.t = string is not equal to the type unit File "test_loc_modtype_type_eq.ml", line 1, characters 36-51: Expected declaration File "test_functor.ml", line 8, characters 45-61: Actual declaration @@ -47,8 +47,8 @@ Error: Signature mismatch: val create : elt -> t is not included in val create : unit -> t - The type "elt -> t" is not compatible with the type "unit -> t" - Type "elt" = "string" is not compatible with type "unit" + The type elt -> t is not compatible with the type unit -> t + Type elt = string is not compatible with type unit File "test_loc_type_subst.ml", line 1, characters 11-47: Expected declaration File "test_functor.ml", line 5, characters 2-23: Actual declaration @@ -68,8 +68,8 @@ Error: Signature mismatch: val create : elt -> t is not included in val create : unit -> t - The type "elt -> t" is not compatible with the type "unit -> t" - Type "elt" = "string" is not compatible with type "unit" + The type elt -> t is not compatible with the type unit -> t + Type elt = string is not compatible with type unit File "test_loc_modtype_type_subst.ml", line 1, characters 16-52: Expected declaration File "test_functor.ml", line 5, characters 2-23: Actual declaration diff --git a/testsuite/tests/typing-typeparam/newtype.ocaml.reference b/testsuite/tests/typing-typeparam/newtype.ocaml.reference index 1ec60282..68eb9f43 100644 --- a/testsuite/tests/typing-typeparam/newtype.ocaml.reference +++ b/testsuite/tests/typing-typeparam/newtype.ocaml.reference @@ -8,11 +8,11 @@ abc,xyz Line 2, characters 32-33: 2 | let f x (type a) (y : a) = (x = y);; (* Fails *) ^ -Error: The value "y" has type "a" but an expression was expected of type "'a" - The type constructor "a" would escape its scope +Error: The value y has type a but an expression was expected of type 'a + The type constructor a would escape its scope Line 3, characters 53-54: 3 | method n : 'a -> 'a = fun (type g) (x:g) -> self#m x ^ -Error: The value "x" has type "g" but an expression was expected of type "'a" - The type constructor "g" would escape its scope +Error: The value x has type g but an expression was expected of type 'a + The type constructor g would escape its scope diff --git a/testsuite/tests/typing-unboxed/test.ml b/testsuite/tests/typing-unboxed/test.ml index edfecda0..dc0d747c 100644 --- a/testsuite/tests/typing-unboxed/test.ml +++ b/testsuite/tests/typing-unboxed/test.ml @@ -761,14 +761,13 @@ type i = I of int Line 2, characters 0-34: 2 | external id : i -> i = "%identity";; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Warning 61 [unboxable-type-in-prim-decl]: This primitive declaration uses type i, whose representation -may be either boxed or unboxed. Without an annotation to indicate -which representation is intended, the boxed representation has been -selected by default. This default choice may change in future -versions of the compiler, breaking the primitive implementation. -You should explicitly annotate the declaration of i -with [@@boxed] or [@@unboxed], so that its external interface -remains stable in the future. +Warning 61 [unboxable-type-in-prim-decl]: This primitive declaration uses type "i", + whose representation may be either boxed or unboxed. Without an annotation + to indicate which representation is intended, the boxed representation has + been selected by default. This default choice may change in future versions + of the compiler, breaking the primitive implementation. You should + explicitly annotate the declaration of "i" with "[@@boxed]" or "[@@unboxed]", so + that its external interface remains stable in the future. external id : i -> i = "%identity" |}];; @@ -782,26 +781,24 @@ type j = J of int Line 3, characters 0-34: 3 | external id : i -> j = "%identity";; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Warning 61 [unboxable-type-in-prim-decl]: This primitive declaration uses type i, whose representation -may be either boxed or unboxed. Without an annotation to indicate -which representation is intended, the boxed representation has been -selected by default. This default choice may change in future -versions of the compiler, breaking the primitive implementation. -You should explicitly annotate the declaration of i -with [@@boxed] or [@@unboxed], so that its external interface -remains stable in the future. +Warning 61 [unboxable-type-in-prim-decl]: This primitive declaration uses type "i", + whose representation may be either boxed or unboxed. Without an annotation + to indicate which representation is intended, the boxed representation has + been selected by default. This default choice may change in future versions + of the compiler, breaking the primitive implementation. You should + explicitly annotate the declaration of "i" with "[@@boxed]" or "[@@unboxed]", so + that its external interface remains stable in the future. Line 3, characters 0-34: 3 | external id : i -> j = "%identity";; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Warning 61 [unboxable-type-in-prim-decl]: This primitive declaration uses type j, whose representation -may be either boxed or unboxed. Without an annotation to indicate -which representation is intended, the boxed representation has been -selected by default. This default choice may change in future -versions of the compiler, breaking the primitive implementation. -You should explicitly annotate the declaration of j -with [@@boxed] or [@@unboxed], so that its external interface -remains stable in the future. +Warning 61 [unboxable-type-in-prim-decl]: This primitive declaration uses type "j", + whose representation may be either boxed or unboxed. Without an annotation + to indicate which representation is intended, the boxed representation has + been selected by default. This default choice may change in future versions + of the compiler, breaking the primitive implementation. You should + explicitly annotate the declaration of "j" with "[@@boxed]" or "[@@unboxed]", so + that its external interface remains stable in the future. external id : i -> j = "%identity" |}];; diff --git a/testsuite/tests/typing-warnings/ambiguous_guarded_disjunction.ml b/testsuite/tests/typing-warnings/ambiguous_guarded_disjunction.ml index eff6a73a..92f83478 100644 --- a/testsuite/tests/typing-warnings/ambiguous_guarded_disjunction.ml +++ b/testsuite/tests/typing-warnings/ambiguous_guarded_disjunction.ml @@ -27,10 +27,11 @@ let ambiguous_typical_example = function Line 2, characters 4-29: 2 | | ((Val x, _) | (_, Val x)) when x < 0 -> () ^^^^^^^^^^^^^^^^^^^^^^^^^ -Warning 57 [ambiguous-var-in-pattern-guard]: Ambiguous or-pattern variables under guard; -variable x appears in different places in different or-pattern alternatives. -Only the first match will be used to evaluate the guard expression. -(see manual section 13.5.4) +Warning 57 [ambiguous-var-in-pattern-guard]: Ambiguous or-pattern variables under + guard; variable "x" appears in different places in different or-pattern + alternatives. + Only the first match will be used to evaluate the guard expression. + (see manual section 13.5.4) val ambiguous_typical_example : expr * expr -> unit = |}] @@ -97,10 +98,11 @@ let ambiguous__y = function Line 2, characters 4-43: 2 | | (`B (x, _, Some y) | `B (x, Some y, _)) when y -> ignore x ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Warning 57 [ambiguous-var-in-pattern-guard]: Ambiguous or-pattern variables under guard; -variable y appears in different places in different or-pattern alternatives. -Only the first match will be used to evaluate the guard expression. -(see manual section 13.5.4) +Warning 57 [ambiguous-var-in-pattern-guard]: Ambiguous or-pattern variables under + guard; variable "y" appears in different places in different or-pattern + alternatives. + Only the first match will be used to evaluate the guard expression. + (see manual section 13.5.4) val ambiguous__y : [> `B of 'a * bool option * bool option ] -> unit = |}] @@ -131,10 +133,11 @@ let ambiguous__x_y = function Line 2, characters 4-43: 2 | | (`B (x, _, Some y) | `B (x, Some y, _)) when x < y -> () ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Warning 57 [ambiguous-var-in-pattern-guard]: Ambiguous or-pattern variables under guard; -variable y appears in different places in different or-pattern alternatives. -Only the first match will be used to evaluate the guard expression. -(see manual section 13.5.4) +Warning 57 [ambiguous-var-in-pattern-guard]: Ambiguous or-pattern variables under + guard; variable "y" appears in different places in different or-pattern + alternatives. + Only the first match will be used to evaluate the guard expression. + (see manual section 13.5.4) val ambiguous__x_y : [> `B of 'a * 'a option * 'a option ] -> unit = |}] @@ -147,10 +150,11 @@ let ambiguous__x_y_z = function Line 2, characters 4-43: 2 | | (`B (x, z, Some y) | `B (x, Some y, z)) when x < y || Some x = z -> () ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Warning 57 [ambiguous-var-in-pattern-guard]: Ambiguous or-pattern variables under guard; -variables y, z appear in different places in different or-pattern alternatives. -Only the first match will be used to evaluate the guard expression. -(see manual section 13.5.4) +Warning 57 [ambiguous-var-in-pattern-guard]: Ambiguous or-pattern variables under + guard; variables "y", "z" appears in different places in different or-pattern + alternatives. + Only the first match will be used to evaluate the guard expression. + (see manual section 13.5.4) val ambiguous__x_y_z : [> `B of 'a * 'a option * 'a option ] -> unit = |}] @@ -181,10 +185,11 @@ let ambiguous__in_depth = function Line 2, characters 4-40: 2 | | `A (`B (Some x, _) | `B (_, Some x)) when x -> () ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Warning 57 [ambiguous-var-in-pattern-guard]: Ambiguous or-pattern variables under guard; -variable x appears in different places in different or-pattern alternatives. -Only the first match will be used to evaluate the guard expression. -(see manual section 13.5.4) +Warning 57 [ambiguous-var-in-pattern-guard]: Ambiguous or-pattern variables under + guard; variable "x" appears in different places in different or-pattern + alternatives. + Only the first match will be used to evaluate the guard expression. + (see manual section 13.5.4) val ambiguous__in_depth : [> `A of [> `B of bool option * bool option ] ] -> unit = @@ -215,10 +220,11 @@ let ambiguous__first_orpat = function Lines 2-3, characters 4-58: 2 | ....`A ((`B (Some x, _) | `B (_, Some x)), 3 | (`C (Some y, Some _, _) | `C (Some y, _, Some _)))................. -Warning 57 [ambiguous-var-in-pattern-guard]: Ambiguous or-pattern variables under guard; -variable x appears in different places in different or-pattern alternatives. -Only the first match will be used to evaluate the guard expression. -(see manual section 13.5.4) +Warning 57 [ambiguous-var-in-pattern-guard]: Ambiguous or-pattern variables under + guard; variable "x" appears in different places in different or-pattern + alternatives. + Only the first match will be used to evaluate the guard expression. + (see manual section 13.5.4) val ambiguous__first_orpat : [> `A of @@ -236,10 +242,11 @@ let ambiguous__second_orpat = function Lines 2-3, characters 4-42: 2 | ....`A ((`B (Some x, Some _, _) | `B (Some x, _, Some _)), 3 | (`C (Some y, _) | `C (_, Some y)))................. -Warning 57 [ambiguous-var-in-pattern-guard]: Ambiguous or-pattern variables under guard; -variable y appears in different places in different or-pattern alternatives. -Only the first match will be used to evaluate the guard expression. -(see manual section 13.5.4) +Warning 57 [ambiguous-var-in-pattern-guard]: Ambiguous or-pattern variables under + guard; variable "y" appears in different places in different or-pattern + alternatives. + Only the first match will be used to evaluate the guard expression. + (see manual section 13.5.4) val ambiguous__second_orpat : [> `A of @@ -332,10 +339,11 @@ let ambiguous__amoi a = match a with Lines 2-3, characters 2-17: 2 | ..X (Z x,Y (y,0)) 3 | | X (Z y,Y (x,_)) -Warning 57 [ambiguous-var-in-pattern-guard]: Ambiguous or-pattern variables under guard; -variables x, y appear in different places in different or-pattern alternatives. -Only the first match will be used to evaluate the guard expression. -(see manual section 13.5.4) +Warning 57 [ambiguous-var-in-pattern-guard]: Ambiguous or-pattern variables under + guard; variables "x", "y" appears in different places in different or-pattern + alternatives. + Only the first match will be used to evaluate the guard expression. + (see manual section 13.5.4) val ambiguous__amoi : amoi -> int = |}] @@ -355,10 +363,11 @@ let ambiguous__module_variable x b = match x with Lines 2-3, characters 4-24: 2 | ....(module M:S),_,(1,_) 3 | | _,(module M:S),(_,1)................... -Warning 57 [ambiguous-var-in-pattern-guard]: Ambiguous or-pattern variables under guard; -variable M appears in different places in different or-pattern alternatives. -Only the first match will be used to evaluate the guard expression. -(see manual section 13.5.4) +Warning 57 [ambiguous-var-in-pattern-guard]: Ambiguous or-pattern variables under + guard; variable "M" appears in different places in different or-pattern + alternatives. + Only the first match will be used to evaluate the guard expression. + (see manual section 13.5.4) val ambiguous__module_variable : (module S) * (module S) * (int * int) -> bool -> int = @@ -373,7 +382,7 @@ let not_ambiguous__module_variable x b = match x with Line 2, characters 12-13: 2 | | (module M:S),_,(1,_) ^ -Warning 60 [unused-module]: unused module M. +Warning 60 [unused-module]: unused module "M". val not_ambiguous__module_variable : (module S) * (module S) * (int * int) -> bool -> int = @@ -395,23 +404,24 @@ let ambiguous_xy_but_not_ambiguous_z g = function Line 2, characters 4-5: 2 | | A (x as z,(0 as y))|A (0 as y as z,x)|B (x,(y as z)) when g x (y+z) -> 1 ^ -Warning 41 [ambiguous-name]: A belongs to several types: t2 t -The first one was selected. Please disambiguate if this is wrong. +Warning 41 [ambiguous-name]: "A" belongs to several types: "t2" "t". + The first one was selected. Please disambiguate if this is wrong. Lines 1-3, characters 41-10: 1 | .........................................function 2 | | A (x as z,(0 as y))|A (0 as y as z,x)|B (x,(y as z)) when g x (y+z) -> 1 3 | | _ -> 2 Warning 4 [fragile-match]: this pattern-matching is fragile. -It will remain exhaustive when constructors are added to type t2. + It will remain exhaustive when constructors are added to type "t2". Line 2, characters 4-56: 2 | | A (x as z,(0 as y))|A (0 as y as z,x)|B (x,(y as z)) when g x (y+z) -> 1 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Warning 57 [ambiguous-var-in-pattern-guard]: Ambiguous or-pattern variables under guard; -variables x, y appear in different places in different or-pattern alternatives. -Only the first match will be used to evaluate the guard expression. -(see manual section 13.5.4) +Warning 57 [ambiguous-var-in-pattern-guard]: Ambiguous or-pattern variables under + guard; variables "x", "y" appears in different places in different or-pattern + alternatives. + Only the first match will be used to evaluate the guard expression. + (see manual section 13.5.4) val ambiguous_xy_but_not_ambiguous_z : (int -> int -> bool) -> t2 -> int = @@ -419,35 +429,36 @@ val ambiguous_xy_but_not_ambiguous_z : (int -> int -> bool) -> t2 -> int = Line 2, characters 4-5: 2 | | A (x as z,(0 as y))|A (0 as y as z,x)|B (x,(y as z)) when g x (y+z) -> 1 ^ -Warning 41 [ambiguous-name]: A belongs to several types: t2 t -The first one was selected. Please disambiguate if this is wrong. +Warning 41 [ambiguous-name]: "A" belongs to several types: "t2" "t". + The first one was selected. Please disambiguate if this is wrong. Line 2, characters 24-25: 2 | | A (x as z,(0 as y))|A (0 as y as z,x)|B (x,(y as z)) when g x (y+z) -> 1 ^ -Warning 41 [ambiguous-name]: A belongs to several types: t2 t -The first one was selected. Please disambiguate if this is wrong. +Warning 41 [ambiguous-name]: "A" belongs to several types: "t2" "t". + The first one was selected. Please disambiguate if this is wrong. Line 2, characters 42-43: 2 | | A (x as z,(0 as y))|A (0 as y as z,x)|B (x,(y as z)) when g x (y+z) -> 1 ^ -Warning 41 [ambiguous-name]: B belongs to several types: t2 t -The first one was selected. Please disambiguate if this is wrong. +Warning 41 [ambiguous-name]: "B" belongs to several types: "t2" "t". + The first one was selected. Please disambiguate if this is wrong. Lines 1-3, characters 41-10: 1 | .........................................function 2 | | A (x as z,(0 as y))|A (0 as y as z,x)|B (x,(y as z)) when g x (y+z) -> 1 3 | | _ -> 2 Warning 4 [fragile-match]: this pattern-matching is fragile. -It will remain exhaustive when constructors are added to type t2. + It will remain exhaustive when constructors are added to type "t2". Line 2, characters 4-56: 2 | | A (x as z,(0 as y))|A (0 as y as z,x)|B (x,(y as z)) when g x (y+z) -> 1 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Warning 57 [ambiguous-var-in-pattern-guard]: Ambiguous or-pattern variables under guard; -variables x, y appear in different places in different or-pattern alternatives. -Only the first match will be used to evaluate the guard expression. -(see manual section 13.5.4) +Warning 57 [ambiguous-var-in-pattern-guard]: Ambiguous or-pattern variables under + guard; variables "x", "y" appears in different places in different or-pattern + alternatives. + Only the first match will be used to evaluate the guard expression. + (see manual section 13.5.4) val ambiguous_xy_but_not_ambiguous_z : (int -> int -> bool) -> t2 -> int = @@ -506,10 +517,11 @@ let guarded_ambiguity = function Line 3, characters 4-29: 3 | | ((Val y, _) | (_, Val y)) when y < 0 -> () ^^^^^^^^^^^^^^^^^^^^^^^^^ -Warning 57 [ambiguous-var-in-pattern-guard]: Ambiguous or-pattern variables under guard; -variable y appears in different places in different or-pattern alternatives. -Only the first match will be used to evaluate the guard expression. -(see manual section 13.5.4) +Warning 57 [ambiguous-var-in-pattern-guard]: Ambiguous or-pattern variables under + guard; variable "y" appears in different places in different or-pattern + alternatives. + Only the first match will be used to evaluate the guard expression. + (see manual section 13.5.4) val guarded_ambiguity : expr * expr -> unit = |}] @@ -538,10 +550,11 @@ let cmp (pred : a -> bool) (x : a alg) (y : a alg) = Line 4, characters 4-29: 4 | | ((Val x, _) | (_, Val x)) when pred x -> () ^^^^^^^^^^^^^^^^^^^^^^^^^ -Warning 57 [ambiguous-var-in-pattern-guard]: Ambiguous or-pattern variables under guard; -variable x appears in different places in different or-pattern alternatives. -Only the first match will be used to evaluate the guard expression. -(see manual section 13.5.4) +Warning 57 [ambiguous-var-in-pattern-guard]: Ambiguous or-pattern variables under + guard; variable "x" appears in different places in different or-pattern + alternatives. + Only the first match will be used to evaluate the guard expression. + (see manual section 13.5.4) val cmp : (a -> bool) -> a alg -> a alg -> unit = |}] diff --git a/testsuite/tests/typing-warnings/application.ml b/testsuite/tests/typing-warnings/application.ml index 03b42bd5..2308ec81 100644 --- a/testsuite/tests/typing-warnings/application.ml +++ b/testsuite/tests/typing-warnings/application.ml @@ -20,7 +20,7 @@ Line 1, characters 8-22: 1 | let _ = Array.get [||];; ^^^^^^^^^^^^^^ Warning 5 [ignored-partial-application]: this function application is partial, -maybe some arguments are missing. + maybe some arguments are missing. - : int -> 'a = |}] @@ -35,7 +35,7 @@ Line 1, characters 16-32: 1 | let () = ignore (Array.get [||]);; ^^^^^^^^^^^^^^^^ Warning 5 [ignored-partial-application]: this function application is partial, -maybe some arguments are missing. + maybe some arguments are missing. |}] @@ -50,7 +50,7 @@ Line 1, characters 21-35: 1 | let _ = if true then Array.get [||] else (fun _ -> 12);; ^^^^^^^^^^^^^^ Warning 5 [ignored-partial-application]: this function application is partial, -maybe some arguments are missing. + maybe some arguments are missing. - : int -> int = |}] @@ -74,7 +74,7 @@ Line 1, characters 18-23: 1 | let f x = let _ = x.r 1 in ();; ^^^^^ Warning 5 [ignored-partial-application]: this function application is partial, -maybe some arguments are missing. + maybe some arguments are missing. val f : t -> unit = |}] @@ -88,7 +88,7 @@ Line 2, characters 6-10: 2 | match f 42 with ^^^^ Warning 5 [ignored-partial-application]: this function application is partial, -maybe some arguments are missing. + maybe some arguments are missing. - : unit = () |}] @@ -103,7 +103,7 @@ Line 2, characters 6-10: 2 | match f 42 with ^^^^ Warning 5 [ignored-partial-application]: this function application is partial, -maybe some arguments are missing. + maybe some arguments are missing. - : unit = () |}] @@ -148,6 +148,5 @@ Line 2, characters 10-15: ^^^^^ Error: This expression has type "int -> int" but an expression was expected of type "int" - Hint: This function application is partial, - maybe some arguments are missing. +Hint: This function application is partial, maybe some arguments are missing. |}] diff --git a/testsuite/tests/typing-warnings/disable_warnings_classes.ml b/testsuite/tests/typing-warnings/disable_warnings_classes.ml index cd502a9b..5d8e5c90 100644 --- a/testsuite/tests/typing-warnings/disable_warnings_classes.ml +++ b/testsuite/tests/typing-warnings/disable_warnings_classes.ml @@ -17,7 +17,7 @@ end;; Line 8, characters 8-9: 8 | let y = 5 in () ^ -Warning 26 [unused-var]: unused variable y. +Warning 26 [unused-var]: unused variable "y". class c : object val a : unit val x : unit end |}];; @@ -36,7 +36,7 @@ end;; Line 8, characters 8-9: 8 | let y = 5 in () ^ -Warning 26 [unused-var]: unused variable y. +Warning 26 [unused-var]: unused variable "y". class c : object method a : unit method x : unit end |}];; @@ -55,7 +55,7 @@ end;; Line 8, characters 8-9: 8 | let y = 5 in () ^ -Warning 26 [unused-var]: unused variable y. +Warning 26 [unused-var]: unused variable "y". class c : object end |}];; @@ -85,7 +85,7 @@ end;; Line 4, characters 8-9: 4 | let b = 5 in () ^ -Warning 26 [unused-var]: unused variable b. +Warning 26 [unused-var]: unused variable "b". class c : object val a : unit val x : unit end |}];; diff --git a/testsuite/tests/typing-warnings/exhaustiveness.ml b/testsuite/tests/typing-warnings/exhaustiveness.ml index fe2c2326..3b88ba61 100644 --- a/testsuite/tests/typing-warnings/exhaustiveness.ml +++ b/testsuite/tests/typing-warnings/exhaustiveness.ml @@ -12,8 +12,7 @@ Lines 1-3, characters 8-23: 2 | None, None -> 1 3 | | Some _, Some _ -> 2.. Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -(None, Some _) + Here is an example of a case that is not matched: "(None, Some _)" val f : 'a option * 'b option -> int = |}] @@ -36,13 +35,13 @@ Line 1, characters 20-48: 1 | let f (x : int t) = match x with A -> 1 | _ -> 2;; (* warn *) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Warning 4 [fragile-match]: this pattern-matching is fragile. -It will remain exhaustive when constructors are added to type t. + It will remain exhaustive when constructors are added to type "t". Line 1, characters 42-43: 1 | let f (x : int t) = match x with A -> 1 | _ -> 2;; (* warn *) ^ Warning 56 [unreachable-case]: this match case is unreachable. -Consider replacing it with a refutation case ' -> .' + Consider replacing it with a refutation case " -> ." val f : int t -> int = |}] @@ -53,7 +52,7 @@ Line 1, characters 53-54: 1 | let f (x : unit t option) = match x with None -> 1 | _ -> 2 ;; (* warn? *) ^ Warning 56 [unreachable-case]: this match case is unreachable. -Consider replacing it with a refutation case ' -> .' + Consider replacing it with a refutation case " -> ." val f : unit t option -> int = |}] @@ -64,7 +63,7 @@ Line 1, characters 53-59: 1 | let f (x : unit t option) = match x with None -> 1 | Some _ -> 2 ;; (* warn *) ^^^^^^ Warning 56 [unreachable-case]: this match case is unreachable. -Consider replacing it with a refutation case ' -> .' + Consider replacing it with a refutation case " -> ." val f : unit t option -> int = |}] @@ -80,8 +79,7 @@ Line 1, characters 27-49: 1 | let f (x : int t option) = match x with None -> 1;; (* warn *) ^^^^^^^^^^^^^^^^^^^^^^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -Some A + Here is an example of a case that is not matched: "Some A" val f : int t option -> int = |}] @@ -101,8 +99,8 @@ Line 1, characters 49-68: 1 | let f : (int t box pair * bool) option -> unit = function None -> ();; ^^^^^^^^^^^^^^^^^^^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -Some ({left=Box A; right=Box A}, _) + Here is an example of a case that is not matched: + "Some ({left=Box A; right=Box A}, _)" val f : (int t box pair * bool) option -> unit = |}] @@ -118,8 +116,7 @@ Line 1, characters 8-39: 1 | let f = function {left=Box 0; _ } -> ();; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -{left=Box 1; _ } + Here is an example of a case that is not matched: "{left=Box 1; _ }" val f : int box pair -> unit = |}] @@ -130,8 +127,7 @@ Line 1, characters 8-47: 1 | let f = function {left=Box 0;right=Box 1} -> ();; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -{left=Box 0; right=Box 0} + Here is an example of a case that is not matched: "{left=Box 0; right=Box 0}" val f : int box pair -> unit = |}] @@ -188,8 +184,7 @@ Line 1, characters 33-51: 1 | let f : (A.a, A.b) cmp -> unit = function Any -> () ^^^^^^^^^^^^^^^^^^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -Eq + Here is an example of a case that is not matched: "Eq" val f : (A.a, A.b) cmp -> unit = |}] @@ -242,8 +237,7 @@ Line 2, characters 2-24: 2 | function None -> false ^^^^^^^^^^^^^^^^^^^^^^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -Some (PlusS _) + Here is an example of a case that is not matched: "Some (PlusS _)" val harder : (zero succ, zero succ, zero succ) plus option -> bool = |}] @@ -320,7 +314,7 @@ Line 1, characters 12-42: 1 | let f x y = match 1 with 1 when x = y -> 1;; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. -All clauses in this pattern-matching are guarded. + All clauses in this pattern-matching are guarded. val f : 'a -> 'a -> int = |}] @@ -332,8 +326,7 @@ Line 1, characters 8-37: 1 | let f = function {contents=_}, 0 -> 0;; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -({ _ }, 1) + Here is an example of a case that is not matched: "({ _ }, 1)" val f : 'a ref * int -> int = |}] @@ -351,9 +344,9 @@ Lines 1-4, characters 8-28: 3 | | Some x when x > 0 -> () 4 | | Some x when x <= 0 -> () Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -Some _ -(However, some guarded clause may match this value.) + Here is an example of a case that is not matched: + "Some _" + (However, some guarded clause may match this value.) val f : int option -> unit = |}] @@ -388,8 +381,7 @@ Lines 20-22, characters 45-49: 21 | | A, A, A, A -> () 22 | | (A|B), (A|B), (A|B), A (*missing B here*) -> () Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -((A|B), (A|B), (A|B), B) + Here is an example of a case that is not matched: "((A|B), (A|B), (A|B), B)" module Single_row_optim : sig type t = A | B val non_exhaustive : t * t * t * t -> unit end diff --git a/testsuite/tests/typing-warnings/open_warnings.ml b/testsuite/tests/typing-warnings/open_warnings.ml index 9e4f3381..a7762d34 100644 --- a/testsuite/tests/typing-warnings/open_warnings.ml +++ b/testsuite/tests/typing-warnings/open_warnings.ml @@ -10,12 +10,12 @@ end;; Line 2, characters 20-26: 2 | module M = struct type t end (* unused type t *) ^^^^^^ -Warning 34 [unused-type-declaration]: unused type t. +Warning 34 [unused-type-declaration]: unused type "t". Line 3, characters 2-8: 3 | open M (* unused open *) ^^^^^^ -Warning 33 [unused-open]: unused open M. +Warning 33 [unused-open]: unused open "M". module T1 : sig end |}] @@ -40,17 +40,18 @@ end;; Line 4, characters 2-8: 4 | open M (* used by line below; shadow constructor A *) ^^^^^^ -Warning 45 [open-shadow-label-constructor]: this open statement shadows the constructor A (which is later used) +Warning 45 [open-shadow-label-constructor]: this open statement shadows the + constructor "A" (which is later used) Line 2, characters 2-13: 2 | type t0 = A (* unused type and constructor *) ^^^^^^^^^^^ -Warning 34 [unused-type-declaration]: unused type t0. +Warning 34 [unused-type-declaration]: unused type "t0". Line 2, characters 12-13: 2 | type t0 = A (* unused type and constructor *) ^ -Warning 37 [unused-constructor]: unused constructor A. +Warning 37 [unused-constructor]: unused constructor "A". module T3 : sig end |}] @@ -65,17 +66,17 @@ end;; Line 3, characters 20-30: 3 | module M = struct type t = A end (* unused type and constructor *) ^^^^^^^^^^ -Warning 34 [unused-type-declaration]: unused type t. +Warning 34 [unused-type-declaration]: unused type "t". Line 3, characters 29-30: 3 | module M = struct type t = A end (* unused type and constructor *) ^ -Warning 37 [unused-constructor]: unused constructor A. +Warning 37 [unused-constructor]: unused constructor "A". Line 4, characters 2-8: 4 | open M (* unused open; no shadowing (A below refers to the one in t0) *) ^^^^^^ -Warning 33 [unused-open]: unused open M. +Warning 33 [unused-open]: unused open "M". module T4 : sig end |}] @@ -90,17 +91,18 @@ end;; Line 4, characters 2-8: 4 | open M (* shadow constructor A *) ^^^^^^ -Warning 45 [open-shadow-label-constructor]: this open statement shadows the constructor A (which is later used) +Warning 45 [open-shadow-label-constructor]: this open statement shadows the + constructor "A" (which is later used) Line 2, characters 2-13: 2 | type t0 = A (* unused type and constructor *) ^^^^^^^^^^^ -Warning 34 [unused-type-declaration]: unused type t0. +Warning 34 [unused-type-declaration]: unused type "t0". Line 2, characters 12-13: 2 | type t0 = A (* unused type and constructor *) ^ -Warning 37 [unused-constructor]: unused constructor A. +Warning 37 [unused-constructor]: unused constructor "A". module T5 : sig end |}] @@ -114,12 +116,12 @@ end;; Line 2, characters 20-26: 2 | module M = struct type t end (* unused type t *) ^^^^^^ -Warning 34 [unused-type-declaration]: unused type t. +Warning 34 [unused-type-declaration]: unused type "t". Line 3, characters 2-9: 3 | open! M (* unused open *) ^^^^^^^ -Warning 66 [unused-open-bang]: unused open! M. +Warning 66 [unused-open-bang]: unused open! "M". module T1_bis : sig end |}] @@ -143,12 +145,12 @@ end;; Line 2, characters 2-13: 2 | type t0 = A (* unused type and constructor *) ^^^^^^^^^^^ -Warning 34 [unused-type-declaration]: unused type t0. +Warning 34 [unused-type-declaration]: unused type "t0". Line 2, characters 12-13: 2 | type t0 = A (* unused type and constructor *) ^ -Warning 37 [unused-constructor]: unused constructor A. +Warning 37 [unused-constructor]: unused constructor "A". module T3_bis : sig end |}] @@ -163,17 +165,17 @@ end;; Line 3, characters 20-30: 3 | module M = struct type t = A end (* unused type and constructor *) ^^^^^^^^^^ -Warning 34 [unused-type-declaration]: unused type t. +Warning 34 [unused-type-declaration]: unused type "t". Line 3, characters 29-30: 3 | module M = struct type t = A end (* unused type and constructor *) ^ -Warning 37 [unused-constructor]: unused constructor A. +Warning 37 [unused-constructor]: unused constructor "A". Line 4, characters 2-9: 4 | open! M (* unused open; no shadowing (A below refers to the one in t0) *) ^^^^^^^ -Warning 66 [unused-open-bang]: unused open! M. +Warning 66 [unused-open-bang]: unused open! "M". module T4_bis : sig end |}] @@ -188,12 +190,12 @@ end;; Line 2, characters 2-13: 2 | type t0 = A (* unused type and constructor *) ^^^^^^^^^^^ -Warning 34 [unused-type-declaration]: unused type t0. +Warning 34 [unused-type-declaration]: unused type "t0". Line 2, characters 12-13: 2 | type t0 = A (* unused type and constructor *) ^ -Warning 37 [unused-constructor]: unused constructor A. +Warning 37 [unused-constructor]: unused constructor "A". module T5_bis : sig end |}] diff --git a/testsuite/tests/typing-warnings/pr5892.ml b/testsuite/tests/typing-warnings/pr5892.ml index c1cdd26d..ff70eedc 100644 --- a/testsuite/tests/typing-warnings/pr5892.ml +++ b/testsuite/tests/typing-warnings/pr5892.ml @@ -18,8 +18,7 @@ Line 1, characters 31-52: 1 | let f : label choice -> bool = function Left -> true;; (* warn *) ^^^^^^^^^^^^^^^^^^^^^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -Right + Here is an example of a case that is not matched: "Right" val f : CamlinternalOO.label choice -> bool = |}] diff --git a/testsuite/tests/typing-warnings/pr6872.ml b/testsuite/tests/typing-warnings/pr6872.ml index b3d8b803..7705327f 100644 --- a/testsuite/tests/typing-warnings/pr6872.ml +++ b/testsuite/tests/typing-warnings/pr6872.ml @@ -27,8 +27,8 @@ A Line 1, characters 0-1: 1 | A ^ -Warning 41 [ambiguous-name]: A belongs to several types: a exn -The first one was selected. Please disambiguate if this is wrong. +Warning 41 [ambiguous-name]: "A" belongs to several types: "a" "exn". + The first one was selected. Please disambiguate if this is wrong. - : a = A |}] @@ -39,8 +39,8 @@ raise A Line 1, characters 6-7: 1 | raise A ^ -Warning 42 [disambiguated-name]: this use of A relies on type-directed disambiguation, -it will not compile with OCaml 4.00 or earlier. +Warning 42 [disambiguated-name]: this use of "A" relies on type-directed + disambiguation, it will not compile with OCaml 4.00 or earlier. Exception: A. |}] @@ -57,21 +57,22 @@ function Not_found -> 1 | A -> 2 | _ -> 3 Line 1, characters 26-27: 1 | function Not_found -> 1 | A -> 2 | _ -> 3 ^ -Warning 42 [disambiguated-name]: this use of A relies on type-directed disambiguation, -it will not compile with OCaml 4.00 or earlier. +Warning 42 [disambiguated-name]: this use of "A" relies on type-directed + disambiguation, it will not compile with OCaml 4.00 or earlier. - : exn -> int = |}, Principal{| Line 1, characters 26-27: 1 | function Not_found -> 1 | A -> 2 | _ -> 3 ^ -Warning 18 [not-principal]: this type-based constructor disambiguation is not principal. +Warning 18 [not-principal]: this type-based constructor disambiguation is not + principal. Line 1, characters 26-27: 1 | function Not_found -> 1 | A -> 2 | _ -> 3 ^ -Warning 42 [disambiguated-name]: this use of A relies on type-directed disambiguation, -it will not compile with OCaml 4.00 or earlier. +Warning 42 [disambiguated-name]: this use of "A" relies on type-directed + disambiguation, it will not compile with OCaml 4.00 or earlier. - : exn -> int = |}] @@ -82,14 +83,14 @@ try raise A with A -> 2 Line 1, characters 10-11: 1 | try raise A with A -> 2 ^ -Warning 42 [disambiguated-name]: this use of A relies on type-directed disambiguation, -it will not compile with OCaml 4.00 or earlier. +Warning 42 [disambiguated-name]: this use of "A" relies on type-directed + disambiguation, it will not compile with OCaml 4.00 or earlier. Line 1, characters 17-18: 1 | try raise A with A -> 2 ^ -Warning 42 [disambiguated-name]: this use of A relies on type-directed disambiguation, -it will not compile with OCaml 4.00 or earlier. +Warning 42 [disambiguated-name]: this use of "A" relies on type-directed + disambiguation, it will not compile with OCaml 4.00 or earlier. - : int = 2 |}] diff --git a/testsuite/tests/typing-warnings/pr7085.ml b/testsuite/tests/typing-warnings/pr7085.ml index f0b47893..298f42ff 100644 --- a/testsuite/tests/typing-warnings/pr7085.ml +++ b/testsuite/tests/typing-warnings/pr7085.ml @@ -32,8 +32,7 @@ Line 17, characters 5-35: 17 | match M.is_t () with None -> 0 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -Some (Is Eq) + Here is an example of a case that is not matched: "Some (Is Eq)" module Make : (M : T) -> sig val f : unit -> int end |}] diff --git a/testsuite/tests/typing-warnings/pr7115.ml b/testsuite/tests/typing-warnings/pr7115.ml index 64b1b377..72dbc2de 100644 --- a/testsuite/tests/typing-warnings/pr7115.ml +++ b/testsuite/tests/typing-warnings/pr7115.ml @@ -16,7 +16,7 @@ end;; Line 2, characters 10-11: 2 | let _f ~x (* x unused argument *) = function ^ -Warning 27 [unused-var-strict]: unused variable x. +Warning 27 [unused-var-strict]: unused variable "x". module X1 : sig end |}] @@ -30,7 +30,7 @@ end;; Line 2, characters 6-7: 2 | let x = 42 (* unused value *) ^ -Warning 32 [unused-value-declaration]: unused value x. +Warning 32 [unused-value-declaration]: unused value "x". module X2 : sig end |}] @@ -46,12 +46,12 @@ end;; Line 2, characters 24-25: 2 | module O = struct let x = 42 (* unused *) end ^ -Warning 32 [unused-value-declaration]: unused value x. +Warning 32 [unused-value-declaration]: unused value "x". Line 3, characters 2-8: 3 | open O (* unused open *) ^^^^^^ -Warning 33 [unused-open]: unused open O. +Warning 33 [unused-open]: unused open "O". module X3 : sig end |}] diff --git a/testsuite/tests/typing-warnings/pr7261.compilers.reference b/testsuite/tests/typing-warnings/pr7261.compilers.reference index 03127652..ccd84b9d 100644 --- a/testsuite/tests/typing-warnings/pr7261.compilers.reference +++ b/testsuite/tests/typing-warnings/pr7261.compilers.reference @@ -5,7 +5,8 @@ Error: Syntax error Line 2, characters 35-49: 2 | Foo: 'b * 'b -> foo constraint 'b = [> `Bla ];; ^^^^^^^^^^^^^^ -Warning 62 [constraint-on-gadt]: Type constraints do not apply to GADT cases of variant types. +Warning 62 [constraint-on-gadt]: Type constraints do not apply to GADT cases + of variant types. type foo = Foo : 'b * 'b -> foo diff --git a/testsuite/tests/typing-warnings/pr7553.ml b/testsuite/tests/typing-warnings/pr7553.ml index 25defbed..538db1c2 100644 --- a/testsuite/tests/typing-warnings/pr7553.ml +++ b/testsuite/tests/typing-warnings/pr7553.ml @@ -23,7 +23,7 @@ end = C;; Line 2, characters 2-8: 2 | open A ^^^^^^ -Warning 33 [unused-open]: unused open A. +Warning 33 [unused-open]: unused open "A". module rec C : sig end |}] @@ -41,13 +41,12 @@ Line 5, characters 10-14: 5 | let None = None ^^^^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -Some _ + Here is an example of a case that is not matched: "Some _" Line 4, characters 6-12: 4 | open A ^^^^^^ -Warning 33 [unused-open]: unused open A. +Warning 33 [unused-open]: unused open "A". module rec D : sig module M : sig module X : sig end end end |}] diff --git a/testsuite/tests/typing-warnings/pr9244.ml b/testsuite/tests/typing-warnings/pr9244.ml index e2161dad..a761cce5 100644 --- a/testsuite/tests/typing-warnings/pr9244.ml +++ b/testsuite/tests/typing-warnings/pr9244.ml @@ -22,7 +22,7 @@ end Line 5, characters 8-9: 5 | let x = 13 ^ -Warning 32 [unused-value-declaration]: unused value x. +Warning 32 [unused-value-declaration]: unused value "x". module M : sig module F2 : U -> U end |}] @@ -41,7 +41,7 @@ end Line 5, characters 8-9: 5 | let x = 13 ^ -Warning 32 [unused-value-declaration]: unused value x. +Warning 32 [unused-value-declaration]: unused value "x". module N : sig module F2 : U -> U end |}] @@ -52,7 +52,7 @@ module F (X : sig type t type s end) = struct type t = X.t end Line 1, characters 25-31: 1 | module F (X : sig type t type s end) = struct type t = X.t end ^^^^^^ -Warning 34 [unused-type-declaration]: unused type s. +Warning 34 [unused-type-declaration]: unused type "s". module F : (X : sig type t type s end) -> sig type t = X.t end |}] diff --git a/testsuite/tests/typing-warnings/records.ml b/testsuite/tests/typing-warnings/records.ml index 34bcb288..8fc958a5 100644 --- a/testsuite/tests/typing-warnings/records.ml +++ b/testsuite/tests/typing-warnings/records.ml @@ -25,31 +25,31 @@ end;; Line 3, characters 19-20: 3 | let f1 (r:t) = r.x (* ok *) ^ -Warning 42 [disambiguated-name]: this use of x relies on type-directed disambiguation, -it will not compile with OCaml 4.00 or earlier. +Warning 42 [disambiguated-name]: this use of "x" relies on type-directed + disambiguation, it will not compile with OCaml 4.00 or earlier. Line 4, characters 29-30: 4 | let f2 r = ignore (r:t); r.x (* non principal *) ^ -Warning 42 [disambiguated-name]: this use of x relies on type-directed disambiguation, -it will not compile with OCaml 4.00 or earlier. +Warning 42 [disambiguated-name]: this use of "x" relies on type-directed + disambiguation, it will not compile with OCaml 4.00 or earlier. Line 7, characters 18-19: 7 | match r with {x; y} -> y + y (* ok *) ^ -Warning 42 [disambiguated-name]: this use of x relies on type-directed disambiguation, -it will not compile with OCaml 4.00 or earlier. +Warning 42 [disambiguated-name]: this use of "x" relies on type-directed + disambiguation, it will not compile with OCaml 4.00 or earlier. Line 7, characters 21-22: 7 | match r with {x; y} -> y + y (* ok *) ^ -Warning 42 [disambiguated-name]: this use of y relies on type-directed disambiguation, -it will not compile with OCaml 4.00 or earlier. +Warning 42 [disambiguated-name]: this use of "y" relies on type-directed + disambiguation, it will not compile with OCaml 4.00 or earlier. Line 7, characters 18-19: 7 | match r with {x; y} -> y + y (* ok *) ^ -Warning 27 [unused-var-strict]: unused variable x. +Warning 27 [unused-var-strict]: unused variable "x". module OK : sig val f1 : M1.t -> int val f2 : M1.t -> int val f3 : M1.t -> int end @@ -57,36 +57,37 @@ module OK : Line 3, characters 19-20: 3 | let f1 (r:t) = r.x (* ok *) ^ -Warning 42 [disambiguated-name]: this use of x relies on type-directed disambiguation, -it will not compile with OCaml 4.00 or earlier. +Warning 42 [disambiguated-name]: this use of "x" relies on type-directed + disambiguation, it will not compile with OCaml 4.00 or earlier. Line 4, characters 29-30: 4 | let f2 r = ignore (r:t); r.x (* non principal *) ^ -Warning 18 [not-principal]: this type-based field disambiguation is not principal. +Warning 18 [not-principal]: this type-based field disambiguation is not + principal. Line 4, characters 29-30: 4 | let f2 r = ignore (r:t); r.x (* non principal *) ^ -Warning 42 [disambiguated-name]: this use of x relies on type-directed disambiguation, -it will not compile with OCaml 4.00 or earlier. +Warning 42 [disambiguated-name]: this use of "x" relies on type-directed + disambiguation, it will not compile with OCaml 4.00 or earlier. Line 7, characters 18-19: 7 | match r with {x; y} -> y + y (* ok *) ^ -Warning 42 [disambiguated-name]: this use of x relies on type-directed disambiguation, -it will not compile with OCaml 4.00 or earlier. +Warning 42 [disambiguated-name]: this use of "x" relies on type-directed + disambiguation, it will not compile with OCaml 4.00 or earlier. Line 7, characters 21-22: 7 | match r with {x; y} -> y + y (* ok *) ^ -Warning 42 [disambiguated-name]: this use of y relies on type-directed disambiguation, -it will not compile with OCaml 4.00 or earlier. +Warning 42 [disambiguated-name]: this use of "y" relies on type-directed + disambiguation, it will not compile with OCaml 4.00 or earlier. Line 7, characters 18-19: 7 | match r with {x; y} -> y + y (* ok *) ^ -Warning 27 [unused-var-strict]: unused variable x. +Warning 27 [unused-var-strict]: unused variable "x". module OK : sig val f1 : M1.t -> int val f2 : M1.t -> int val f3 : M1.t -> int end @@ -100,8 +101,9 @@ end;; (* fails *) Line 3, characters 25-31: 3 | let f r = match r with {x; y} -> y + y ^^^^^^ -Warning 41 [ambiguous-name]: these field labels belong to several types: M1.u M1.t -The first one was selected. Please disambiguate if this is wrong. +Warning 41 [ambiguous-name]: these field labels belong to several types: + "M1.u" "M1.t". + The first one was selected. Please disambiguate if this is wrong. Line 3, characters 35-36: 3 | let f r = match r with {x; y} -> y + y @@ -120,43 +122,44 @@ end;; (* fails for -principal *) Line 6, characters 8-9: 6 | {x; y} -> y + y ^ -Warning 42 [disambiguated-name]: this use of x relies on type-directed disambiguation, -it will not compile with OCaml 4.00 or earlier. +Warning 42 [disambiguated-name]: this use of "x" relies on type-directed + disambiguation, it will not compile with OCaml 4.00 or earlier. Line 6, characters 11-12: 6 | {x; y} -> y + y ^ -Warning 42 [disambiguated-name]: this use of y relies on type-directed disambiguation, -it will not compile with OCaml 4.00 or earlier. +Warning 42 [disambiguated-name]: this use of "y" relies on type-directed + disambiguation, it will not compile with OCaml 4.00 or earlier. Line 6, characters 8-9: 6 | {x; y} -> y + y ^ -Warning 27 [unused-var-strict]: unused variable x. +Warning 27 [unused-var-strict]: unused variable "x". module F2 : sig val f : M1.t -> int end |}, Principal{| Line 6, characters 8-9: 6 | {x; y} -> y + y ^ -Warning 42 [disambiguated-name]: this use of x relies on type-directed disambiguation, -it will not compile with OCaml 4.00 or earlier. +Warning 42 [disambiguated-name]: this use of "x" relies on type-directed + disambiguation, it will not compile with OCaml 4.00 or earlier. Line 6, characters 11-12: 6 | {x; y} -> y + y ^ -Warning 42 [disambiguated-name]: this use of y relies on type-directed disambiguation, -it will not compile with OCaml 4.00 or earlier. +Warning 42 [disambiguated-name]: this use of "y" relies on type-directed + disambiguation, it will not compile with OCaml 4.00 or earlier. Line 6, characters 7-13: 6 | {x; y} -> y + y ^^^^^^ -Warning 18 [not-principal]: this type-based record disambiguation is not principal. +Warning 18 [not-principal]: this type-based record disambiguation is not + principal. Line 6, characters 8-9: 6 | {x; y} -> y + y ^ -Warning 27 [unused-var-strict]: unused variable x. +Warning 27 [unused-var-strict]: unused variable "x". module F2 : sig val f : M1.t -> int end |}] @@ -174,8 +177,8 @@ let f (r:M.t) = r.M.x;; (* ok *) Line 1, characters 18-21: 1 | let f (r:M.t) = r.M.x;; (* ok *) ^^^ -Warning 42 [disambiguated-name]: this use of x relies on type-directed disambiguation, -it will not compile with OCaml 4.00 or earlier. +Warning 42 [disambiguated-name]: this use of "x" relies on type-directed + disambiguation, it will not compile with OCaml 4.00 or earlier. val f : M.t -> int = |}] @@ -184,15 +187,15 @@ let f (r:M.t) = r.x;; (* warning *) Line 1, characters 18-19: 1 | let f (r:M.t) = r.x;; (* warning *) ^ -Warning 40 [name-out-of-scope]: x was selected from type M.t. -It is not visible in the current scope, and will not -be selected if the type becomes unknown. +Warning 40 [name-out-of-scope]: "x" was selected from type "M.t". + It is not visible in the current scope, and will not be selected + if the type becomes unknown. Line 1, characters 18-19: 1 | let f (r:M.t) = r.x;; (* warning *) ^ -Warning 42 [disambiguated-name]: this use of x relies on type-directed disambiguation, -it will not compile with OCaml 4.00 or earlier. +Warning 42 [disambiguated-name]: this use of "x" relies on type-directed + disambiguation, it will not compile with OCaml 4.00 or earlier. val f : M.t -> int = |}] @@ -201,15 +204,15 @@ let f ({x}:M.t) = x;; (* warning *) Line 1, characters 8-9: 1 | let f ({x}:M.t) = x;; (* warning *) ^ -Warning 42 [disambiguated-name]: this use of x relies on type-directed disambiguation, -it will not compile with OCaml 4.00 or earlier. +Warning 42 [disambiguated-name]: this use of "x" relies on type-directed + disambiguation, it will not compile with OCaml 4.00 or earlier. Line 1, characters 7-10: 1 | let f ({x}:M.t) = x;; (* warning *) ^^^ -Warning 40 [name-out-of-scope]: this record of type M.t contains fields that are -not visible in the current scope: x. -They will not be selected if the type becomes unknown. +Warning 40 [name-out-of-scope]: this record of type "M.t" contains fields that + are not visible in the current scope: "x". + They will not be selected if the type becomes unknown. val f : M.t -> int = |}] @@ -235,13 +238,13 @@ end;; Line 4, characters 20-21: 4 | let f (r:M.t) = r.x ^ -Warning 42 [disambiguated-name]: this use of x relies on type-directed disambiguation, -it will not compile with OCaml 4.00 or earlier. +Warning 42 [disambiguated-name]: this use of "x" relies on type-directed + disambiguation, it will not compile with OCaml 4.00 or earlier. Line 3, characters 2-8: 3 | open N ^^^^^^ -Warning 33 [unused-open]: unused open N. +Warning 33 [unused-open]: unused open "N". module OK : sig val f : M.t -> int end |}] @@ -287,15 +290,15 @@ end;; (* ok *) Line 3, characters 9-10: 3 | let f {x;z} = x,z ^ -Warning 42 [disambiguated-name]: this use of x relies on type-directed disambiguation, -it will not compile with OCaml 4.00 or earlier. +Warning 42 [disambiguated-name]: this use of "x" relies on type-directed + disambiguation, it will not compile with OCaml 4.00 or earlier. Line 3, characters 8-13: 3 | let f {x;z} = x,z ^^^^^ -Warning 9 [missing-record-field-pattern]: the following labels are not bound in this record pattern: -y -Either bind these labels explicitly or add '; _' to the pattern. +Warning 9 [missing-record-field-pattern]: the following labels are not bound + in this record pattern: "y". + Either bind these labels explicitly or add "; _" to the pattern. module OK : sig val f : M.u -> bool * char end |}] @@ -307,8 +310,8 @@ end;; (* fail for missing label *) Line 3, characters 11-12: 3 | let r = {x=true;z='z'} ^ -Warning 42 [disambiguated-name]: this use of x relies on type-directed disambiguation, -it will not compile with OCaml 4.00 or earlier. +Warning 42 [disambiguated-name]: this use of "x" relies on type-directed + disambiguation, it will not compile with OCaml 4.00 or earlier. Line 3, characters 10-24: 3 | let r = {x=true;z='z'} @@ -325,14 +328,14 @@ end;; (* ok *) Line 4, characters 11-12: 4 | let r = {x=3; y=true} ^ -Warning 42 [disambiguated-name]: this use of x relies on type-directed disambiguation, -it will not compile with OCaml 4.00 or earlier. +Warning 42 [disambiguated-name]: this use of "x" relies on type-directed + disambiguation, it will not compile with OCaml 4.00 or earlier. Line 4, characters 16-17: 4 | let r = {x=3; y=true} ^ -Warning 42 [disambiguated-name]: this use of y relies on type-directed disambiguation, -it will not compile with OCaml 4.00 or earlier. +Warning 42 [disambiguated-name]: this use of "y" relies on type-directed + disambiguation, it will not compile with OCaml 4.00 or earlier. module OK : sig @@ -393,14 +396,14 @@ let r = {MN.x = 3; NM.y = 4};; (* error: type would change with order *) Line 1, characters 8-28: 1 | let r = {MN.x = 3; NM.y = 4};; (* error: type would change with order *) ^^^^^^^^^^^^^^^^^^^^ -Warning 41 [ambiguous-name]: x belongs to several types: MN.bar MN.foo -The first one was selected. Please disambiguate if this is wrong. +Warning 41 [ambiguous-name]: "x" belongs to several types: "MN.bar" "MN.foo". + The first one was selected. Please disambiguate if this is wrong. Line 1, characters 8-28: 1 | let r = {MN.x = 3; NM.y = 4};; (* error: type would change with order *) ^^^^^^^^^^^^^^^^^^^^ -Warning 41 [ambiguous-name]: y belongs to several types: NM.foo NM.bar -The first one was selected. Please disambiguate if this is wrong. +Warning 41 [ambiguous-name]: "y" belongs to several types: "NM.foo" "NM.bar". + The first one was selected. Please disambiguate if this is wrong. Line 1, characters 19-23: 1 | let r = {MN.x = 3; NM.y = 4};; (* error: type would change with order *) @@ -430,8 +433,8 @@ end;; Line 3, characters 37-38: 3 | let f r = ignore (r: foo); {r with x = 2; z = 3} ^ -Warning 42 [disambiguated-name]: this use of x relies on type-directed disambiguation, -it will not compile with OCaml 4.00 or earlier. +Warning 42 [disambiguated-name]: this use of "x" relies on type-directed + disambiguation, it will not compile with OCaml 4.00 or earlier. Line 3, characters 44-45: 3 | let f r = ignore (r: foo); {r with x = 2; z = 3} @@ -459,8 +462,8 @@ end;; Line 3, characters 38-39: 3 | let f r = ignore (r: foo); { r with x = 3; a = 4 } ^ -Warning 42 [disambiguated-name]: this use of x relies on type-directed disambiguation, -it will not compile with OCaml 4.00 or earlier. +Warning 42 [disambiguated-name]: this use of "x" relies on type-directed + disambiguation, it will not compile with OCaml 4.00 or earlier. Line 3, characters 45-46: 3 | let f r = ignore (r: foo); { r with x = 3; a = 4 } @@ -477,14 +480,14 @@ end;; Line 3, characters 11-12: 3 | let r = {x=1; y=2} ^ -Warning 42 [disambiguated-name]: this use of x relies on type-directed disambiguation, -it will not compile with OCaml 4.00 or earlier. +Warning 42 [disambiguated-name]: this use of "x" relies on type-directed + disambiguation, it will not compile with OCaml 4.00 or earlier. Line 3, characters 16-17: 3 | let r = {x=1; y=2} ^ -Warning 42 [disambiguated-name]: this use of y relies on type-directed disambiguation, -it will not compile with OCaml 4.00 or earlier. +Warning 42 [disambiguated-name]: this use of "y" relies on type-directed + disambiguation, it will not compile with OCaml 4.00 or earlier. Line 4, characters 18-19: 4 | let r: other = {x=1; y=2} @@ -520,7 +523,7 @@ Line 3, characters 19-22: ^^^ Error: This record expression is expected to have type "t" There is no field "yyz" within type "t" -Hint: Did you mean "yyy"? +Hint: Did you mean "yyy"? |}] (* PR#6004 *) @@ -541,8 +544,8 @@ class f (_ : 'a) (_ : 'a) = object end;; Line 1, characters 12-13: 1 | class g = f A;; (* ok *) ^ -Warning 42 [disambiguated-name]: this use of A relies on type-directed disambiguation, -it will not compile with OCaml 4.00 or earlier. +Warning 42 [disambiguated-name]: this use of "A" relies on type-directed + disambiguation, it will not compile with OCaml 4.00 or earlier. class g : f class f : 'a -> 'a -> object end @@ -552,33 +555,34 @@ class g = f (A : t) A;; (* warn with -principal *) Line 1, characters 13-14: 1 | class g = f (A : t) A;; (* warn with -principal *) ^ -Warning 42 [disambiguated-name]: this use of A relies on type-directed disambiguation, -it will not compile with OCaml 4.00 or earlier. +Warning 42 [disambiguated-name]: this use of "A" relies on type-directed + disambiguation, it will not compile with OCaml 4.00 or earlier. Line 1, characters 20-21: 1 | class g = f (A : t) A;; (* warn with -principal *) ^ -Warning 42 [disambiguated-name]: this use of A relies on type-directed disambiguation, -it will not compile with OCaml 4.00 or earlier. +Warning 42 [disambiguated-name]: this use of "A" relies on type-directed + disambiguation, it will not compile with OCaml 4.00 or earlier. class g : f |}, Principal{| Line 1, characters 13-14: 1 | class g = f (A : t) A;; (* warn with -principal *) ^ -Warning 42 [disambiguated-name]: this use of A relies on type-directed disambiguation, -it will not compile with OCaml 4.00 or earlier. +Warning 42 [disambiguated-name]: this use of "A" relies on type-directed + disambiguation, it will not compile with OCaml 4.00 or earlier. Line 1, characters 20-21: 1 | class g = f (A : t) A;; (* warn with -principal *) ^ -Warning 18 [not-principal]: this type-based constructor disambiguation is not principal. +Warning 18 [not-principal]: this type-based constructor disambiguation is not + principal. Line 1, characters 20-21: 1 | class g = f (A : t) A;; (* warn with -principal *) ^ -Warning 42 [disambiguated-name]: this use of A relies on type-directed disambiguation, -it will not compile with OCaml 4.00 or earlier. +Warning 42 [disambiguated-name]: this use of "A" relies on type-directed + disambiguation, it will not compile with OCaml 4.00 or earlier. class g : f |}] @@ -598,13 +602,13 @@ end;; Line 7, characters 15-16: 7 | let y : t = {x = 0} ^ -Warning 42 [disambiguated-name]: this use of x relies on type-directed disambiguation, -it will not compile with OCaml 4.00 or earlier. +Warning 42 [disambiguated-name]: this use of "x" relies on type-directed + disambiguation, it will not compile with OCaml 4.00 or earlier. Line 6, characters 2-8: 6 | open M (* this open is unused, it isn't reported as shadowing 'x' *) ^^^^^^ -Warning 33 [unused-open]: unused open M. +Warning 33 [unused-open]: unused open "M". module Shadow1 : sig @@ -625,13 +629,15 @@ end;; Line 6, characters 2-8: 6 | open M (* this open shadows label 'x' *) ^^^^^^ -Warning 45 [open-shadow-label-constructor]: this open statement shadows the label x (which is later used) +Warning 45 [open-shadow-label-constructor]: this open statement shadows the + label "x" (which is later used) Line 7, characters 10-18: 7 | let y = {x = ""} ^^^^^^^^ -Warning 41 [ambiguous-name]: these field labels belong to several types: M.s t -The first one was selected. Please disambiguate if this is wrong. +Warning 41 [ambiguous-name]: these field labels belong to several types: + "M.s" "t". + The first one was selected. Please disambiguate if this is wrong. module Shadow2 : sig @@ -653,8 +659,8 @@ end;; Line 5, characters 37-40: 5 | let f (u : u) = match u with `Key {loc} -> loc ^^^ -Warning 42 [disambiguated-name]: this use of loc relies on type-directed disambiguation, -it will not compile with OCaml 4.00 or earlier. +Warning 42 [disambiguated-name]: this use of "loc" relies on type-directed + disambiguation, it will not compile with OCaml 4.00 or earlier. module P6235 : sig @@ -679,8 +685,8 @@ end;; Line 7, characters 11-14: 7 | |`Key {loc} -> loc ^^^ -Warning 42 [disambiguated-name]: this use of loc relies on type-directed disambiguation, -it will not compile with OCaml 4.00 or earlier. +Warning 42 [disambiguated-name]: this use of "loc" relies on type-directed + disambiguation, it will not compile with OCaml 4.00 or earlier. module P6235' : sig @@ -693,13 +699,14 @@ module P6235' : Line 7, characters 11-14: 7 | |`Key {loc} -> loc ^^^ -Warning 42 [disambiguated-name]: this use of loc relies on type-directed disambiguation, -it will not compile with OCaml 4.00 or earlier. +Warning 42 [disambiguated-name]: this use of "loc" relies on type-directed + disambiguation, it will not compile with OCaml 4.00 or earlier. Line 7, characters 10-15: 7 | |`Key {loc} -> loc ^^^^^ -Warning 18 [not-principal]: this type-based record disambiguation is not principal. +Warning 18 [not-principal]: this type-based record disambiguation is not + principal. module P6235' : sig @@ -739,56 +746,56 @@ module M : sig type t = { x : int; y : char; } end Line 2, characters 27-28: 2 | let f (x : M.t) = { x with y = 'a' } ^ -Warning 42 [disambiguated-name]: this use of y relies on type-directed disambiguation, -it will not compile with OCaml 4.00 or earlier. +Warning 42 [disambiguated-name]: this use of "y" relies on type-directed + disambiguation, it will not compile with OCaml 4.00 or earlier. Line 2, characters 18-36: 2 | let f (x : M.t) = { x with y = 'a' } ^^^^^^^^^^^^^^^^^^ -Warning 40 [name-out-of-scope]: this record of type M.t contains fields that are -not visible in the current scope: y. -They will not be selected if the type becomes unknown. +Warning 40 [name-out-of-scope]: this record of type "M.t" contains fields that + are not visible in the current scope: "y". + They will not be selected if the type becomes unknown. val f : M.t -> M.t = Line 3, characters 27-28: 3 | let g (x : M.t) = { x with y = 'a' } :: [] ^ -Warning 42 [disambiguated-name]: this use of y relies on type-directed disambiguation, -it will not compile with OCaml 4.00 or earlier. +Warning 42 [disambiguated-name]: this use of "y" relies on type-directed + disambiguation, it will not compile with OCaml 4.00 or earlier. Line 3, characters 18-36: 3 | let g (x : M.t) = { x with y = 'a' } :: [] ^^^^^^^^^^^^^^^^^^ -Warning 40 [name-out-of-scope]: this record of type M.t contains fields that are -not visible in the current scope: y. -They will not be selected if the type becomes unknown. +Warning 40 [name-out-of-scope]: this record of type "M.t" contains fields that + are not visible in the current scope: "y". + They will not be selected if the type becomes unknown. val g : M.t -> M.t list = Line 4, characters 27-28: 4 | let h (x : M.t) = { x with y = 'a' } :: { x with y = 'b' } :: [];; ^ -Warning 42 [disambiguated-name]: this use of y relies on type-directed disambiguation, -it will not compile with OCaml 4.00 or earlier. +Warning 42 [disambiguated-name]: this use of "y" relies on type-directed + disambiguation, it will not compile with OCaml 4.00 or earlier. Line 4, characters 18-36: 4 | let h (x : M.t) = { x with y = 'a' } :: { x with y = 'b' } :: [];; ^^^^^^^^^^^^^^^^^^ -Warning 40 [name-out-of-scope]: this record of type M.t contains fields that are -not visible in the current scope: y. -They will not be selected if the type becomes unknown. +Warning 40 [name-out-of-scope]: this record of type "M.t" contains fields that + are not visible in the current scope: "y". + They will not be selected if the type becomes unknown. Line 4, characters 49-50: 4 | let h (x : M.t) = { x with y = 'a' } :: { x with y = 'b' } :: [];; ^ -Warning 42 [disambiguated-name]: this use of y relies on type-directed disambiguation, -it will not compile with OCaml 4.00 or earlier. +Warning 42 [disambiguated-name]: this use of "y" relies on type-directed + disambiguation, it will not compile with OCaml 4.00 or earlier. Line 4, characters 40-58: 4 | let h (x : M.t) = { x with y = 'a' } :: { x with y = 'b' } :: [];; ^^^^^^^^^^^^^^^^^^ -Warning 40 [name-out-of-scope]: this record of type M.t contains fields that are -not visible in the current scope: y. -They will not be selected if the type becomes unknown. +Warning 40 [name-out-of-scope]: this record of type "M.t" contains fields that + are not visible in the current scope: "y". + They will not be selected if the type becomes unknown. val h : M.t -> M.t list = |}] diff --git a/testsuite/tests/typing-warnings/unused_functor_parameter.ml b/testsuite/tests/typing-warnings/unused_functor_parameter.ml index ed9ac693..1ac3e73d 100644 --- a/testsuite/tests/typing-warnings/unused_functor_parameter.ml +++ b/testsuite/tests/typing-warnings/unused_functor_parameter.ml @@ -8,7 +8,7 @@ module Foo(Unused : sig end) = struct end;; Line 1, characters 11-17: 1 | module Foo(Unused : sig end) = struct end;; ^^^^^^ -Warning 60 [unused-module]: unused module Unused. +Warning 60 [unused-module]: unused module "Unused". module Foo : (Unused : sig end) -> sig end |}] @@ -18,7 +18,7 @@ module type S = functor (Unused : sig end) -> sig end;; Line 1, characters 25-31: 1 | module type S = functor (Unused : sig end) -> sig end;; ^^^^^^ -Warning 67 [unused-functor-parameter]: unused functor parameter Unused. +Warning 67 [unused-functor-parameter]: unused functor parameter "Unused". module type S = (Unused : sig end) -> sig end |}] @@ -30,7 +30,7 @@ end;; Line 2, characters 12-18: 2 | module M (Unused : sig end) : sig end ^^^^^^ -Warning 67 [unused-functor-parameter]: unused functor parameter Unused. +Warning 67 [unused-functor-parameter]: unused functor parameter "Unused". module type S = sig module M : (Unused : sig end) -> sig end end |}] diff --git a/testsuite/tests/typing-warnings/unused_recmodule.ml b/testsuite/tests/typing-warnings/unused_recmodule.ml index 8ee636b5..cd10da58 100644 --- a/testsuite/tests/typing-warnings/unused_recmodule.ml +++ b/testsuite/tests/typing-warnings/unused_recmodule.ml @@ -26,7 +26,7 @@ end;; Line 14, characters 4-10: 14 | type t ^^^^^^ -Warning 34 [unused-type-declaration]: unused type t. +Warning 34 [unused-type-declaration]: unused type "t". module M : sig end |}];; diff --git a/testsuite/tests/typing-warnings/unused_types.ml b/testsuite/tests/typing-warnings/unused_types.ml index 08cada67..0189449a 100644 --- a/testsuite/tests/typing-warnings/unused_types.ml +++ b/testsuite/tests/typing-warnings/unused_types.ml @@ -12,7 +12,7 @@ end Line 3, characters 2-19: 3 | type unused = int ^^^^^^^^^^^^^^^^^ -Warning 34 [unused-type-declaration]: unused type unused. +Warning 34 [unused-type-declaration]: unused type "unused". module Unused : sig end |}] @@ -27,7 +27,7 @@ end Line 4, characters 2-27: 4 | type nonrec unused = used ^^^^^^^^^^^^^^^^^^^^^^^^^ -Warning 34 [unused-type-declaration]: unused type unused. +Warning 34 [unused-type-declaration]: unused type "unused". module Unused_nonrec : sig end |}] @@ -41,12 +41,12 @@ end Line 3, characters 2-27: 3 | type unused = A of unused ^^^^^^^^^^^^^^^^^^^^^^^^^ -Warning 34 [unused-type-declaration]: unused type unused. +Warning 34 [unused-type-declaration]: unused type "unused". Line 3, characters 16-27: 3 | type unused = A of unused ^^^^^^^^^^^ -Warning 37 [unused-constructor]: unused constructor A. +Warning 37 [unused-constructor]: unused constructor "A". module Unused_rec : sig end |}] @@ -73,7 +73,7 @@ end Line 4, characters 11-12: 4 | type t = T ^ -Warning 37 [unused-constructor]: unused constructor T. +Warning 37 [unused-constructor]: unused constructor "T". module Unused_constructor : sig type t end |}] @@ -91,8 +91,8 @@ end Line 5, characters 11-12: 5 | type t = T ^ -Warning 37 [unused-constructor]: constructor T is never used to build values. -(However, this constructor appears in patterns.) +Warning 37 [unused-constructor]: constructor "T" is never used to build values. + (However, this constructor appears in patterns.) module Unused_constructor_outside_patterns : sig type t val nothing : t -> unit end @@ -108,8 +108,8 @@ end Line 4, characters 11-12: 4 | type t = T ^ -Warning 37 [unused-constructor]: constructor T is never used to build values. -Its type is exported as a private type. +Warning 37 [unused-constructor]: constructor "T" is never used to build values. + Its type is exported as a private type. module Unused_constructor_exported_private : sig type t = private T end |}] @@ -137,7 +137,7 @@ end Line 4, characters 19-20: 4 | type t = private T ^ -Warning 37 [unused-constructor]: unused constructor T. +Warning 37 [unused-constructor]: unused constructor "T". module Unused_private_constructor : sig type t end |}] @@ -185,7 +185,7 @@ end Line 3, characters 2-26: 3 | exception Nobody_uses_me ^^^^^^^^^^^^^^^^^^^^^^^^ -Warning 38 [unused-extension]: unused exception Nobody_uses_me +Warning 38 [unused-extension]: unused exception "Nobody_uses_me" module Unused_exception : sig end |}] @@ -201,7 +201,7 @@ end Line 5, characters 12-26: 5 | type t += Nobody_uses_me ^^^^^^^^^^^^^^ -Warning 38 [unused-extension]: unused extension constructor Nobody_uses_me +Warning 38 [unused-extension]: unused extension constructor "Nobody_uses_me" module Unused_extension_constructor : sig type t = .. end |}] @@ -217,7 +217,7 @@ end Line 5, characters 59-75: 5 | type t += Dont_warn_on_me [@warning "-unused-extension"] | Nobody_uses_me ^^^^^^^^^^^^^^^^ -Warning 38 [unused-extension]: unused extension constructor Nobody_uses_me +Warning 38 [unused-extension]: unused extension constructor "Nobody_uses_me" module Unused_extension_disabled_warning : sig type t = .. end |}] @@ -235,8 +235,8 @@ end Line 4, characters 2-32: 4 | exception Nobody_constructs_me ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Warning 38 [unused-extension]: exception Nobody_constructs_me is never used to build values. -(However, this constructor appears in patterns.) +Warning 38 [unused-extension]: exception "Nobody_constructs_me" is never used + to build values. (However, this constructor appears in patterns.) module Unused_exception_outside_patterns : sig val falsity : exn -> bool end |}] @@ -256,8 +256,8 @@ end Line 6, characters 12-27: 6 | type t += Noone_builds_me ^^^^^^^^^^^^^^^ -Warning 38 [unused-extension]: extension constructor Noone_builds_me is never used to build values. -(However, this constructor appears in patterns.) +Warning 38 [unused-extension]: extension constructor "Noone_builds_me" is never used + to build values. (However, this constructor appears in patterns.) module Unused_extension_outside_patterns : sig type t = .. val falsity : t -> bool end @@ -273,8 +273,8 @@ end Line 4, characters 2-23: 4 | exception Private_exn ^^^^^^^^^^^^^^^^^^^^^ -Warning 38 [unused-extension]: exception Private_exn is never used to build values. -It is exported or rebound as a private extension. +Warning 38 [unused-extension]: exception "Private_exn" is never used to build + values. It is exported or rebound as a private extension. module Unused_exception_exported_private : sig type exn += private Private_exn end @@ -292,8 +292,8 @@ end Line 6, characters 12-23: 6 | type t += Private_ext ^^^^^^^^^^^ -Warning 38 [unused-extension]: extension constructor Private_ext is never used to build values. -It is exported or rebound as a private extension. +Warning 38 [unused-extension]: extension constructor "Private_ext" is never used + to build values. It is exported or rebound as a private extension. module Unused_extension_exported_private : sig type t = .. type t += private Private_ext end @@ -324,7 +324,7 @@ end Line 5, characters 20-31: 5 | type t += private Private_ext ^^^^^^^^^^^ -Warning 38 [unused-extension]: unused extension constructor Private_ext +Warning 38 [unused-extension]: unused extension constructor "Private_ext" module Unused_private_extension : sig type t end |}] @@ -361,7 +361,7 @@ end;; Line 3, characters 11-12: 3 | type t = A [@@warning "-34"] ^ -Warning 37 [unused-constructor]: unused constructor A. +Warning 37 [unused-constructor]: unused constructor "A". module Unused_type_disable_warning : sig end |}] @@ -374,7 +374,7 @@ end;; Line 3, characters 2-30: 3 | type t = A [@@warning "-37"] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Warning 34 [unused-type-declaration]: unused type t. +Warning 34 [unused-type-declaration]: unused type "t". module Unused_constructor_disable_warning : sig end |}] @@ -387,12 +387,12 @@ end;; Line 3, characters 2-33: 3 | type t = A [@warning "-37"] | B ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Warning 34 [unused-type-declaration]: unused type t. +Warning 34 [unused-type-declaration]: unused type "t". Line 3, characters 30-33: 3 | type t = A [@warning "-37"] | B ^^^ -Warning 37 [unused-constructor]: unused constructor B. +Warning 37 [unused-constructor]: unused constructor "B". module Unused_constructor_disable_one_warning : sig end |}] @@ -406,12 +406,12 @@ end;; Line 2, characters 13-21: 2 | type t = { a : int; b : int } ^^^^^^^^ -Warning 69 [unused-field]: unused record field a. +Warning 69 [unused-field]: unused record field "a". Line 2, characters 22-29: 2 | type t = { a : int; b : int } ^^^^^^^ -Warning 69 [unused-field]: unused record field b. +Warning 69 [unused-field]: unused record field "b". module Unused_record : sig end |}] @@ -425,8 +425,8 @@ end;; Line 2, characters 13-20: 2 | type t = { a : int } ^^^^^^^ -Warning 69 [unused-field]: record field a is never read. -(However, this field is used to build or mutate values.) +Warning 69 [unused-field]: record field "a" is never read. + (However, this field is used to build or mutate values.) module Unused_field : sig end |}] @@ -442,8 +442,8 @@ end;; Line 2, characters 22-30: 2 | type t = { a : int; b : int; c : int } ^^^^^^^^ -Warning 69 [unused-field]: record field b is never read. -(However, this field is used to build or mutate values.) +Warning 69 [unused-field]: record field "b" is never read. + (However, this field is used to build or mutate values.) module Unused_field : sig end |}] @@ -458,7 +458,7 @@ end;; Line 2, characters 22-37: 2 | type t = { a : int; mutable b : int } ^^^^^^^^^^^^^^^ -Warning 69 [unused-field]: mutable record field b is never mutated. +Warning 69 [unused-field]: mutable record field "b" is never mutated. module Unused_mutable_field : sig end |}] @@ -494,7 +494,7 @@ end;; Line 4, characters 22-37: 4 | type t = { a : int; mutable b : int } ^^^^^^^^^^^^^^^ -Warning 69 [unused-field]: mutable record field b is never mutated. +Warning 69 [unused-field]: mutable record field "b" is never mutated. module Unused_mutable_field_exported_private : sig type t = private { a : int; mutable b : int; } end @@ -508,7 +508,7 @@ end;; Line 3, characters 2-56: 3 | type t = { a: int; b:int } [@@warning "-unused-field"] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Warning 34 [unused-type-declaration]: unused type t. +Warning 34 [unused-type-declaration]: unused type "t". module Unused_field_disable_warning : sig end |}] @@ -521,12 +521,12 @@ end;; Line 3, characters 2-55: 3 | type t = { a: int [@warning "-unused-field"]; b:int } ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Warning 34 [unused-type-declaration]: unused type t. +Warning 34 [unused-type-declaration]: unused type "t". Line 3, characters 48-53: 3 | type t = { a: int [@warning "-unused-field"]; b:int } ^^^^^ -Warning 69 [unused-field]: unused record field b. +Warning 69 [unused-field]: unused record field "b". module Unused_field_disable_one_warning : sig end |}] @@ -538,7 +538,7 @@ let u (type unused) = () Line 1, characters 12-18: 1 | let u (type unused) = () ^^^^^^ -Warning 34 [unused-type-declaration]: unused type unused. +Warning 34 [unused-type-declaration]: unused type "unused". val u : unit = () |}] @@ -548,7 +548,7 @@ let u = fun (type unused) -> () Line 1, characters 18-24: 1 | let u = fun (type unused) -> () ^^^^^^ -Warning 34 [unused-type-declaration]: unused type unused. +Warning 34 [unused-type-declaration]: unused type "unused". val u : unit = () |}] @@ -558,7 +558,7 @@ let u : type unused. unit = () Line 1, characters 13-19: 1 | let u : type unused. unit = () ^^^^^^ -Warning 34 [unused-type-declaration]: unused type unused. +Warning 34 [unused-type-declaration]: unused type "unused". val u : unit = () |}] @@ -568,7 +568,7 @@ let f (type unused) x = x Line 1, characters 12-18: 1 | let f (type unused) x = x ^^^^^^ -Warning 34 [unused-type-declaration]: unused type unused. +Warning 34 [unused-type-declaration]: unused type "unused". val f : 'a -> 'a = |}] @@ -578,7 +578,7 @@ let f = fun (type unused) x -> x Line 1, characters 18-24: 1 | let f = fun (type unused) x -> x ^^^^^^ -Warning 34 [unused-type-declaration]: unused type unused. +Warning 34 [unused-type-declaration]: unused type "unused". val f : 'a -> 'a = |}] @@ -588,7 +588,7 @@ let f = fun (type unused) x -> x Line 1, characters 18-24: 1 | let f = fun (type unused) x -> x ^^^^^^ -Warning 34 [unused-type-declaration]: unused type unused. +Warning 34 [unused-type-declaration]: unused type "unused". val f : 'a -> 'a = |}] @@ -598,7 +598,7 @@ let f (type used unused) (x : used) = x Line 1, characters 17-23: 1 | let f (type used unused) (x : used) = x ^^^^^^ -Warning 34 [unused-type-declaration]: unused type unused. +Warning 34 [unused-type-declaration]: unused type "unused". val f : 'used -> 'used = |}] @@ -609,7 +609,7 @@ let f = fun (type used unused) (x : used) -> x Line 1, characters 23-29: 1 | let f = fun (type used unused) (x : used) -> x ^^^^^^ -Warning 34 [unused-type-declaration]: unused type unused. +Warning 34 [unused-type-declaration]: unused type "unused". val f : 'used -> 'used = |}] @@ -620,7 +620,7 @@ let f : type used unused. used -> used = fun x -> x Line 1, characters 18-24: 1 | let f : type used unused. used -> used = fun x -> x ^^^^^^ -Warning 34 [unused-type-declaration]: unused type unused. +Warning 34 [unused-type-declaration]: unused type "unused". val f : 'used -> 'used = |}] @@ -630,12 +630,12 @@ let f (type unused1 unused2) x = x Line 1, characters 12-19: 1 | let f (type unused1 unused2) x = x ^^^^^^^ -Warning 34 [unused-type-declaration]: unused type unused1. +Warning 34 [unused-type-declaration]: unused type "unused1". Line 1, characters 20-27: 1 | let f (type unused1 unused2) x = x ^^^^^^^ -Warning 34 [unused-type-declaration]: unused type unused2. +Warning 34 [unused-type-declaration]: unused type "unused2". val f : 'a -> 'a = |}] @@ -646,12 +646,12 @@ let f = fun (type unused1 unused2) x -> x Line 1, characters 18-25: 1 | let f = fun (type unused1 unused2) x -> x ^^^^^^^ -Warning 34 [unused-type-declaration]: unused type unused1. +Warning 34 [unused-type-declaration]: unused type "unused1". Line 1, characters 26-33: 1 | let f = fun (type unused1 unused2) x -> x ^^^^^^^ -Warning 34 [unused-type-declaration]: unused type unused2. +Warning 34 [unused-type-declaration]: unused type "unused2". val f : 'a -> 'a = |}] @@ -662,12 +662,36 @@ let f : type unused1 unused2. 'a -> 'a = fun x -> x Line 1, characters 13-20: 1 | let f : type unused1 unused2. 'a -> 'a = fun x -> x ^^^^^^^ -Warning 34 [unused-type-declaration]: unused type unused1. +Warning 34 [unused-type-declaration]: unused type "unused1". Line 1, characters 21-28: 1 | let f : type unused1 unused2. 'a -> 'a = fun x -> x ^^^^^^^ -Warning 34 [unused-type-declaration]: unused type unused2. +Warning 34 [unused-type-declaration]: unused type "unused2". val f : 'a -> 'a = |}] + +let f (x1 : int as 'unused1) (x2 : int as 'unused2) + (x3 : int as 'used1) (x4 : 'used1) (x5 : 'used2) = (x1, x2, x3, x4, x5) + +[%%expect{| +Line 1, characters 19-27: +1 | let f (x1 : int as 'unused1) (x2 : int as 'unused2) + ^^^^^^^^ +Warning 34 [unused-type-declaration]: unused type alias "'unused1". + +Line 1, characters 42-50: +1 | let f (x1 : int as 'unused1) (x2 : int as 'unused2) + ^^^^^^^^ +Warning 34 [unused-type-declaration]: unused type alias "'unused2". + +val f : int -> int -> int -> int -> 'used2 -> int * int * int * int * 'used2 = + +|}] + +type 'a t = [> `A] as 'a + +[%%expect{| +type 'a t = 'a constraint 'a = [> `A ] +|}] diff --git a/testsuite/tests/unwind/check-linker-version.sh b/testsuite/tests/unwind/check-linker-version.sh index fabd0ed9..1966885d 100755 --- a/testsuite/tests/unwind/check-linker-version.sh +++ b/testsuite/tests/unwind/check-linker-version.sh @@ -1,13 +1,14 @@ -#!/bin/sh -exec > ${ocamltest_response} 2>&1 -LDFULL="`ld -v 2>&1`" -LD="`echo $LDFULL | grep -o \"ld64-[0-9]*\"`" -LDVER="`echo $LD | sed \"s/ld64-//\"`" -if [[ -z "$LD" ]]; then - echo "unknown linker: pattern ld64-[0-9]* not found in 'ld -v' output"; - test_result=${TEST_SKIP}; -elif [[ $LDVER -lt 224 ]]; then - echo "ld version is $LDVER, only 224 or above are supported"; +#!/usr/bin/env bash + +LDVER=$(ld -v 2>&1 | egrep -o "PROJECT:ld(64)?-[0-9]*" | sed -E "s/PROJECT:ld(64)?-//") + +# Extract the first 3 parts of an LD version number +version () { + echo "$@" | awk -F. '{ printf("%d%03d%03d\n", $1,$2,$3); }' +} + +if [ $(version "$LDVER") -lt $(version "224.0.0.0") ]; then + echo "ld version is $LDVER, only 224 or above are supported."; test_result=${TEST_SKIP}; else test_result=${TEST_PASS}; diff --git a/testsuite/tests/unwind/stack_walker.c b/testsuite/tests/unwind/stack_walker.c index acf36eb8..ae759aee 100644 --- a/testsuite/tests/unwind/stack_walker.c +++ b/testsuite/tests/unwind/stack_walker.c @@ -38,10 +38,10 @@ value ml_perform_stack_walk(value unused) { if (strlen(procname) > 4 && !memcmp(procname, "caml", 4) && 'A' <= procname[4] && procname[4] <= 'Z' && - strchr(procname+4, '.')) { + strchr(procname+4, '$')) { /* mangled OCaml name, unmangle and print */ const char* mangled = procname + 4; - const char* mod_end = strchr(mangled, '.'); + const char* mod_end = strchr(mangled, '$'); const char* id_begin = strchr(mod_end + 1, '_'); if (!id_begin) id_begin = mangled + strlen(mangled); printf("%.*s.%.*s\n", diff --git a/testsuite/tests/warnings/deprecated_module.compilers.reference b/testsuite/tests/warnings/deprecated_module.compilers.reference index 4546d311..f0db09fe 100644 --- a/testsuite/tests/warnings/deprecated_module.compilers.reference +++ b/testsuite/tests/warnings/deprecated_module.compilers.reference @@ -1,6 +1,6 @@ -File "deprecated_module.ml", line 16, characters 8-11: +File "deprecated_module.ml", line 16, characters 8-9: 16 | let _ = M.x - ^^^ + ^ Alert deprecated: module M File "deprecated_module.ml", line 17, characters 8-9: diff --git a/testsuite/tests/warnings/deprecated_module_use.compilers.reference b/testsuite/tests/warnings/deprecated_module_use.compilers.reference index 8aa6a213..c7f0f304 100644 --- a/testsuite/tests/warnings/deprecated_module_use.compilers.reference +++ b/testsuite/tests/warnings/deprecated_module_use.compilers.reference @@ -7,9 +7,9 @@ Alert deprecated: module Deprecated_module Please use something else! -File "deprecated_module_use.ml", line 20, characters 9-12: +File "deprecated_module_use.ml", line 20, characters 9-10: 20 | type s = M.t - ^^^ + ^ Alert deprecated: module Deprecated_module.M File "deprecated_module_use.ml", line 20, characters 9-12: diff --git a/testsuite/tests/warnings/w01.compilers.reference b/testsuite/tests/warnings/w01.compilers.reference index bbaf1b65..20eafa00 100644 --- a/testsuite/tests/warnings/w01.compilers.reference +++ b/testsuite/tests/warnings/w01.compilers.reference @@ -7,14 +7,13 @@ File "w01.ml", line 20, characters 0-3: 20 | f 1; f 1;; ^^^ Warning 5 [ignored-partial-application]: this function application is partial, -maybe some arguments are missing. + maybe some arguments are missing. File "w01.ml", line 30, characters 4-5: 30 | let 1 = 1;; ^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. -Here is an example of a case that is not matched: -0 + Here is an example of a case that is not matched: 0 File "w01.ml", line 35, characters 0-1: 35 | 1; 1;; diff --git a/testsuite/tests/warnings/w03.compilers.reference b/testsuite/tests/warnings/w03.compilers.reference index 14ab9740..88f8df13 100644 --- a/testsuite/tests/warnings/w03.compilers.reference +++ b/testsuite/tests/warnings/w03.compilers.reference @@ -6,4 +6,4 @@ Alert deprecated: A File "w03.ml", line 17, characters 15-25: 17 | exception B [@@deprecated] ^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "deprecated" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the deprecated attribute cannot appear in this context diff --git a/testsuite/tests/warnings/w04.compilers.reference b/testsuite/tests/warnings/w04.compilers.reference index 1c6cc55c..ec3613b8 100644 --- a/testsuite/tests/warnings/w04.compilers.reference +++ b/testsuite/tests/warnings/w04.compilers.reference @@ -3,4 +3,4 @@ File "w04.ml", lines 21-23, characters 10-8: 22 | | A -> 0 23 | | _ -> 1 Warning 4 [fragile-match]: this pattern-matching is fragile. -It will remain exhaustive when constructors are added to type t. + It will remain exhaustive when constructors are added to type t. diff --git a/testsuite/tests/warnings/w04_failure.compilers.reference b/testsuite/tests/warnings/w04_failure.compilers.reference index a4b1640c..91039e20 100644 --- a/testsuite/tests/warnings/w04_failure.compilers.reference +++ b/testsuite/tests/warnings/w04_failure.compilers.reference @@ -4,7 +4,7 @@ File "w04_failure.ml", lines 20-23, characters 2-17: 22 | | _, XY, X -> () 23 | | _, _, _ -> () Warning 4 [fragile-match]: this pattern-matching is fragile. -It will remain exhaustive when constructors are added to type repr. + It will remain exhaustive when constructors are added to type repr. File "w04_failure.ml", lines 20-23, characters 2-17: 20 | ..match r1, r2, t with @@ -12,7 +12,7 @@ File "w04_failure.ml", lines 20-23, characters 2-17: 22 | | _, XY, X -> () 23 | | _, _, _ -> () Warning 4 [fragile-match]: this pattern-matching is fragile. -It will remain exhaustive when constructors are added to type ab. + It will remain exhaustive when constructors are added to type ab. File "w04_failure.ml", lines 20-23, characters 2-17: 20 | ..match r1, r2, t with @@ -20,4 +20,4 @@ File "w04_failure.ml", lines 20-23, characters 2-17: 22 | | _, XY, X -> () 23 | | _, _, _ -> () Warning 4 [fragile-match]: this pattern-matching is fragile. -It will remain exhaustive when constructors are added to type xy. + It will remain exhaustive when constructors are added to type xy. diff --git a/testsuite/tests/warnings/w06.compilers.reference b/testsuite/tests/warnings/w06.compilers.reference index c7dc45bd..b9393007 100644 --- a/testsuite/tests/warnings/w06.compilers.reference +++ b/testsuite/tests/warnings/w06.compilers.reference @@ -1,9 +1,11 @@ File "w06.ml", line 16, characters 9-12: 16 | let () = foo 2 ^^^ -Warning 6 [labels-omitted]: label bar was omitted in the application of this function. +Warning 6 [labels-omitted]: label bar was omitted in the application of this + function. File "w06.ml", line 17, characters 9-12: 17 | let () = bar 4 2 ^^^ -Warning 6 [labels-omitted]: labels foo, baz were omitted in the application of this function. +Warning 6 [labels-omitted]: labels foo, baz were omitted in the application + of this function. diff --git a/testsuite/tests/warnings/w26_alias.ml b/testsuite/tests/warnings/w26_alias.ml index 0cc291b8..2e5c7ad2 100644 --- a/testsuite/tests/warnings/w26_alias.ml +++ b/testsuite/tests/warnings/w26_alias.ml @@ -13,7 +13,7 @@ type t = { x : int; y : int; } Line 6, characters 21-22: 6 | let sum ({ x; y } as t) = x + y ^ -Warning 26 [unused-var]: unused variable t. +Warning 26 [unused-var]: unused variable "t". val sum : t -> int = |}] diff --git a/testsuite/tests/warnings/w32.ml b/testsuite/tests/warnings/w32.ml index cbb1630e..1b196faa 100644 --- a/testsuite/tests/warnings/w32.ml +++ b/testsuite/tests/warnings/w32.ml @@ -70,6 +70,26 @@ module type S = sig module F: sig val x : int end -> sig end end +(* from ocaml/ocaml#13955 no warning 32 should be triggered for [test] *) + +[@@@warning "-60"] +module I : sig + module F (_ : sig val test : int end) : sig end +end = struct + module F (X: sig val test : int end) = struct let _ = X.test end +end + +(* same for the recursive version *) + +module rec X: sig + module F(_:sig val x:int end): sig end +end = struct + module F(X:sig val x:int end) = struct let _ = X.x end +end +and Y: sig end = struct end + +[@@@warning "+60"] + (* TEST flags = "-w +A"; setup-ocamlc.byte-build-env; diff --git a/testsuite/tests/warnings/w44.ml b/testsuite/tests/warnings/w44.ml index 44eccf54..629c6934 100644 --- a/testsuite/tests/warnings/w44.ml +++ b/testsuite/tests/warnings/w44.ml @@ -14,7 +14,8 @@ let g f = f (); M.(f ());; Line 1, characters 16-17: 1 | let g f = f (); M.(f ());; ^ -Warning 44 [open-shadow-identifier]: this open statement shadows the value identifier f (which is later used) +Warning 44 [open-shadow-identifier]: this open statement shadows the + value identifier "f" (which is later used) val g : (unit -> 'a) -> int = |}] @@ -49,8 +50,8 @@ end;; Line 3, characters 10-11: 3 | val y = x + 1 ^ -Error: The instance variable "x" - cannot be accessed from the definition of another instance variable +Error: The instance variable "x" cannot be accessed from the definition of + another instance variable |}] module M = struct let x = 0 end diff --git a/testsuite/tests/warnings/w45.compilers.reference b/testsuite/tests/warnings/w45.compilers.reference index 5cb2b426..8ee51032 100644 --- a/testsuite/tests/warnings/w45.compilers.reference +++ b/testsuite/tests/warnings/w45.compilers.reference @@ -1,13 +1,14 @@ File "w45.ml", line 24, characters 2-9: 24 | open T2 (* shadow X, which is later used; but not A, see #6762 *) ^^^^^^^ -Warning 45 [open-shadow-label-constructor]: this open statement shadows the constructor X (which is later used) +Warning 45 [open-shadow-label-constructor]: this open statement shadows the + constructor X (which is later used) File "w45.ml", line 26, characters 14-15: 26 | let _ = (A, X) (* X belongs to several types *) ^ -Warning 41 [ambiguous-name]: X belongs to several types: T2.s T1.s -The first one was selected. Please disambiguate if this is wrong. +Warning 41 [ambiguous-name]: X belongs to several types: T2.s T1.s. + The first one was selected. Please disambiguate if this is wrong. File "w45.ml", line 23, characters 2-9: 23 | open T1 (* unused open *) diff --git a/testsuite/tests/warnings/w47_inline.compilers.reference b/testsuite/tests/warnings/w47_inline.compilers.reference index 46e15a9d..d954cdee 100644 --- a/testsuite/tests/warnings/w47_inline.compilers.reference +++ b/testsuite/tests/warnings/w47_inline.compilers.reference @@ -11,40 +11,41 @@ Warning 26 [unused-var]: unused variable f3. File "w47_inline.ml", line 15, characters 23-29: 15 | let d = (fun x -> x) [@inline malformed attribute] (* rejected *) ^^^^^^ -Warning 47 [attribute-payload]: illegal payload for attribute 'inline'. -It must be either 'never', 'always', 'hint' or empty +Warning 47 [attribute-payload]: illegal payload for attribute inline. + It must be either 'never', 'always', 'hint' or empty File "w47_inline.ml", line 16, characters 23-29: 16 | let e = (fun x -> x) [@inline malformed_attribute] (* rejected *) ^^^^^^ -Warning 47 [attribute-payload]: illegal payload for attribute 'inline'. -It must be either 'never', 'always', 'hint' or empty +Warning 47 [attribute-payload]: illegal payload for attribute inline. + It must be either 'never', 'always', 'hint' or empty File "w47_inline.ml", line 17, characters 23-29: 17 | let f = (fun x -> x) [@inline : malformed_attribute] (* rejected *) ^^^^^^ -Warning 47 [attribute-payload]: illegal payload for attribute 'inline'. -It must be either 'never', 'always', 'hint' or empty +Warning 47 [attribute-payload]: illegal payload for attribute inline. + It must be either 'never', 'always', 'hint' or empty File "w47_inline.ml", line 18, characters 23-29: 18 | let g = (fun x -> x) [@inline ? malformed_attribute] (* rejected *) ^^^^^^ -Warning 47 [attribute-payload]: illegal payload for attribute 'inline'. -It must be either 'never', 'always', 'hint' or empty +Warning 47 [attribute-payload]: illegal payload for attribute inline. + It must be either 'never', 'always', 'hint' or empty File "w47_inline.ml", line 23, characters 15-22: 23 | let k x = (a [@inlined malformed]) x (* rejected *) ^^^^^^^ -Warning 47 [attribute-payload]: illegal payload for attribute 'inlined'. -It must be either 'never', 'always', 'hint' or empty +Warning 47 [attribute-payload]: illegal payload for attribute inlined. + It must be either 'never', 'always', 'hint' or empty File "w47_inline.ml", line 31, characters 7-12: 31 | let[@local malformed] f3 x = x (* bad payload *) in ^^^^^ -Warning 47 [attribute-payload]: illegal payload for attribute 'local'. -It must be either 'never', 'always', 'maybe' or empty +Warning 47 [attribute-payload]: illegal payload for attribute local. + It must be either 'never', 'always', 'maybe' or empty File "w47_inline.ml", line 32, characters 17-26: 32 | let[@local] f4 x = 2 * x (* not local *) in ^^^^^^^^^ -Warning 55 [inlining-impossible]: Cannot inline: This function cannot be compiled into a static continuation +Warning 55 [inlining-impossible]: Cannot inline: + This function cannot be compiled into a static continuation diff --git a/testsuite/tests/warnings/w47_ppwarning.compilers.reference b/testsuite/tests/warnings/w47_ppwarning.compilers.reference index 9b6f417d..a76acd30 100644 --- a/testsuite/tests/warnings/w47_ppwarning.compilers.reference +++ b/testsuite/tests/warnings/w47_ppwarning.compilers.reference @@ -1,20 +1,20 @@ File "w47_ppwarning.ml", line 10, characters 12-25: 10 | let x1 = 42 [@@ppwarning] ^^^^^^^^^^^^^ -Warning 47 [attribute-payload]: illegal payload for attribute 'ppwarning'. -A single string literal is expected +Warning 47 [attribute-payload]: illegal payload for attribute ppwarning. + A single string literal is expected File "w47_ppwarning.ml", line 13, characters 12-37: 13 | let x2 = 42 [@@ppwarning "foo" "bar"] ^^^^^^^^^^^^^^^^^^^^^^^^^ -Warning 47 [attribute-payload]: illegal payload for attribute 'ppwarning'. -A single string literal is expected +Warning 47 [attribute-payload]: illegal payload for attribute ppwarning. + A single string literal is expected File "w47_ppwarning.ml", line 16, characters 12-28: 16 | let x3 = 42 [@@ppwarning 84] ^^^^^^^^^^^^^^^^ -Warning 47 [attribute-payload]: illegal payload for attribute 'ppwarning'. -A single string literal is expected +Warning 47 [attribute-payload]: illegal payload for attribute ppwarning. + A single string literal is expected File "w47_ppwarning.ml", line 19, characters 25-30: 19 | let x4 = 42 [@@ppwarning "foo"] diff --git a/testsuite/tests/warnings/w51.ml b/testsuite/tests/warnings/w51.ml index a471ccff..8183cc6d 100644 --- a/testsuite/tests/warnings/w51.ml +++ b/testsuite/tests/warnings/w51.ml @@ -73,8 +73,8 @@ let rec test x = (test[@tailcall foobar]) x;; Line 1, characters 24-32: 1 | let rec test x = (test[@tailcall foobar]) x;; ^^^^^^^^ -Warning 47 [attribute-payload]: illegal payload for attribute 'tailcall'. -Only an optional boolean literal is supported. +Warning 47 [attribute-payload]: illegal payload for attribute "tailcall". + Only an optional boolean literal is supported. val test : 'a -> 'b = |}] diff --git a/testsuite/tests/warnings/w52.ml b/testsuite/tests/warnings/w52.ml index c444c1a4..9dfb3714 100644 --- a/testsuite/tests/warnings/w52.ml +++ b/testsuite/tests/warnings/w52.ml @@ -8,9 +8,10 @@ let () = try () with Invalid_argument "Any" -> ();; Line 1, characters 38-43: 1 | let () = try () with Invalid_argument "Any" -> ();; ^^^^^ -Warning 52 [fragile-literal-pattern]: Code should not depend on the actual values of -this constructor's arguments. They are only for information -and may change in future versions. (see manual section 13.5.3) +Warning 52 [fragile-literal-pattern]: Code should not depend on the actual + values of this constructor's arguments. + They are only for information and may change in future versions. + (see manual section 13.5.3) |}];; let () = try () with Match_failure ("Any",_,_) -> ();; @@ -18,9 +19,10 @@ let () = try () with Match_failure ("Any",_,_) -> ();; Line 1, characters 35-46: 1 | let () = try () with Match_failure ("Any",_,_) -> ();; ^^^^^^^^^^^ -Warning 52 [fragile-literal-pattern]: Code should not depend on the actual values of -this constructor's arguments. They are only for information -and may change in future versions. (see manual section 13.5.3) +Warning 52 [fragile-literal-pattern]: Code should not depend on the actual + values of this constructor's arguments. + They are only for information and may change in future versions. + (see manual section 13.5.3) |}];; let () = try () with Match_failure (_,0,_) -> ();; @@ -28,9 +30,10 @@ let () = try () with Match_failure (_,0,_) -> ();; Line 1, characters 35-42: 1 | let () = try () with Match_failure (_,0,_) -> ();; ^^^^^^^ -Warning 52 [fragile-literal-pattern]: Code should not depend on the actual values of -this constructor's arguments. They are only for information -and may change in future versions. (see manual section 13.5.3) +Warning 52 [fragile-literal-pattern]: Code should not depend on the actual + values of this constructor's arguments. + They are only for information and may change in future versions. + (see manual section 13.5.3) |}];; type t = @@ -53,9 +56,10 @@ let f = function Line 2, characters 7-17: 2 | | Warn "anything" -> () ^^^^^^^^^^ -Warning 52 [fragile-literal-pattern]: Code should not depend on the actual values of -this constructor's arguments. They are only for information -and may change in future versions. (see manual section 13.5.3) +Warning 52 [fragile-literal-pattern]: Code should not depend on the actual + values of this constructor's arguments. + They are only for information and may change in future versions. + (see manual section 13.5.3) val f : t -> unit = |}];; @@ -67,9 +71,10 @@ let g = function Line 2, characters 8-10: 2 | | Warn' 0n -> () ^^ -Warning 52 [fragile-literal-pattern]: Code should not depend on the actual values of -this constructor's arguments. They are only for information -and may change in future versions. (see manual section 13.5.3) +Warning 52 [fragile-literal-pattern]: Code should not depend on the actual + values of this constructor's arguments. + They are only for information and may change in future versions. + (see manual section 13.5.3) val g : t -> unit = |}];; @@ -95,9 +100,10 @@ let j = function Line 2, characters 7-34: 2 | | Deep (_ :: _ :: ("deep",_) :: _) -> () ^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Warning 52 [fragile-literal-pattern]: Code should not depend on the actual values of -this constructor's arguments. They are only for information -and may change in future versions. (see manual section 13.5.3) +Warning 52 [fragile-literal-pattern]: Code should not depend on the actual + values of this constructor's arguments. + They are only for information and may change in future versions. + (see manual section 13.5.3) val j : t -> unit = |}];; diff --git a/testsuite/tests/warnings/w53.compilers.reference b/testsuite/tests/warnings/w53.compilers.reference index ac91465c..019bd76c 100644 --- a/testsuite/tests/warnings/w53.compilers.reference +++ b/testsuite/tests/warnings/w53.compilers.reference @@ -1,909 +1,909 @@ File "w53.ml", line 12, characters 16-21: 12 | val x : int [@alert foo "foo"] (* rejected *) ^^^^^ -Warning 53 [misplaced-attribute]: the "alert" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the alert attribute cannot appear in this context File "w53.ml", line 18, characters 6-11: 18 | [@@@alert foo "foo"] (* rejected *) ^^^^^ -Warning 53 [misplaced-attribute]: the "alert" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the alert attribute cannot appear in this context File "w53.ml", line 22, characters 14-19: 22 | let x = 5 [@alert foo "foo"] (* rejected *) ^^^^^ -Warning 53 [misplaced-attribute]: the "alert" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the alert attribute cannot appear in this context File "w53.ml", line 24, characters 16-21: 24 | let y = 10 [@@alert foo "foo"] (* rejected *) ^^^^^ -Warning 53 [misplaced-attribute]: the "alert" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the alert attribute cannot appear in this context File "w53.ml", line 26, characters 6-11: 26 | [@@@alert foo "foo"] (* rejected *) ^^^^^ -Warning 53 [misplaced-attribute]: the "alert" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the alert attribute cannot appear in this context File "w53.ml", line 34, characters 24-29: 34 | type t1 = { x : int [@boxed] } (* rejected *) ^^^^^ -Warning 53 [misplaced-attribute]: the "boxed" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the boxed attribute cannot appear in this context File "w53.ml", line 36, characters 16-21: 36 | val x : int [@boxed] (* rejected *) ^^^^^ -Warning 53 [misplaced-attribute]: the "boxed" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the boxed attribute cannot appear in this context File "w53.ml", line 40, characters 17-22: 40 | val y : int [@@boxed] (* rejected *) ^^^^^ -Warning 53 [misplaced-attribute]: the "boxed" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the boxed attribute cannot appear in this context File "w53.ml", line 42, characters 6-11: 42 | [@@@boxed] (* rejected *) ^^^^^ -Warning 53 [misplaced-attribute]: the "boxed" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the boxed attribute cannot appear in this context File "w53.ml", line 46, characters 16-21: 46 | let x = (42 [@boxed], 84) (* rejected *) ^^^^^ -Warning 53 [misplaced-attribute]: the "boxed" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the boxed attribute cannot appear in this context File "w53.ml", line 48, characters 16-21: 48 | let y = 10 [@@boxed] (* rejected *) ^^^^^ -Warning 53 [misplaced-attribute]: the "boxed" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the boxed attribute cannot appear in this context File "w53.ml", line 50, characters 6-11: 50 | [@@@boxed] (* rejected *) ^^^^^ -Warning 53 [misplaced-attribute]: the "boxed" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the boxed attribute cannot appear in this context File "w53.ml", line 57, characters 16-26: 57 | val x : int [@deprecated] (* rejected *) ^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "deprecated" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the deprecated attribute cannot appear in this context File "w53.ml", line 63, characters 6-16: 63 | [@@@deprecated] (* rejected *) ^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "deprecated" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the deprecated attribute cannot appear in this context File "w53.ml", line 67, characters 14-24: 67 | let x = 5 [@deprecated] (* rejected *) ^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "deprecated" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the deprecated attribute cannot appear in this context File "w53.ml", line 69, characters 16-26: 69 | let y = 10 [@@deprecated] (* rejected *) ^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "deprecated" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the deprecated attribute cannot appear in this context File "w53.ml", line 71, characters 6-16: 71 | [@@@deprecated] (* rejected *) ^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "deprecated" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the deprecated attribute cannot appear in this context File "w53.ml", line 76, characters 19-37: 76 | type t1 = Foo1 [@deprecated_mutable] (* rejected *) ^^^^^^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "deprecated_mutable" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the deprecated_mutable attribute cannot appear in this context File "w53.ml", line 78, characters 16-34: 78 | val x : int [@deprecated_mutable] (* rejected *) ^^^^^^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "deprecated_mutable" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the deprecated_mutable attribute cannot appear in this context File "w53.ml", line 80, characters 21-39: 80 | type 'a t2 = 'a [@@deprecated_mutable] (* rejected *) ^^^^^^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "deprecated_mutable" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the deprecated_mutable attribute cannot appear in this context File "w53.ml", line 84, characters 24-42: 84 | type t4 = { x : int [@deprecated_mutable] } (* rejected *) ^^^^^^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "deprecated_mutable" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the deprecated_mutable attribute cannot appear in this context File "w53.ml", line 86, characters 17-35: 86 | val y : int [@@deprecated_mutable] (* rejected *) ^^^^^^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "deprecated_mutable" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the deprecated_mutable attribute cannot appear in this context File "w53.ml", line 88, characters 6-24: 88 | [@@@deprecated_mutable] (* rejected *) ^^^^^^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "deprecated_mutable" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the deprecated_mutable attribute cannot appear in this context File "w53.ml", line 92, characters 14-32: 92 | let x = 5 [@deprecated_mutable] (* rejected *) ^^^^^^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "deprecated_mutable" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the deprecated_mutable attribute cannot appear in this context File "w53.ml", line 94, characters 16-34: 94 | let y = 10 [@@deprecated_mutable] (* rejected *) ^^^^^^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "deprecated_mutable" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the deprecated_mutable attribute cannot appear in this context File "w53.ml", line 96, characters 6-24: 96 | [@@@deprecated_mutable] (* rejected *) ^^^^^^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "deprecated_mutable" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the deprecated_mutable attribute cannot appear in this context File "w53.ml", line 101, characters 32-46: 101 | type t1 = Foo1 of int * int [@explicit_arity] (* rejected *) ^^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "explicit_arity" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the explicit_arity attribute cannot appear in this context File "w53.ml", line 103, characters 16-30: 103 | val x : int [@explicit_arity] (* rejected *) ^^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "explicit_arity" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the explicit_arity attribute cannot appear in this context File "w53.ml", line 105, characters 20-34: 105 | type 'a t2 = 'a [@explicit_arity] (* rejected *) ^^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "explicit_arity" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the explicit_arity attribute cannot appear in this context File "w53.ml", line 107, characters 17-31: 107 | val y : int [@@explicit_arity] (* rejected *) ^^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "explicit_arity" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the explicit_arity attribute cannot appear in this context File "w53.ml", line 109, characters 6-20: 109 | [@@@explicit_arity] (* rejected *) ^^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "explicit_arity" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the explicit_arity attribute cannot appear in this context File "w53.ml", line 113, characters 14-28: 113 | let x = 5 [@explicit_arity] (* rejected *) ^^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "explicit_arity" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the explicit_arity attribute cannot appear in this context File "w53.ml", line 115, characters 16-30: 115 | let y = 10 [@@explicit_arity] (* rejected *) ^^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "explicit_arity" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the explicit_arity attribute cannot appear in this context File "w53.ml", line 117, characters 6-20: 117 | [@@@explicit_arity] (* rejected *) ^^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "explicit_arity" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the explicit_arity attribute cannot appear in this context File "w53.ml", line 122, characters 18-27: 122 | type t1 = int [@immediate] (* rejected *) ^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "immediate" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the immediate attribute cannot appear in this context File "w53.ml", line 126, characters 16-25: 126 | val x : int [@immediate] (* rejected *) ^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "immediate" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the immediate attribute cannot appear in this context File "w53.ml", line 127, characters 17-26: 127 | val x : int [@@immediate] (* rejected *) ^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "immediate" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the immediate attribute cannot appear in this context File "w53.ml", line 129, characters 6-15: 129 | [@@@immediate] (* rejected *) ^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "immediate" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the immediate attribute cannot appear in this context File "w53.ml", line 130, characters 6-17: 130 | [@@@immediate64] (* rejected *) ^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "immediate64" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the immediate64 attribute cannot appear in this context File "w53.ml", line 134, characters 15-24: 134 | let x = (4 [@immediate], 42 [@immediate64]) (* rejected *) ^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "immediate" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the immediate attribute cannot appear in this context File "w53.ml", line 134, characters 32-43: 134 | let x = (4 [@immediate], 42 [@immediate64]) (* rejected *) ^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "immediate64" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the immediate64 attribute cannot appear in this context File "w53.ml", line 135, characters 21-30: 135 | let y = (4, 42) [@@immediate] (* rejected *) ^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "immediate" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the immediate attribute cannot appear in this context File "w53.ml", line 136, characters 21-32: 136 | let z = (4, 42) [@@immediate64] (* rejected *) ^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "immediate64" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the immediate64 attribute cannot appear in this context File "w53.ml", line 138, characters 18-27: 138 | type t1 = int [@immediate] (* rejected *) ^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "immediate" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the immediate attribute cannot appear in this context File "w53.ml", line 142, characters 6-15: 142 | [@@@immediate] (* rejected *) ^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "immediate" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the immediate attribute cannot appear in this context File "w53.ml", line 143, characters 6-17: 143 | [@@@immediate64] (* rejected *) ^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "immediate64" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the immediate64 attribute cannot appear in this context File "w53.ml", line 148, characters 25-31: 148 | type t1 = int -> int [@inline] (* rejected *) ^^^^^^ -Warning 53 [misplaced-attribute]: the "inline" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the inline attribute cannot appear in this context File "w53.ml", line 149, characters 26-32: 149 | type t2 = int -> int [@@inline] (* rejected *) ^^^^^^ -Warning 53 [misplaced-attribute]: the "inline" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the inline attribute cannot appear in this context File "w53.ml", line 150, characters 25-32: 150 | type t3 = int -> int [@inlined] (* rejected *) ^^^^^^^ -Warning 53 [misplaced-attribute]: the "inlined" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the inlined attribute cannot appear in this context File "w53.ml", line 151, characters 26-33: 151 | type t4 = int -> int [@@inlined] (* rejected *) ^^^^^^^ -Warning 53 [misplaced-attribute]: the "inlined" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the inlined attribute cannot appear in this context File "w53.ml", line 153, characters 24-30: 153 | val f1 : int -> int [@inline] (* rejected *) ^^^^^^ -Warning 53 [misplaced-attribute]: the "inline" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the inline attribute cannot appear in this context File "w53.ml", line 154, characters 25-31: 154 | val f2 : int -> int [@@inline] (* rejected *) ^^^^^^ -Warning 53 [misplaced-attribute]: the "inline" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the inline attribute cannot appear in this context File "w53.ml", line 155, characters 24-31: 155 | val f3 : int -> int [@inlined] (* rejected *) ^^^^^^^ -Warning 53 [misplaced-attribute]: the "inlined" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the inlined attribute cannot appear in this context File "w53.ml", line 156, characters 25-32: 156 | val f4 : int -> int [@@inlined] (* rejected *) ^^^^^^^ -Warning 53 [misplaced-attribute]: the "inlined" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the inlined attribute cannot appear in this context File "w53.ml", line 158, characters 53-59: 158 | module type F = functor (X : sig end) -> sig end [@inline] (* rejected *) ^^^^^^ -Warning 53 [misplaced-attribute]: the "inline" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the inline attribute cannot appear in this context File "w53.ml", line 159, characters 54-60: 159 | module type G = functor (X : sig end) -> sig end [@@inline] (* rejected *) ^^^^^^ -Warning 53 [misplaced-attribute]: the "inline" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the inline attribute cannot appear in this context File "w53.ml", line 161, characters 6-12: 161 | [@@@inline] (* rejected *) ^^^^^^ -Warning 53 [misplaced-attribute]: the "inline" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the inline attribute cannot appear in this context File "w53.ml", line 162, characters 6-13: 162 | [@@@inlined] (* rejected *) ^^^^^^^ -Warning 53 [misplaced-attribute]: the "inlined" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the inlined attribute cannot appear in this context File "w53.ml", line 166, characters 16-22: 166 | let h x = x [@inline] (* rejected *) ^^^^^^ -Warning 53 [misplaced-attribute]: the "inline" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the inline attribute cannot appear in this context File "w53.ml", line 167, characters 16-28: 167 | let h x = x [@ocaml.inline] (* rejected *) ^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "ocaml.inline" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the ocaml.inline attribute cannot appear in this context File "w53.ml", line 169, characters 16-23: 169 | let i x = x [@inlined] (* rejected *) ^^^^^^^ -Warning 53 [misplaced-attribute]: the "inlined" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the inlined attribute cannot appear in this context File "w53.ml", line 170, characters 16-29: 170 | let j x = x [@ocaml.inlined] (* rejected *) ^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "ocaml.inlined" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the ocaml.inlined attribute cannot appear in this context File "w53.ml", line 173, characters 18-25: 173 | let l x = h x [@inlined] (* rejected *) ^^^^^^^ -Warning 53 [misplaced-attribute]: the "inlined" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the inlined attribute cannot appear in this context File "w53.ml", line 181, characters 27-33: 181 | module C = struct end [@@inline] (* rejected *) ^^^^^^ -Warning 53 [misplaced-attribute]: the "inline" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the inline attribute cannot appear in this context File "w53.ml", line 182, characters 28-40: 182 | module C' = struct end [@@ocaml.inline] (* rejected *) ^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "ocaml.inline" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the ocaml.inline attribute cannot appear in this context File "w53.ml", line 183, characters 27-34: 183 | module D = struct end [@@inlined] (* rejected *) ^^^^^^^ -Warning 53 [misplaced-attribute]: the "inlined" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the inlined attribute cannot appear in this context File "w53.ml", line 184, characters 28-41: 184 | module D' = struct end [@@ocaml.inlined] (* rejected *) ^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "ocaml.inlined" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the ocaml.inlined attribute cannot appear in this context File "w53.ml", line 188, characters 18-24: 188 | module G = (A [@inline])(struct end) (* rejected *) ^^^^^^ -Warning 53 [misplaced-attribute]: the "inline" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the inline attribute cannot appear in this context File "w53.ml", line 189, characters 19-31: 189 | module G' = (A [@ocaml.inline])(struct end) (* rejected *) ^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "ocaml.inline" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the ocaml.inline attribute cannot appear in this context File "w53.ml", line 193, characters 24-31: 193 | module I = Set.Make [@inlined] (* rejected *) ^^^^^^^ -Warning 53 [misplaced-attribute]: the "inlined" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the inlined attribute cannot appear in this context File "w53.ml", line 194, characters 25-38: 194 | module I' = Set.Make [@ocaml.inlined] (* rejected *) ^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "ocaml.inlined" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the ocaml.inlined attribute cannot appear in this context File "w53.ml", line 196, characters 25-32: 196 | module J = Set.Make [@@inlined] (* rejected *) ^^^^^^^ -Warning 53 [misplaced-attribute]: the "inlined" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the inlined attribute cannot appear in this context File "w53.ml", line 197, characters 26-39: 197 | module J' = Set.Make [@@ocaml.inlined] (* rejected *) ^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "ocaml.inlined" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the ocaml.inlined attribute cannot appear in this context File "w53.ml", line 202, characters 21-28: 202 | type 'a t1 = 'a [@@noalloc] (* rejected *) ^^^^^^^ -Warning 53 [misplaced-attribute]: the "noalloc" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the noalloc attribute cannot appear in this context File "w53.ml", line 203, characters 19-26: 203 | type s1 = Foo1 [@noalloc] (* rejected *) ^^^^^^^ -Warning 53 [misplaced-attribute]: the "noalloc" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the noalloc attribute cannot appear in this context File "w53.ml", line 204, characters 19-26: 204 | val x : int64 [@@noalloc] (* rejected *) ^^^^^^^ -Warning 53 [misplaced-attribute]: the "noalloc" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the noalloc attribute cannot appear in this context File "w53.ml", line 206, characters 24-31: 206 | external y : (int64 [@noalloc]) -> (int64 [@noalloc]) = "x" (* rejected *) ^^^^^^^ -Warning 53 [misplaced-attribute]: the "noalloc" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the noalloc attribute cannot appear in this context File "w53.ml", line 206, characters 46-53: 206 | external y : (int64 [@noalloc]) -> (int64 [@noalloc]) = "x" (* rejected *) ^^^^^^^ -Warning 53 [misplaced-attribute]: the "noalloc" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the noalloc attribute cannot appear in this context File "w53.ml", line 211, characters 21-28: 211 | type 'a t1 = 'a [@@noalloc] (* rejected *) ^^^^^^^ -Warning 53 [misplaced-attribute]: the "noalloc" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the noalloc attribute cannot appear in this context File "w53.ml", line 212, characters 19-26: 212 | type s1 = Foo1 [@noalloc] (* rejected *) ^^^^^^^ -Warning 53 [misplaced-attribute]: the "noalloc" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the noalloc attribute cannot appear in this context File "w53.ml", line 213, characters 25-32: 213 | let x : int64 = 42L [@@noalloc] (* rejected *) ^^^^^^^ -Warning 53 [misplaced-attribute]: the "noalloc" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the noalloc attribute cannot appear in this context File "w53.ml", line 215, characters 24-31: 215 | external y : (int64 [@noalloc]) -> (int64 [@noalloc]) = "x" (* rejected *) ^^^^^^^ -Warning 53 [misplaced-attribute]: the "noalloc" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the noalloc attribute cannot appear in this context File "w53.ml", line 215, characters 46-53: 215 | external y : (int64 [@noalloc]) -> (int64 [@noalloc]) = "x" (* rejected *) ^^^^^^^ -Warning 53 [misplaced-attribute]: the "noalloc" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the noalloc attribute cannot appear in this context File "w53.ml", line 244, characters 21-29: 244 | type 'a t1 = 'a [@@tailcall] (* rejected *) ^^^^^^^^ -Warning 53 [misplaced-attribute]: the "tailcall" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the tailcall attribute cannot appear in this context File "w53.ml", line 245, characters 19-27: 245 | type s1 = Foo1 [@tailcall] (* rejected *) ^^^^^^^^ -Warning 53 [misplaced-attribute]: the "tailcall" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the tailcall attribute cannot appear in this context File "w53.ml", line 246, characters 16-24: 246 | val x : int [@tailcall] (* rejected *) ^^^^^^^^ -Warning 53 [misplaced-attribute]: the "tailcall" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the tailcall attribute cannot appear in this context File "w53.ml", line 248, characters 35-43: 248 | external z : int -> int = "x" [@@tailcall] (* rejected *) ^^^^^^^^ -Warning 53 [misplaced-attribute]: the "tailcall" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the tailcall attribute cannot appear in this context File "w53.ml", line 250, characters 6-14: 250 | [@@@tailcall] (* rejected *) ^^^^^^^^ -Warning 53 [misplaced-attribute]: the "tailcall" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the tailcall attribute cannot appear in this context File "w53.ml", line 254, characters 21-29: 254 | type 'a t1 = 'a [@@tailcall] (* rejected *) ^^^^^^^^ -Warning 53 [misplaced-attribute]: the "tailcall" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the tailcall attribute cannot appear in this context File "w53.ml", line 255, characters 19-27: 255 | type s1 = Foo1 [@tailcall] (* rejected *) ^^^^^^^^ -Warning 53 [misplaced-attribute]: the "tailcall" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the tailcall attribute cannot appear in this context File "w53.ml", line 257, characters 16-24: 257 | let m x = x [@tailcall] (* rejected *) ^^^^^^^^ -Warning 53 [misplaced-attribute]: the "tailcall" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the tailcall attribute cannot appear in this context File "w53.ml", line 258, characters 16-30: 258 | let n x = x [@ocaml.tailcall] (* rejected *) ^^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "ocaml.tailcall" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the ocaml.tailcall attribute cannot appear in this context File "w53.ml", line 261, characters 18-26: 261 | let q x = m x [@tailcall] (* rejected *) ^^^^^^^^ -Warning 53 [misplaced-attribute]: the "tailcall" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the tailcall attribute cannot appear in this context File "w53.ml", line 263, characters 35-43: 263 | external z : int -> int = "x" [@@tailcall] (* rejected *) ^^^^^^^^ -Warning 53 [misplaced-attribute]: the "tailcall" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the tailcall attribute cannot appear in this context File "w53.ml", line 265, characters 6-14: 265 | [@@@tailcall] (* rejected *) ^^^^^^^^ -Warning 53 [misplaced-attribute]: the "tailcall" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the tailcall attribute cannot appear in this context File "w53.ml", line 270, characters 24-31: 270 | type t1 = { x : int [@unboxed] } (* rejected *) ^^^^^^^ -Warning 53 [misplaced-attribute]: the "unboxed" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the unboxed attribute cannot appear in this context File "w53.ml", line 272, characters 16-23: 272 | val x : int [@unboxed] (* rejected *) ^^^^^^^ -Warning 53 [misplaced-attribute]: the "unboxed" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the unboxed attribute cannot appear in this context File "w53.ml", line 276, characters 17-24: 276 | val y : int [@@unboxed] (* rejected *) ^^^^^^^ -Warning 53 [misplaced-attribute]: the "unboxed" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the unboxed attribute cannot appear in this context File "w53.ml", line 280, characters 6-13: 280 | [@@@unboxed] (* rejected *) ^^^^^^^ -Warning 53 [misplaced-attribute]: the "unboxed" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the unboxed attribute cannot appear in this context File "w53.ml", line 284, characters 16-23: 284 | let x = (42 [@unboxed], 84) (* rejected *) ^^^^^^^ -Warning 53 [misplaced-attribute]: the "unboxed" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the unboxed attribute cannot appear in this context File "w53.ml", line 286, characters 16-23: 286 | let y = 10 [@@unboxed] (* rejected *) ^^^^^^^ -Warning 53 [misplaced-attribute]: the "unboxed" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the unboxed attribute cannot appear in this context File "w53.ml", line 290, characters 6-13: 290 | [@@@unboxed] (* rejected *) ^^^^^^^ -Warning 53 [misplaced-attribute]: the "unboxed" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the unboxed attribute cannot appear in this context File "w53.ml", line 295, characters 21-29: 295 | type 'a t1 = 'a [@@untagged] (* rejected *) ^^^^^^^^ -Warning 53 [misplaced-attribute]: the "untagged" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the untagged attribute cannot appear in this context File "w53.ml", line 296, characters 19-27: 296 | type s1 = Foo1 [@untagged] (* rejected *) ^^^^^^^^ -Warning 53 [misplaced-attribute]: the "untagged" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the untagged attribute cannot appear in this context File "w53.ml", line 297, characters 17-25: 297 | val x : int [@@untagged] (* rejected *) ^^^^^^^^ -Warning 53 [misplaced-attribute]: the "untagged" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the untagged attribute cannot appear in this context File "w53.ml", line 304, characters 21-29: 304 | type 'a t1 = 'a [@@untagged] (* rejected *) ^^^^^^^^ -Warning 53 [misplaced-attribute]: the "untagged" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the untagged attribute cannot appear in this context File "w53.ml", line 305, characters 19-27: 305 | type s1 = Foo1 [@untagged] (* rejected *) ^^^^^^^^ -Warning 53 [misplaced-attribute]: the "untagged" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the untagged attribute cannot appear in this context File "w53.ml", line 306, characters 22-30: 306 | let x : int = 42 [@@untagged] (* rejected *) ^^^^^^^^ -Warning 53 [misplaced-attribute]: the "untagged" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the untagged attribute cannot appear in this context File "w53.ml", line 314, characters 24-32: 314 | type t1 = { x : int [@unrolled 42] } (* rejected *) ^^^^^^^^ -Warning 53 [misplaced-attribute]: the "unrolled" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the unrolled attribute cannot appear in this context File "w53.ml", line 315, characters 27-35: 315 | type t2 = { x : int } [@@unrolled 42] (* rejected *) ^^^^^^^^ -Warning 53 [misplaced-attribute]: the "unrolled" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the unrolled attribute cannot appear in this context File "w53.ml", line 317, characters 23-31: 317 | val f : int -> int [@unrolled 42] (* rejected *) ^^^^^^^^ -Warning 53 [misplaced-attribute]: the "unrolled" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the unrolled attribute cannot appear in this context File "w53.ml", line 318, characters 24-32: 318 | val g : int -> int [@@unrolled 42] (* rejected *) ^^^^^^^^ -Warning 53 [misplaced-attribute]: the "unrolled" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the unrolled attribute cannot appear in this context File "w53.ml", line 320, characters 39-47: 320 | external z : float -> float = "x" [@@unrolled 42] (* rejected *) ^^^^^^^^ -Warning 53 [misplaced-attribute]: the "unrolled" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the unrolled attribute cannot appear in this context File "w53.ml", line 322, characters 6-14: 322 | [@@@unrolled 42] (* rejected *) ^^^^^^^^ -Warning 53 [misplaced-attribute]: the "unrolled" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the unrolled attribute cannot appear in this context File "w53.ml", line 326, characters 8-16: 326 | let [@unrolled 42] rec test_unrolled x = (* rejected *) ^^^^^^^^ -Warning 53 [misplaced-attribute]: the "unrolled" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the unrolled attribute cannot appear in this context File "w53.ml", line 333, characters 24-32: 333 | type t1 = { x : int [@unrolled 42] } (* rejected *) ^^^^^^^^ -Warning 53 [misplaced-attribute]: the "unrolled" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the unrolled attribute cannot appear in this context File "w53.ml", line 334, characters 27-35: 334 | type t2 = { x : int } [@@unrolled 42] (* rejected *) ^^^^^^^^ -Warning 53 [misplaced-attribute]: the "unrolled" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the unrolled attribute cannot appear in this context File "w53.ml", line 336, characters 22-30: 336 | let rec f x = f x [@unrolled 42] (* rejected *) ^^^^^^^^ -Warning 53 [misplaced-attribute]: the "unrolled" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the unrolled attribute cannot appear in this context File "w53.ml", line 337, characters 23-31: 337 | let rec f x = f x [@@unrolled 42] (* rejected *) ^^^^^^^^ -Warning 53 [misplaced-attribute]: the "unrolled" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the unrolled attribute cannot appear in this context File "w53.ml", line 339, characters 39-47: 339 | external z : int -> int = "x" "y" [@@unrolled 42] (* rejected *) ^^^^^^^^ -Warning 53 [misplaced-attribute]: the "unrolled" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the unrolled attribute cannot appear in this context File "w53.ml", line 341, characters 6-14: 341 | [@@@unrolled 42] (* rejected *) ^^^^^^^^ -Warning 53 [misplaced-attribute]: the "unrolled" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the unrolled attribute cannot appear in this context File "w53.ml", line 390, characters 25-48: 390 | | Lit_pat2 of int [@@warn_on_literal_pattern] (* rejected *) ^^^^^^^^^^^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "warn_on_literal_pattern" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the warn_on_literal_pattern attribute cannot appear in this context File "w53.ml", line 394, characters 16-39: 394 | val x : int [@warn_on_literal_pattern] (* rejected *) ^^^^^^^^^^^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "warn_on_literal_pattern" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the warn_on_literal_pattern attribute cannot appear in this context File "w53.ml", line 396, characters 21-44: 396 | type 'a t2 = 'a [@@warn_on_literal_pattern] (* rejected *) ^^^^^^^^^^^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "warn_on_literal_pattern" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the warn_on_literal_pattern attribute cannot appear in this context File "w53.ml", line 398, characters 17-40: 398 | val y : int [@@warn_on_literal_pattern] (* rejected *) ^^^^^^^^^^^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "warn_on_literal_pattern" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the warn_on_literal_pattern attribute cannot appear in this context File "w53.ml", line 400, characters 6-29: 400 | [@@@warn_on_literal_pattern] (* rejected *) ^^^^^^^^^^^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "warn_on_literal_pattern" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the warn_on_literal_pattern attribute cannot appear in this context File "w53.ml", line 406, characters 25-48: 406 | | Lit_pat2 of int [@@warn_on_literal_pattern] (* rejected *) ^^^^^^^^^^^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "warn_on_literal_pattern" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the warn_on_literal_pattern attribute cannot appear in this context File "w53.ml", line 408, characters 14-37: 408 | let x = 5 [@warn_on_literal_pattern] (* rejected *) ^^^^^^^^^^^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "warn_on_literal_pattern" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the warn_on_literal_pattern attribute cannot appear in this context File "w53.ml", line 410, characters 16-39: 410 | let y = 10 [@@warn_on_literal_pattern] (* rejected *) ^^^^^^^^^^^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "warn_on_literal_pattern" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the warn_on_literal_pattern attribute cannot appear in this context File "w53.ml", line 412, characters 6-29: 412 | [@@@warn_on_literal_pattern] (* rejected *) ^^^^^^^^^^^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "warn_on_literal_pattern" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the warn_on_literal_pattern attribute cannot appear in this context File "w53.ml", line 421, characters 21-25: 421 | type 'a t1 = 'a [@@poll error] (* rejected *) ^^^^ -Warning 53 [misplaced-attribute]: the "poll" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the poll attribute cannot appear in this context File "w53.ml", line 422, characters 19-23: 422 | type s1 = Foo1 [@poll error] (* rejected *) ^^^^ -Warning 53 [misplaced-attribute]: the "poll" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the poll attribute cannot appear in this context File "w53.ml", line 423, characters 19-23: 423 | val x : int64 [@@poll error] (* rejected *) ^^^^ -Warning 53 [misplaced-attribute]: the "poll" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the poll attribute cannot appear in this context File "w53.ml", line 425, characters 24-28: 425 | external y : (int64 [@poll error]) -> (int64 [@poll error]) = (* rejected *) ^^^^ -Warning 53 [misplaced-attribute]: the "poll" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the poll attribute cannot appear in this context File "w53.ml", line 425, characters 49-53: 425 | external y : (int64 [@poll error]) -> (int64 [@poll error]) = (* rejected *) ^^^^ -Warning 53 [misplaced-attribute]: the "poll" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the poll attribute cannot appear in this context File "w53.ml", line 427, characters 39-43: 427 | external z : int64 -> int64 = "x" [@@poll error] (* rejected *) ^^^^ -Warning 53 [misplaced-attribute]: the "poll" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the poll attribute cannot appear in this context File "w53.ml", line 431, characters 21-25: 431 | type 'a t1 = 'a [@@poll error] (* rejected *) ^^^^ -Warning 53 [misplaced-attribute]: the "poll" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the poll attribute cannot appear in this context File "w53.ml", line 432, characters 19-23: 432 | type s1 = Foo1 [@poll error] (* rejected *) ^^^^ -Warning 53 [misplaced-attribute]: the "poll" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the poll attribute cannot appear in this context File "w53.ml", line 433, characters 25-29: 433 | let x : int64 = 42L [@@poll error] (* rejected *) ^^^^ -Warning 53 [misplaced-attribute]: the "poll" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the poll attribute cannot appear in this context File "w53.ml", line 436, characters 24-28: 436 | external y : (int64 [@poll error]) -> (int64 [@poll error]) = (* rejected *) ^^^^ -Warning 53 [misplaced-attribute]: the "poll" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the poll attribute cannot appear in this context File "w53.ml", line 436, characters 49-53: 436 | external y : (int64 [@poll error]) -> (int64 [@poll error]) = (* rejected *) ^^^^ -Warning 53 [misplaced-attribute]: the "poll" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the poll attribute cannot appear in this context File "w53.ml", line 438, characters 39-43: 438 | external z : int64 -> int64 = "x" [@@poll error] (* rejected *) ^^^^ -Warning 53 [misplaced-attribute]: the "poll" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the poll attribute cannot appear in this context File "w53.ml", line 443, characters 21-31: 443 | type 'a t1 = 'a [@@specialise] (* rejected *) ^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "specialise" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the specialise attribute cannot appear in this context File "w53.ml", line 444, characters 19-29: 444 | type s1 = Foo1 [@specialise] (* rejected *) ^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "specialise" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the specialise attribute cannot appear in this context File "w53.ml", line 445, characters 19-29: 445 | val x : int64 [@@specialise] (* rejected *) ^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "specialise" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the specialise attribute cannot appear in this context File "w53.ml", line 447, characters 24-34: 447 | external y : (int64 [@specialise]) -> (int64 [@specialise]) = (* rejected *) ^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "specialise" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the specialise attribute cannot appear in this context File "w53.ml", line 447, characters 49-59: 447 | external y : (int64 [@specialise]) -> (int64 [@specialise]) = (* rejected *) ^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "specialise" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the specialise attribute cannot appear in this context File "w53.ml", line 449, characters 39-49: 449 | external z : int64 -> int64 = "x" [@@specialise] (* rejected *) ^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "specialise" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the specialise attribute cannot appear in this context File "w53.ml", line 453, characters 21-31: 453 | type 'a t1 = 'a [@@specialise] (* rejected *) ^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "specialise" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the specialise attribute cannot appear in this context File "w53.ml", line 454, characters 19-29: 454 | type s1 = Foo1 [@specialise] (* rejected *) ^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "specialise" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the specialise attribute cannot appear in this context File "w53.ml", line 455, characters 25-35: 455 | let x : int64 = 42L [@@specialise] (* rejected *) ^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "specialise" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the specialise attribute cannot appear in this context File "w53.ml", line 457, characters 16-26: 457 | let g x = (f[@specialise]) x (* rejected *) ^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "specialise" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the specialise attribute cannot appear in this context File "w53.ml", line 459, characters 24-34: 459 | external y : (int64 [@specialise]) -> (int64 [@specialise]) = (* rejected *) ^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "specialise" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the specialise attribute cannot appear in this context File "w53.ml", line 459, characters 49-59: 459 | external y : (int64 [@specialise]) -> (int64 [@specialise]) = (* rejected *) ^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "specialise" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the specialise attribute cannot appear in this context File "w53.ml", line 461, characters 39-49: 461 | external z : int64 -> int64 = "x" [@@specialise] (* rejected *) ^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "specialise" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the specialise attribute cannot appear in this context File "w53.ml", line 466, characters 21-32: 466 | type 'a t1 = 'a [@@specialised] (* rejected *) ^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "specialised" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the specialised attribute cannot appear in this context File "w53.ml", line 467, characters 19-30: 467 | type s1 = Foo1 [@specialised] (* rejected *) ^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "specialised" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the specialised attribute cannot appear in this context File "w53.ml", line 468, characters 19-30: 468 | val x : int64 [@@specialised] (* rejected *) ^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "specialised" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the specialised attribute cannot appear in this context File "w53.ml", line 470, characters 24-35: 470 | external y : (int64 [@specialised]) -> (int64 [@specialised]) = (* rejected *) ^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "specialised" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the specialised attribute cannot appear in this context File "w53.ml", line 470, characters 50-61: 470 | external y : (int64 [@specialised]) -> (int64 [@specialised]) = (* rejected *) ^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "specialised" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the specialised attribute cannot appear in this context File "w53.ml", line 472, characters 39-50: 472 | external z : int64 -> int64 = "x" [@@specialised] (* rejected *) ^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "specialised" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the specialised attribute cannot appear in this context File "w53.ml", line 476, characters 21-32: 476 | type 'a t1 = 'a [@@specialised] (* rejected *) ^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "specialised" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the specialised attribute cannot appear in this context File "w53.ml", line 477, characters 19-30: 477 | type s1 = Foo1 [@specialised] (* rejected *) ^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "specialised" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the specialised attribute cannot appear in this context File "w53.ml", line 478, characters 25-36: 478 | let x : int64 = 42L [@@specialised] (* rejected *) ^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "specialised" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the specialised attribute cannot appear in this context File "w53.ml", line 479, characters 8-19: 479 | let [@specialised] f x = x (* rejected *) ^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "specialised" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the specialised attribute cannot appear in this context File "w53.ml", line 482, characters 24-35: 482 | external y : (int64 [@specialised]) -> (int64 [@specialised]) = (* rejected *) ^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "specialised" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the specialised attribute cannot appear in this context File "w53.ml", line 482, characters 50-61: 482 | external y : (int64 [@specialised]) -> (int64 [@specialised]) = (* rejected *) ^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "specialised" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the specialised attribute cannot appear in this context File "w53.ml", line 484, characters 39-50: 484 | external z : int64 -> int64 = "x" [@@specialised] (* rejected *) ^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "specialised" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the specialised attribute cannot appear in this context File "w53.ml", line 489, characters 21-34: 489 | type 'a t1 = 'a [@@tail_mod_cons] (* rejected *) ^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "tail_mod_cons" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the tail_mod_cons attribute cannot appear in this context File "w53.ml", line 490, characters 19-32: 490 | type s1 = Foo1 [@tail_mod_cons] (* rejected *) ^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "tail_mod_cons" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the tail_mod_cons attribute cannot appear in this context File "w53.ml", line 491, characters 19-32: 491 | val x : int64 [@@tail_mod_cons] (* rejected *) ^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "tail_mod_cons" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the tail_mod_cons attribute cannot appear in this context File "w53.ml", line 493, characters 24-37: 493 | external y : (int64 [@tail_mod_cons]) -> (int64 [@tail_mod_cons]) = ^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "tail_mod_cons" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the tail_mod_cons attribute cannot appear in this context File "w53.ml", line 493, characters 52-65: 493 | external y : (int64 [@tail_mod_cons]) -> (int64 [@tail_mod_cons]) = ^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "tail_mod_cons" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the tail_mod_cons attribute cannot appear in this context File "w53.ml", line 496, characters 39-52: 496 | external z : int64 -> int64 = "x" [@@tail_mod_cons] (* rejected *) ^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "tail_mod_cons" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the tail_mod_cons attribute cannot appear in this context File "w53.ml", line 500, characters 21-34: 500 | type 'a t1 = 'a [@@tail_mod_cons] (* rejected *) ^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "tail_mod_cons" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the tail_mod_cons attribute cannot appear in this context File "w53.ml", line 501, characters 19-32: 501 | type s1 = Foo1 [@tail_mod_cons] (* rejected *) ^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "tail_mod_cons" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the tail_mod_cons attribute cannot appear in this context File "w53.ml", line 502, characters 25-38: 502 | let x : int64 = 42L [@@tail_mod_cons] (* rejected *) ^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "tail_mod_cons" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the tail_mod_cons attribute cannot appear in this context File "w53.ml", line 504, characters 16-29: 504 | let g x = (f[@tail_mod_cons]) x (* rejected *) ^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "tail_mod_cons" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the tail_mod_cons attribute cannot appear in this context File "w53.ml", line 506, characters 24-37: 506 | external y : (int64 [@tail_mod_cons]) -> (int64 [@tail_mod_cons]) = ^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "tail_mod_cons" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the tail_mod_cons attribute cannot appear in this context File "w53.ml", line 506, characters 52-65: 506 | external y : (int64 [@tail_mod_cons]) -> (int64 [@tail_mod_cons]) = ^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "tail_mod_cons" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the tail_mod_cons attribute cannot appear in this context File "w53.ml", line 509, characters 39-52: 509 | external z : int64 -> int64 = "x" [@@tail_mod_cons] (* rejected *) ^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "tail_mod_cons" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the tail_mod_cons attribute cannot appear in this context File "w53.ml", line 515, characters 10-15: 515 | [@@@alert foo "foo"] (* rejected *) ^^^^^ -Warning 53 [misplaced-attribute]: the "alert" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the alert attribute cannot appear in this context diff --git a/testsuite/tests/warnings/w53_across_cmi.compilers.reference b/testsuite/tests/warnings/w53_across_cmi.compilers.reference index 6bd061b8..143e0173 100644 --- a/testsuite/tests/warnings/w53_across_cmi.compilers.reference +++ b/testsuite/tests/warnings/w53_across_cmi.compilers.reference @@ -1,32 +1,32 @@ File "w53_without_cmi.ml", line 6, characters 4-9: 6 | [@@@alert xyz "xyz"] (* rejected *) ^^^^^ -Warning 53 [misplaced-attribute]: the "alert" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the alert attribute cannot appear in this context File "w53_without_cmi.ml", line 9, characters 6-11: 9 | [@@@alert foo "foo"] (* rejected *) ^^^^^ -Warning 53 [misplaced-attribute]: the "alert" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the alert attribute cannot appear in this context File "w53_with_cmi.mli", line 6, characters 4-9: 6 | [@@@alert xyz "xyz"] (* rejected *) ^^^^^ -Warning 53 [misplaced-attribute]: the "alert" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the alert attribute cannot appear in this context File "w53_with_cmi.ml", line 1, characters 4-9: 1 | [@@@alert foo "foo"] (* rejected *) ^^^^^ -Warning 53 [misplaced-attribute]: the "alert" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the alert attribute cannot appear in this context File "w53_with_cmi.ml", line 2, characters 4-9: 2 | [@@@alert bar "bar"] (* rejected *) ^^^^^ -Warning 53 [misplaced-attribute]: the "alert" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the alert attribute cannot appear in this context File "w53_with_cmi.ml", line 6, characters 4-9: 6 | [@@@alert xyz "xyz"] (* rejected *) ^^^^^ -Warning 53 [misplaced-attribute]: the "alert" attribute cannot appear in this context +Warning 53 [misplaced-attribute]: the alert attribute cannot appear in this context File "w53_across_cmi.ml", line 17, characters 5-20: 17 | open W53_without_cmi ^^^^^^^^^^^^^^^ diff --git a/testsuite/tests/warnings/w54.compilers.reference b/testsuite/tests/warnings/w54.compilers.reference index a5075bcf..fec62fd4 100644 --- a/testsuite/tests/warnings/w54.compilers.reference +++ b/testsuite/tests/warnings/w54.compilers.reference @@ -1,19 +1,23 @@ File "w54.ml", line 12, characters 33-39: 12 | let f = (fun x -> x) [@inline] [@inline never] ^^^^^^ -Warning 54 [duplicated-attribute]: the "inline" attribute is used more than once on this expression +Warning 54 [duplicated-attribute]: the inline attribute is used more than once + on this expression File "w54.ml", line 13, characters 51-63: 13 | let g = (fun x -> x) [@inline] [@something_else] [@ocaml.inline] ^^^^^^^^^^^^ -Warning 54 [duplicated-attribute]: the "ocaml.inline" attribute is used more than once on this expression +Warning 54 [duplicated-attribute]: the ocaml.inline attribute is used more than once + on this expression File "w54.ml", line 15, characters 26-39: 15 | let h x = (g [@inlined] [@ocaml.inlined never]) x ^^^^^^^^^^^^^ -Warning 54 [duplicated-attribute]: the "ocaml.inlined" attribute is used more than once on this expression +Warning 54 [duplicated-attribute]: the ocaml.inlined attribute is used more than once + on this expression File "w54.ml", line 19, characters 0-43: 19 | let i = ((fun x -> x) [@inline]) [@@inline] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Warning 54 [duplicated-attribute]: the "inline" attribute is used more than once on this expression +Warning 54 [duplicated-attribute]: the inline attribute is used more than once + on this expression diff --git a/testsuite/tests/warnings/w55.flambda.reference b/testsuite/tests/warnings/w55.flambda.reference index 3c31287f..5b75268c 100644 --- a/testsuite/tests/warnings/w55.flambda.reference +++ b/testsuite/tests/warnings/w55.flambda.reference @@ -1,14 +1,17 @@ File "w55.ml", line 33, characters 10-26: 33 | let h x = (j [@inlined]) x ^^^^^^^^^^^^^^^^ -Warning 55 [inlining-impossible]: Cannot inline: [@inlined] attributes may not be used on partial applications +Warning 55 [inlining-impossible]: Cannot inline: + [@inlined] attributes may not be used on partial applications File "w55.ml", line 29, characters 10-27: 29 | let i x = (!r [@inlined]) x ^^^^^^^^^^^^^^^^^ -Warning 55 [inlining-impossible]: Cannot inline: [@inlined] attribute was not used on this function application (the optimizer did not know what function was being applied) +Warning 55 [inlining-impossible]: Cannot inline: + [@inlined] attribute was not used on this function application (the optimizer did not know what function was being applied) File "w55.ml", line 39, characters 12-30: 39 | let b x y = (a [@inlined]) x y ^^^^^^^^^^^^^^^^^^ -Warning 55 [inlining-impossible]: Cannot inline: [@inlined] attribute was not used on this function application (the optimizer did not know what function was being applied) +Warning 55 [inlining-impossible]: Cannot inline: + [@inlined] attribute was not used on this function application (the optimizer did not know what function was being applied) diff --git a/testsuite/tests/warnings/w55.native.reference b/testsuite/tests/warnings/w55.native.reference index 63f7fd7a..98593a2e 100644 --- a/testsuite/tests/warnings/w55.native.reference +++ b/testsuite/tests/warnings/w55.native.reference @@ -1,7 +1,8 @@ File "w55.ml", line 25, characters 10-26: 25 | let g x = (f [@inlined]) x ^^^^^^^^^^^^^^^^ -Warning 55 [inlining-impossible]: Cannot inline: Function information unavailable +Warning 55 [inlining-impossible]: Cannot inline: + Function information unavailable File "w55.ml", line 29, characters 10-27: 29 | let i x = (!r [@inlined]) x @@ -21,9 +22,11 @@ Warning 55 [inlining-impossible]: Cannot inline: Over-application File "w55.ml", line 39, characters 12-30: 39 | let b x y = (a [@inlined]) x y ^^^^^^^^^^^^^^^^^^ -Warning 55 [inlining-impossible]: Cannot inline: Function information unavailable +Warning 55 [inlining-impossible]: Cannot inline: + Function information unavailable File "w55.ml", line 42, characters 10-26: 42 | let d x = (c [@inlined]) x ^^^^^^^^^^^^^^^^ -Warning 55 [inlining-impossible]: Cannot inline: Function information unavailable +Warning 55 [inlining-impossible]: Cannot inline: + Function information unavailable diff --git a/testsuite/tests/warnings/w58.native.reference b/testsuite/tests/warnings/w58.native.reference index 4fb0badf..05a16b2c 100644 --- a/testsuite/tests/warnings/w58.native.reference +++ b/testsuite/tests/warnings/w58.native.reference @@ -1,2 +1,3 @@ File "_none_", line 1: -Warning 58 [no-cmx-file]: no cmx file was found in path for module Module_without_cmx, and its interface was not compiled with -opaque +Warning 58 [no-cmx-file]: no cmx file was found in path for module + Module_without_cmx, and its interface was not compiled with -opaque diff --git a/testsuite/tests/warnings/w59.flambda.reference b/testsuite/tests/warnings/w59.flambda.reference index 33f0d7ca..f75e16b6 100644 --- a/testsuite/tests/warnings/w59.flambda.reference +++ b/testsuite/tests/warnings/w59.flambda.reference @@ -1,34 +1,34 @@ File "w59.ml", line 47, characters 2-43: 47 | Obj.set_field (Obj.repr o) 0 (Obj.repr 3); ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Warning 59 [flambda-assignment-to-non-mutable-value]: A potential assignment to a non-mutable value was detected -in this source file. Such assignments may generate incorrect code -when using Flambda. +Warning 59 [flambda-assignment-to-non-mutable-value]: A potential assignment + to a non-mutable value was detected in this source file. Such assignments + may generate incorrect code when using Flambda. File "w59.ml", line 48, characters 2-43: 48 | Obj.set_field (Obj.repr p) 0 (Obj.repr 3); ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Warning 59 [flambda-assignment-to-non-mutable-value]: A potential assignment to a non-mutable value was detected -in this source file. Such assignments may generate incorrect code -when using Flambda. +Warning 59 [flambda-assignment-to-non-mutable-value]: A potential assignment + to a non-mutable value was detected in this source file. Such assignments + may generate incorrect code when using Flambda. File "w59.ml", line 49, characters 2-43: 49 | Obj.set_field (Obj.repr q) 0 (Obj.repr 3); ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Warning 59 [flambda-assignment-to-non-mutable-value]: A potential assignment to a non-mutable value was detected -in this source file. Such assignments may generate incorrect code -when using Flambda. +Warning 59 [flambda-assignment-to-non-mutable-value]: A potential assignment + to a non-mutable value was detected in this source file. Such assignments + may generate incorrect code when using Flambda. File "w59.ml", line 50, characters 2-43: 50 | Obj.set_field (Obj.repr r) 0 (Obj.repr 3) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Warning 59 [flambda-assignment-to-non-mutable-value]: A potential assignment to a non-mutable value was detected -in this source file. Such assignments may generate incorrect code -when using Flambda. +Warning 59 [flambda-assignment-to-non-mutable-value]: A potential assignment + to a non-mutable value was detected in this source file. Such assignments + may generate incorrect code when using Flambda. File "w59.ml", line 57, characters 2-7: 57 | set o ^^^^^ -Warning 59 [flambda-assignment-to-non-mutable-value]: A potential assignment to a non-mutable value was detected -in this source file. Such assignments may generate incorrect code -when using Flambda. +Warning 59 [flambda-assignment-to-non-mutable-value]: A potential assignment + to a non-mutable value was detected in this source file. Such assignments + may generate incorrect code when using Flambda. diff --git a/testsuite/tests/warnings/w74.ml b/testsuite/tests/warnings/w74.ml index b75acdb6..f44d03a8 100644 --- a/testsuite/tests/warnings/w74.ml +++ b/testsuite/tests/warnings/w74.ml @@ -22,10 +22,10 @@ Lines 1-5, characters 34-31: 3 | | (_, r) when (r.contents <- true; false) -> assert false 4 | | (false, _) -> () 5 | | (_, {contents = false}) -> () -Warning 74 [degraded-to-partial-match]: This pattern-matching is compiled -as partial, even if it appears to be total. It may generate a Match_failure -exception. This typically occurs due to complex matches on mutable fields. -(see manual section 13.5.5) +Warning 74 [degraded-to-partial-match]: This pattern-matching is compiled as + partial, even if it appears to be total. It may generate a "Match_failure" + exception. This typically occurs due to complex matches on mutable fields. + (see manual section 13.5.5) val f : bool * bool ref -> unit = |}];; @@ -41,10 +41,10 @@ Lines 1-4, characters 34-31: 2 | | (true, {contents = true}) -> () 3 | | (false, _) -> () 4 | | (_, {contents = false}) -> () -Warning 74 [degraded-to-partial-match]: This pattern-matching is compiled -as partial, even if it appears to be total. It may generate a Match_failure -exception. This typically occurs due to complex matches on mutable fields. -(see manual section 13.5.5) +Warning 74 [degraded-to-partial-match]: This pattern-matching is compiled as + partial, even if it appears to be total. It may generate a "Match_failure" + exception. This typically occurs due to complex matches on mutable fields. + (see manual section 13.5.5) val g : bool * bool ref -> unit = |}];; @@ -76,10 +76,10 @@ Lines 2-6, characters 2-33: 4 | | (_, r) when (r.contents <- true; false) -> assert false 5 | | (false, _) -> () 6 | | (_, {contents = false}) -> () -Warning 74 [degraded-to-partial-match]: This pattern-matching is compiled -as partial, even if it appears to be total. It may generate a Match_failure -exception. This typically occurs due to complex matches on mutable fields. -(see manual section 13.5.5) +Warning 74 [degraded-to-partial-match]: This pattern-matching is compiled as + partial, even if it appears to be total. It may generate a "Match_failure" + exception. This typically occurs due to complex matches on mutable fields. + (see manual section 13.5.5) val f : bool * bool ref -> unit = |}];; @@ -96,10 +96,10 @@ Lines 1-5, characters 34-31: 3 | | (_, r) when (r.contents <- true; false) -> assert false 4 | | (false, _) -> () 5 | | (_, {contents = false}) -> () -Warning 74 [degraded-to-partial-match]: This pattern-matching is compiled -as partial, even if it appears to be total. It may generate a Match_failure -exception. This typically occurs due to complex matches on mutable fields. -(see manual section 13.5.5) +Warning 74 [degraded-to-partial-match]: This pattern-matching is compiled as + partial, even if it appears to be total. It may generate a "Match_failure" + exception. This typically occurs due to complex matches on mutable fields. + (see manual section 13.5.5) val f : bool * bool ref -> unit = |}];; diff --git a/testsuite/tests/weak-ephe-final/ephe_custom.ml b/testsuite/tests/weak-ephe-final/ephe_custom.ml new file mode 100644 index 00000000..30a1f64e --- /dev/null +++ b/testsuite/tests/weak-ephe-final/ephe_custom.ml @@ -0,0 +1,21 @@ +(* TEST *) + +let w = Weak.create 1 + +let major_obj () = + let n = Sys.opaque_identity 42 in + let v = Sys.opaque_identity (Int64.of_int n) in + Gc.minor (); + v + +let () = + Weak.set w 0 (Some (major_obj ())); + Gc.major (); + let x = Option.get (Weak.get_copy w 0) in + Gc.major (); + Printf.printf "value: %Ld\n%!" x; + let junk = List.init 1_000_000 Fun.id in + Gc.minor (); + ignore (Sys.opaque_identity junk); + (* check that the memory representing x did not get reused in junk *) + Printf.printf "value: %Ld\n%!" x diff --git a/testsuite/tests/weak-ephe-final/ephe_custom.reference b/testsuite/tests/weak-ephe-final/ephe_custom.reference new file mode 100644 index 00000000..bae9dd44 --- /dev/null +++ b/testsuite/tests/weak-ephe-final/ephe_custom.reference @@ -0,0 +1,2 @@ +value: 42 +value: 42 diff --git a/testsuite/tests/weak-ephe-final/weak_array_par.ml b/testsuite/tests/weak-ephe-final/weak_array_par.ml new file mode 100644 index 00000000..1208ee48 --- /dev/null +++ b/testsuite/tests/weak-ephe-final/weak_array_par.ml @@ -0,0 +1,25 @@ +(* TEST *) + +let () = Random.self_init () + +let num_domains = 4 +let iters = 1_000_000 +let len = 10_000 +let table = Weak.create len + +let go () = + for i = 1 to 1_000_000 do + let s = string_of_int i in + let h = String.hash s mod len in + begin match Weak.get table h with + | None -> () + | Some s' -> assert (String.hash s' mod len = h) + end; + Weak.set table h (Some s) + done + +let () = + let domains = Array.init (num_domains - 1) (fun _ -> Domain.spawn go) in + go (); + Array.iter Domain.join domains; + print_endline "ok" diff --git a/testsuite/tests/weak-ephe-final/weak_array_par.reference b/testsuite/tests/weak-ephe-final/weak_array_par.reference new file mode 100644 index 00000000..9766475a --- /dev/null +++ b/testsuite/tests/weak-ephe-final/weak_array_par.reference @@ -0,0 +1 @@ +ok diff --git a/testsuite/tests/win-unicode/mltest.compilers.reference b/testsuite/tests/win-unicode/mltest.compilers.reference index 7912d17c..0d7f8260 100644 --- a/testsuite/tests/win-unicode/mltest.compilers.reference +++ b/testsuite/tests/win-unicode/mltest.compilers.reference @@ -2,11 +2,9 @@ val foreign_names : string list = ["été"; "simple"; "sœur"; "你好"] val test_files : string list = ["été.txt"; "simple.txt"; "sœur.txt"; "你好.txt"] val to_create_and_delete_files : string list = - ["верблюды"; "骆驼"; "קעמל"; "اونٹ"; "Lạc đà"; - "ఒంటె"; "ஒட்டகம்"; "وشتر"; + ["верблюды"; "骆驼"; "קעמל"; "اونٹ"; "Lạc đà"; "ఒంటె"; "ஒட்டகம்"; "وشتر"; "उष्ट्रः"; "اٺ"] -val foreign_names2 : string list = - ["верблюды"; "骆驼"; "קעמל"; "اونٹ"] +val foreign_names2 : string list = ["верблюды"; "骆驼"; "קעמל"; "اونٹ"] val getenvironmentenv : string -> string = val unix_getcwd : unit -> string = val sys_getcwd : unit -> string = @@ -39,9 +37,8 @@ val t_sys_readdir : string list = val t_open_in : string list = ["été.txt"; "simple.txt"; "sœur.txt"; "你好.txt"] val t_open_out : string list = - ["Hello, верблюды"; "Hello, 骆驼"; "Hello, קעמל"; - "Hello, اونٹ"; "Hello, Lạc đà"; "Hello, ఒంటె"; - "Hello, ஒட்டகம்"; "Hello, وشتر"; + ["Hello, верблюды"; "Hello, 骆驼"; "Hello, קעמל"; "Hello, اونٹ"; + "Hello, Lạc đà"; "Hello, ఒంటె"; "Hello, ஒட்டகம்"; "Hello, وشتر"; "Hello, उष्ट्रः"; "Hello, اٺ"] val t_file_exists : bool list = [true; true; true; true; true; true; true; true; true; true] @@ -78,8 +75,7 @@ val t_sys_chdir : string list = ["été"; "simple"; "sœur"; "你好"] val t_unix_chdir : string list = ["été"; "simple"; "sœur"; "你好"] - : bool list = [false; false; false; false] val t_getenv : ((string * string) * (string * string)) list = - [(("верблюды", "верблюды"), - ("верблюдыверблюды", "верблюдыверблюды")); + [(("верблюды", "верблюды"), ("верблюдыверблюды", "верблюдыверблюды")); (("骆驼", "骆驼"), ("骆驼骆驼", "骆驼骆驼")); (("קעמל", "קעמל"), ("קעמלקעמל", "קעמלקעמל")); (("اونٹ", "اونٹ"), ("اونٹاونٹ", "اونٹاونٹ"))] diff --git a/testsuite/tools/asmgen_arm.S b/testsuite/tools/asmgen_arm.S index da6d9ee7..49d734c5 100644 --- a/testsuite/tools/asmgen_arm.S +++ b/testsuite/tools/asmgen_arm.S @@ -13,6 +13,9 @@ /* */ /**************************************************************************/ +#include "caml/m.h" +#include "caml/asm.h" + .text .global call_gen_code @@ -38,5 +41,4 @@ caml_c_call: @ function to call is in r10 bx r10 -/* Mark stack as non-executable */ - .section .note.GNU-stack,"",%progbits + NONEXECSTACK_NOTE diff --git a/testsuite/tools/asmgen_arm64.S b/testsuite/tools/asmgen_arm64.S index 6a06f8d7..d43144cf 100644 --- a/testsuite/tools/asmgen_arm64.S +++ b/testsuite/tools/asmgen_arm64.S @@ -13,6 +13,9 @@ /* */ /**************************************************************************/ +#include "caml/m.h" +#include "caml/asm.h" + #if defined(SYS_macosx) #define G(sym) _##sym #else @@ -60,7 +63,4 @@ G(call_gen_code): G(caml_c_call): br x15 -#if !defined(SYS_macosx) -/* Mark stack as non-executable */ - .section .note.GNU-stack,"",%progbits -#endif + NONEXECSTACK_NOTE diff --git a/testsuite/tools/asmgen_power.S b/testsuite/tools/asmgen_power.S index b3323484..754afefa 100644 --- a/testsuite/tools/asmgen_power.S +++ b/testsuite/tools/asmgen_power.S @@ -10,6 +10,9 @@ /* */ /*********************************************************************/ +#include "caml/m.h" +#include "caml/asm.h" + #define RESERVED_STACK 32 #define LR_SAVE_AREA 16 @@ -131,5 +134,4 @@ FUNCTION(caml_c_call) mr 12, 28 bctr -/* Mark stack as non-executable */ - .section .note.GNU-stack,"",%progbits + NONEXECSTACK_NOTE diff --git a/testsuite/tools/asmgen_s390x.S b/testsuite/tools/asmgen_s390x.S index 99eeca27..14c014c7 100644 --- a/testsuite/tools/asmgen_s390x.S +++ b/testsuite/tools/asmgen_s390x.S @@ -1,3 +1,6 @@ +#include "caml/m.h" +#include "caml/asm.h" + #define ALIGN 8 #define CALL_GEN_CODE call_gen_code @@ -63,5 +66,4 @@ CAML_ABSF_MASK: .comm young_limit, 8 -/* Mark stack as non-executable */ - .section .note.GNU-stack,"",%progbits + NONEXECSTACK_NOTE diff --git a/testsuite/tools/expect.ml b/testsuite/tools/expect.ml index 3de4baad..c949d9ca 100644 --- a/testsuite/tools/expect.ml +++ b/testsuite/tools/expect.ml @@ -76,8 +76,9 @@ let match_expect_extension (ext : Parsetree.extension) = let normal, principal = match e.pexp_desc with | Pexp_tuple - [ a - ; { pexp_desc = Pexp_construct + [ None, a + ; None, + { pexp_desc = Pexp_construct ({ txt = Lident "Principal"; _ }, Some b) } ] -> (string_constant a, string_constant b) @@ -215,6 +216,13 @@ function | (Ptop_dir _ | Ptop_def []) :: l -> min_line_number l | Ptop_def (st :: _) :: _ -> Some st.pstr_loc.loc_start.pos_lnum + +let visible_inline_code () = + let open Misc.Style in + let default = get_styles () in + let inline_code = { ansi = []; text_open = {|"|}; text_close={|"|} } in + set_styles { default with inline_code } + let eval_expect_file _fname ~file_contents = Warnings.reset_fatal (); let chunks, trailing_code = @@ -222,7 +230,9 @@ let eval_expect_file _fname ~file_contents = in let buf = Buffer.create 1024 in let ppf = Format.formatter_of_buffer buf in - let () = Misc.Style.set_tag_handling ppf in + let () = + visible_inline_code (); + Misc.Style.set_tag_handling ppf in let exec_phrases phrases = let phrases = match min_line_number phrases with diff --git a/testsuite/tools/parsecmm.mly b/testsuite/tools/parsecmm.mly index 2e61069d..798226ae 100644 --- a/testsuite/tools/parsecmm.mly +++ b/testsuite/tools/parsecmm.mly @@ -191,7 +191,7 @@ params: | /**/ { [] } ; oneparam: - IDENT COLON machtype { (bind_ident $1, $3) } + IDENT COLON machtype { (bind_ident $1 Immutable, $3) } ; machtype: UNIT { [||] } @@ -211,11 +211,11 @@ expr: INTCONST { Cconst_int ($1, debuginfo ()) } | FLOATCONST { Cconst_float (float_of_string $1, debuginfo ()) } | STRING { Cconst_symbol ($1, debuginfo ()) } - | IDENT { Cvar(find_ident $1) } + | IDENT { find_ident $1 } | LBRACKET RBRACKET { Ctuple [] } | LPAREN LET letdef sequence RPAREN { make_letdef $3 $4 } | LPAREN LETMUT letmutdef sequence RPAREN { make_letmutdef $3 $4 } - | LPAREN ASSIGN IDENT expr RPAREN { Cassign(find_ident $3, $4) } + | LPAREN ASSIGN IDENT expr RPAREN { Cassign(find_mut_ident $3, $4) } | LPAREN APPLY location expr exprlist machtype RPAREN { Cop(Capply $6, $4 :: List.rev $5, debuginfo ?loc:$3 ()) } | LPAREN EXTCALL STRING exprlist machtype RPAREN @@ -304,7 +304,7 @@ letdefmult: | oneletdef letdefmult { $1 :: $2 } ; oneletdef: - IDENT expr { (bind_ident $1, $2) } + IDENT expr { (bind_ident $1 Immutable, $2) } ; letmutdef: oneletmutdef { [$1] } @@ -315,7 +315,7 @@ letmutdefmult: | oneletmutdef letmutdefmult { $1 :: $2 } ; oneletmutdef: - IDENT machtype expr { (bind_ident $1, $2, $3) } + IDENT machtype expr { (bind_ident $1 Mutable, $2, $3) } ; chunk: UNSIGNED BYTE { Byte_unsigned } @@ -396,7 +396,7 @@ onecase: | CASE INTCONST COLON { [$2] } ; bind_ident: - IDENT { bind_ident $1 } + IDENT { bind_ident $1 Immutable } ; datadecl: LPAREN datalist RPAREN { List.rev $2 } diff --git a/testsuite/tools/parsecmmaux.ml b/testsuite/tools/parsecmmaux.ml index af7aaea2..67682f35 100644 --- a/testsuite/tools/parsecmmaux.ml +++ b/testsuite/tools/parsecmmaux.ml @@ -16,11 +16,15 @@ (* Auxiliary functions for parsing *) type error = - Unbound of string + | Unbound of string + | Immutable_used_as_mutable of string exception Error of error -let tbl_ident = (Hashtbl.create 57 : (string, Backend_var.t) Hashtbl.t) +type mutability = Immutable | Mutable + +let tbl_ident : (string, (Backend_var.t * mutability)) Hashtbl.t = + Hashtbl.create 57 let tbl_label = (Hashtbl.create 57 : (string, int) Hashtbl.t) let ident_name s = @@ -28,16 +32,24 @@ let ident_name s = | exception Not_found -> s | n -> String.sub s 0 n -let bind_ident s = +let bind_ident s mut = let id = Backend_var.create_local (ident_name s) in - Hashtbl.add tbl_ident s id; + Hashtbl.add tbl_ident s (id, mut); Backend_var.With_provenance.create id let find_ident s = - try - Hashtbl.find tbl_ident s - with Not_found -> + match Hashtbl.find tbl_ident s with + | exception Not_found -> + raise(Error(Unbound s)) + | id, Immutable -> Cmm.Cvar id + | id, Mutable -> Cmm.Cvar_mut id + +let find_mut_ident s = + match Hashtbl.find tbl_ident s with + | exception Not_found -> raise(Error(Unbound s)) + | _, Immutable -> raise(Error(Immutable_used_as_mutable s)) + | id, Mutable -> id let unbind_ident id = Hashtbl.remove tbl_ident (Backend_var.With_provenance.name id) @@ -51,8 +63,11 @@ let find_label s = lbl let report_error = function - Unbound s -> + | Unbound s -> prerr_string "Unbound identifier "; prerr_string s; prerr_endline "." + | Immutable_used_as_mutable s -> + prerr_string "Identifier bound as immutable used as mutable: "; + prerr_string s; prerr_endline "." let debuginfo ?(loc=Location.symbol_rloc ()) () = Debuginfo.(from_location diff --git a/testsuite/tools/parsecmmaux.mli b/testsuite/tools/parsecmmaux.mli index a6728b49..4e6e1c35 100644 --- a/testsuite/tools/parsecmmaux.mli +++ b/testsuite/tools/parsecmmaux.mli @@ -15,8 +15,11 @@ (* Auxiliary functions for parsing *) -val bind_ident: string -> Backend_var.With_provenance.t -val find_ident: string -> Backend_var.t +type mutability = Immutable | Mutable + +val bind_ident: string -> mutability -> Backend_var.With_provenance.t +val find_ident: string -> Cmm.expression +val find_mut_ident: string -> Backend_var.t val unbind_ident: Backend_var.With_provenance.t -> unit val find_label: string -> int @@ -24,7 +27,8 @@ val find_label: string -> int val debuginfo: ?loc:Location.t -> unit -> Debuginfo.t type error = - Unbound of string + | Unbound of string + | Immutable_used_as_mutable of string exception Error of error diff --git a/tools/check-symbol-names b/tools/check-symbol-names index 1fa25608..69c7b928 100755 --- a/tools/check-symbol-names +++ b/tools/check-symbol-names @@ -20,9 +20,11 @@ set -o pipefail nm -A -P "$@" | LC_ALL=C awk ' # ignore caml_foo, camlFoo_bar, _caml_foo, _camlFoo_bar -$2 ~ /^(\.refptr\.)?(__emutls_v\.)?(_?caml[_A-Z])/ { next } +$2 ~ /^(\.refptr\.)?(_?__emutls_v\.)?(_?caml[_A-Z])/ { next } # ignore re_foo $2 ~ /^(\.refptr\.)?(_?re_)/ { next } +# ignore "extern char **environ" +$2 ~ /^(\.refptr\.)?(environ)/ { next } # ignore symbols pulled in by SHGetKnownFolderPath $2 ~ /^\.refptr\.FOLDERID_[a-zA-Z]+/ { next } # ignore local and undefined symbols diff --git a/tools/check-typo b/tools/check-typo index 49a08f99..e7648830 100755 --- a/tools/check-typo +++ b/tools/check-typo @@ -64,9 +64,11 @@ # You can ignore a rule by giving the option - on the command # line (before any file names). -# Files which include the utf8 rule will be validated using grep and line-length -# computations will take UTF-8 sequences into account. As a special case, UTF-8 -# sequences are always allowed in the copyright headers. +# Files which include the non-ascii rule will be validated using grep and +# line-length computations will take UTF-8 sequences into account. As a special +# case, UTF-8 sequences are always allowed in the copyright headers. Files which +# include the non-ascii rule must still be valid UTF-8 (the only alternative is +# to mark the file as binary). # First prevent i18n from messing up everything. export LC_ALL=C @@ -74,7 +76,7 @@ export LC_ALL=C OCAML_CT_CAT=${OCAML_CT_CAT:-cat} OCAML_CT_LS_FILES=${OCAML_CT_LS_FILES:-git ls-files} OCAML_CT_HEAD=${OCAML_CT_HEAD:-HEAD} -OCAML_CT_AWK=${OCAML_CT_AWK:-awk} +OCAML_CT_AWK=${OCAML_CT_AWK:-gawk} if [ -z "${OCAML_CT_GIT_INDEX+x}" ] ; then OCAML_CT_GIT_INDEX= else @@ -236,17 +238,14 @@ EXIT_CODE=0 rules=" $(echo $rules) " attr_rules=" $(echo $attr_rules) " - if test -n "$(echo "$rules $attr_rules" | grep " utf8 ")" - then - # grep -a is used to force the file to be considered as text and -x - # requires the entire line to match. This specifically detects the - # presence of lines containing malformed UTF-8. It may be tested using - # https://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt - if $OCAML_CT_CAT "$OCAML_CT_PREFIX$f" \ - | LC_ALL=en_US.UTF8 grep -qaxv '.*' ; then - echo "File \"$f\" is not correctly encoded in UTF-8" - exit 2 - fi + # grep -a is used to force the file to be considered as text and -x + # requires the entire line to match. This specifically detects the + # presence of lines containing malformed UTF-8. It may be tested using + # https://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt + if $OCAML_CT_CAT "$OCAML_CT_PREFIX$f" \ + | LC_ALL=C.UTF-8 grep -qaxv '.*' ; then + echo "File \"$f\" is not correctly encoded in UTF-8" + exit 2 fi if ! \ ($OCAML_CT_CAT "$OCAML_CT_PREFIX$f" | tr -d '\r'; echo) \ @@ -294,14 +293,14 @@ EXIT_CODE=0 } function utf8_decode(str) { - if (is_err("utf8")) { + if (is_err("non-ascii")) { return str; } else { # This script assumes that the UTF-8 has been externally validated t = str; gsub(/[\300-\367][\200-\277]+/, "?", t); if (t != str) { - ++ counts["utf8"]; + ++ counts["non-ascii"]; } return t; } @@ -365,14 +364,10 @@ EXIT_CODE=0 match($0, /[\200-\377]/) \ && state != "authors" && state != "copyright" { - if (is_err("utf8")) { + if (is_err("non-ascii")) { err("non-ascii", "non-ASCII character(s)"); - if (header_utf8 && !is_err("non-ascii")) { - err("non-ascii-utf8", \ - "non-ASCII character(s) AND UTF-8 encountered"); - } } else { - ++ counts["utf8"]; + ++ counts["non-ascii"]; } } @@ -422,16 +417,6 @@ EXIT_CODE=0 } } - # Record that the header contained UTF-8 sequences - match($0, /[\300-\367][\200-\277]+/) \ - && (state == "authors" || state == "copyright") { - header_utf8 = 1; - if (counts["non-ascii"] > 0 && is_err("non-ascii")) { - err("non-ascii-utf8", \ - "non-ASCII character(s) AND UTF-8 encountered"); - } - } - # Header-recognition automaton. Read this from bottom to top. # Valid UTF-8 chars are recognised in copyright and authors # TODO: ensure all files are valid UTF-8 before awking them. diff --git a/tools/ci/actions/check-configure.sh b/tools/ci/actions/check-configure.sh index 44e1452a..a86b76ef 100755 --- a/tools/ci/actions/check-configure.sh +++ b/tools/ci/actions/check-configure.sh @@ -25,16 +25,16 @@ set -e -WANT="$(sed -ne 's/^AC_PREREQ(\[\(.*\)\])/\1/p' configure.ac)" -HAVE=$(sh configure -V | grep "^generated by GNU Autoconf" | awk '{print $NF}') -if [ "$WANT" != "$HAVE" ]; then +WANT=$(sed -ne 's/^AC_PREREQ(\[\(.*\)\])/\1/p' configure.ac) +HAVE=$(sh ./configure -V | sed -ne '/generated by GNU Autoconf/s/.* \+//p') +if [[ $WANT != "$HAVE" ]]; then echo -ne '\e[31mWrong Autoconf version: \e[0m ' - echo -e "Have: \e[31m$HAVE\e[0m Want: \e[32m$WANT\e[0m" - echo -e "Run tools/autogen autoconf[-]$WANT" + echo -e 'Have: \e[31m'"$HAVE"'\e[0m Want: \e[32m'"$WANT"'\e[0m' + echo "Run tools/autogen autoconf[-]$WANT" exit 1 fi -if [[ $1 = 'pull_request' ]]; then +if [[ $2 = 'pull_request' ]]; then ALL_COMMITS_MUST_PASS=1 else ALL_COMMITS_MUST_PASS=0 @@ -50,46 +50,37 @@ else COLOR='33' fi -CI_SCRIPT='tools/ci/actions/check-configure.sh' -PATHS=\ -'configure\|configure\.ac\|VERSION\|aclocal\.m4\|build-aux/.*'\ -'\|tools/autogen\|tools/git-dev-options\.sh' - # $1 - commit to checkout files from -# $2 - range of commits to diff -# When testing a single commit, $1 and $2 will be the same; when validating the -# tip of a branch, $1 will be HEAD and $2 will be the range of commits in the -# branch. CheckTree () { - RET=0 + local RET=0 COMMIT="$1" - COMMITS_TO_SEARCH="$2" - if git diff-tree --diff-filter=d --no-commit-id --name-only -r \ - "$COMMITS_TO_SEARCH" | grep -qx "$PATHS\|$CI_SCRIPT"; then - git checkout -qB return - git checkout -q "$COMMIT" - mv configure configure.ref - make -s configure - if diff -q configure configure.ref >/dev/null ; then - echo -e "$COMMIT: \e[32mconfigure.ac generates configure\e[0m" - else - RET=1 - echo -e \ - "$COMMIT: \e[${COLOR}mconfigure.ac doesn't generate configure\e[0m" - fi - mv configure.ref configure - git checkout -q return + git branch -qf 'return' + git checkout -q "$COMMIT" + mv configure configure.ref + tools/autogen + if diff -q configure configure.ref >/dev/null ; then + echo -e "$COMMIT: \e[32mconfigure.ac generates configure\e[0m" + else + RET=1 + echo -e \ + "$COMMIT: \e[${COLOR}mconfigure.ac doesn't generate configure\e[0m" fi + mv configure.ref configure + git checkout -q 'return' return $RET } +PATHS=(tools/ci/actions/check-configure.sh configure configure.ac VERSION \ + aclocal.m4 build-aux tools/autogen tools/git-dev-options.sh) + # $RESULT is 1 for success and 0 for error RESULT=1 # We traverse the commits in commit order; if $ALL_COMMITS_MUST_PASS=0, the # success of the most recent commit of the branch (traversed last) will # override any previous failure. -for commit in $(git rev-list "$MERGE_BASE..$PR_HEAD" --reverse); do - if CheckTree "$commit" "$commit"; then +for commit in $(git rev-list "$MERGE_BASE..$PR_HEAD" --reverse \ + -- "${PATHS[@]}"); do + if CheckTree "$commit"; then if ((!ALL_COMMITS_MUST_PASS)); then # Commit passed, so reset any previous failure RESULT=1 @@ -106,6 +97,6 @@ if ((!RESULT)); then else echo 'Please fix the branch by committing changes after running:' fi - echo 'make -B configure' + echo 'tools/autogen' exit 1 fi diff --git a/tools/ci/actions/check-parsetree-modified.sh b/tools/ci/actions/check-parsetree-modified.sh deleted file mode 100755 index 3438bb9c..00000000 --- a/tools/ci/actions/check-parsetree-modified.sh +++ /dev/null @@ -1,54 +0,0 @@ -#!/usr/bin/env bash -#************************************************************************** -#* * -#* OCaml * -#* * -#* Paul-Elliot Anglès d'Auriac, Tarides * -#* * -#* Copyright 2023 Tarides * -#* * -#* All rights reserved. This file is distributed under the terms of * -#* the GNU Lesser General Public License version 2.1, with the * -#* special exception on linking described in the file LICENSE. * -#* * -#************************************************************************** - -set -e - -# Hygiene Checks: check that whenever the parsetree.mli file has been modified, -# the parsetree-change label has been applied to the PR - -# Exactly of the following must be true: -# - No commit in the PR alters the parsetree.mli file -# - The parsetree-change label is applied to the PR - -API_URL="$1" -shift 1 - -AUTH="authorization: Bearer $GITHUB_TOKEN" - -# We need all the commits in the PR to be available -. tools/ci/actions/deepen-fetch.sh - -COMMIT_RANGE="$MERGE_BASE..$PR_HEAD" - -LABEL='parsetree-change' - -if ! git diff "$COMMIT_RANGE" --name-only --exit-code parsing/parsetree.mli \ - > /dev/null; then - echo -e "The parsetree has been modified." - if curl --silent --header "$AUTH" "$API_URL/labels" | grep -q "$LABEL"; then - echo -e "Label $LABEL is assigned to the PR." - else - echo -e "Please assign the label $LABEL to the PR" - exit 1 - fi -else - echo -e "The parsetree has not been modified." - if curl --silent --header "$AUTH" "$API_URL/labels" | grep -q "$LABEL"; then - echo -e "Please remove the label $LABEL to the PR" - exit 1 - else - echo -e "Label $LABEL is not assigned to the PR" - fi -fi diff --git a/tools/ci/actions/check-typo.sh b/tools/ci/actions/check-typo.sh index 2b837950..b023efe3 100755 --- a/tools/ci/actions/check-typo.sh +++ b/tools/ci/actions/check-typo.sh @@ -77,11 +77,24 @@ export OCAML_CT_CA_FLAG='--cached' rm -f failed COMMIT_RANGE="$MERGE_BASE..$PR_HEAD" + +# If either .gitattributes or tools/check-typo have been changed, set an +# indicator for the "full tree" stage to run +if git diff-tree --diff-filter=d --no-commit-id --name-only -r "$COMMIT_RANGE" \ + | grep -qx '.gitattributes\|tools/check-typo'; then + full_check_needed=true +else + full_check_needed=false +fi +echo "full_check_needed=$full_check_needed" >>"$GITHUB_OUTPUT" + if ((CHECK_ALL_COMMITS)); then # Check each commit in turn for commit in $(git rev-list "$COMMIT_RANGE" --reverse); do CheckTypoTree "$commit" "$commit" done +elif $full_check_needed; then + echo "Full check of the tree is required - skipping checking of changed files" else # Use the range of commits just to get the list of files to check; only HEAD # is scanned. diff --git a/tools/ci/actions/multicoretests.sh b/tools/ci/actions/multicoretests.sh new file mode 100755 index 00000000..4adbd992 --- /dev/null +++ b/tools/ci/actions/multicoretests.sh @@ -0,0 +1,89 @@ +#!/usr/bin/env bash +#************************************************************************** +#* * +#* OCaml * +#* * +#* Samuel Hym, Tarides * +#* * +#* Copyright 2024 Tarides * +#* * +#* All rights reserved. This file is distributed under the terms of * +#* the GNU Lesser General Public License version 2.1, with the * +#* special exception on linking described in the file LICENSE. * +#* * +#************************************************************************** + +set -e + +OCAMLDIR=ocaml +DUNEDIR=dune +MULTICORETESTSDIR=multicoretests + +export PREFIX="$HOME/local" +export PATH="$PREFIX/bin:$PATH" + +fatal() { + printf %s "$1" + exit 1 +} + +build_ocaml() { + # We let build.yml test for warnings + cd "$OCAMLDIR" + if ! ./configure --disable-warn-error --disable-stdlib-manpages \ + --disable-ocamltest --disable-ocamldoc --prefix="$PREFIX" ; then + echo + echo "::group::config.log content ($(wc -l config.log) lines)" + cat config.log + echo '::endgroup::' + exit 1 + fi + + make -j + make install +} + +build_dune() { + cd "$DUNEDIR" + make release + make install PREFIX="$PREFIX" +} + +show_config() { + set -x + ocamlc -config + dune --version +} + +build_testsuite() { + cd "$MULTICORETESTSDIR" + dune build +} + +run_testsuite() { + export QCHECK_MSG_INTERVAL=60 + cd "$MULTICORETESTSDIR" + dune build @ci -j1 --no-buffer --display=quiet --cache=disabled \ + --error-reporting=twice +} + +case "$1" in + ocaml) + build_ocaml + ;; + dune) + build_dune + ;; + show_config) + show_config + ;; + build) + build_testsuite + ;; + testsuite) + run_testsuite + ;; + *) + fatal "Unknown command '$1'" + ;; +esac diff --git a/tools/ci/actions/runner.sh b/tools/ci/actions/runner.sh index b78b53f8..1ab25c16 100755 --- a/tools/ci/actions/runner.sh +++ b/tools/ci/actions/runner.sh @@ -25,6 +25,20 @@ MAKE_WARN="$MAKE --warn-undefined-variables" export PATH=$PREFIX/bin:$PATH +call-configure () { + local failed + ./configure "$@" || failed=$? + if ((failed)); then + # Output seems to be a little unpredictable in GitHub Actions: ensure that + # the fold is definitely on a new line + echo + echo "::group::config.log content ($(wc -l config.log) lines)" + cat config.log + echo '::endgroup::' + exit $failed + fi +} + Configure () { mkdir -p $PREFIX cat< nul > nul || set CYGWIN_UPGRADE_REQUIRED=1 @@ -140,6 +141,7 @@ set CYGWIN_INSTALL_PACKAGES= set CYGWIN_UPGRADE_REQUIRED=%FORCE_CYGWIN_UPGRADE% for %%P in (%CYGWIN_PACKAGES%) do call :CheckPackage %%P +set CYGWIN_INSTALL_PACKAGES=%CYGWIN_INSTALL_PACKAGES%,cygwin=3.6.1-1 call :UpgradeCygwin "%CYG_ROOT%\bin\bash.exe" -lc "$APPVEYOR_BUILD_FOLDER/tools/ci/appveyor/appveyor_build.sh install" || exit /b 1 diff --git a/tools/ci/appveyor/appveyor_build.sh b/tools/ci/appveyor/appveyor_build.sh index ea43236b..b2898339 100755 --- a/tools/ci/appveyor/appveyor_build.sh +++ b/tools/ci/appveyor/appveyor_build.sh @@ -29,22 +29,22 @@ fi git config --global --add safe.directory '*' function run { - if [[ $1 = "--show" ]] ; then SHOW_CMD='true'; shift; else SHOW_CMD=''; fi - NAME=$1 - shift - echo "-=-=- $NAME -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-" - if [[ -n $SHOW_CMD ]]; then (set -x; "$@"); else "$@"; fi - CODE=$? - if [[ $CODE -ne 0 ]] ; then - echo "-=-=- $NAME failed! -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-" - if [[ $BUILD_PID -ne 0 ]] ; then - kill -KILL $BUILD_PID 2>/dev/null - wait $BUILD_PID 2>/dev/null - fi - exit $CODE - else - echo "-=-=- End of $NAME -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-" + if [[ $1 = "--show" ]] ; then SHOW_CMD='true'; shift; else SHOW_CMD=''; fi + NAME=$1 + shift + echo "-=-=- $NAME -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-" + if [[ -n $SHOW_CMD ]]; then (set -x; "$@"); else "$@"; fi + CODE=$? + if [[ $CODE -ne 0 ]] ; then + echo "-=-=- $NAME failed! -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-" + if [[ $BUILD_PID -ne 0 ]] ; then + kill -KILL $BUILD_PID 2>/dev/null + wait $BUILD_PID 2>/dev/null fi + exit $CODE + else + echo "-=-=- End of $NAME -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-" + fi } # Function: set_configuration @@ -52,60 +52,47 @@ function run { # $1:the Windows port. Recognized values: mingw, msvc and msvc64 # $2: the prefix to use to install function set_configuration { - case "$1" in - cygwin*) - dep='--disable-dependency-generation' - man='' - ;; - mingw32) - host='--host=i686-w64-mingw32' - dep='--disable-dependency-generation' - man='' - ;; - mingw64) - host='--host=x86_64-w64-mingw32' - dep='--disable-dependency-generation' - man='--disable-stdlib-manpages' - ;; - msvc32) - host='--host=i686-pc-windows' - dep='--disable-dependency-generation' - man='' - ;; - msvc64) - host='--host=x86_64-pc-windows' - # Explicitly test dependency generation on msvc64 - dep='--enable-dependency-generation' - man='' - ;; - esac + mkdir -p "$CACHE_DIRECTORY" - mkdir -p "$CACHE_DIRECTORY" + local CACHE_KEY CACHE_FILE_PREFIX CACHE_FILE + CACHE_KEY=$({ cat configure; uname; } | sha1sum | cut -c 1-7) + CACHE_FILE_PREFIX="$CACHE_DIRECTORY/config.cache-$1" + CACHE_FILE="$CACHE_FILE_PREFIX-$CACHE_KEY" - local CACHE_KEY CACHE_FILE_PREFIX CACHE_FILE - CACHE_KEY=$({ cat configure; uname; } | sha1sum | cut -c 1-7) - CACHE_FILE_PREFIX="$CACHE_DIRECTORY/config.cache-$1" - CACHE_FILE="$CACHE_FILE_PREFIX-$CACHE_KEY" + args=('--cache-file' "$CACHE_FILE" '--prefix' "$2" '--enable-ocamltest') - # Remove old configure cache if the configure script or the OS - # have changed - if [[ ! -f "$CACHE_FILE" ]] ; then - rm -f -- "$CACHE_FILE_PREFIX"* - fi + case "$1" in + cygwin*) + args+=('--disable-dependency-generation');; + mingw32) + args+=('--host=i686-w64-mingw32' '--disable-dependency-generation');; + mingw64) + args+=('--host=x86_64-w64-mingw32' '--disable-dependency-generation' \ + '--disable-stdlib-manpages');; + msvc32) + args+=('--host=i686-pc-windows' '--disable-dependency-generation');; + msvc64) + # Explicitly test dependency generation on msvc64 + args+=('--host=x86_64-pc-windows' '--enable-dependency-generation');; + esac - # Remove configure cache if the script has failed - if ! ./configure --cache-file="$CACHE_FILE" $dep $build $man $host \ - --prefix="$2" --enable-ocamltest ; then - rm -f -- "$CACHE_FILE" - local failed - ./configure --cache-file="$CACHE_FILE" $dep $build $man $host \ - --prefix="$2" --enable-ocamltest \ - || failed=$? - if ((failed)) ; then cat config.log ; exit $failed ; fi - fi + # Remove old configure cache if the configure script or the OS + # have changed + if [[ ! -f "$CACHE_FILE" ]] ; then + rm -f -- "$CACHE_FILE_PREFIX"* + fi -# FILE=$(pwd | cygpath -f - -m)/Makefile.config -# run "Content of $FILE" cat Makefile.config + echo './configure' "${args[@]@Q}" + if ! ./configure "${args[@]}"; then + # Remove configure cache if the script has failed + rm -f -- "$CACHE_FILE" + local failed + ./configure "${args[@]}" || failed=$? + if ((failed)) ; then cat config.log ; exit $failed ; fi + fi + +# FILE=$(pwd | cygpath -f - -m)/Makefile.config +# run "Content of $FILE" cat Makefile.config } PARALLEL_URL='https://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel' @@ -161,17 +148,26 @@ case "$1" in $FULL_BUILD_PREFIX-$PORT/runtime/*.a \ $FULL_BUILD_PREFIX-$PORT/otherlibs/*/lib*.a fi - # The testsuite is too slow to run on AppVeyor in full. Run the dynlink - # tests now (to include natdynlink) - run "test dynlink $PORT" \ - $MAKE -C "$FULL_BUILD_PREFIX-$PORT/testsuite" parallel-lib-dynlink - # Now reconfigure ocamltest to run in bytecode-only mode - sed -i '/native_/s/true/false/' \ - "$FULL_BUILD_PREFIX-$PORT/ocamltest/ocamltest_config.ml" - $MAKE -C "$FULL_BUILD_PREFIX-$PORT" -j ocamltest ocamltest.opt - # And run the entire testsuite, skipping all the native-code tests - run "test $PORT" \ - make -C "$FULL_BUILD_PREFIX-$PORT/testsuite" SHOW_TIMINGS=1 all + run_testsuite=true + if [[ -n $APPVEYOR_PULL_REQUEST_NUMBER ]]; then + API_URL="https://api.github.com/repos/$APPVEYOR_REPO_NAME/issues/$APPVEYOR_PULL_REQUEST_NUMBER" + if curl --silent "$API_URL/labels" | grep -q "no-testsuite"; then + run_testsuite=false + fi + fi + if $run_testsuite; then + # The testsuite is too slow to run on AppVeyor in full. Run the dynlink + # tests now (to include natdynlink) + run "test dynlink $PORT" \ + $MAKE -C "$FULL_BUILD_PREFIX-$PORT/testsuite" parallel-lib-dynlink + # Now reconfigure ocamltest to run in bytecode-only mode + sed -i '/native_/s/true/false/' \ + "$FULL_BUILD_PREFIX-$PORT/ocamltest/ocamltest_config.ml" + $MAKE -C "$FULL_BUILD_PREFIX-$PORT" -j ocamltest ocamltest.opt + # And run the entire testsuite, skipping all the native-code tests + run "test $PORT" \ + make -C "$FULL_BUILD_PREFIX-$PORT/testsuite" SHOW_TIMINGS=1 all + fi run "install $PORT" $MAKE -C "$FULL_BUILD_PREFIX-$PORT" install if [[ $PORT = 'msvc64' ]] ; then run "$MAKE check_all_arches" \ diff --git a/tools/ci/inria/main b/tools/ci/inria/main index 5ece025c..4dcf83e0 100755 --- a/tools/ci/inria/main +++ b/tools/ci/inria/main @@ -155,7 +155,7 @@ conffile=Makefile.config make=make instdir="$HOME/ocaml-tmp-install" confoptions="--enable-ocamltest --enable-dependency-generation \ -${OCAML_CONFIGURE_OPTIONS}" +--enable-codegen-invariants ${OCAML_CONFIGURE_OPTIONS}" make_native=true cleanup=false check_make_alldepend=false diff --git a/tools/gdb.py b/tools/gdb.py index 15953ee6..8b5cd176 100644 --- a/tools/gdb.py +++ b/tools/gdb.py @@ -119,6 +119,9 @@ class GDBValue: def double_array(self, size): return self._v.cast(self._target._double_type.array(size-1)._t) + def pointer_index(self, index): + return GDBValue(self._v[index], self._target) + class GDBTarget: def __init__(self): self._value_type = GDBType(gdb.lookup_type('value')) diff --git a/tools/lldb.py b/tools/lldb.py index e1d6a60f..fea8f3b6 100644 --- a/tools/lldb.py +++ b/tools/lldb.py @@ -102,7 +102,7 @@ class LLDBValue: return LLDBValue(self._v.Dereference(), self._target) def struct(self): - t = self._v.GetType() + t = self._v.type fields = t.GetNumberOfFields() return {member.name: LLDBValue(self._v.GetChildMemberWithName(member.name), @@ -157,6 +157,11 @@ class LLDBValue: def double_array(self, size): return self._v.Cast(self._target._double_type.array(size)._t) + def pointer_index(self, index): + t = self._v.type.GetPointeeType() + address = self.unsigned() + index * t.size + return self._target._create_value("[]", address, LLDBType(t)) + class LLDBTarget: def __init__(self, target): self._target = target diff --git a/tools/ocaml.py b/tools/ocaml.py index 81ad16ff..41f1cb51 100644 --- a/tools/ocaml.py +++ b/tools/ocaml.py @@ -98,6 +98,9 @@ # # double_array(size): an array of double-precision floating point # members, as a debugger-native array. +# +# pointer_index(index): treating the value as a pointer p, returning +# p[index] as a value. TODO: switch to __getitem__. MAX_BLOCK_SLOTS = 8 MAX_STRING_LEN = 80 @@ -480,11 +483,12 @@ class Value: POOL_WSIZE = 4096 class Finder: + debug = False # Settable interactively from debugger. + def __init__(self, target): self._sizeclasses = None self._wsize_sizeclass = None self._target = target - self.debug = False def sizeclasses(self): if self._sizeclasses is None: @@ -556,6 +560,9 @@ class Finder: def search_heap(self, description, heap_state_p): "Searches a single `struct caml_heap_state *` for self.address." + if heap_state_p.unsigned() == 0: + self._log(f"shared heap for {description} is NULL") + return heap_state = heap_state_p.dereference().struct() if self.keep_going: self.search_pools(f"{description} avail", @@ -576,18 +583,18 @@ class Finder: self.search_large(f"{description} unswept", heap_state['unswept_large']) - def search_domain(self, index, dom_state_p): + def search_domain(self, index, caml_state_p): "Search a single domain's heap for `self.address`." - dom_state = dom_state_p.dereference().struct() - young_start = dom_state['young_start'].unsigned() - young_end = dom_state['young_end'].unsigned() + caml_state = caml_state_p.dereference().struct() + young_start = caml_state['young_start'].unsigned() + young_end = caml_state['young_end'].unsigned() description = f"domain {index}" self._log(f"searching {description}") if self.keep_going and (young_start <= self.address <= young_end): self._found(f"{description} minor heap " f"0x{young_start:x}-0x{young_end:x}") if self.keep_going: - self.search_heap(description, dom_state['shared_heap']) + self.search_heap(description, caml_state['shared_heap']) def find(self, expr, val): if not val.valid: @@ -612,14 +619,17 @@ class Finder: # Search per-domain heaps. all_domains = self._target.global_variable('all_domains') - Max_domains = all_domains.array_size() - self._log(f"{Max_domains} domains.") - for i in range(Max_domains): - dom = all_domains.sub(i).struct() - dom_state_p = dom['state'] - if dom_state_p.unsigned() == 0: # null pointer: no domain + caml_params = (self._target.global_variable('caml_params') + .dereference().struct()) + max_domains = caml_params['max_domains'].unsigned() + self._log(f"{max_domains} domains.") + for i in range(max_domains): + dom_internal = all_domains.pointer_index(i).struct() + caml_state_p = dom_internal['state'] + if caml_state_p.unsigned() == 0: # null pointer: no domain + self._log(f"caml_state for domain {i} is NULL") continue - self.search_domain(i, dom_state_p) + self.search_domain(i, caml_state_p) if not self.keep_going: break @@ -641,5 +651,3 @@ class Finder: print(f" {where}") else: print(f"{expr} {str(val)} not found on heap") - - self.debug = True diff --git a/tools/ocamlcp_common.ml b/tools/ocamlcp_common.ml index 7fcacc94..3b63adef 100644 --- a/tools/ocamlcp_common.ml +++ b/tools/ocamlcp_common.ml @@ -106,6 +106,11 @@ module Make(T: OCAMLCP) = struct cannot_deal_with "-intf" ".ml files"; if !with_impl then rev_profargs := "-impl" :: !rev_profargs; if !with_intf then rev_profargs := "-intf" :: !rev_profargs; + begin match !Clflags.keyword_edition with + | None -> () + | Some k -> + rev_profargs := ("-keywords " ^ k) :: !rev_profargs + end; let status = let profiling_object = if T.bytecode then "profiling.cmo" else "profiling.cmx" in diff --git a/tools/ocamlprof.ml b/tools/ocamlprof.ml index 256659ec..78ea974e 100644 --- a/tools/ocamlprof.ml +++ b/tools/ocamlprof.ml @@ -154,6 +154,11 @@ let case { pc_rhs; pc_guard } = { rhs = pc_rhs; guard = pc_guard } let rec rewrite_patexp_list iflag l = rewrite_exp_list iflag (List.map (fun x -> x.pvb_expr) l) +and rewrite_case_body iflag rhs = + match rhs.pexp_desc with + | Pexp_unreachable -> () + | _ -> rewrite_exp iflag rhs + and rewrite_cases iflag l = List.iter (fun pc -> @@ -161,7 +166,7 @@ and rewrite_cases iflag l = | None -> () | Some g -> rewrite_exp iflag g end; - rewrite_exp iflag pc.pc_rhs + rewrite_case_body iflag pc.pc_rhs ) l @@ -215,7 +220,7 @@ and rw_exp iflag sexp = rewrite_exp_list iflag (List.map snd sargs) | Pexp_tuple sexpl -> - rewrite_exp_list iflag sexpl + List.iter (fun (_, e) -> rewrite_exp iflag e) sexpl | Pexp_construct(_, None) -> () | Pexp_construct(_, Some sarg) -> @@ -238,7 +243,7 @@ and rw_exp iflag sexp = rewrite_exp iflag srecord; rewrite_exp iflag snewval - | Pexp_array(sargl) -> + | Pexp_array sargl -> rewrite_exp_list iflag sargl | Pexp_ifthenelse(scond, sifso, None) -> @@ -298,7 +303,7 @@ and rw_exp iflag sexp = | Pexp_newtype (_, sexp) -> rewrite_exp iflag sexp | Pexp_open (_, e) -> rewrite_exp iflag e - | Pexp_pack (smod) -> rewrite_mod iflag smod + | Pexp_pack (smod, _) -> rewrite_mod iflag smod | Pexp_letop {let_; ands; body; _} -> rewrite_exp iflag let_.pbop_exp; List.iter (fun {pbop_exp; _} -> rewrite_exp iflag pbop_exp) ands; @@ -318,12 +323,18 @@ and rewrite_annotate_exp_list l = (function | {guard=Some scond; rhs=sbody} -> insert_profile rw_exp scond; - insert_profile rw_exp sbody; + rewrite_annotate_rhs sbody | {rhs={pexp_desc = Pexp_constraint(sbody, _)}} (* let f x : t = e *) - -> insert_profile rw_exp sbody - | {rhs=sexp} -> insert_profile rw_exp sexp) + -> rewrite_annotate_rhs sbody + | {rhs=sexp} -> rewrite_annotate_rhs sexp + ) l +and rewrite_annotate_rhs rhs = + match rhs.pexp_desc with + | Pexp_unreachable -> () + | _ -> insert_profile rw_exp rhs + and rewrite_function iflag = function | [{guard=None; rhs={pexp_desc = (Pexp_function _)} as sexp}] @@ -505,6 +516,8 @@ let main () = "-instrument", Arg.Set instr_mode, " (undocumented)"; "-intf", Arg.String process_intf_file, " Process as a .mli file"; + "-keywords", Arg.String (fun s -> Clflags.keyword_edition := Some s), + " Specify keyword set."; "-m", Arg.String (fun s -> modes := s), " (undocumented)"; "-version", Arg.Unit print_version, " Print version and exit"; diff --git a/tools/pre-commit-githook b/tools/pre-commit-githook index 5b044373..9131071e 100755 --- a/tools/pre-commit-githook +++ b/tools/pre-commit-githook @@ -175,7 +175,7 @@ if git diff --diff-filter=d --staged --name-only | grep -qx "$PATHS" ; then fi else echo 'configure.ac does not appear to generate configure' - echo 'Try running make -B configure and stage the changes' + echo 'Try running tools/autogen and stage the changes' echo "$OVERRIDE_MESSAGE" git diff --text --no-index a b STATUS=1 diff --git a/tools/sync_stdlib_docs b/tools/sync_stdlib_docs index 6ac3c39b..c143ae40 100755 --- a/tools/sync_stdlib_docs +++ b/tools/sync_stdlib_docs @@ -25,7 +25,7 @@ fi #Removes a label, i.e a space, a variable name, followed by a colon followed by #an alphabetic character or ( or '. This should avoid altering the contents of #comments. -LABREGEX="s/ [a-z_]+:([a-z\('])/ \1/g" +LABREGEX="s/ [a-z_]+:([A-Za-z\('])/ \1/g" #A second, slightly different round sometimes required to deal with f:(key:key LABLABREGEX="s/\([a-z_]+:([a-z\('])/\(\1/g" diff --git a/toplevel/byte/topeval.ml b/toplevel/byte/topeval.ml index 14c60503..9fbba9e9 100644 --- a/toplevel/byte/topeval.ml +++ b/toplevel/byte/topeval.ml @@ -123,16 +123,7 @@ let execute_phrase print_outcome ppf phr = match phr with | Ptop_def sstr -> let oldenv = !toplevel_env in - Typecore.reset_delayed_checks (); - let (str, sg, sn, shape, newenv) = - Typemod.type_toplevel_phrase oldenv sstr - in - if !Clflags.dump_typedtree then Printtyped.implementation ppf str; - let sg' = Typemod.Signature_names.simplify newenv sn sg in - Includemod.check_implementation oldenv sg sg'; - Typecore.force_delayed_checks (); - let shape = Shape_reduce.local_reduce Env.empty shape in - if !Clflags.dump_shape then Shape.print ppf shape; + let (str, sg', newenv) = typecheck_phrase ppf oldenv sstr in let lam = Translmod.transl_toplevel_definition str in Warnings.check_fatal (); begin try diff --git a/toplevel/byte/trace.ml b/toplevel/byte/trace.ml index 1712c5ff..bddb4b3f 100644 --- a/toplevel/byte/trace.ml +++ b/toplevel/byte/trace.ml @@ -71,8 +71,8 @@ let rec instrument_result env name ppf clos_typ = | Tarrow(l, t1, t2, _) -> let starred_name = match name with - | Lident s -> Lident(s ^ "*") - | Ldot(lid, s) -> Ldot(lid, s ^ "*") + | Lident s -> Lident(s ^ "*" ) + | Ldot(lid, id) -> Ldot(lid, { id with txt = id.txt ^ "*" }) | Lapply _ -> fatal_error "Trace.instrument_result" in let trace_res = instrument_result env starred_name ppf t2 in (fun clos_val -> diff --git a/toplevel/genprintval.ml b/toplevel/genprintval.ml index 25069ddf..f31a3377 100644 --- a/toplevel/genprintval.ml +++ b/toplevel/genprintval.ml @@ -20,8 +20,8 @@ open Format open Longident open Path open Types +open Data_types open Outcometree -module Out_name = Out_type.Out_name module type OBJ = sig @@ -84,6 +84,8 @@ module Make(O : OBJ)(EVP : EVALPATH with type valu = O.t) = struct with _exn -> 0 end) + let tree_of_name (name : string) = + Oide_ident (Out_type.Out_name.create name) (* Given an exception value, we cannot recover its type, hence we cannot print its arguments in general. @@ -103,7 +105,7 @@ module Make(O : OBJ)(EVP : EVALPATH with type valu = O.t) = struct else if O.tag arg = Obj.double_tag then list := Oval_float (O.obj arg : float) :: !list else - list := Oval_constr (Oide_ident (Out_name.create "_"), []) :: !list + list := Oval_constr (tree_of_name "_", []) :: !list done; List.rev !list end @@ -111,8 +113,8 @@ module Make(O : OBJ)(EVP : EVALPATH with type valu = O.t) = struct let outval_of_untyped_exception bucket = if O.tag bucket <> 0 then - let name = Out_name.create (O.obj (O.field bucket 0) : string) in - Oval_constr (Oide_ident name, []) + let name = (O.obj (O.field bucket 0) : string)in + Oval_constr (tree_of_name name, []) else let name = (O.obj(O.field(O.field bucket 0) 0) : string) in let args = @@ -123,7 +125,7 @@ module Make(O : OBJ)(EVP : EVALPATH with type valu = O.t) = struct && O.tag(O.field bucket 1) = 0 then outval_of_untyped_exception_args (O.field bucket 1) 0 else outval_of_untyped_exception_args bucket 1 in - Oval_constr (Oide_ident (Out_name.create name), args) + Oval_constr (tree_of_name name, args) (* The user-defined printers. Also used for some builtin types. *) @@ -204,34 +206,72 @@ module Make(O : OBJ)(EVP : EVALPATH with type valu = O.t) = struct it comes from. Attempt to omit the prefix if the type comes from a module that has been opened. *) - let tree_of_qualified find env ty_path name = - match ty_path with - | Pident _ -> - Oide_ident name - | Pdot(p, _s) -> - if - match get_desc (find (Lident (Out_name.print name)) env) with - | Tconstr(ty_path', _, _) -> Path.same ty_path ty_path' - | _ -> false - | exception Not_found -> false - then Oide_ident name - else Oide_dot (Out_type.tree_of_path p, Out_name.print name) - | Papply _ -> - Out_type.tree_of_path ty_path - | Pextra_ty _ -> - (* These can only appear directly inside of the associated - constructor so we can just drop the prefix *) - Oide_ident name + let tree_of_qualified lookup_all get_path env ty_path name = + (*First, we rewrite double underscore [__] into [.] whenever possible *) + let ty_path = Out_type.rewrite_double_underscore_paths env ty_path in + (* If [ty_path] is [M.N.t] and [name] is [Foo], we want to find + a short name for [M.N.Foo] in the current typing environment. + Our strategy is to try [Foo], [N.Foo] and [M.N.Foo] in + turn. *) + + (* Start by transforming the path [M.N.t] into the Longident [M.N.Foo]. *) + let lid = match Untypeast.lident_of_path ty_path with + | Lident _ -> Lident name + | Ldot (p,_) -> Ldot(p, Location.mknoloc name) + | x -> x + in + + (* [candidates exn M.N.Foo] is [Foo; N.Foo; M.N.Foo]. + @raise [exn] on functor application. *) + let candidates apply_exn lid = + (* [loop M.N [Foo]] is [[Foo]; [N; Foo]; [M; N; Foo]] *) + let rec loop lid suff = match lid with + | Lident last -> [suff; (last :: suff)] + | Ldot({txt=p; _}, {txt=s; _}) -> suff :: loop p (s :: suff) + | Lapply _ -> raise apply_exn + in + loop lid [] (* [[]; [Foo]; [N; Foo]; [M; N; Foo]] *) + |> List.filter_map Longident.unflatten + in + + (* A shorter name is correct (matches) if one of its possible + interpretations (there may be several constructors with the + same name at different types in a module) has the same type + path as the one we are printing. *) + let matches lid = + match lookup_all lid env with + | Error _ -> false + | Ok cstrs -> + List.exists (fun (cstr, _) -> + Path.same (get_path cstr) ty_path + ) cstrs + in + + let rec tree_of_lident = function + | Lident name -> + tree_of_name name + | Ldot ({txt=lid; _}, {txt=name; _}) -> + Oide_dot (tree_of_lident lid, name) + | Lapply ({txt=lid1; _}, {txt=lid2; _}) -> + Oide_apply (tree_of_lident lid1, tree_of_lident lid2) + in + + let exception Functor_application in + match List.find matches (candidates Functor_application lid) with + | exception (Functor_application | Not_found) -> + tree_of_lident lid + | best_lid -> + tree_of_lident best_lid let tree_of_constr = tree_of_qualified - (fun lid env -> - (Env.find_constructor_by_name lid env).cstr_res) + (Env.lookup_all_constructors ~use:false ~loc:Location.none Env.Positive) + Data_types.cstr_res_type_path and tree_of_label = tree_of_qualified - (fun lid env -> - (Env.find_label_by_name lid env).lbl_res) + (Env.lookup_all_labels ~use:false ~loc:Location.none Env.Construct) + Data_types.lbl_res_type_path (* An abstract type *) @@ -276,54 +316,21 @@ module Make(O : OBJ)(EVP : EVALPATH with type valu = O.t) = struct Oval_stuff "" | Tarrow _ -> Oval_stuff "" - | Ttuple(ty_list) -> - Oval_tuple (tree_of_val_list 0 depth obj ty_list) + | Ttuple(labeled_tys) -> + Oval_tuple (tree_of_labeled_val_list 0 depth obj labeled_tys) | Tconstr(path, ty_list, _) -> begin match get_desc (Ctype.expand_head env ty) with | Tconstr(path, [ty_arg], _) when Path.same path Predef.path_list -> - if O.is_block obj then - match check_depth depth obj ty with - Some x -> x - | None -> - let rec tree_of_conses tree_list depth obj ty_arg = - if !printer_steps < 0 || depth < 0 then - Oval_ellipsis :: tree_list - else if O.is_block obj then - let tree = nest tree_of_val (depth - 1) - (O.field obj 0) ty_arg - in - let next_obj = O.field obj 1 in - nest_gen (Oval_stuff "" :: tree :: tree_list) - (tree_of_conses (tree :: tree_list)) - depth next_obj ty_arg - else tree_list - in - Oval_list - (List.rev (tree_of_conses [] depth obj ty_arg)) - else - Oval_list [] + tree_of_list depth obj ty_arg | Tconstr(path, [ty_arg], _) when Path.same path Predef.path_array -> - let length = O.size obj in - if length > 0 then - match check_depth depth obj ty with - Some x -> x - | None -> - let rec tree_of_items tree_list i = - if !printer_steps < 0 || depth < 0 then - Oval_ellipsis :: tree_list - else if i < length then - let tree = nest tree_of_val (depth - 1) - (O.field obj i) ty_arg - in - tree_of_items (tree :: tree_list) (i + 1) - else tree_list - in - Oval_array (List.rev (tree_of_items [] 0)) - else - Oval_array [] + tree_of_generic_array Asttypes.Mutable depth obj ty_arg + + | Tconstr(path, [ty_arg], _) + when Path.same path Predef.path_iarray -> + tree_of_generic_array Asttypes.Immutable depth obj ty_arg | Tconstr(path, [], _) when Path.same path Predef.path_string -> @@ -334,157 +341,34 @@ module Make(O : OBJ)(EVP : EVALPATH with type valu = O.t) = struct let s = Bytes.to_string (O.obj obj : bytes) in Oval_string (s, !printer_steps, Ostr_bytes) + | Tconstr(path, [], _) + when Path.same path Predef.path_floatarray -> + Oval_floatarray (O.obj obj : floatarray) + | Tconstr (path, [ty_arg], _) when Path.same path Predef.path_lazy_t -> - let obj_tag = O.tag obj in - (* Lazy values are represented in three possible ways: - - 1. a lazy thunk that is not yet forced has tag - Obj.lazy_tag - - 2. a lazy thunk that has just been forced has tag - Obj.forward_tag; its first field is the forced - result, which we can print - - 3. when the GC moves a forced trunk with forward_tag, - or when a thunk is directly created from a value, - we get a third representation where the value is - directly exposed, without the Obj.forward_tag - (if its own tag is not ambiguous, that is neither - lazy_tag nor forward_tag) - - Note that using Lazy.is_val and Lazy.force would be - unsafe, because they use the Obj.* functions rather - than the O.* functions of the functor argument, and - would thus crash if called from the toplevel - (debugger/printval instantiates Genprintval.Make with - an Obj module talking over a socket). - *) - if obj_tag = Obj.lazy_tag then Oval_stuff "" - else begin - let forced_obj = - if obj_tag = Obj.forward_tag then O.field obj 0 else obj - in - (* calling oneself recursively on forced_obj risks - having a false positive for cycle detection; - indeed, in case (3) above, the value is stored - as-is instead of being wrapped in a forward - pointer. It means that, for (lazy "foo"), we have - forced_obj == obj - and it is easy to wrongly print (lazy ) in such - a case (PR#6669). - - Unfortunately, there is a corner-case that *is* - a real cycle: using unboxed types one can define - - type t = T : t Lazy.t -> t [@@unboxed] - let rec x = lazy (T x) - - which creates a Forward_tagged block that points to - itself. For this reason, we still "nest" - (detect head cycles) on forward tags. - *) - let v = - if obj_tag = Obj.forward_tag - then nest tree_of_val depth forced_obj ty_arg - else tree_of_val depth forced_obj ty_arg - in - Oval_lazy v - end - | _ -> begin try - let decl = Env.find_type path env in - match decl with + tree_of_lazy depth obj ty_arg + + | _ -> + match Env.find_type path env with + | exception Not_found | {type_kind = Type_abstract _; type_manifest = None} -> Oval_stuff "" - | {type_kind = Type_abstract _; type_manifest = Some body} -> + | {type_kind = Type_abstract _; type_manifest = Some body; + type_params} -> tree_of_val depth obj - (instantiate_type env decl.type_params ty_list body) - | {type_kind = Type_variant (constr_list,rep)} -> - let unbx = (rep = Variant_unboxed) in - let tag = - if unbx then Cstr_unboxed - else if O.is_block obj - then Cstr_block(O.tag obj) - else Cstr_constant(O.obj obj) in - let {cd_id;cd_args;cd_res} = - Datarepr.find_constr_by_tag tag constr_list in - let type_params = - match cd_res with - Some t -> - begin match get_desc t with - Tconstr (_,params,_) -> - params - | _ -> assert false end - | None -> decl.type_params - in - begin - match cd_args with - | Cstr_tuple l -> - let ty_args = - instantiate_types env type_params ty_list l in - tree_of_constr_with_args (tree_of_constr env path) - (Ident.name cd_id) false 0 depth obj - ty_args unbx - | Cstr_record lbls -> - let r = - tree_of_record_fields depth - env path type_params ty_list - lbls 0 obj unbx - in - Oval_constr(tree_of_constr env path - (Out_name.create (Ident.name cd_id)), - [ r ]) - end - | {type_kind = Type_record(lbl_list, rep)} -> - begin match check_depth depth obj ty with - Some x -> x - | None -> - let pos = - match rep with - | Record_extension _ -> 1 - | _ -> 0 - in - let unbx = - match rep with Record_unboxed _ -> true | _ -> false - in - tree_of_record_fields depth - env path decl.type_params ty_list - lbl_list pos obj unbx - end + (instantiate_type env type_params ty_list body) + | {type_kind = Type_variant (constr_list,rep); type_params} -> + tree_of_variant depth path type_params ty_list obj + constr_list rep + | {type_kind = Type_record(lbl_list, rep); type_params} -> + tree_of_record depth path type_params ty_list obj + lbl_list rep | {type_kind = Type_open} -> tree_of_extension path ty_list depth obj - with - Not_found -> (* raised by Env.find_type *) - Oval_stuff "" - | Datarepr.Constr_not_found -> (* raised by find_constr_by_tag *) - Oval_stuff "" - end end | Tvariant row -> - if O.is_block obj then - let tag : int = O.obj (O.field obj 0) in - let rec find = function - | (l, f) :: fields -> - if Btype.hash_variant l = tag then - match row_field_repr f with - | Rpresent(Some ty) | Reither(_,[ty],_) -> - let args = - nest tree_of_val (depth - 1) (O.field obj 1) ty - in - Oval_variant (l, Some args) - | _ -> find fields - else find fields - | [] -> Oval_stuff "" in - find (row_fields row) - else - let tag : int = O.obj obj in - let rec find = function - | (l, _) :: fields -> - if Btype.hash_variant l = tag then - Oval_variant (l, None) - else find fields - | [] -> Oval_stuff "" in - find (row_fields row) + tree_of_polyvariant depth obj row | Tobject (_, _) -> Oval_stuff "" | Tsubst _ | Tfield(_, _, _, _) | Tnil | Tlink _ -> @@ -495,6 +379,160 @@ module Make(O : OBJ)(EVP : EVALPATH with type valu = O.t) = struct Oval_stuff "" end + and tree_of_list depth obj ty_arg = + if not (O.is_block obj) then Oval_list [] + else match check_depth depth obj ty with + | Some x -> x + | None -> + let rec tree_of_conses tree_list depth obj ty_arg = + if !printer_steps < 0 || depth < 0 then + Oval_ellipsis :: tree_list + else if O.is_block obj then + let tree = nest tree_of_val (depth - 1) + (O.field obj 0) ty_arg + in + let next_obj = O.field obj 1 in + nest_gen (Oval_stuff "" :: tree :: tree_list) + (tree_of_conses (tree :: tree_list)) + depth next_obj ty_arg + else tree_list + in + Oval_list + (List.rev (tree_of_conses [] depth obj ty_arg)) + + and tree_of_generic_array am depth obj ty_arg = + let length = O.size obj in + if length = 0 then Oval_array ([], am) + else match check_depth depth obj ty with + | Some x -> x + | None -> + let rec tree_of_items tree_list i = + if !printer_steps < 0 || depth < 0 then + Oval_ellipsis :: tree_list + else if i < length then + let tree = nest tree_of_val (depth - 1) + (O.field obj i) ty_arg + in + tree_of_items (tree :: tree_list) (i + 1) + else tree_list + in + Oval_array (List.rev (tree_of_items [] 0), am) + + and tree_of_lazy depth obj ty_arg = + let obj_tag = O.tag obj in + (* Lazy values are represented in several possible ways: + + 1. a lazy thunk that is not yet forced has tag + Obj.lazy_tag + + 1bis. a lazy thunk that is in the process of + being forced has tag Obj.forcing_tag + + 2. a lazy thunk that has just been forced has tag + Obj.forward_tag; its first field is the forced + result, which we can print + + 3. when the GC moves a forced trunk with forward_tag, + or when a thunk is directly created from a value, + we get a third representation where the value is + directly exposed, without the Obj.forward_tag + (if its own tag is not ambiguous, that is neither + lazy_tag nor forward_tag) + + Note that using Lazy.is_val and Lazy.force would be + unsafe, because they use the Obj.* functions rather + than the O.* functions of the functor argument, and + would thus crash if called from the toplevel + (debugger/printval instantiates Genprintval.Make with + an Obj module talking over a socket). + *) + if obj_tag = Obj.lazy_tag then Oval_stuff "" + else if obj_tag = Obj.forcing_tag then Oval_stuff "" + else begin + let forced_obj = + if obj_tag = Obj.forward_tag then O.field obj 0 else obj + in + (* calling oneself recursively on forced_obj risks + having a false positive for cycle detection; + indeed, in case (3) above, the value is stored + as-is instead of being wrapped in a forward + pointer. It means that, for (lazy "foo"), we have + forced_obj == obj + and it is easy to wrongly print (lazy ) in such + a case (PR#6669). + + Unfortunately, there is a corner-case that *is* + a real cycle: using unboxed types one can define + + type t = T : t Lazy.t -> t [@@unboxed] + let rec x = lazy (T x) + + which creates a Forward_tagged block that points to + itself. For this reason, we still "nest" + (detect head cycles) on forward tags. + *) + let v = + if obj_tag = Obj.forward_tag + then nest tree_of_val depth forced_obj ty_arg + else tree_of_val depth forced_obj ty_arg + in + Oval_lazy v + end + + and tree_of_variant depth path type_params ty_list obj constr_list rep = + let unbx = (rep = Variant_unboxed) in + let tag = + if unbx then Cstr_unboxed + else if O.is_block obj + then Cstr_block(O.tag obj) + else Cstr_constant(O.obj obj) in + match Datarepr.find_constr_by_tag tag constr_list with + | exception Datarepr.Constr_not_found -> + Oval_stuff "" + | {cd_id;cd_args;cd_res} -> + let type_params = + match cd_res with + Some t -> + begin match get_desc t with + Tconstr (_,params,_) -> + params + | _ -> assert false end + | None -> type_params + in + begin + match cd_args with + | Cstr_tuple l -> + let ty_args = + instantiate_types env type_params ty_list l in + tree_of_constr_with_args (tree_of_constr env path) + (Ident.name cd_id) false 0 depth obj + ty_args unbx + | Cstr_record lbls -> + let r = + tree_of_record_fields depth + env path type_params ty_list + lbls 0 obj unbx + in + Oval_constr(tree_of_constr env path (Ident.name cd_id), + [ r ]) + end + + and tree_of_record depth path type_params ty_list obj lbl_list rep = + match check_depth depth obj ty with + | Some x -> x + | None -> + let pos = + match rep with + | Record_extension _ -> 1 + | _ -> 0 + in + let unbx = + match rep with Record_unboxed _ -> true | _ -> false + in + tree_of_record_fields depth + env path type_params ty_list + lbl_list pos obj unbx + and tree_of_record_fields depth env path type_params ty_list lbl_list pos obj unboxed = let rec tree_of_fields pos = function @@ -505,8 +543,8 @@ module Make(O : OBJ)(EVP : EVALPATH with type valu = O.t) = struct (* PR#5722: print full module path only for first record field *) let lid = - if pos = 0 then tree_of_label env path (Out_name.create name) - else Oide_ident (Out_name.create name) + if pos = 0 then tree_of_label env path name + else tree_of_name name and v = if unboxed then tree_of_val (depth - 1) obj ty_arg @@ -524,6 +562,40 @@ module Make(O : OBJ)(EVP : EVALPATH with type valu = O.t) = struct in Oval_record (tree_of_fields pos lbl_list) + and tree_of_polyvariant depth obj row = + if O.is_block obj then + let tag : int = O.obj (O.field obj 0) in + let rec find = function + | (l, f) :: fields -> + if Btype.hash_variant l = tag then + match row_field_repr f with + | Rpresent(Some ty) | Reither(_,[ty],_) -> + let args = + nest tree_of_val (depth - 1) (O.field obj 1) ty + in + Oval_variant (l, Some args) + | _ -> find fields + else find fields + | [] -> Oval_stuff "" in + find (row_fields row) + else + let tag : int = O.obj obj in + let rec find = function + | (l, _) :: fields -> + if Btype.hash_variant l = tag then + Oval_variant (l, None) + else find fields + | [] -> Oval_stuff "" in + find (row_fields row) + + and tree_of_labeled_val_list start depth obj labeled_tys = + let rec tree_list i = function + | [] -> [] + | (label, ty) :: labeled_tys -> + let tree = nest tree_of_val (depth - 1) (O.field obj i) ty in + (label, tree) :: tree_list (i + 1) labeled_tys in + tree_list start labeled_tys + and tree_of_val_list start depth obj ty_list = let rec tree_list i = function | [] -> [] @@ -534,7 +606,7 @@ module Make(O : OBJ)(EVP : EVALPATH with type valu = O.t) = struct and tree_of_constr_with_args tree_of_cstr cstr_name inlined start depth obj ty_args unboxed = - let lid = tree_of_cstr (Out_name.create cstr_name) in + let lid = tree_of_cstr cstr_name in let args = if inlined || unboxed then match ty_args with @@ -580,7 +652,7 @@ module Make(O : OBJ)(EVP : EVALPATH with type valu = O.t) = struct in let args = instantiate_types env type_params ty_list cstr.cstr_args in tree_of_constr_with_args - (fun x -> Oide_ident x) name (cstr.cstr_inlined <> None) + tree_of_name name (cstr.cstr_inlined <> None) 1 depth bucket args false with Not_found | EVP.Error -> diff --git a/toplevel/native/topeval.ml b/toplevel/native/topeval.ml index fd2443fd..194e8e06 100644 --- a/toplevel/native/topeval.ml +++ b/toplevel/native/topeval.ml @@ -163,16 +163,7 @@ let execute_phrase print_outcome ppf phr = incr phrase_seqid; let phrase_name = "TOP" ^ string_of_int !phrase_seqid in Compilenv.reset ?packname:None phrase_name; - Typecore.reset_delayed_checks (); - let (str, sg, names, shape, newenv) = - Typemod.type_toplevel_phrase oldenv sstr - in - if !Clflags.dump_typedtree then Printtyped.implementation ppf str; - let sg' = Typemod.Signature_names.simplify newenv names sg in - Includemod.check_implementation oldenv sg sg'; - Typecore.force_delayed_checks (); - let shape = Shape_reduce.local_reduce Env.empty shape in - if !Clflags.dump_shape then Shape.print ppf shape; + let (str, sg', newenv) = typecheck_phrase ppf oldenv sstr in (* `let _ = ` or even just `` require special handling in toplevels, or nothing is displayed. In bytecode, the lambda for is directly executed and the result _is_ the diff --git a/toplevel/topcommon.ml b/toplevel/topcommon.ml index 2f37ebfd..273e6cc4 100644 --- a/toplevel/topcommon.ml +++ b/toplevel/topcommon.ml @@ -209,6 +209,19 @@ let preprocess_phrase ppf phr = if !Clflags.dump_source then Pprintast.top_phrase ppf phr; phr +let typecheck_phrase ppf oldenv sstr = + Typecore.reset_delayed_checks (); + let (str, sg, sn, shape, newenv) = + Typemod.type_toplevel_phrase oldenv sstr + in + if !Clflags.dump_typedtree then Printtyped.implementation ppf str; + let sg' = Typemod.Signature_names.simplify newenv sn sg in + Includemod.check_implementation oldenv sg sg'; + Typecore.force_delayed_checks (); + let shape = Shape_reduce.local_reduce Env.empty shape in + if !Clflags.dump_shape then Shape.print ppf shape; + (str, sg', newenv) + (* Phrase buffer that stores the last toplevel phrase (see [Location.input_phrase_buffer]). *) let phrase_buffer = Buffer.create 1024 @@ -345,11 +358,14 @@ let inline_code = Format_doc.compat Style.inline_code let try_run_directive ppf dir_name pdir_arg = begin match get_directive dir_name with | None -> - fprintf ppf "Unknown directive %a." inline_code dir_name; - let directives = all_directive_names () in - Format_doc.compat Misc.did_you_mean ppf - (fun () -> Misc.spellcheck directives dir_name); - fprintf ppf "@."; + let print ppf () = + let directives = all_directive_names () in + Misc.aligned_hint ~prefix:"" ppf + "@{Unknown directive @}%a." + Style.inline_code dir_name + (Misc.did_you_mean (Misc.spellcheck directives dir_name)) + in + fprintf ppf "%a@." (Format_doc.compat print) (); false | Some d -> match d, pdir_arg with @@ -390,7 +406,7 @@ let try_run_directive ppf dir_name pdir_arg = | `String -> Format.fprintf ppf "a %a literal" inline_code "string" | `Int -> - Format.fprintf ppf "an %a literal" inline_code "string" + Format.fprintf ppf "an %a literal" inline_code "int" | `Ident -> Format.fprintf ppf "an identifier" | `Bool -> diff --git a/toplevel/topcommon.mli b/toplevel/topcommon.mli index f76ccb30..6c2a8564 100644 --- a/toplevel/topcommon.mli +++ b/toplevel/topcommon.mli @@ -43,10 +43,18 @@ val toplevel_env : Env.t ref (* Typing environment for the toplevel *) val initialize_toplevel_env : unit -> unit (* Initialize the typing environment for the toplevel *) + val preprocess_phrase : - formatter -> Parsetree.toplevel_phrase -> Parsetree.toplevel_phrase - (* Preprocess the given toplevel phrase using regular and ppx - preprocessors. Return the updated phrase. *) + formatter -> Parsetree.toplevel_phrase -> Parsetree.toplevel_phrase +(* Preprocess the given toplevel phrase using regular and ppx + preprocessors. Return the updated phrase. *) + +val typecheck_phrase : + formatter -> Env.t -> Parsetree.structure -> + Typedtree.structure * Types.signature * Env.t +(* Type-check the current toplevel phrase (not a directive) + in the current typing environment, return an updated typing environment. *) + val record_backtrace : unit -> unit diff --git a/toplevel/topdirs.ml b/toplevel/topdirs.ml index aa75b572..8d2ebccd 100644 --- a/toplevel/topdirs.ml +++ b/toplevel/topdirs.ml @@ -18,6 +18,7 @@ open Format open Misc open Types +open Data_types open Toploop let error_fmt () = @@ -183,133 +184,16 @@ let _ = add_directive "mod_use" (Directive_string (with_error_fmt dir_mod_use)) (* Install, remove a printer *) -module Printer = struct - type kind = - | Old of Types.type_expr - (* 'a -> unit *) - | Simple of Types.type_expr - (* Format.formatter -> 'a -> unit *) - | Generic of { ty_path: Path.t; arity: int; } - (* (formatter -> 'a1 -> unit) -> - (formatter -> 'a2 -> unit) -> - ... -> - (formatter -> 'an -> unit) -> - formatter -> ('a1, 'a2, ..., 'an) t -> unit - *) -end - -let filter_arrow ty = - let ty = Ctype.expand_head !toplevel_env ty in - match get_desc ty with - | Tarrow (lbl, l, r, _) when not (Btype.is_optional lbl) -> Some (l, r) - | _ -> None - -let extract_last_arrow ty = - let rec extract last ty = - match filter_arrow ty with - | None -> last - | Some ((_, rest) as next) -> extract (Some next) rest - in extract None ty - -let extract_target_type ty = - Option.map fst (extract_last_arrow ty) - -let extract_target_parameters ty = - match extract_target_type ty with - | None -> None - | Some tgt -> - let tgt = Ctype.expand_head !toplevel_env tgt in - match get_desc tgt with - | Tconstr (path, (_ :: _ as args), _) - when Ctype.all_distinct_vars !toplevel_env args -> - Some (path, args) - | _ -> None - -let match_simple_printer_type desc ~is_old_style = - let make_printer_type = - if is_old_style - then Topprinters.printer_type_old - else Topprinters.printer_type_new - in - match - Ctype.with_local_level_generalize begin fun () -> - let ty_arg = Ctype.newvar() in - Ctype.unify !toplevel_env - (make_printer_type ty_arg) - (Ctype.instance desc.val_type); - ty_arg - end - with - | exception Ctype.Unify _ -> None - | ty_arg -> - if is_old_style - then Some (Printer.Old ty_arg) - else Some (Printer.Simple ty_arg) - -let match_generic_printer_type desc ty_path params = - let make_printer_type = Topprinters.printer_type_new in - match - Ctype.with_local_level_generalize begin fun () -> - let args = List.map (fun _ -> Ctype.newvar ()) params in - let ty_target = Ctype.newty (Tconstr (ty_path, args, ref Mnil)) in - let printer_args_ty = - List.map (fun ty_var -> make_printer_type ty_var) args in - let ty_expected = - List.fold_right Topprinters.type_arrow - printer_args_ty (make_printer_type ty_target) in - Ctype.unify !toplevel_env - ty_expected - (Ctype.instance desc.val_type); - args - end - with - | exception Ctype.Unify _ -> None - | args -> - if Ctype.all_distinct_vars !toplevel_env args - then Some () - else None - -let match_printer_type desc = - match match_simple_printer_type desc ~is_old_style:false with - | Some _ as res -> res - | None -> - match match_simple_printer_type desc ~is_old_style:true with - | Some _ as res -> res - | None -> - match extract_target_parameters desc.val_type with - | None -> None - | Some (ty_path, args) -> - match match_generic_printer_type desc ty_path args with - | None -> None - | Some () -> - Some (Printer.Generic { ty_path; arity = List.length args; }) - -let find_printer lid = - match Env.find_value_by_name lid !toplevel_env with - | exception Not_found -> - let report ppf = - fprintf ppf "Unbound value %a.@." - Printtyp.longident lid - in Error report - | (path, desc) -> - match match_printer_type desc with - | None -> - let report ppf = - fprintf ppf "%a has the wrong type for a printing function.@." - Printtyp.longident lid - in Error report - | Some kind -> Ok (path, kind) - let install_printer_by_kind path kind = let v = eval_value_path !toplevel_env path in match kind with - | Printer.Old ty_arg -> + | Topprinters.Old ty_arg -> install_printer path ty_arg (fun _formatter repr -> Obj.obj v (Obj.obj repr)) - | Printer.Simple ty_arg -> + | Topprinters.Simple ty_arg -> install_printer path ty_arg (fun formatter repr -> Obj.obj v formatter (Obj.obj repr)) - | Printer.Generic { ty_path; arity } -> + | Topprinters.Generic { ty_path; arity } -> let rec build v = function | 0 -> Zero @@ -322,27 +206,23 @@ let install_printer_by_kind path kind = let remove_installed_printer path = match remove_printer path with | () -> Ok () - | exception Not_found -> - let report ppf = - fprintf ppf "The printer named %a is not installed.@." - Printtyp.path path - in Error report + | exception Not_found -> Error (`No_active_printer path) let dir_install_printer ppf lid = - match find_printer lid with - | Error report -> - report ppf + match Topprinters.find_printer !toplevel_env lid with + | Error error -> + Topprinters.report_error ppf error | Ok (path, kind) -> install_printer_by_kind path kind let dir_remove_printer ppf lid = - match find_printer lid with - | Error report -> - report ppf + match Topprinters.find_printer !toplevel_env lid with + | Error error -> + Topprinters.report_error ppf error | Ok (path, _kind) -> match remove_installed_printer path with | Ok () -> () - | Error report -> report ppf + | Error error -> Topprinters.report_error ppf error let _ = add_directive "install_printer" (Directive_ident (with_error_fmt dir_install_printer)) @@ -391,7 +271,7 @@ let show_prim to_sig ppf lid = let s = match lid with | Longident.Lident s -> s - | Longident.Ldot (_,s) -> s + | Longident.Ldot (_,{ txt = s; _ }) -> s | Longident.Lapply _ -> fprintf ppf "Invalid path %a@." Printtyp.longident lid; raise Exit @@ -483,7 +363,7 @@ let () = let desc = Env.lookup_constructor ~loc Env.Positive lid env in if is_exception_constructor env desc.cstr_res then raise Not_found; - let path = Btype.cstr_type_path desc in + let path = Data_types.cstr_res_type_path desc in let type_decl = Env.find_type path env in if is_extension_constructor desc.cstr_tag then let ret_type = diff --git a/toplevel/topprinters.ml b/toplevel/topprinters.ml index b2c90e85..b64a8f62 100644 --- a/toplevel/topprinters.ml +++ b/toplevel/topprinters.ml @@ -15,8 +15,6 @@ (* Infrastructure to support user-defined printers in toplevels and debugger *) -type printer_type = Types.type_expr -> Types.type_expr - let type_arrow ta tb = Ctype.newty (Tarrow (Asttypes.Nolabel, ta, tb, Types.commu_var ())) @@ -35,3 +33,125 @@ let printer_type_old alpha = let printer_type_new alpha = type_arrow (type_formatter ()) (type_arrow alpha type_unit) + +type kind = + | Old of Types.type_expr + (* 'a -> unit *) + | Simple of Types.type_expr + (* Format.formatter -> 'a -> unit *) + | Generic of { ty_path: Path.t; arity: int; } + (* (formatter -> 'a1 -> unit) -> + (formatter -> 'a2 -> unit) -> + ... -> + (formatter -> 'an -> unit) -> + formatter -> ('a1, 'a2, ..., 'an) t -> unit + *) + +type error = [ + | `Unbound_identifier of Longident.t + | `Wrong_type of Longident.t + | `No_active_printer of Path.t +] + +let match_simple_printer_type env ty ~is_old_style = + let make_printer_type = + if is_old_style + then printer_type_old + else printer_type_new + in + match + Ctype.with_local_level_generalize begin fun () -> + let ty_arg = Ctype.newvar() in + Ctype.unify env + (make_printer_type ty_arg) + (Ctype.instance ty); + ty_arg + end + with + | exception Ctype.Unify _ -> None + | ty_arg -> + if is_old_style + then Some (Old ty_arg) + else Some (Simple ty_arg) + +let filter_arrow env ty = + let ty = Ctype.expand_head env ty in + match Types.get_desc ty with + | Tarrow (lbl, l, r, _) when not (Btype.is_optional lbl) -> Some (l, r) + | _ -> None + +let extract_last_arrow env ty = + let rec extract last ty = + match filter_arrow env ty with + | None -> last + | Some ((_, rest) as next) -> extract (Some next) rest + in extract None ty + +let extract_target_type env ty = + Option.map fst (extract_last_arrow env ty) + +let extract_target_parameters env ty = + match extract_target_type env ty with + | None -> None + | Some tgt -> + let tgt = Ctype.expand_head env tgt in + match Types.get_desc tgt with + | Tconstr (path, (_ :: _ as args), _) + when Ctype.all_distinct_vars env args -> + Some (path, args) + | _ -> None + +let match_generic_printer_type env ty = + match extract_target_parameters env ty with + | None -> None + | Some (ty_path, params) -> + match + Ctype.with_local_level_generalize begin fun () -> + let args = List.map (fun _ -> Ctype.newvar ()) params in + let ty_target = + Ctype.newty (Tconstr (ty_path, args, ref Types.Mnil)) in + let printer_args_ty = + List.map (fun ty_var -> printer_type_new ty_var) args in + let ty_expected = + List.fold_right type_arrow + printer_args_ty (printer_type_new ty_target) in + Ctype.unify env + ty_expected + (Ctype.instance ty); + args + end + with + | exception Ctype.Unify _ -> None + | args -> + if Ctype.all_distinct_vars env args + then + Some (Generic { ty_path; arity = List.length params; }) + else None + +let match_printer_type env ty = + match match_simple_printer_type env ty ~is_old_style:false with + | Some _ as res -> res + | None -> + match match_simple_printer_type env ty ~is_old_style:true with + | Some _ as res -> res + | None -> match_generic_printer_type env ty + + +let report_error ppf = function + | `Unbound_identifier lid -> + Format.fprintf ppf "Unbound value %a.@." + Printtyp.longident lid + | `Wrong_type lid -> + Format.fprintf ppf "%a has the wrong type for a printing function.@." + Printtyp.longident lid + | `No_active_printer path -> + Format.fprintf ppf "The printer named %a is not installed.@." + Printtyp.path path + +let find_printer env lid = + match Env.find_value_by_name lid env with + | exception Not_found -> Error (`Unbound_identifier lid) + | (path, desc) -> + match match_printer_type env desc.val_type with + | None -> Error (`Wrong_type lid) + | Some kind -> Ok (path, kind) diff --git a/toplevel/topprinters.mli b/toplevel/topprinters.mli index e5888107..621c32df 100644 --- a/toplevel/topprinters.mli +++ b/toplevel/topprinters.mli @@ -15,9 +15,25 @@ (* Infrastructure to support user-defined printers in toplevels and debugger *) -type printer_type = Types.type_expr -> Types.type_expr +type kind = + | Old of Types.type_expr + (* 'a -> unit *) + | Simple of Types.type_expr + (* Format.formatter -> 'a -> unit *) + | Generic of { ty_path: Path.t; arity: int; } + (* (formatter -> 'a1 -> unit) -> + (formatter -> 'a2 -> unit) -> + ... -> + (formatter -> 'an -> unit) -> + formatter -> ('a1, 'a2, ..., 'an) t -> unit + *) -val type_arrow : Types.type_expr -> Types.type_expr -> Types.type_expr +type error = [ + | `Unbound_identifier of Longident.t + | `Wrong_type of Longident.t + | `No_active_printer of Path.t +] -val printer_type_new : printer_type -val printer_type_old : printer_type +val find_printer : Env.t -> Longident.t -> (Path.t * kind, error) result + +val report_error : Format.formatter -> error -> unit diff --git a/typing/btype.ml b/typing/btype.ml index 75a9f5f2..24abf319 100644 --- a/typing/btype.ml +++ b/typing/btype.ml @@ -171,7 +171,6 @@ let type_origin decl = match decl.type_kind with | Type_abstract origin -> origin | Type_variant _ | Type_record _ | Type_open -> Definition -let label_is_poly lbl = is_poly_Tpoly lbl.lbl_arg let dummy_method = "*dummy method*" @@ -311,7 +310,7 @@ let fold_type_expr f init ty = | Tarrow (_, ty1, ty2, _) -> let result = f init ty1 in f result ty2 - | Ttuple l -> List.fold_left f init l + | Ttuple l -> List.fold_left (fun acc (_, t) -> f acc t) init l | Tconstr (_, l, _) -> List.fold_left f init l | Tobject(ty, {contents = Some (_, p)}) -> let result = f init ty in @@ -330,8 +329,8 @@ let fold_type_expr f init ty = | Tpoly (ty, tyl) -> let result = f init ty in List.fold_left f result tyl - | Tpackage (_, fl) -> - List.fold_left (fun result (_n, ty) -> f result ty) init fl + | Tpackage pack -> + List.fold_left (fun result (_n, ty) -> f result ty) init pack.pack_cstrs let iter_type_expr f ty = fold_type_expr (fun () v -> f v) () ty @@ -477,7 +476,7 @@ let type_iterators mark = match get_desc ty with Tconstr (p, _, _) | Tobject (_, {contents=Some (p, _)}) - | Tpackage (p, _) -> + | Tpackage {pack_path = p} -> it.it_path p | Tvariant row -> Option.iter (fun (p,_) -> it.it_path p) (row_name row) @@ -515,7 +514,7 @@ let copy_commu c = if is_commu_ok c then commu_ok else commu_var () let rec copy_type_desc ?(keep_names=false) f = function Tvar _ as ty -> if keep_names then ty else Tvar None | Tarrow (p, ty1, ty2, c)-> Tarrow (p, f ty1, f ty2, copy_commu c) - | Ttuple l -> Ttuple (List.map f l) + | Ttuple l -> Ttuple (List.map (fun (label, t) -> label, f t) l) | Tconstr (p, l, _) -> Tconstr (p, List.map f l, ref Mnil) | Tobject(ty, {contents = Some (p, tl)}) -> Tobject (f ty, ref (Some(p, List.map f tl))) @@ -531,7 +530,9 @@ let rec copy_type_desc ?(keep_names=false) f = function | Tpoly (ty, tyl) -> let tyl = List.map f tyl in Tpoly (f ty, tyl) - | Tpackage (p, fl) -> Tpackage (p, List.map (fun (n, ty) -> (n, f ty)) fl) + | Tpackage pack -> + Tpackage {pack with + pack_cstrs = List.map (fun (n, ty) -> (n, f ty)) pack.pack_cstrs} (* TODO: rename to [module Copy_scope] *) module For_copy : sig @@ -774,15 +775,3 @@ let instance_variable_type label sign = match Vars.find label sign.csig_vars with | (_, _, ty) -> ty | exception Not_found -> assert false - - - (**********) - (* Misc *) - (**********) - -(**** Type information getter ****) - -let cstr_type_path cstr = - match get_desc cstr.cstr_res with - | Tconstr (p, _, _) -> p - | _ -> assert false diff --git a/typing/btype.mli b/typing/btype.mli index f8fd3ad3..eea0139b 100644 --- a/typing/btype.mli +++ b/typing/btype.mli @@ -92,7 +92,6 @@ val is_poly_Tpoly: type_expr -> bool val dummy_method: label val type_kind_is_abstract: type_declaration -> bool val type_origin: type_declaration -> type_origin -val label_is_poly: label_description -> bool (**** polymorphic variants ****) @@ -305,7 +304,3 @@ val method_type : label -> class_signature -> type_expr (* Return the type of an instance variable. @raises [Assert_failure] if the class has no such method. *) val instance_variable_type : label -> class_signature -> type_expr - -(**** Type information getter ****) - -val cstr_type_path : constructor_description -> Path.t diff --git a/typing/cmt2annot.ml b/typing/cmt2annot.ml index 698cccab..ed42791e 100644 --- a/typing/cmt2annot.ml +++ b/typing/cmt2annot.ml @@ -23,7 +23,7 @@ let variables_iterator scope = let super = default_iterator in let pat sub (type k) (p : k general_pattern) = begin match p.pat_desc with - | Tpat_var (id, _, _) | Tpat_alias (_, id, _, _) -> + | Tpat_var (id, _, _) | Tpat_alias (_, id, _, _, _) -> Stypes.record (Stypes.An_ident (p.pat_loc, Ident.name id, Annot.Idef scope)) diff --git a/typing/ctype.ml b/typing/ctype.ml index c54a2b7a..d91ccb60 100644 --- a/typing/ctype.ml +++ b/typing/ctype.ml @@ -18,6 +18,7 @@ open Misc open Asttypes open Types +open Data_types open Btype open Errortrace @@ -330,19 +331,19 @@ module Pattern_env : sig type t = private { mutable env : Env.t; equations_scope : int; - allow_recursive_equations : bool; } - val make: Env.t -> equations_scope:int -> allow_recursive_equations:bool -> t + in_counterexample : bool; } + val make: Env.t -> equations_scope:int -> in_counterexample:bool -> t val copy: ?equations_scope:int -> t -> t val set_env: t -> Env.t -> unit end = struct type t = { mutable env : Env.t; equations_scope : int; - allow_recursive_equations : bool; } - let make env ~equations_scope ~allow_recursive_equations = + in_counterexample : bool; } + let make env ~equations_scope ~in_counterexample = { env; equations_scope; - allow_recursive_equations; } + in_counterexample; } let copy ?equations_scope penv = let equations_scope = match equations_scope with None -> penv.equations_scope | Some s -> s in @@ -421,7 +422,7 @@ let can_assume_injective = function let in_counterexample uenv = match uenv with | Expression _ -> false - | Pattern { penv } -> penv.allow_recursive_equations + | Pattern { penv } -> penv.in_counterexample let allow_recursive_equations uenv = !Clflags.recursive_types || in_counterexample uenv @@ -631,6 +632,12 @@ let free_variables ?env ty = let add_one ty _kind acc = ty :: acc in with_type_mark (fun mark -> free_vars ~init:[] ~add_one ?env mark ty) +let free_variables_list ?env tyl = + let add_one ty _kind acc = ty :: acc in + with_type_mark (fun mark -> + List.fold_left (fun acc ty -> free_vars ~init:acc ~add_one ?env mark ty) + [] tyl) + let closed_type ?env mark ty = let add_one ty kind _acc = raise (Non_closed (ty, kind)) in free_vars ~init:() ~add_one ?env mark ty @@ -769,10 +776,10 @@ let rec copy_spine copy_scope ty = | Tpoly (ty', tvl) -> Tpoly (copy_rec ty', tvl) | Ttuple tyl -> - Ttuple (List.map copy_rec tyl) - | Tpackage (path, fl) -> - let fl = List.map (fun (n, ty) -> n, copy_rec ty) fl in - Tpackage (path, fl) + Ttuple (List.map (fun (lbl, ty) -> (lbl, copy_rec ty)) tyl) + | Tpackage {pack_path; pack_cstrs} -> + let fl = List.map (fun (n, ty) -> n, copy_rec ty) pack_cstrs in + Tpackage {pack_path; pack_cstrs = fl} | Tconstr (path, tyl, _) -> Tconstr (path, List.map copy_rec tyl, ref Mnil) | _ -> assert false @@ -820,11 +827,12 @@ let rec check_scope_escape mark env level ty = | exception Cannot_expand -> raise_escape_exn (Constructor p) end - | Tpackage (p, fl) when level < Path.scope p -> + | Tpackage ({pack_path = p} as pack) when level < Path.scope p -> let p' = normalize_package_path env p in if Path.same p p' then raise_escape_exn (Module_type p); check_scope_escape mark env level - (newty2 ~level:orig_level (Tpackage (p', fl))) + (newty2 ~level:orig_level + (Tpackage {pack with pack_path = p'})) | _ -> iter_type_expr (check_scope_escape mark env level) ty end; @@ -896,10 +904,10 @@ let rec update_level env level expand ty = set_level (); iter_type_expr (update_level env level expand) ty end - | Tpackage (p, fl) when level < Path.scope p -> + | Tpackage ({pack_path = p} as pack) when level < Path.scope p -> let p' = normalize_package_path env p in if Path.same p p' then raise_escape_exn (Module_type p); - set_type_desc ty (Tpackage (p', fl)); + set_type_desc ty (Tpackage {pack with pack_path = p'}); update_level env level expand ty | Tobject (_, ({contents=Some(p, _tl)} as nm)) when level < Path.scope p -> @@ -979,8 +987,8 @@ let rec lower_contravariant env var_level visited contra ty = | ty -> lower_rec contra ty | exception Cannot_expand -> not_expanded () else not_expanded () - | Tpackage (_, fl) -> - List.iter (fun (_n, ty) -> lower_rec true ty) fl + | Tpackage p -> + List.iter (fun (_n, ty) -> lower_rec true ty) p.pack_cstrs | Tarrow (_, t1, t2, _) -> lower_rec true t1; lower_rec contra t2 @@ -1838,30 +1846,34 @@ let is_contractive env p = exception Occur -let rec occur_rec env allow_recursive visited ty0 ty = - if eq_type ty ty0 then raise Occur; - match get_desc ty with - Tconstr(p, _tl, _abbrev) -> - if allow_recursive && is_contractive env p then () else - begin try - if TypeSet.mem ty visited then raise Occur; - let visited = TypeSet.add ty visited in - iter_type_expr (occur_rec env allow_recursive visited ty0) ty - with Occur -> try - let ty' = try_expand_head try_expand_safe env ty in - (* This call used to be inlined, but there seems no reason for it. - Message was referring to change in rev. 1.58 of the CVS repo. *) - occur_rec env allow_recursive visited ty0 ty' - with Cannot_expand -> - raise Occur - end - | Tobject _ | Tvariant _ -> - () - | _ -> - if allow_recursive || TypeSet.mem ty visited then () else begin - let visited = TypeSet.add ty visited in - iter_type_expr (occur_rec env allow_recursive visited ty0) ty - end +let rec occur_rec env visited allow_recursive parents ty0 ty = + if not_marked_node visited ty then begin + if eq_type ty ty0 then raise Occur; + begin match get_desc ty with + Tconstr(p, _tl, _abbrev) -> + if allow_recursive && is_contractive env p then () else + begin try + if TypeSet.mem ty parents then raise Occur; + let parents = TypeSet.add ty parents in + iter_type_expr (occur_rec env visited allow_recursive parents ty0) ty + with Occur -> try + let ty' = try_expand_head try_expand_safe env ty in + (* This call used to be inlined, but there seems no reason for it. + Message was referring to change in rev. 1.58 of the CVS repo. *) + occur_rec env visited allow_recursive parents ty0 ty' + with Cannot_expand -> + raise Occur + end + | Tobject _ | Tvariant _ -> + () + | _ -> + if allow_recursive || TypeSet.mem ty parents then () else begin + let parents = TypeSet.add ty parents in + iter_type_expr (occur_rec env visited allow_recursive parents ty0) ty + end + end; + ignore (try_mark_node visited ty) + end let type_changed = ref false (* trace possible changes to the studied type *) @@ -1875,7 +1887,8 @@ let occur uenv ty0 ty = while type_changed := false; if not (eq_type ty0 ty) then - occur_rec env allow_recursive TypeSet.empty ty0 ty; + with_type_mark (fun mark -> + occur_rec env mark allow_recursive TypeSet.empty ty0 ty); !type_changed do () (* prerr_endline "changed" *) done; merge type_changed old @@ -2209,20 +2222,25 @@ let unexpanded_diff ~got ~expected = (**** Unification ****) (* Return whether [t0] occurs in [ty]. Objects are also traversed. *) +let rec deep_occur_rec mark t0 ty = + if get_level ty >= get_level t0 && try_mark_node mark ty then begin + if eq_type ty t0 then raise Occur; + iter_type_expr (deep_occur_rec mark t0) ty + end + let deep_occur t0 ty = - with_type_mark begin fun mark -> - let rec occur_rec ty = - if get_level ty >= get_level t0 && try_mark_node mark ty then begin - if eq_type ty t0 then raise Occur; - iter_type_expr occur_rec ty - end - in try - occur_rec ty; false - with Occur -> - true - end + with_type_mark (fun mark -> deep_occur_rec mark t0 ty); + false + with + | Occur -> true +let deep_occur_list t0 tyl = + try + with_type_mark (fun mark -> List.iter (deep_occur_rec mark t0) tyl); + false + with + | Occur -> true (* A local constraint can be added only if the rhs of the constraint does not contain any Tvars. @@ -2378,13 +2396,13 @@ let rec mcomp type_pairs env t1 t2 = mcomp type_pairs env t1 t2; mcomp type_pairs env u1 u2; | (Ttuple tl1, Ttuple tl2) -> - mcomp_list type_pairs env tl1 tl2 + mcomp_labeled_list type_pairs env tl1 tl2 | (Tconstr (p1, tl1, _), Tconstr (p2, tl2, _)) -> mcomp_type_decl type_pairs env p1 p2 tl1 tl2 | (Tconstr (_, [], _), _) when has_injective_univars env t2' -> - raise_unexplained_for Unify + raise Incompatible | (_, Tconstr (_, [], _)) when has_injective_univars env t1' -> - raise_unexplained_for Unify + raise Incompatible | (Tconstr (p, _, _), _) | (_, Tconstr (p, _, _)) -> begin try let decl = Env.find_type p env in @@ -2426,6 +2444,16 @@ and mcomp_list type_pairs env tl1 tl2 = raise Incompatible; List.iter2 (mcomp type_pairs env) tl1 tl2 +and mcomp_labeled_list type_pairs env labeled_tl1 labeled_tl2 = + if 0 <> List.compare_lengths labeled_tl1 labeled_tl2 then + raise Incompatible; + List.iter2 + (fun (label1, ty1) (label2, ty2) -> + if not (Option.equal String.equal label1 label2) then + raise Incompatible; + mcomp type_pairs env ty1 ty2) + labeled_tl1 labeled_tl2 + and mcomp_fields type_pairs env ty1 ty2 = if not (concrete_object ty1 && concrete_object ty2) then assert false; let (fields2, rest2) = flatten_fields ty2 in @@ -2538,7 +2566,8 @@ and mcomp_record_description type_pairs env = | l1 :: xs, l2 :: ys -> mcomp type_pairs env l1.ld_type l2.ld_type; if Ident.name l1.ld_id = Ident.name l2.ld_id && - l1.ld_mutable = l2.ld_mutable + l1.ld_mutable = l2.ld_mutable && + l1.ld_atomic = l2.ld_atomic then iter xs ys else raise Incompatible | [], [] -> () @@ -2600,25 +2629,18 @@ let eq_package_path env p1 p2 = Path.same (normalize_package_path env p1) (normalize_package_path env p2) let nondep_type' = ref (fun _ _ _ -> assert false) -let package_subtype = ref (fun _ _ _ _ _ -> assert false) +let package_subtype = ref (fun _ _ _ -> assert false) exception Nondep_cannot_erase of Ident.t -let rec concat_longident lid1 = - let open Longident in - function - Lident s -> Ldot (lid1, s) - | Ldot (lid2, s) -> Ldot (concat_longident lid1 lid2, s) - | Lapply (lid2, lid) -> Lapply (concat_longident lid1 lid2, lid) - let nondep_instance env level id ty = let ty = !nondep_type' env [id] ty in if level = generic_level then duplicate_type ty else with_level ~level (fun () -> instance ty) -(* Find the type paths nl1 in the module type mty2, and add them to the +(* Find the type paths nl1 in the module type pack2, and add them to the list (nl2, tl2). raise Not_found if impossible *) -let complete_type_list ?(allow_absent=false) env fl1 lv2 mty2 fl2 = +let complete_type_list ?(allow_absent=false) env fl1 lv2 pack2 = (* This is morally WRONG: we're adding a (dummy) module without a scope in the environment. However no operation which cares about levels/scopes is going to happen while this module exists. @@ -2630,14 +2652,15 @@ let complete_type_list ?(allow_absent=false) env fl1 lv2 mty2 fl2 = It'd be nice if we avoided creating such temporary dummy modules and broken environments though. *) let id2 = Ident.create_local "Pkg" in - let env' = Env.add_module id2 Mp_present mty2 env in + let env' = Env.add_module id2 Mp_present (Mty_ident pack2.pack_path) env in let rec complete fl1 fl2 = match fl1, fl2 with [], _ -> fl2 | (n, _) :: nl, (n2, _ as nt2) :: ntl' when n >= n2 -> nt2 :: complete (if n = n2 then nl else fl1) ntl' | (n, _) :: nl, _ -> - let lid = concat_longident (Longident.Lident "Pkg") n in + let lid = "Pkg" :: n in + let lid = Option.get (Longident.unflatten lid) in match Env.find_type_by_name lid env' with | (_, {type_arity = 0; type_kind = Type_abstract _; type_private = Public; type_manifest = Some t2}) -> @@ -2657,19 +2680,19 @@ let complete_type_list ?(allow_absent=false) env fl1 lv2 mty2 fl2 = | exception Not_found when allow_absent-> complete nl fl2 in - match complete fl1 fl2 with + match complete fl1 pack2.pack_cstrs with | res -> res | exception Exit -> raise Not_found (* raise Not_found rather than Unify if the module types are incompatible *) -let unify_package env unify_list lv1 p1 fl1 lv2 p2 fl2 = - let ntl2 = complete_type_list env fl1 lv2 (Mty_ident p2) fl2 - and ntl1 = complete_type_list env fl2 lv1 (Mty_ident p1) fl1 in +let compare_package env unify_list lv1 pack1 lv2 pack2 = + let ntl2 = complete_type_list env pack1.pack_cstrs lv2 pack2 + and ntl1 = complete_type_list env pack2.pack_cstrs lv1 pack1 in unify_list (List.map snd ntl1) (List.map snd ntl2); - if eq_package_path env p1 p2 then Ok () + if eq_package_path env pack1.pack_path pack2.pack_path then Ok () else Result.bind - (!package_subtype env p1 fl1 p2 fl2) - (fun () -> !package_subtype env p2 fl2 p1 fl1) + (!package_subtype env pack1 pack2) + (fun () -> !package_subtype env pack2 pack1) (* force unification in Reither when one side has a non-conjunctive type *) (* Code smell: this could also be put in unification_environment. @@ -2860,8 +2883,8 @@ and unify3 uenv t1 t1' t2 t2' = | false, false -> link_commu ~inside:c1 c2 | true, true -> () end - | (Ttuple tl1, Ttuple tl2) -> - unify_list uenv tl1 tl2 + | (Ttuple labeled_tl1, Ttuple labeled_tl2) -> + unify_labeled_list uenv labeled_tl1 labeled_tl2 | (Tconstr (p1, tl1, _), Tconstr (p2, tl2, _)) when Path.same p1 p2 -> if not (in_pattern_mode uenv) then unify_list uenv tl1 tl2 @@ -2956,21 +2979,8 @@ and unify3 uenv t1 t1' t2 t2' = | (Tpoly (t1, tl1), Tpoly (t2, tl2)) -> enter_poly_for Unify (get_env uenv) t1 tl1 t2 tl2 (unify uenv) - | (Tpackage (p1, fl1), Tpackage (p2, fl2)) -> - begin match - unify_package (get_env uenv) (unify_list uenv) - (get_level t1) p1 fl1 (get_level t2) p2 fl2 - with - | Ok () -> () - | Error fm_err -> - if not (in_pattern_mode uenv) then - raise_for Unify (Errortrace.First_class_module fm_err); - List.iter (fun (_n, ty) -> reify uenv ty) (fl1 @ fl2); - | exception Not_found -> - if not (in_pattern_mode uenv) then raise_unexplained_for Unify; - List.iter (fun (_n, ty) -> reify uenv ty) (fl1 @ fl2); - (* if !generate_equations then List.iter2 (mcomp !env) tl1 tl2 *) - end + | (Tpackage pack1, Tpackage pack2) -> + unify_package uenv (get_level t1) pack1 (get_level t2) pack2 | (Tnil, Tconstr _ ) -> raise_for Unify (Obj (Abstract_row Second)) | (Tconstr _, Tnil ) -> @@ -2998,6 +3008,34 @@ and unify_list env tl1 tl2 = raise_unexplained_for Unify; List.iter2 (unify env) tl1 tl2 +and unify_labeled_list env labeled_tl1 labeled_tl2 = + if 0 <> List.compare_lengths labeled_tl1 labeled_tl2 then + raise_unexplained_for Unify; + List.iter2 + (fun (label1, ty1) (label2, ty2) -> + if not (Option.equal String.equal label1 label2) then begin + let diff = { Errortrace.got=label1; expected=label2} in + raise_for Unify (Errortrace.Tuple_label_mismatch diff) + end; + unify env ty1 ty2) + labeled_tl1 labeled_tl2 + +and unify_package uenv lvl1 pack1 lvl2 pack2 = + match + compare_package (get_env uenv) (unify_list uenv) lvl1 pack1 lvl2 pack2 + with + | Ok () -> () + | Error fm_err -> + if not (in_pattern_mode uenv) then + raise_for Unify (Errortrace.First_class_module fm_err); + List.iter (fun (_n, ty) -> reify uenv ty) + (pack1.pack_cstrs @ pack2.pack_cstrs); + | exception Not_found -> + if not (in_pattern_mode uenv) then raise_unexplained_for Unify; + List.iter (fun (_n, ty) -> reify uenv ty) + (pack1.pack_cstrs @ pack2.pack_cstrs); + (* if !generate_equations then List.iter2 (mcomp !env) tl1 tl2 *) + (* Build a fresh row variable for unification *) and make_rowvar level use1 rest1 use2 rest2 = let set_name ty name = @@ -3279,7 +3317,7 @@ let unify uenv ty1 ty2 = undo_compress snap; raise (Unify (expand_to_unification_error (get_env uenv) trace)) -let unify_gadt (penv : Pattern_env.t) ty1 ty2 = +let unify_gadt (penv : Pattern_env.t) ~pat:ty1 ~expected:ty2 = let equated_types = TypePairs.create 0 in let do_unify_gadt () = let uenv = Pattern @@ -3291,7 +3329,7 @@ let unify_gadt (penv : Pattern_env.t) ty1 ty2 = unify uenv ty1 ty2; equated_types in - let no_leak = penv.allow_recursive_equations || closed_type_expr ty2 in + let no_leak = penv.in_counterexample || closed_type_expr ty2 in if no_leak then with_univar_pairs [] do_unify_gadt else let snap = Btype.snapshot () in try @@ -3815,19 +3853,13 @@ let rec moregen inst_nongen type_pairs env t1 t2 = moregen inst_nongen type_pairs env t1 t2; moregen inst_nongen type_pairs env u1 u2 | (Ttuple tl1, Ttuple tl2) -> - moregen_list inst_nongen type_pairs env tl1 tl2 + moregen_labeled_list inst_nongen type_pairs env tl1 tl2 | (Tconstr (p1, tl1, _), Tconstr (p2, tl2, _)) when Path.same p1 p2 -> moregen_list inst_nongen type_pairs env tl1 tl2 - | (Tpackage (p1, fl1), Tpackage (p2, fl2)) -> - begin match - unify_package env (moregen_list inst_nongen type_pairs env) - (get_level t1') p1 fl1 (get_level t2') p2 fl2 - with - | Ok () -> () - | Error fme -> raise_for Moregen (First_class_module fme) - | exception Not_found -> raise_unexplained_for Moregen - end + | (Tpackage pack1, Tpackage pack2) -> + moregen_package inst_nongen type_pairs env (get_level t1') pack1 + (get_level t2') pack2 | (Tnil, Tconstr _ ) -> raise_for Moregen (Obj (Abstract_row Second)) | (Tconstr _, Tnil ) -> raise_for Moregen (Obj (Abstract_row First)) | (Tvariant row1, Tvariant row2) -> @@ -3858,6 +3890,26 @@ and moregen_list inst_nongen type_pairs env tl1 tl2 = raise_unexplained_for Moregen; List.iter2 (moregen inst_nongen type_pairs env) tl1 tl2 +and moregen_labeled_list inst_nongen type_pairs env labeled_tl1 + labeled_tl2 = + if 0 <> List.compare_lengths labeled_tl1 labeled_tl2 then + raise_unexplained_for Moregen; + List.iter2 + (fun (label1, ty1) (label2, ty2) -> + if not (Option.equal String.equal label1 label2) then + raise_unexplained_for Moregen; + moregen inst_nongen type_pairs env ty1 ty2) + labeled_tl1 labeled_tl2 + +and moregen_package inst_nongen type_pairs env lvl1 pack1 lvl2 pack2 = + match + compare_package env (moregen_list inst_nongen type_pairs env) + lvl1 pack1 lvl2 pack2 + with + | Ok () -> () + | Error fme -> raise_for Moregen (First_class_module fme) + | exception Not_found -> raise_unexplained_for Moregen + and moregen_fields inst_nongen type_pairs env ty1 ty2 = let (fields1, rest1) = flatten_fields ty1 and (fields2, rest2) = flatten_fields ty2 in @@ -4177,19 +4229,13 @@ let rec eqtype rename type_pairs subst env t1 t2 = eqtype rename type_pairs subst env t1 t2; eqtype rename type_pairs subst env u1 u2 | (Ttuple tl1, Ttuple tl2) -> - eqtype_list rename type_pairs subst env tl1 tl2 + eqtype_labeled_list rename type_pairs subst env tl1 tl2 | (Tconstr (p1, tl1, _), Tconstr (p2, tl2, _)) when Path.same p1 p2 -> eqtype_list_same_length rename type_pairs subst env tl1 tl2 - | (Tpackage (p1, fl1), Tpackage (p2, fl2)) -> - begin match - unify_package env (eqtype_list rename type_pairs subst env) - (get_level t1') p1 fl1 (get_level t2') p2 fl2 - with - | Ok () -> () - | Error fme -> raise_for Equality (First_class_module fme) - | exception Not_found -> raise_unexplained_for Equality - end + | (Tpackage pack1, Tpackage pack2) -> + eqtype_package rename type_pairs subst env + (get_level t1') pack1 (get_level t2') pack2 | (Tnil, Tconstr _ ) -> raise_for Equality (Obj (Abstract_row Second)) | (Tconstr _, Tnil ) -> @@ -4224,6 +4270,25 @@ and eqtype_list rename type_pairs subst env tl1 tl2 = raise_unexplained_for Equality; eqtype_list_same_length rename type_pairs subst env tl1 tl2 +and eqtype_labeled_list rename type_pairs subst env labeled_tl1 labeled_tl2 = + if 0 <> List.compare_lengths labeled_tl1 labeled_tl2 then + raise_unexplained_for Equality; + List.iter2 + (fun (label1, ty1) (label2, ty2) -> + if not (Option.equal String.equal label1 label2) then + raise_unexplained_for Equality; + eqtype rename type_pairs subst env ty1 ty2) + labeled_tl1 labeled_tl2 + +and eqtype_package rename type_pairs subst env lvl1 pack1 lvl2 pack2 = + match + compare_package env (eqtype_list rename type_pairs subst env) + lvl1 pack1 lvl2 pack2 + with + | Ok () -> () + | Error fme -> raise_for Equality (First_class_module fme) + | exception Not_found -> raise_unexplained_for Equality + and eqtype_fields rename type_pairs subst env ty1 ty2 = let (fields1, rest1) = flatten_fields ty1 in let (fields2, rest2) = flatten_fields ty2 in @@ -4726,15 +4791,17 @@ let rec build_subtype env (visited : transient_expr list) if c > Unchanged then (newty (Tarrow(l, t1', t2', commu_ok)), c) else (t, Unchanged) - | Ttuple tlist -> + | Ttuple labeled_tlist -> let tt = Transient_expr.repr t in if memq_warn tt visited then (t, Unchanged) else let visited = tt :: visited in + let labels, tlist = List.split labeled_tlist in let tlist' = List.map (build_subtype env visited loops posi level) tlist in let c = collect tlist' in - if c > Unchanged then (newty (Ttuple (List.map fst tlist')), c) + if c > Unchanged then + (newty (Ttuple (List.combine labels (List.map fst tlist'))), c) else (t, Unchanged) | Tconstr(p, tl, abbrev) when level > 0 && generic_abbrev env p && safe_abbrev env t @@ -4758,7 +4825,7 @@ let rec build_subtype env (visited : transient_expr list) (* Fix PR#4505: do not set ty to Tvar when it appears in tl1, as this occurrence might break the occur check. XXX not clear whether this correct anyway... *) - if List.exists (deep_occur ty) tl1 then raise Not_found; + if deep_occur_list ty tl1 then raise Not_found; set_type_desc ty (Tvar None); let t'' = newvar () in let loops = (get_id ty, t'') :: loops in @@ -4926,7 +4993,7 @@ let rec subtype_rec env trace t1 t2 cstrs = u1 u2 cstrs | (Ttuple tl1, Ttuple tl2) -> - subtype_list env trace tl1 tl2 cstrs + subtype_labeled_list env trace tl1 tl2 cstrs | (Tconstr(p1, [], _), Tconstr(p2, [], _)) when Path.same p1 p2 -> cstrs | (Tconstr(p1, _tl1, _abbrev1), _) @@ -4943,8 +5010,9 @@ let rec subtype_rec env trace t1 t2 cstrs = let (co, cn) = Variance.get_upper v in if co then if cn then - (trace, newty2 ~level:(get_level t1) (Ttuple[t1]), - newty2 ~level:(get_level t2) (Ttuple[t2]), !univar_pairs) + (trace, newty2 ~level:(get_level t1) (Ttuple[None, t1]), + newty2 ~level:(get_level t2) (Ttuple[None, t2]), + !univar_pairs) :: cstrs else subtype_rec @@ -4994,46 +5062,51 @@ let rec subtype_rec env trace t1 t2 cstrs = with Escape _ -> (trace, t1, t2, !univar_pairs)::cstrs end - | (Tpackage (p1, fl1), Tpackage (p2, fl2)) -> - begin try - let ntl1 = - complete_type_list env fl2 (get_level t1) (Mty_ident p1) fl1 - and ntl2 = - complete_type_list env fl1 (get_level t2) (Mty_ident p2) fl2 - ~allow_absent:true in - let cstrs' = - List.map - (fun (n2,t2) -> (trace, List.assoc n2 ntl1, t2, !univar_pairs)) - ntl2 - in - if eq_package_path env p1 p2 then cstrs' @ cstrs - else begin - (* need to check module subtyping *) - let snap = Btype.snapshot () in - match List.iter (fun (_, t1, t2, _) -> unify env t1 t2) cstrs' with - | () when Result.is_ok (!package_subtype env p1 fl1 p2 fl2) -> - Btype.backtrack snap; cstrs' @ cstrs - | () | exception Unify _ -> - Btype.backtrack snap; raise Not_found - end - with Not_found -> - (trace, t1, t2, !univar_pairs)::cstrs - end + | (Tpackage pack1, Tpackage pack2) -> + subtype_package env trace (get_level t1) pack1 + (get_level t2) pack2 cstrs | (_, _) -> (trace, t1, t2, !univar_pairs)::cstrs end -and subtype_list env trace tl1 tl2 cstrs = - if List.length tl1 <> List.length tl2 then +and subtype_labeled_list env trace labeled_tl1 labeled_tl2 cstrs = + if 0 <> List.compare_lengths labeled_tl1 labeled_tl2 then subtype_error ~env ~trace ~unification_trace:[]; List.fold_left2 - (fun cstrs t1 t2 -> - subtype_rec - env - (Subtype.Diff { got = t1; expected = t2 } :: trace) - t1 t2 - cstrs) - cstrs tl1 tl2 + (fun cstrs (label1, ty1) (label2, ty2) -> + if not (Option.equal String.equal label1 label2) then + subtype_error ~env ~trace ~unification_trace:[]; + subtype_rec + env + (Subtype.Diff { got = ty1; expected = ty2 } :: trace) + ty1 ty2 + cstrs) + cstrs labeled_tl1 labeled_tl2 + +and subtype_package env trace lvl1 pack1 lvl2 pack2 cstrs = + try + let ntl1 = complete_type_list env pack2.pack_cstrs lvl1 pack1 + and ntl2 = + complete_type_list env pack1.pack_cstrs lvl2 pack2 + ~allow_absent:true in + let cstrs' = + List.map + (fun (n2,t2) -> (trace, List.assoc n2 ntl1, t2, !univar_pairs)) + ntl2 + in + if eq_package_path env pack1.pack_path pack2.pack_path then cstrs' @ cstrs + else begin + (* need to check module subtyping *) + let snap = Btype.snapshot () in + match List.iter (fun (_, t1, t2, _) -> unify env t1 t2) cstrs' with + | () when Result.is_ok (!package_subtype env pack1 pack2) -> + Btype.backtrack snap; cstrs' @ cstrs + | () | exception Unify _ -> + Btype.backtrack snap; raise Not_found + end + with Not_found -> + (trace, newty (Tpackage pack1), newty (Tpackage pack2), !univar_pairs) + ::cstrs and subtype_fields env trace ty1 ty2 cstrs = (* Assume that either rest1 or rest2 is not Tvar *) @@ -5086,7 +5159,7 @@ and subtype_row env trace row1 row2 cstrs = | (Tvar _|Tconstr _|Tnil), (Tvar _|Tconstr _|Tnil) when row1_closed && r1 = [] -> List.fold_left - (fun cstrs (_,f1,f2) -> + (fun cstrs (l,f1,f2) -> match row_field_repr f1, row_field_repr f2 with (Rpresent None|Reither(true,_,_)), Rpresent None -> cstrs @@ -5103,7 +5176,12 @@ and subtype_row env trace row1 row2 cstrs = t1 t2 cstrs | Rabsent, _ -> cstrs - | _ -> raise Exit) + | Rpresent None, Rpresent (Some _) + | Rpresent (Some _), Rpresent None -> + subtype_error ~env ~trace + ~unification_trace:[Variant (Incompatible_types_for l)] + | _ -> + raise Exit) cstrs pairs | Tunivar _, Tunivar _ when row1_closed = row2_closed && r1 = [] && r2 = [] -> @@ -5340,7 +5418,8 @@ let rec normalize_type_rec mark ty = begin match !nm with | None -> () | Some (n, v :: l) -> - if deep_occur ty (newgenty (Ttuple l)) then + if deep_occur_list ty l + then (* The abbreviation may be hiding something, so remove it *) set_name nm None else @@ -5416,13 +5495,16 @@ let rec nondep_type_rec ?(expand_private=false) env ids ty = *) with Cannot_expand -> raise exn end - | Tpackage(p, fl) when Path.exists_free ids p -> - let p' = normalize_package_path env p in + | Tpackage pack when Path.exists_free ids pack.pack_path -> + let p' = normalize_package_path env pack.pack_path in begin match Path.find_free_opt ids p' with | Some id -> raise (Nondep_cannot_erase id) | None -> let nondep_field_rec (n, ty) = (n, nondep_type_rec env ids ty) in - Tpackage (p', List.map nondep_field_rec fl) + Tpackage { + pack_path = p'; + pack_cstrs = List.map nondep_field_rec pack.pack_cstrs + } end | Tobject (t1, name) -> Tobject (nondep_type_rec env ids t1, diff --git a/typing/ctype.mli b/typing/ctype.mli index 16996932..36897603 100644 --- a/typing/ctype.mli +++ b/typing/ctype.mli @@ -181,10 +181,10 @@ module Pattern_env : sig { mutable env : Env.t; equations_scope : int; (* scope for local type declarations *) - allow_recursive_equations : bool; + in_counterexample : bool; (* true iff checking counter examples *) } - val make: Env.t -> equations_scope:int -> allow_recursive_equations:bool -> t + val make: Env.t -> equations_scope:int -> in_counterexample:bool -> t val copy: ?equations_scope:int -> t -> t val set_env: t -> Env.t -> unit end @@ -193,9 +193,12 @@ type existential_treatment = | Keep_existentials_flexible | Make_existentials_abstract of Pattern_env.t -val instance_constructor: existential_treatment -> - constructor_description -> type_expr list * type_expr * type_expr list - (* Same, for a constructor. Also returns existentials. *) +val instance_constructor: + existential_treatment -> + Data_types.constructor_description -> + type_expr list * type_expr * type_expr list +(* Same, for a constructor. Also returns existentials. *) + val instance_parameterized_type: ?keep_names:bool -> type_expr list -> type_expr -> type_expr list * type_expr @@ -210,10 +213,13 @@ val instance_poly: type_expr list -> type_expr -> type_expr list * type_expr (* Take an instance of a type scheme containing free univars *) val polyfy: Env.t -> type_expr -> type_expr list -> type_expr * bool + val instance_label: - fixed:bool -> - label_description -> type_expr list * type_expr * type_expr - (* Same, for a label *) + fixed:bool -> + Data_types.label_description -> + type_expr list * type_expr * type_expr +(* Same, for a label *) + val apply: ?use_current_level:bool -> Env.t -> type_expr list -> type_expr -> type_expr list -> type_expr @@ -266,14 +272,14 @@ val get_new_abstract_name : Env.t -> string -> string val unify: Env.t -> type_expr -> type_expr -> unit (* Unify the two types given. Raise [Unify] if not possible. *) val unify_gadt: - Pattern_env.t -> type_expr -> type_expr -> Btype.TypePairs.t - (* [unify_gadt penv ty1 ty2] unifies [ty1] and [ty2] in - [Pattern] mode, possible adding local constraints to the + Pattern_env.t -> pat:type_expr -> expected:type_expr -> Btype.TypePairs.t + (* [unify_gadt penv ~pat:ty1 ~expected:ty2] unifies [ty1] and [ty2] + in [Pattern] mode, possible adding local constraints to the environment in [penv]. Raises [Unify] if not possible. Returns the pairs of types that have been equated. - Type variables in [ty1] are assumed to be non-leaking (safely - reifiable), moreover if [penv.allow_recursive_equations = true] - the same assumption is made for [ty2]. *) + Type variables in [ty1] are always assumed to be non-leaking + (safely reifiable); if [penv.in_counterexample = true] + then both [ty1] and [ty2] are assumed to be non-leaking. *) val unify_var: Env.t -> type_expr -> type_expr -> unit (* Same as [unify], but allow free univars when first type is a variable. *) @@ -285,6 +291,7 @@ val filter_method: Env.t -> string -> type_expr -> type_expr [Filter_method_failed] instead of [Unify]. *) val occur_in: Env.t -> type_expr -> type_expr -> bool val deep_occur: type_expr -> type_expr -> bool +val deep_occur_list: type_expr -> type_expr list -> bool val moregeneral: Env.t -> bool -> type_expr -> type_expr -> unit (* Check if the first type scheme is more general than the second. *) val is_moregeneral: Env.t -> bool -> type_expr -> type_expr -> bool @@ -448,6 +455,7 @@ type closed_class_failure = { } val free_variables: ?env:Env.t -> type_expr -> type_expr list +val free_variables_list: ?env:Env.t -> type_expr list -> type_expr list (* If env present, then check for incomplete definitions too *) val closed_type_expr: ?env:Env.t -> type_expr -> bool val closed_type_decl: type_declaration -> type_expr option @@ -472,8 +480,7 @@ val immediacy : Env.t -> type_expr -> Type_immediacy.t (* Stubs *) val package_subtype : - (Env.t -> Path.t -> (Longident.t * type_expr) list -> - Path.t -> (Longident.t * type_expr) list -> + (Env.t -> package -> package -> (unit,Errortrace.first_class_module) Result.t) ref (* Raises [Incompatible] *) diff --git a/typing/data_types.ml b/typing/data_types.ml new file mode 100644 index 00000000..167a160c --- /dev/null +++ b/typing/data_types.ml @@ -0,0 +1,91 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Gabriel Scherer, projet Picube, INRIA Paris *) +(* *) +(* Copyright 2024 Institut National de Recherche en Informatique et *) +(* en Automatique. *) +(* *) +(* All rights reserved. This file is distributed under the terms of *) +(* the GNU Lesser General Public License version 2.1, with the *) +(* special exception on linking described in the file LICENSE. *) +(* *) +(**************************************************************************) + +open Asttypes +open Types + +(* Constructor and record label descriptions inserted held in typing + environments *) + +type constructor_description = + { cstr_name: string; (* Constructor name *) + cstr_res: type_expr; (* Type of the result *) + cstr_existentials: type_expr list; (* list of existentials *) + cstr_args: type_expr list; (* Type of the arguments *) + cstr_arity: int; (* Number of arguments *) + cstr_tag: constructor_tag; (* Tag for heap blocks *) + cstr_consts: int; (* Number of constant constructors *) + cstr_nonconsts: int; (* Number of non-const constructors *) + cstr_generalized: bool; (* Constrained return type? *) + cstr_private: private_flag; (* Read-only constructor? *) + cstr_loc: Location.t; + cstr_attributes: Parsetree.attributes; + cstr_inlined: type_declaration option; + cstr_uid: Uid.t; + } + +and constructor_tag = + Cstr_constant of int (* Constant constructor (an int) *) + | Cstr_block of int (* Regular constructor (a block) *) + | Cstr_unboxed (* Constructor of an unboxed type *) + | Cstr_extension of Path.t * bool (* Extension constructor + true if a constant false if a block*) + +let equal_tag t1 t2 = + match (t1, t2) with + | Cstr_constant i1, Cstr_constant i2 -> i2 = i1 + | Cstr_block i1, Cstr_block i2 -> i2 = i1 + | Cstr_unboxed, Cstr_unboxed -> true + | Cstr_extension (path1, _), Cstr_extension (path2, _) -> + Path.same path1 path2 + | (Cstr_constant _|Cstr_block _|Cstr_unboxed|Cstr_extension _), _ -> false + +let equal_constr c1 c2 = + equal_tag c1.cstr_tag c2.cstr_tag + +let may_equal_constr c1 c2 = + c1.cstr_arity = c2.cstr_arity + && (match c1.cstr_tag,c2.cstr_tag with + | Cstr_extension _,Cstr_extension _ -> + (* extension constructors may be rebindings of each other *) + true + | tag1, tag2 -> + equal_tag tag1 tag2) + +let cstr_res_type_path cstr = + match get_desc cstr.cstr_res with + | Tconstr (p, _, _) -> p + | _ -> assert false + +type label_description = + { lbl_name: string; (* Short name *) + lbl_res: type_expr; (* Type of the result (the record) *) + lbl_arg: type_expr; (* Type of the argument + (the field value) *) + lbl_mut: mutable_flag; (* Is this a mutable field? *) + lbl_atomic: atomic_flag; (* Is this an atomic field? *) + lbl_pos: int; (* Position in block *) + lbl_all: label_description array; (* All the labels in this type *) + lbl_repres: record_representation; (* Representation for this record *) + lbl_private: private_flag; (* Read-only field? *) + lbl_loc: Location.t; + lbl_attributes: Parsetree.attributes; + lbl_uid: Uid.t; + } + +let lbl_res_type_path lbl = + match get_desc lbl.lbl_res with + | Tconstr (p, _, _) -> p + | _ -> assert false diff --git a/typing/data_types.mli b/typing/data_types.mli new file mode 100644 index 00000000..2ec77dbe --- /dev/null +++ b/typing/data_types.mli @@ -0,0 +1,75 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Gabriel Scherer, projet Picube, INRIA Paris *) +(* *) +(* Copyright 2024 Institut National de Recherche en Informatique et *) +(* en Automatique. *) +(* *) +(* All rights reserved. This file is distributed under the terms of *) +(* the GNU Lesser General Public License version 2.1, with the *) +(* special exception on linking described in the file LICENSE. *) +(* *) +(**************************************************************************) + +open Asttypes +open Types + +(* Constructor and record label descriptions inserted held in typing + environments *) + +type constructor_description = + { cstr_name: string; (* Constructor name *) + cstr_res: type_expr; (* Type of the result *) + cstr_existentials: type_expr list; (* list of existentials *) + cstr_args: type_expr list; (* Type of the arguments *) + cstr_arity: int; (* Number of arguments *) + cstr_tag: constructor_tag; (* Tag for heap blocks *) + cstr_consts: int; (* Number of constant constructors *) + cstr_nonconsts: int; (* Number of non-const constructors *) + cstr_generalized: bool; (* Constrained return type? *) + cstr_private: private_flag; (* Read-only constructor? *) + cstr_loc: Location.t; + cstr_attributes: Parsetree.attributes; + cstr_inlined: type_declaration option; + cstr_uid: Uid.t; + } + +and constructor_tag = + Cstr_constant of int (* Constant constructor (an int) *) + | Cstr_block of int (* Regular constructor (a block) *) + | Cstr_unboxed (* Constructor of an unboxed type *) + | Cstr_extension of Path.t * bool (* Extension constructor + true if a constant false if a block*) + +(* Constructors are the same: they return (structurally)-equal values + when applied to equal arguments. *) +val equal_constr : + constructor_description -> constructor_description -> bool + +(* Constructors may be the same, given potential rebinding. *) +val may_equal_constr : + constructor_description -> constructor_description -> bool + +(* Type constructor of the constructor's result type. *) +val cstr_res_type_path : constructor_description -> Path.t + +type label_description = + { lbl_name: string; (* Short name *) + lbl_res: type_expr; (* Type of the result (the record) *) + lbl_arg: type_expr; (* Type of the argument + (the field value) *) + lbl_mut: mutable_flag; (* Is this a mutable field? *) + lbl_atomic: atomic_flag; (* Is this an atomic field? *) + lbl_pos: int; (* Position in block *) + lbl_all: label_description array; (* All the labels in this type *) + lbl_repres: record_representation; (* Representation for this record *) + lbl_private: private_flag; (* Read-only field? *) + lbl_loc: Location.t; + lbl_attributes: Parsetree.attributes; + lbl_uid: Uid.t; + } + +(* Type constructor of the label record type. *) +val lbl_res_type_path : label_description -> Path.t diff --git a/typing/datarepr.ml b/typing/datarepr.ml index 52280311..d0266be6 100644 --- a/typing/datarepr.ml +++ b/typing/datarepr.ml @@ -18,6 +18,7 @@ open Asttypes open Types +open Data_types open Btype (* Simplified version of Ctype.free_vars *) @@ -56,7 +57,9 @@ let constructor_existentials cd_args cd_res = match cd_res with | None -> [] | Some type_ret -> - let arg_vars_set = free_vars (newgenty (Ttuple tyl)) in + let arg_vars_set = + free_vars (newgenty (Ttuple (List.map (fun ty -> None, ty) tyl))) + in let res_vars = free_vars type_ret in TypeSet.elements (TypeSet.diff arg_vars_set res_vars) in @@ -67,7 +70,10 @@ let constructor_args ~current_unit priv cd_args cd_res path rep = match cd_args with | Cstr_tuple l -> existentials, l, None | Cstr_record lbls -> - let arg_vars_set = free_vars ~param:true (newgenty (Ttuple tyl)) in + let arg_vars_set = + free_vars ~param:true + (newgenty (Ttuple (List.map (fun ty -> None, ty) tyl))) + in let type_params = TypeSet.elements arg_vars_set in let arity = List.length type_params in let tdecl = @@ -178,7 +184,8 @@ let none = (* Clearly ill-formed type *) let dummy_label = - { lbl_name = ""; lbl_res = none; lbl_arg = none; lbl_mut = Immutable; + { lbl_name = ""; lbl_res = none; lbl_arg = none; + lbl_mut = Immutable; lbl_atomic = Nonatomic; lbl_pos = (-1); lbl_all = [||]; lbl_repres = Record_regular; lbl_private = Public; lbl_loc = Location.none; @@ -196,6 +203,7 @@ let label_descrs ty_res lbls repres priv = lbl_res = ty_res; lbl_arg = l.ld_type; lbl_mut = l.ld_mutable; + lbl_atomic = l.ld_atomic; lbl_pos = num; lbl_all = all_labels; lbl_repres = repres; diff --git a/typing/datarepr.mli b/typing/datarepr.mli index 1ccb918e..140ca7c5 100644 --- a/typing/datarepr.mli +++ b/typing/datarepr.mli @@ -17,6 +17,7 @@ determining their representation. *) open Types +open Data_types val extension_descr: current_unit:(Unit_info.t option) -> Path.t -> extension_constructor -> diff --git a/typing/env.ml b/typing/env.ml index 07f7398a..d6913270 100644 --- a/typing/env.ml +++ b/typing/env.ml @@ -21,6 +21,7 @@ open Asttypes open Longident open Path open Types +open Data_types open Local_store @@ -137,7 +138,8 @@ type value_unbound_reason = | Val_unbound_ghost_recursive of Location.t type module_unbound_reason = - | Mod_unbound_illegal_recursion + | Mod_unbound_illegal_recursion of + { container : string option; unbound : string } type summary = Env_empty @@ -652,7 +654,14 @@ type lookup_error = | Functor_used_as_structure of Longident.t | Abstract_used_as_structure of Longident.t | Generative_used_as_applicative of Longident.t - | Illegal_reference_to_recursive_module + | Illegal_reference_to_recursive_module of + { container: string option; unbound : string } + | Illegal_reference_to_recursive_class_type of + { container : string option; + unbound : string; + unbound_class_type : Longident.t; + container_class_type : string; + } | Cannot_scrape_alias of Longident.t * Path.t type error = @@ -871,7 +880,7 @@ let add_persistent_structure id env = affect the environment at all. We should only observe the existence of a cmi when accessing components of the module. (See #9991). *) - if material || not !Clflags.transparent_modules then + if material || not !Clflags.no_alias_deps then IdTbl.add id Mod_persistent env.modules else env.modules @@ -1323,7 +1332,7 @@ let required_globals = s_ref [] let reset_required_globals () = required_globals := [] let get_required_globals () = !required_globals let add_required_global id = - if Ident.global id && not !Clflags.transparent_modules + if Ident.global id && not !Clflags.no_alias_deps && not (List.exists (Ident.same id) !required_globals) then required_globals := id :: !required_globals @@ -1347,7 +1356,7 @@ and expand_module_path lax env path = try match find_module_lazy ~alias:true path env with {mdl_type=MtyL_alias path1} -> let path' = normalize_module_path lax env path1 in - if lax || !Clflags.transparent_modules then path' else + if lax || !Clflags.no_alias_deps then path' else let id = Path.head path in if Ident.global id && not (Ident.same id (Path.head path')) then add_required_global id; @@ -1995,7 +2004,7 @@ and store_type ~check id info shape env = let loc = info.type_loc in if check then check_usage loc id info.type_uid - (fun s -> Warnings.Unused_type_declaration s) + (fun s -> Warnings.Unused_type_declaration (s, Warnings.Declaration)) !type_declarations; let descrs, env = let path = Pident id in @@ -2605,23 +2614,23 @@ let mark_type_path_used env path = | decl -> mark_type_used decl.type_uid | exception Not_found -> () -let mark_constructor_used usage cd = - match Types.Uid.Tbl.find !used_constructors cd.cd_uid with +let mark_constructor_used usage uid = + match Types.Uid.Tbl.find !used_constructors uid with | mark -> mark usage | exception Not_found -> () -let mark_extension_used usage ext = - match Types.Uid.Tbl.find !used_constructors ext.ext_uid with +let mark_extension_used usage uid = + match Types.Uid.Tbl.find !used_constructors uid with | mark -> mark usage | exception Not_found -> () -let mark_label_used usage ld = - match Types.Uid.Tbl.find !used_labels ld.ld_uid with +let mark_label_used usage uid = + match Types.Uid.Tbl.find !used_labels uid with | mark -> mark usage | exception Not_found -> () let mark_constructor_description_used usage env cstr = - let ty_path = Btype.cstr_type_path cstr in + let ty_path = cstr_res_type_path cstr in mark_type_path_used env ty_path; match Types.Uid.Tbl.find !used_constructors cstr.cstr_uid with | mark -> mark usage @@ -2668,9 +2677,10 @@ let may_lookup_error report_errors loc env err = let report_module_unbound ~errors ~loc env reason = match reason with - | Mod_unbound_illegal_recursion -> + | Mod_unbound_illegal_recursion { container; unbound } -> (* see #5965 *) - may_lookup_error errors loc env Illegal_reference_to_recursive_module + may_lookup_error errors loc env + (Illegal_reference_to_recursive_module { container; unbound }) let report_value_unbound ~errors ~loc env reason lid = match reason with @@ -2879,7 +2889,8 @@ let rec lookup_module_components ~errors ~use ~loc lid env = !components_of_functor_appl' ~loc ~f_path ~f_comp ~arg env in Papply (f_path, arg), comps -and lookup_structure_components ~errors ~use ~loc lid env = +and lookup_structure_components ~errors ~use l env = + let { txt=lid; loc } = l in let path, comps = lookup_module_components ~errors ~use ~loc lid env in match get_components_res comps with | Ok (Structure_comps comps) -> path, comps @@ -2905,24 +2916,26 @@ and get_functor_components ~errors ~loc lid env comps = | Error (No_components_alias p) -> may_lookup_error errors loc env (Cannot_scrape_alias(lid, p)) -and lookup_all_args ~errors ~use ~loc lid0 env = +and lookup_all_args ~errors ~use lid0 env = let rec loop_lid_arg args = function | Lident _ | Ldot _ as f_lid -> (f_lid, args) | Lapply (f_lid, arg_lid) -> + let { txt = arg_lid; loc } = arg_lid in let arg_path, arg_md = lookup_module ~errors ~use ~loc arg_lid env in - loop_lid_arg ((f_lid,arg_path,arg_md.md_type)::args) f_lid + loop_lid_arg ((f_lid,arg_path,arg_md.md_type)::args) f_lid.txt in loop_lid_arg [] lid0 and lookup_apply ~errors ~use ~loc lid0 env = - let f0_lid, args0 = lookup_all_args ~errors ~use ~loc lid0 env in + let f0_lid, args0 = lookup_all_args ~errors ~use lid0 env in let args_for_errors = List.map (fun (_,p,mty) -> (p,mty)) args0 in let f0_path, f0_comp = lookup_module_components ~errors ~use ~loc f0_lid env in let check_one_apply ~errors ~loc ~f_lid ~f_comp ~arg_path ~arg_mty env = let f_comp, param_mty = + let { txt = f_lid; loc } = f_lid in get_functor_components ~errors ~loc f_lid env f_comp in check_functor_appl @@ -2969,10 +2982,10 @@ and lookup_module ~errors ~use ~loc lid env = Papply(path_f, path_arg), md and lookup_dot_module ~errors ~use ~loc l s env = - let p, comps = lookup_structure_components ~errors ~use ~loc l env in - match NameMap.find s comps.comp_modules with + let p, comps = lookup_structure_components ~errors ~use l env in + match NameMap.find s.txt comps.comp_modules with | mda -> - let path = Pdot(p, s) in + let path = Pdot(p, s.txt) in use_module ~use ~loc path mda; (path, mda) | exception Not_found -> @@ -2980,59 +2993,59 @@ and lookup_dot_module ~errors ~use ~loc l s env = let lookup_dot_value ~errors ~use ~loc l s env = let (path, comps) = - lookup_structure_components ~errors ~use ~loc l env + lookup_structure_components ~errors ~use l env in - match NameMap.find s comps.comp_values with + match NameMap.find s.txt comps.comp_values with | vda -> - let path = Pdot(path, s) in + let path = Pdot(path, s.txt) in use_value ~use ~loc path vda; (path, vda.vda_description) | exception Not_found -> may_lookup_error errors loc env (Unbound_value (Ldot(l, s), No_hint)) let lookup_dot_type ~errors ~use ~loc l s env = - let (p, comps) = lookup_structure_components ~errors ~use ~loc l env in - match NameMap.find s comps.comp_types with + let (p, comps) = lookup_structure_components ~errors ~use l env in + match NameMap.find s.txt comps.comp_types with | tda -> - let path = Pdot(p, s) in + let path = Pdot(p, s.txt) in use_type ~use ~loc path tda; (path, tda) | exception Not_found -> may_lookup_error errors loc env (Unbound_type (Ldot(l, s))) let lookup_dot_modtype ~errors ~use ~loc l s env = - let (p, comps) = lookup_structure_components ~errors ~use ~loc l env in - match NameMap.find s comps.comp_modtypes with + let (p, comps) = lookup_structure_components ~errors ~use l env in + match NameMap.find s.txt comps.comp_modtypes with | mta -> - let path = Pdot(p, s) in + let path = Pdot(p, s.txt) in use_modtype ~use ~loc path mta.mtda_declaration; (path, mta.mtda_declaration) | exception Not_found -> may_lookup_error errors loc env (Unbound_modtype (Ldot(l, s))) let lookup_dot_class ~errors ~use ~loc l s env = - let (p, comps) = lookup_structure_components ~errors ~use ~loc l env in - match NameMap.find s comps.comp_classes with + let (p, comps) = lookup_structure_components ~errors ~use l env in + match NameMap.find s.txt comps.comp_classes with | clda -> - let path = Pdot(p, s) in + let path = Pdot(p, s.txt) in use_class ~use ~loc path clda; (path, clda.clda_declaration) | exception Not_found -> may_lookup_error errors loc env (Unbound_class (Ldot(l, s))) let lookup_dot_cltype ~errors ~use ~loc l s env = - let (p, comps) = lookup_structure_components ~errors ~use ~loc l env in - match NameMap.find s comps.comp_cltypes with + let (p, comps) = lookup_structure_components ~errors ~use l env in + match NameMap.find s.txt comps.comp_cltypes with | cltda -> - let path = Pdot(p, s) in + let path = Pdot(p, s.txt) in use_cltype ~use ~loc path cltda.cltda_declaration; (path, cltda.cltda_declaration) | exception Not_found -> may_lookup_error errors loc env (Unbound_cltype (Ldot(l, s))) let lookup_all_dot_labels ~errors ~use ~loc usage l s env = - let (_, comps) = lookup_structure_components ~errors ~use ~loc l env in - match NameMap.find s comps.comp_labels with + let (_, comps) = lookup_structure_components ~errors ~use l env in + match NameMap.find s.txt comps.comp_labels with | [] | exception Not_found -> may_lookup_error errors loc env (Unbound_label (Ldot(l, s))) | lbls -> @@ -3044,13 +3057,14 @@ let lookup_all_dot_labels ~errors ~use ~loc usage l s env = let lookup_all_dot_constructors ~errors ~use ~loc usage l s env = match l with - | Longident.Lident "*predef*" -> + | { txt=Longident.Lident "*predef*"; _ } -> (* Hack to support compilation of default arguments *) + let { txt=s; loc } = s in lookup_all_ident_constructors ~errors ~use ~loc usage s initial | _ -> - let (_, comps) = lookup_structure_components ~errors ~use ~loc l env in - match NameMap.find s comps.comp_constrs with + let (_, comps) = lookup_structure_components ~errors ~use l env in + match NameMap.find s.txt comps.comp_constrs with | [] | exception Not_found -> may_lookup_error errors loc env (Unbound_constructor (Ldot(l, s))) | cstrs -> @@ -3065,7 +3079,7 @@ let lookup_all_dot_constructors ~errors ~use ~loc usage l s env = let lookup_module_path ~errors ~use ~loc ~load lid env : Path.t = match lid with | Lident s -> - if !Clflags.transparent_modules && not load then + if !Clflags.no_alias_deps && not load then fst (lookup_ident_module Don't_load ~errors ~use ~loc s env) else fst (lookup_ident_module Load ~errors ~use ~loc s env) @@ -3526,18 +3540,25 @@ open Format_doc let print_path: Path.t printer ref = ref (fun _ _ -> assert false) let pp_path ppf l = !print_path ppf l -let spellcheck ppf extract env lid = +module Style = Misc.Style + +let quoted_longident = Style.as_inline_code Pprintast.Doc.longident +let quoted_constr = Style.as_inline_code Pprintast.Doc.constr + +let spellcheck extract env lid = let choices ~path name = Misc.spellcheck (extract path env) name in - match lid with - | Longident.Lapply _ -> () + match lid with + | Longident.Lapply _ -> None | Longident.Lident s -> - Misc.did_you_mean ppf (fun () -> choices ~path:None s) + Misc.did_you_mean (choices ~path:None s) | Longident.Ldot (r, s) -> - Misc.did_you_mean ppf (fun () -> choices ~path:(Some r) s) + let pp ppf s = + quoted_longident ppf (Longident.Ldot(r, Location.mknoloc s)) + in + Misc.did_you_mean ~pp (choices ~path:(Some r.txt) s.txt) -let spellcheck_name ppf extract env name = - Misc.did_you_mean ppf - (fun () -> Misc.spellcheck (extract env) name) +let spellcheck_name extract env name = + Misc.did_you_mean (Misc.spellcheck (extract env) name) let extract_values path env = fold_values (fun name _ _ acc -> name :: acc) path env [] @@ -3562,130 +3583,192 @@ let extract_instance_variables env = | Val_ivar _ -> name :: acc | _ -> acc) None env [] -module Style = Misc.Style - -let quoted_longident = Style.as_inline_code Pprintast.Doc.longident -let quoted_constr = Style.as_inline_code Pprintast.Doc.constr - -let report_lookup_error_doc _loc env ppf = function - | Unbound_value(lid, hint) -> begin - fprintf ppf "Unbound value %a" quoted_longident lid; - spellcheck ppf extract_values env lid; - match hint with - | No_hint -> () - | Missing_rec def_loc -> - let (_, line, _) = - Location.get_pos_info def_loc.Location.loc_start - in - fprintf ppf - "@.@[@{Hint@}: If this is a recursive definition,@ \ - you should add the %a keyword on line %i@]" - Style.inline_code "rec" - line - end +let report_lookup_error_doc loc env = function + | Unbound_value(lid, hint) -> + Location.aligned_error_hint ~loc + "@{Unbound value @}%a" quoted_longident lid + (spellcheck extract_values env lid) + ~sub:( + match hint with + | No_hint ->[] + | Missing_rec def_loc -> + let (_, line, _) = + Location.get_pos_info def_loc.Location.loc_start + in + [Location.msg + "@[@{Hint@}: If this is a recursive definition,@ \ + you should add the %a keyword on line %i@]" + Style.inline_code "rec" + line + ] + ) | Unbound_type lid -> - fprintf ppf "Unbound type constructor %a" - quoted_longident lid; - spellcheck ppf extract_types env lid; + Location.aligned_error_hint ~loc + "@{Unbound type constructor @}%a" + quoted_longident lid + (spellcheck extract_types env lid) | Unbound_module lid -> begin - fprintf ppf "Unbound module %a" - quoted_longident lid; - match find_modtype_by_name lid env with - | exception Not_found -> spellcheck ppf extract_modules env lid; + let main ppf = + fprintf ppf "@{Unbound module @}%a" quoted_longident lid in + match find_modtype_by_name lid env with + | exception Not_found -> + Location.aligned_error_hint ~loc "%t" main + (spellcheck extract_modules env lid) | _ -> - fprintf ppf - "@.@[@{Hint@}: There is a module type named %a, %s@]" - quoted_longident lid - "but module types are not modules" + Location.errorf ~loc "%t" main + ~sub:[Location.msg + "@{Hint@}: There is a module type named %a,@ \ + but module types are not modules" + quoted_longident lid + ] end | Unbound_constructor lid -> - fprintf ppf "Unbound constructor %a" - quoted_constr lid; - spellcheck ppf extract_constructors env lid; + Location.aligned_error_hint ~loc + "@{Unbound constructor @}%a" + quoted_constr lid + (spellcheck extract_constructors env lid) | Unbound_label lid -> - fprintf ppf "Unbound record field %a" - quoted_longident lid; - spellcheck ppf extract_labels env lid; + Location.aligned_error_hint ~loc + "@{Unbound record field @}%a" + quoted_longident lid + (spellcheck extract_labels env lid) | Unbound_class lid -> begin - fprintf ppf "Unbound class %a" - quoted_longident lid; + let main ppf = + fprintf ppf "@{Unbound class @}%a" quoted_longident lid + in match find_cltype_by_name lid env with - | exception Not_found -> spellcheck ppf extract_classes env lid; + | exception Not_found -> + Location.aligned_error_hint ~loc "%t" main + (spellcheck extract_classes env lid) | _ -> - fprintf ppf - "@.@[@{Hint@}: There is a class type named %a, %s@]" - quoted_longident lid - "but classes are not class types" + Location.errorf ~loc "%t" main + ~sub:[ + Location.msg + "@{Hint@}: There is a class type named %a,@ \ + but classes are not class types." + quoted_longident lid + ] end | Unbound_modtype lid -> begin - fprintf ppf "Unbound module type %a" - quoted_longident lid; + let main ppf = + fprintf ppf "@{Unbound module type @}%a" + quoted_longident lid in match find_module_by_name lid env with - | exception Not_found -> spellcheck ppf extract_modtypes env lid; + | exception Not_found -> + Location.aligned_error_hint ~loc "%t" main + (spellcheck extract_modtypes env lid) | _ -> - fprintf ppf - "@.@[@{Hint@}: There is a module named %a, %s@]" - quoted_longident lid - "but modules are not module types" - end + Location.errorf ~loc "%t" main + ~sub:[ + Location.msg + "@{Hint@}: There is a module named %a,@ \ + but modules are not module types" + quoted_longident lid + ] + end | Unbound_cltype lid -> - fprintf ppf "Unbound class type %a" - quoted_longident lid; - spellcheck ppf extract_cltypes env lid; + Location.aligned_error_hint ~loc + "@{Unbound class type @}%a" quoted_longident lid + (spellcheck extract_cltypes env lid) | Unbound_instance_variable s -> - fprintf ppf "Unbound instance variable %a" Style.inline_code s; - spellcheck_name ppf extract_instance_variables env s; + Location.aligned_error_hint ~loc + "@{Unbound instance variable @}%a" + Style.inline_code s + (spellcheck_name extract_instance_variables env s) | Not_an_instance_variable s -> - fprintf ppf "The value %a is not an instance variable" - Style.inline_code s; - spellcheck_name ppf extract_instance_variables env s; + Location.aligned_error_hint ~loc + "@{The value @}%a is not an instance variable" + Style.inline_code s + (spellcheck_name extract_instance_variables env s) | Masked_instance_variable lid -> - fprintf ppf - "The instance variable %a@ \ - cannot be accessed from the definition of another instance variable" + Location.errorf ~loc + "The instance variable %a@ cannot@ be@ accessed@ from@ the@ \ + definition@ of@ another instance variable" quoted_longident lid | Masked_self_variable lid -> - fprintf ppf - "The self variable %a@ \ - cannot be accessed from the definition of an instance variable" + Location.errorf ~loc + "The self variable %a@ cannot@ be@ accessed@ \ + from@ the@ definition of an instance variable" quoted_longident lid | Masked_ancestor_variable lid -> - fprintf ppf - "The ancestor variable %a@ \ - cannot be accessed from the definition of an instance variable" - quoted_longident lid - | Illegal_reference_to_recursive_module -> - fprintf ppf "Illegal recursive module reference" + Location.errorf ~loc + "The ancestor variable %a@ cannot@ be@ accessed@ from@ \ + the definition of an instance variable" + quoted_longident lid + | Illegal_reference_to_recursive_module { container; unbound } -> + let container = Option.value ~default:"_" container in + let self_or_definition, self_or_unbound = + if String.equal container unbound + then dprintf "its own definition", dprintf "itself" + else + dprintf "the definition of the module %a" Style.inline_code container, + dprintf "the module type of %a" Style.inline_code unbound + in + Location.errorf ~loc + "@[This module type is recursive.@ \ + This use of the recursive module %a@ \ + within %t@ \ + makes the module type of %a depend on@ %t.@ \ + Such recursive definitions of module types are not allowed.@]" + Style.inline_code unbound + self_or_definition + Style.inline_code container + self_or_unbound + | Illegal_reference_to_recursive_class_type + { container; unbound; unbound_class_type; container_class_type } -> + let container = Option.value ~default:"_" container in + let self_or_unbound = + if String.equal container unbound + then dprintf "itself" + else dprintf "the module type of %a" Style.inline_code unbound + in + Location.errorf ~loc + "@[This class type is recursive.@ This use of the class type %a@ \ + from the recursive module %a@ within the definition of@ \ + the class type %a@ in the recursive module %a@ \ + makes the module type of %a@ depend on %t.@ \ + Such recursive definitions of@ class types within recursive modules@ \ + are not allowed.@]" + quoted_longident unbound_class_type + Style.inline_code unbound + Style.inline_code container_class_type + Style.inline_code container + Style.inline_code container + self_or_unbound | Structure_used_as_functor lid -> - fprintf ppf "@[The module %a is a structure, it cannot be applied@]" + Location.errorf ~loc + "The module %a is a structure, it cannot be applied" quoted_longident lid | Abstract_used_as_functor lid -> - fprintf ppf "@[The module %a is abstract, it cannot be applied@]" - quoted_longident lid + Location.errorf ~loc + "The module %a is abstract, it cannot be applied" + quoted_longident lid | Functor_used_as_structure lid -> - fprintf ppf "@[The module %a is a functor, \ - it cannot have any components@]" quoted_longident lid + Location.errorf ~loc + "The module %a is a functor, it cannot have any components" + quoted_longident lid | Abstract_used_as_structure lid -> - fprintf ppf "@[The module %a is abstract, \ - it cannot have any components@]" - quoted_longident lid + Location.errorf ~loc + "The module %a is abstract, it cannot have any components" + quoted_longident lid | Generative_used_as_applicative lid -> - fprintf ppf "@[The functor %a is generative,@ it@ cannot@ be@ \ - applied@ in@ type@ expressions@]" + Location.errorf ~loc + "The functor %a is generative,@ it@ cannot@ be@ \ + applied@ in@ type@ expressions" quoted_longident lid | Cannot_scrape_alias(lid, p) -> let cause = if Current_unit.Name.is_path p then "is the current compilation unit" else "is missing" in - fprintf ppf + Location.errorf ~loc "The module %a is an alias for module %a, which %s" quoted_longident lid (Style.as_inline_code pp_path) p cause -let report_error_doc ppf = function - | Missing_module(_, path1, path2) -> - fprintf ppf "@[@["; +let report_error_doc = function + | Missing_module(loc, path1, path2) -> + let pp_path path1 path2 ppf = if Path.same path1 path2 then fprintf ppf "Internal path@ %a@ is dangling." Style.inline_code (Path.name path1) @@ -3693,34 +3776,20 @@ let report_error_doc ppf = function fprintf ppf "Internal path@ %a@ expands to@ %a@ which is dangling." Style.inline_code (Path.name path1) Style.inline_code (Path.name path2); - fprintf ppf "@]@ @[%s@ %a@ %s.@]@]" - "The compiled interface for module" + in + Location.errorf ~loc + "%t@ @[The compiled interface for module@ %a@ was not found.@]" + (pp_path path1 path2) Style.inline_code (Ident.name (Path.head path2)) - "was not found" - | Illegal_value_name(_loc, name) -> - fprintf ppf "%a is not a valid value identifier." + | Illegal_value_name(loc, name) -> + Location.errorf ~loc "%a is not a valid value identifier." Style.inline_code name - | Lookup_error(loc, t, err) -> report_lookup_error_doc loc t ppf err + | Lookup_error(loc, t, err) -> report_lookup_error_doc loc t err let () = Location.register_error_of_exn (function - | Error err -> - let loc = - match err with - | Missing_module (loc, _, _) - | Illegal_value_name (loc, _) - | Lookup_error(loc, _, _) -> loc - in - let error_of_printer = - if loc = Location.none - then Location.error_of_printer_file - else Location.error_of_printer ~loc ?sub:None ?footnote:None - in - Some (error_of_printer report_error_doc err) + | Error err -> Some (report_error_doc err) | _ -> None ) - -let report_lookup_error = Format_doc.compat2 report_lookup_error_doc -let report_error = Format_doc.compat report_error_doc diff --git a/typing/env.mli b/typing/env.mli index 1ad27a11..736ffac3 100644 --- a/typing/env.mli +++ b/typing/env.mli @@ -16,6 +16,7 @@ (* Environment handling *) open Types +open Data_types open Misc type value_unbound_reason = @@ -25,7 +26,8 @@ type value_unbound_reason = | Val_unbound_ghost_recursive of Location.t type module_unbound_reason = - | Mod_unbound_illegal_recursion + | Mod_unbound_illegal_recursion of + { container : string option; unbound: string } type summary = Env_empty @@ -145,14 +147,14 @@ val mark_type_used: Uid.t -> unit type constructor_usage = Positive | Pattern | Exported_private | Exported val mark_constructor_used: - constructor_usage -> constructor_declaration -> unit + constructor_usage -> Uid.t -> unit val mark_extension_used: - constructor_usage -> extension_constructor -> unit + constructor_usage -> Uid.t -> unit type label_usage = Projection | Mutation | Construct | Exported_private | Exported val mark_label_used: - label_usage -> label_declaration -> unit + label_usage -> Uid.t -> unit (* Lookup by long identifiers *) @@ -181,7 +183,14 @@ type lookup_error = | Functor_used_as_structure of Longident.t | Abstract_used_as_structure of Longident.t | Generative_used_as_applicative of Longident.t - | Illegal_reference_to_recursive_module + | Illegal_reference_to_recursive_module of + { container : string option; unbound : string } + | Illegal_reference_to_recursive_class_type of + { container : string option; + unbound : string; + unbound_class_type : Longident.t; + container_class_type : string + } | Cannot_scrape_alias of Longident.t * Path.t val lookup_error: Location.t -> t -> lookup_error -> 'a @@ -448,14 +457,6 @@ type error = exception Error of error - -val report_error: error Format_doc.format_printer -val report_error_doc: error Format_doc.printer - -val report_lookup_error: - Location.t -> t -> lookup_error Format_doc.format_printer -val report_lookup_error_doc: - Location.t -> t -> lookup_error Format_doc.printer val in_signature: bool -> t -> t val is_in_signature: t -> bool diff --git a/typing/errortrace.ml b/typing/errortrace.ml index 347e5c9a..4986623f 100644 --- a/typing/errortrace.ml +++ b/typing/errortrace.ml @@ -110,6 +110,7 @@ type ('a, 'variety) elt = | Obj : 'variety obj -> ('a, 'variety) elt | Escape : 'a escape -> ('a, _) elt | Function_label_mismatch of Asttypes.arg_label diff + | Tuple_label_mismatch of string option diff | Incompatible_fields : { name:string; diff: type_expr diff } -> ('a, _) elt (* Could move [Incompatible_fields] into [obj] *) | First_class_module: first_class_module -> ('a,_) elt @@ -127,7 +128,8 @@ let map_elt (type variety) f : ('a, variety) elt -> ('b, variety) elt = function Escape { kind = Equation (f x); context } | Escape {kind = (Univ _ | Self | Constructor _ | Module_type _ | Constraint); _} - | Variant _ | Obj _ | Function_label_mismatch _ | Incompatible_fields _ + | Variant _ | Obj _ | Function_label_mismatch _ | Tuple_label_mismatch _ + | Incompatible_fields _ | Rec_occur (_, _) | First_class_module _ as x -> x let map f t = List.map (map_elt f) t diff --git a/typing/errortrace.mli b/typing/errortrace.mli index 6b42b66a..fca1270b 100644 --- a/typing/errortrace.mli +++ b/typing/errortrace.mli @@ -96,6 +96,7 @@ type ('a, 'variety) elt = | Obj : 'variety obj -> ('a, 'variety) elt | Escape : 'a escape -> ('a, _) elt | Function_label_mismatch of Asttypes.arg_label diff + | Tuple_label_mismatch of string option diff | Incompatible_fields : { name:string; diff: type_expr diff } -> ('a, _) elt | First_class_module: first_class_module -> ('a,_) elt (* Unification & Moregen; included in Equality for simplicity *) diff --git a/typing/errortrace_report.ml b/typing/errortrace_report.ml index 03012f7d..18f233f4 100644 --- a/typing/errortrace_report.ml +++ b/typing/errortrace_report.ml @@ -271,16 +271,14 @@ let explain_incompatible_fields name (diff: Types.type_expr Errortrace.diff) = (Style.as_inline_code type_expr_with_reserved_names) diff.expected -let explain_label_mismatch ~got ~expected = +let explain_label_mismatch ~missing_label_msg {Errortrace.got;expected} = let quoted_label ppf l = Style.inline_code ppf (Asttypes.string_of_label l) in match got, expected with | Asttypes.Nolabel, Asttypes.(Labelled _ | Optional _ ) -> doc_printf "@,@[A label@ %a@ was expected@]" quoted_label expected | Asttypes.(Labelled _|Optional _), Asttypes.Nolabel -> - doc_printf - "@,@[The first argument is labeled@ %a,@ \ - but an unlabeled argument was expected@]" + doc_printf missing_label_msg quoted_label got | Asttypes.Labelled g, Asttypes.Optional e when g = e -> doc_printf @@ -328,7 +326,24 @@ let explanation (type variety) intro prev env | Errortrace.Incompatible_fields { name; diff} -> Some(explain_incompatible_fields name diff) | Errortrace.Function_label_mismatch diff -> - Some(explain_label_mismatch ~got:diff.got ~expected:diff.expected) + let missing_label_msg = + format_of_string + "@,@[The first argument is labeled@ %a,@ \ + but an unlabeled argument was expected@]" + in + Some(explain_label_mismatch ~missing_label_msg diff) + | Errortrace.Tuple_label_mismatch diff -> + let ast_label = function + | None -> Asttypes.Nolabel + | Some x -> Asttypes.Labelled x + in + let diff = Errortrace.map_diff ast_label diff in + let missing_label_msg = + format_of_string + "@,@[The first tuple element is labeled@ %a,@ \ + but an unlabeled element was expected@]" + in + Some(explain_label_mismatch ~missing_label_msg diff) | Errortrace.Variant v -> explain_variant v | Errortrace.Obj o -> diff --git a/typing/gprinttyp.ml b/typing/gprinttyp.ml index 0056efb9..b2f53ca0 100644 --- a/typing/gprinttyp.ml +++ b/typing/gprinttyp.ml @@ -139,16 +139,29 @@ module Index: sig | Main of int | Synthetic of int | Named_subnode of { id:int; synth:bool; name:string } + type level_and_scope = { level:int; scope: int } + type 'a desc = { + id: 'a; + color: Decoration.color option; + desc: Types.type_desc; + lvl:level_and_scope; + } val subnode: name:string -> t -> t val either_ext: Types.row_field_cell -> t - val split: - params -> Types.type_expr -> t * Decoration.color option * Types.type_desc + val split: params -> Types.type_expr -> t desc val colorize: params -> t -> Decoration.color option end = struct type t = | Main of int | Synthetic of int | Named_subnode of { id:int; synth:bool; name:string } + type level_and_scope = { level:int; scope: int } + type 'a desc = { + id: 'a; + color: Decoration.color option; + desc: Types.type_desc; + lvl:level_and_scope; + } type name_map = { (* We keep the main and synthetic and index space separate to avoid index @@ -221,7 +234,13 @@ end = struct let split params x = let x = repr params x in let color = colorize_id params x.id in - pretty_id params x.id, color, x.desc + let scope = Types.Transient_expr.get_scope x in + let level = x.level in + { id = pretty_id params x.id; + color; + desc = x.desc; + lvl = {level;scope} + } let subnode ~name x = match x with | Main id -> Named_subnode {id;name;synth=false} @@ -303,8 +322,9 @@ module Pp = struct let seq ~sep = pp_print_seq ~pp_sep:sep let rec longident ppf = function | Longident.Lident s -> fprintf ppf "%s" s - | Longident.Ldot (l,s) -> fprintf ppf "%a.%s" longident l s - | Longident.Lapply(f,x) -> fprintf ppf "%a(%a)" longident f longident x + | Longident.Ldot (l,s) -> fprintf ppf "%a.%s" longident l.txt s.txt + | Longident.Lapply(f,x) -> + fprintf ppf "%a(%a)" longident f.txt longident x.txt let color ppf = function | Decoration.Named s -> fprintf ppf "%s" s @@ -521,8 +541,49 @@ module Digraph = struct let labelf fmt = labelk Fun.id fmt let labelr fmt = labelk Decoration.make fmt - let add_node explicit_d color id tynode dg = - let d = labelf "%a" Pp.prettier_index id in + (* Use unicode superscript digit to circumvent graphviz limited support for + superscript. *) + let superscript_digit ppf n = + let s = match n with + | 1 -> "¹" + | 2 -> "²" + | 3 -> "³" + | 0 -> "⁰" + | 4 -> "⁴" + | 5 -> "⁵" + | 6 -> "⁶" + | 7 -> "⁷" + | 8 -> "⁸" + | 9 -> "⁹" + | _ -> assert false + in + Format.pp_print_string ppf s + + let rec superscript ppf n = + if n < 10 then + superscript_digit ppf n + else begin + superscript ppf (n/10); + superscript_digit ppf (n mod 10) + end + + let superscript_level ppf lvl = + (* avoid a dependency on Btype *) + if lvl = Ident.highest_scope then Format.pp_print_string ppf "᪲" + else superscript ppf lvl + + let add_node explicit_d color id ?lvl tynode dg = + let d = match lvl with + | None -> labelf "%a" Pp.prettier_index id + | Some {Index.level; scope=0} -> + labelf "%a %a" + Pp.prettier_index id superscript_level level + | Some {Index.level; scope} -> + labelf "%a %a⁺%a" + Pp.prettier_index id + superscript_level level + superscript scope + in let d = match color with | None -> Decoration.make d | Some x -> Decoration.(make (filled x :: d)) @@ -564,9 +625,10 @@ module Digraph = struct dg |> add std (Edge(id0,id)) let split_fresh_typ params ty0 g = - let (id, color, desc) = Index.split params ty0 in + let {Index.id; _ } as desc = Index.split params ty0 in let tynode = Node id in - if Elt_map.mem tynode g then id, None else id, Some (tynode,color,desc) + if Elt_map.mem tynode g then id, None + else id, Some { desc with id = tynode } let pp_path = Format_doc.compat Path.print @@ -574,8 +636,8 @@ module Digraph = struct let id, next = split_fresh_typ params ty0 dg.elts in match next with | None -> id, dg - | Some (tynode,color,desc) -> - id, node params color id tynode desc dg + | Some Index.{id=tynode; color; desc; lvl} -> + id, node params color ~lvl id tynode desc dg and edge params id0 lbl ty gh = let id, gh = inject_typ params ty gh in add lbl (Edge(id0,id)) gh @@ -594,8 +656,19 @@ module Digraph = struct snd @@ List.fold_left (numbered_edge params id0) (0,gh) l - and node params color id tynode desc dg = - let add_tynode l = add_node l color id tynode dg in + and labeled_edge params id0 (i,gh) (l,ty) = + let l = + match l with + | None -> labelr "%d" i + | Some l -> labelr "%d%s" i l + in + i + 1, edge params id0 l ty gh + and labeled_edges params id0 l gh = + snd @@ List.fold_left + (labeled_edge params id0) + (0,gh) l + and node params color ~lvl id tynode desc dg = + let add_tynode l = add_node l color ~lvl id tynode dg in let mk fmt = labelk (fun l -> add_tynode (Decoration.make l)) fmt in let numbered = numbered_edges params id in let edge = edge params id in @@ -605,7 +678,7 @@ module Digraph = struct | Types.Tarrow(l,t1,t2,_) -> mk "→%a" Pp.exponent_of_label l |> numbered [t1; t2] | Types.Ttuple tl -> - mk "*" |> numbered tl + mk "*" |> labeled_edges params id tl | Types.Tconstr (p,tl,abbrevs) -> let constr = mk "%a" pp_path p |> numbered tl in if not params.follow_expansions then @@ -630,13 +703,13 @@ module Digraph = struct in begin match split_fresh_typ params t dg.elts with | _, None -> dg - | next_id, Some (_, color, desc) -> - group_fields ~params ~prev_id:id + | next_id, Some {Index.color; desc; lvl; _ } -> + group_fields ~params ~prev_id:id ~lvl dg.elts dg.graph empty_subgraph ~id:next_id ~color ~desc end | Types.Tfield _ -> - group_fields ~params ~prev_id:id + group_fields ~params ~prev_id:id ~lvl dg.elts dg.graph empty_subgraph ~color ~id ~desc | Types.Tnil -> mk "[Nil]" @@ -669,11 +742,14 @@ module Digraph = struct fields in { elts; graph = add_subgraph (labelr "polyvar", fields) main } - | Types.Tpackage (p, fl) -> - let types = List.map snd fl in + | Types.Tpackage {pack_path; pack_cstrs} -> + let types = List.map snd pack_cstrs in + let pp_cstrs ppf (l, _) = + Pp.longident ppf (Option.get @@ Longident.unflatten l) + in mk "[mod %a with %a]" - pp_path p - Pp.(list ~sep:semi longident) (List.map fst fl) + pp_path pack_path + Pp.(list ~sep:semi pp_cstrs) pack_cstrs |> numbered types and variant params id0 (elts,main,fields) (name,rf) = let id = Index.subnode ~name id0 in @@ -713,7 +789,7 @@ module Digraph = struct ) rf and group_fields ~params ~prev_id elts main fields - ~color ~id ~desc = + ~color ~lvl ~id ~desc = let add_tynode dg l = add_node l color id (Node id) dg in let mk dg fmt = labelk (fun l -> add_tynode dg (Decoration.make l)) fmt in let merge elts ~main ~fields = @@ -731,8 +807,8 @@ module Digraph = struct let id_next, next = split_fresh_typ params next elts in begin match next with | None -> {elts; graph=main} - | Some (_,color,desc) -> - group_fields ~params ~prev_id:id + | Some {Index.color; desc; lvl; _} -> + group_fields ~params ~prev_id:id ~lvl elts main fields ~id:id_next ~desc ~color end @@ -745,7 +821,7 @@ module Digraph = struct | Types.Tnil -> merge elts ~main ~fields | _ -> let dg = merge elts ~main ~fields in - node params color id (Node id) desc dg + node params color ~lvl id (Node id) desc dg end let params diff --git a/typing/gprinttyp.mli b/typing/gprinttyp.mli index 1feef0c2..e6bbd61c 100644 --- a/typing/gprinttyp.mli +++ b/typing/gprinttyp.mli @@ -20,10 +20,11 @@ (** A type node is printed as {[ - .------------. - | id |----> - | |---> - .------------. + .---------------. + | lvl | + | ID |----> + | |---> + .---------------. ]} where the description part might be: - a path: [list/8!] diff --git a/typing/ident.ml b/typing/ident.ml index 9a736abe..de4abfa7 100644 --- a/typing/ident.ml +++ b/typing/ident.ml @@ -137,19 +137,48 @@ let is_predef = function | Predef _ -> true | _ -> false +let canonical_stamps = s_table Hashtbl.create 0 +let next_canonical_stamp = s_table Hashtbl.create 0 + +let canonicalize name stamp = + try Hashtbl.find !canonical_stamps (name, stamp) + with Not_found -> + let canonical_stamp = + try Hashtbl.find !next_canonical_stamp name + with Not_found -> 0 + in + Hashtbl.replace !next_canonical_stamp name + (canonical_stamp + 1); + Hashtbl.add !canonical_stamps (name, stamp) + canonical_stamp; + canonical_stamp + +let pp_stamped ppf (name, stamp) = + let open Format_doc in + if not !Clflags.unique_ids then + fprintf ppf "%s" name + else begin + let stamp = + if not !Clflags.canonical_ids then stamp + else canonicalize name stamp + in + fprintf ppf "%s/%i" name stamp + end + let print ~with_scope ppf = let open Format_doc in function - | Global name -> fprintf ppf "%s!" name - | Predef { name; stamp = n } -> - fprintf ppf "%s%s!" name - (if !Clflags.unique_ids then asprintf "/%i" n else "") - | Local { name; stamp = n } -> - fprintf ppf "%s%s" name - (if !Clflags.unique_ids then asprintf "/%i" n else "") - | Scoped { name; stamp = n; scope } -> - fprintf ppf "%s%s%s" name - (if !Clflags.unique_ids then asprintf "/%i" n else "") + | Global name -> + fprintf ppf "%s!" name + | Predef { name; stamp } -> + fprintf ppf "%a!" + pp_stamped (name, stamp) + | Local { name; stamp } -> + fprintf ppf "%a" + pp_stamped (name, stamp) + | Scoped { name; stamp; scope } -> + fprintf ppf "%a%s" + pp_stamped (name, stamp) (if with_scope then asprintf "[%i]" scope else "") let print_with_scope ppf id = print ~with_scope:true ppf id diff --git a/typing/includecore.ml b/typing/includecore.ml index e23315f1..871f7900 100644 --- a/typing/includecore.ml +++ b/typing/includecore.ml @@ -155,6 +155,7 @@ type kind_mismatch = type_kind * type_kind type label_mismatch = | Type of Errortrace.equality_error | Mutability of position + | Atomicity of position type record_change = (Types.label_declaration, Types.label_declaration, label_mismatch) @@ -272,6 +273,10 @@ let report_label_mismatch first second env ppf err = Format_doc.fprintf ppf "%s is mutable and %s is not." (String.capitalize_ascii (choose ord first second)) (choose_other ord first second) + | Atomicity ord -> + Format_doc.fprintf ppf "%s is atomic and %s is not." + (String.capitalize_ascii (choose ord first second)) + (choose_other ord first second) let pp_record_diff first second prefix decl env ppf (x : record_change) = match x with @@ -433,7 +438,6 @@ let report_kind_mismatch first second ppf (kind1, kind2) = let report_type_mismatch first second decl env ppf err = let pr fmt = Fmt.fprintf ppf fmt in - pr "@ "; match err with | Arity -> pr "They have different arities." @@ -481,6 +485,14 @@ module Record_diffing = struct then let ord = if ld1.ld_mutable = Asttypes.Mutable then First else Second in Some (Mutability ord) + else if ld1.ld_atomic <> ld2.ld_atomic + then + let ord = + match ld1.ld_atomic with + | Atomic -> First + | Nonatomic -> Second + in + Some (Atomicity ord) else let tl1 = params1 @ [ld1.ld_type] in let tl2 = params2 @ [ld2.ld_type] in @@ -969,7 +981,9 @@ let type_declarations ?(equality = false) ~loc env ~mark name | (Type_variant (cstrs1, rep1), Type_variant (cstrs2, rep2)) -> if mark then begin let mark usage cstrs = - List.iter (Env.mark_constructor_used usage) cstrs + List.iter (fun cstr -> + Env.mark_constructor_used usage cstr.Types.cd_uid + ) cstrs in let usage : Env.constructor_usage = if decl2.type_private = Public then Env.Exported @@ -988,7 +1002,9 @@ let type_declarations ?(equality = false) ~loc env ~mark name | (Type_record(labels1,rep1), Type_record(labels2,rep2)) -> if mark then begin let mark usage lbls = - List.iter (Env.mark_label_used usage) lbls + List.iter (fun lbl -> + Env.mark_label_used usage lbl.Types.ld_uid + ) lbls in let usage : Env.label_usage = if decl2.type_private = Public then Env.Exported @@ -1019,10 +1035,21 @@ let type_declarations ?(equality = false) ~loc env ~mark name | Error violation -> Some (Immediate violation) in if err <> None then err else + (* We need to check coherence of internal and exported variance either + * when the export type is abstract, as there is no manifest to get + the minimal variance from + * when the export type is private, as the private manifest may be + result of expansions within Ctype.equal_private, forgetting + an explicit variance annotation in the internal type + * when the internal type is private, but this is already included + in the above two cases (a private type can only be exported as + abstract or private) + * when the internal type is open, as we do not allow changing the + variance in that case *) + let abstr' = abstr || decl2.type_private = Private in let need_variance = - abstr || decl1.type_private = Private || decl1.type_kind = Type_open in + abstr' || decl1.type_private = Private || decl1.type_kind = Type_open in if not need_variance then None else - let abstr = abstr || decl2.type_private = Private in let opn = decl2.type_kind = Type_open && decl2.type_manifest = None in let constrained ty = not (Btype.is_Tvar ty) in if List.for_all2 @@ -1030,10 +1057,13 @@ let type_declarations ?(equality = false) ~loc env ~mark name let open Variance in let imp a b = not a || b in let (co1,cn1) = get_upper v1 and (co2,cn2) = get_upper v2 in - (if abstr then (imp co1 co2 && imp cn1 cn2) + (if abstr' then (imp co1 co2 && imp cn1 cn2) else if opn || constrained ty then (co1 = co2 && cn1 = cn2) else true) && let (p1,n1,j1) = get_lower v1 and (p2,n2,j2) = get_lower v2 in + (* Only check the lower bound for abstract types. + For private types, the lower bound can be inferred, and + the internal one may be wrong in the result of functors. *) imp abstr (imp p2 p1 && imp n2 n1 && imp j2 j1)) decl2.type_params (List.combine decl1.type_variance decl2.type_variance) then None else Some Variance @@ -1046,7 +1076,7 @@ let extension_constructors ~loc env ~mark id ext1 ext2 = if ext2.ext_private = Public then Env.Exported else Env.Exported_private in - Env.mark_extension_used usage ext1 + Env.mark_extension_used usage ext1.ext_uid end; let ty1 = Btype.newgenty (Tconstr(ext1.ext_type_path, ext1.ext_type_params, ref Mnil)) diff --git a/typing/includecore.mli b/typing/includecore.mli index bed53fb0..f2eb179e 100644 --- a/typing/includecore.mli +++ b/typing/includecore.mli @@ -54,6 +54,7 @@ type kind_mismatch = type_kind * type_kind type label_mismatch = | Type of Errortrace.equality_error | Mutability of position + | Atomicity of position type record_change = (Types.label_declaration as 'ld, 'ld, label_mismatch) Diffing_with_keys.change diff --git a/typing/includemod.ml b/typing/includemod.ml index dda0464c..2bab1b33 100644 --- a/typing/includemod.ml +++ b/typing/includemod.ml @@ -100,10 +100,13 @@ module Error = struct and arg_functor_param_symptom = (functor_parameter, Ident.t) functor_param_symptom - and functor_params_diff = (functor_parameter list * module_type) core_diff + and functor_params_info = + { params: functor_parameter list; res: module_type } + and functor_params_diff = functor_params_info core_diff and signature_symptom = { env: Env.t; + subst: Subst.t; missings: signature_item list; incompatibles: (Ident.t * sigitem_symptom) list; oks: (int * module_coercion) list; @@ -132,6 +135,12 @@ module Error = struct | In_Type_declaration of Ident.t * core_sigitem_symptom | In_Expansion of core_module_type_symptom + let cons_arg arg params_info = + { params = arg :: params_info.params; res = params_info.res } + + let functor_params info1 info2 = + Error (Functor (Params (sdiff info1 info2))) + end module Directionality = struct @@ -182,8 +191,13 @@ module Directionality = struct pos:pos; } - let strictly_positive ~mark = - let mark_as_used = if mark then Mark_positive else Mark_neither in + let strictly_positive ~mark ~both = + let mark_as_used = + match mark, both with + | true, true -> Mark_both + | true, false -> Mark_positive + | false, _ -> Mark_neither + in { in_eq=false; pos=Strictly_positive; mark_as_used } let unknown ~mark = @@ -417,15 +431,15 @@ let retrieve_functor_params env mty = | Mty_ident p as res -> begin match expand_modtype_path env p with | Some mty -> retrieve_functor_params before env mty - | None -> List.rev before, res + | None -> { Error.params = List.rev before; res } end | Mty_alias p as res -> begin match expand_module_alias ~strengthen:false env p with | Ok mty -> retrieve_functor_params before env mty - | Error _ -> List.rev before, res + | Error _ -> { Error.params = List.rev before; res } end | Mty_functor (p, res) -> retrieve_functor_params (p :: before) env res - | Mty_signature _ as res -> List.rev before, res + | Mty_signature _ as res -> { Error.params = List.rev before; res } in retrieve_functor_params [] env mty @@ -550,9 +564,9 @@ and try_modtypes ~core ~direction ~loc env subst mty1 mty2 orig_shape = | None -> begin match mty1 with | Mty_functor _ -> - let params1 = retrieve_functor_params env mty1 in - let d = Error.sdiff params1 ([],mty2) in - Error Error.(Functor (Params d)) + Error.functor_params + (retrieve_functor_params env mty1) + { params = []; res=mty2 } | _ -> Error Error.(Mt_core Not_an_identifier) end end @@ -602,26 +616,22 @@ and try_modtypes ~core ~direction ~loc env subst mty1 mty2 orig_shape = in Ok (Tcoerce_functor(cc_arg, cc_res), final_shape) | _, Error {Error.symptom = Error.Functor Error.Params res; _} -> - let got_params, got_res = res.got in - let expected_params, expected_res = res.expected in - let d = Error.sdiff - (param1::got_params, got_res) - (param2::expected_params, expected_res) in - Error Error.(Functor (Params d)) + let got = Error.cons_arg param1 res.got in + let expected = Error.cons_arg param2 res.expected in + Error.functor_params got expected | Error _, _ -> - let params1, res1 = retrieve_functor_params env res1 in - let params2, res2 = retrieve_functor_params env res2 in - let d = Error.sdiff (param1::params1, res1) (param2::params2, res2) in - Error Error.(Functor (Params d)) + let params env param res = + Error.cons_arg param (retrieve_functor_params env res) + in + Error.functor_params (params env param1 res1) (params env param2 res2) | Ok _, Error res -> Error Error.(Functor (Result res)) end | Mty_functor _, _ | _, Mty_functor _ -> - let params1 = retrieve_functor_params env mty1 in - let params2 = retrieve_functor_params env mty2 in - let d = Error.sdiff params1 params2 in - Error Error.(Functor (Params d)) + Error.functor_params + (retrieve_functor_params env mty1) + (retrieve_functor_params env mty2) | _, Mty_alias _ -> Error (Error.Mt_core Error.Not_an_alias) @@ -750,6 +760,7 @@ and signatures ~core ~direction ~loc env subst sig1 sig2 mod_shape = | missings, incompatibles, runtime_coercions, leftovers -> Error { Error.env=new_env; + subst; missings; incompatibles; oks=runtime_coercions; @@ -1104,7 +1115,7 @@ let () = let compunit env ~mark impl_name impl_sig intf_name intf_sig unit_shape = let loc = Location.in_file impl_name in - let direction = Directionality.strictly_positive ~mark in + let direction = Directionality.strictly_positive ~mark ~both:false in match signatures ~core:core_inclusion ~direction ~loc env Subst.identity impl_sig intf_sig unit_shape @@ -1164,8 +1175,8 @@ module Functor_inclusion_diff = struct | None -> None | Some res -> match retrieve_functor_params env res with - | [], _ -> None - | params, res -> + | { params = []; _ } -> None + | { params; res} -> let more = Array.of_list params in Some (keep_expansible_param res, more) @@ -1205,7 +1216,8 @@ module Functor_inclusion_diff = struct in expand_params { st with env; subst } - let diff env (l1,res1) (l2,_) = + type inclusion_env = { i_env:Env.t; i_subst:Subst.t } + let diff {i_env=env; i_subst=subst} (l1,res1) (l2,_) = let module Compute = Diff.Left_variadic(struct let test st mty1 mty2 = let loc = Location.none in @@ -1222,7 +1234,7 @@ module Functor_inclusion_diff = struct let param1 = Array.of_list l1 in let param2 = Array.of_list l2 in let state = - { env; subst = Subst.identity; res = keep_expansible_param res1} + { env; subst; res = keep_expansible_param res1} in Compute.diff state param1 param2 @@ -1295,7 +1307,7 @@ module Functor_app_diff = struct I.expand_params { st with env; res} let diff env ~f ~args = - let params, res = retrieve_functor_params env f in + let {Error.params; res} = retrieve_functor_params env f in let module Compute = Diff.Right_variadic(struct let update = update let test (state:Defs.state) (arg,arg_mty) param = @@ -1330,9 +1342,9 @@ end (* Hide the context and substitution parameters to the outside world *) -let modtypes_with_shape ~shape ~loc env ~mark mty1 mty2 = +let modtypes_constraint ~shape ~loc env ~mark mty1 mty2 = (* modtypes with shape is used when typing module expressions in [Typemod] *) - let direction = Directionality.strictly_positive ~mark in + let direction = Directionality.strictly_positive ~mark ~both:true in match modtypes ~core:core_inclusion ~direction ~loc env Subst.identity mty1 mty2 shape @@ -1372,7 +1384,9 @@ let signatures env ~mark sig1 sig2 = gen_signatures env ~direction sig1 sig2 let check_implementation env impl intf = - let direction = Directionality.strictly_positive ~mark:true in + let direction = + Directionality.strictly_positive ~mark:true ~both:false + in ignore (gen_signatures env ~direction impl intf) let type_declarations ~loc env ~mark id decl1 decl2 = diff --git a/typing/includemod.mli b/typing/includemod.mli index fa749601..3d3129b4 100644 --- a/typing/includemod.mli +++ b/typing/includemod.mli @@ -77,10 +77,13 @@ module Error: sig (Types.functor_parameter, Ident.t) functor_param_symptom and functor_params_diff = - (Types.functor_parameter list * Types.module_type) core_diff + functor_params_info core_diff + and functor_params_info = + { params: functor_parameter list; res: module_type } and signature_symptom = { env: Env.t; + subst: Subst.t; missings: Types.signature_item list; incompatibles: (Ident.t * sigitem_symptom) list; oks: (int * Typedtree.module_coercion) list; @@ -146,7 +149,21 @@ val modtypes: val modtypes_consistency: loc:Location.t -> Env.t -> module_type -> module_type -> unit -val modtypes_with_shape: +(** [modtypes_constraint ~shape ~loc env ~mark exp_modtype constraint_modtype] + checks that [exp_modtype] is a subtype of [constraint_modtype], and returns + the module coercion and the shape of the constrained module. + + It also marks as used paired items in positive position in [exp_modtype], + and also paired items in negative position in [constraint_modtype]. + + This marking in negative position allows to raise an [unused item] warning + whenever an item in a functor parameter in [constraint_modtype] does not + exist in [exp_modtypes]. This behaviour differs from the one in + {!check_implementation} and {!compunit} which assumes that is not + appropriate to raise warning about the interface file while typechecking the + implementation file. +*) +val modtypes_constraint: shape:Shape.t -> loc:Location.t -> Env.t -> mark:bool -> module_type -> module_type -> module_coercion * Shape.t @@ -232,7 +249,8 @@ module Functor_inclusion_diff: sig type diff = (Types.functor_parameter, unit) Error.functor_param_symptom type state end - val diff: Env.t -> + type inclusion_env = { i_env:Env.t; i_subst:Subst.t } + val diff: inclusion_env -> Types.functor_parameter list * Types.module_type -> Types.functor_parameter list * Types.module_type -> Diffing.Define(Defs).patch diff --git a/typing/includemod_errorprinter.ml b/typing/includemod_errorprinter.ml index fd74a073..cc39f74c 100644 --- a/typing/includemod_errorprinter.ml +++ b/typing/includemod_errorprinter.ml @@ -16,6 +16,8 @@ module Style = Misc.Style module Fmt = Format_doc module Printtyp = Printtyp.Doc +type inclusion_env = Includemod.Functor_inclusion_diff.inclusion_env = + { i_env:Env.t; i_subst:Subst.t } module Context = struct type pos = @@ -607,7 +609,7 @@ module Functor_suberror = struct Fmt.pp_open_tbox () Diffing.prefix (pos, Diffing.classify diff) Fmt.pp_set_tab () - (Printtyp.wrap_printing_env env ~error:true + (Printtyp.wrap_printing_env env.i_env ~error:true (fun () -> sub ~expansion_token env diff) ) Fmt.pp_close_tbox () @@ -615,7 +617,7 @@ module Functor_suberror = struct let onlycase sub ~expansion_token env (_, diff) = Location.msg "%a@[%t@]" Fmt.pp_print_tab () - (Printtyp.wrap_printing_env env ~error:true + (Printtyp.wrap_printing_env env.i_env ~error:true (fun () -> sub ~expansion_token env diff) ) @@ -689,7 +691,7 @@ let core env id x = "the first" "the second" env) diff.symptom show_locs (diff.got.val_loc, diff.expected.val_loc) | Err.Type_declarations diff -> - Fmt.dprintf "@[@[%s:@;<1 2>%a@ %s@;<1 2>%a@]%a%a@]" + Fmt.dprintf "@[@[%s:@;<1 2>%a@ %s@;<1 2>%a@]@,%a%a@]" "Type declarations do not match" !Oprint.out_sig_item (Out_type.tree_of_type_declaration id diff.got Trec_first) @@ -773,6 +775,41 @@ let core_module_type_symptom (x:Err.core_module_type_symptom) = (* Construct a linearized error message from the error tree *) +let functor_expected ~before ~ctx = + let main = + (* The abstract module type case is detected by {!Includemod} *) + Fmt.dprintf + "@[This module should not be@ a@ structure,@ \ + a@ functor@ was expected.@]" + in + dwith_context ctx main :: before + +let unexpected_functor ~env ~before ~ctx diff = + let rmty = diff.got.res in + let intro = + match diff.expected.res with + | Mty_ident _ -> + Fmt.dprintf + "@[This module should not be a functor,@ a@ module with an@ \ + abstract@ module@ type@ was@ expected.@]" + | Mty_signature _ | _ -> + Fmt.dprintf + "@[This module should not be a functor,@ a@ structure was expected.@]" + in + let main = + match Includemod.modtypes_consistency ~loc:Location.none env rmty + diff.expected.res with + | _ -> + Fmt.dprintf + "%t@ @{Hint@}: Did you forget to apply the functor?" + intro + | exception _ -> + Fmt.dprintf "%t@ @[Moreover,@ the type of the functor@ body@ is@ \ + incompatible@ with@ the@ expected@ module type.@]" + intro + in + dwith_context ctx main :: before + let rec module_type ~expansion_token ~eqmode ~env ~before ~ctx diff = match diff.symptom with | Invalid_module_alias _ (* the difference is non-informative here *) @@ -814,8 +851,18 @@ and module_type_symptom ~eqmode ~expansion_token ~env ~before ~ctx = function in dwith_context ctx printer :: before -and functor_params ~expansion_token ~env ~before ~ctx {got;expected;_} = - let d = Functor_suberror.Inclusion.patch env got expected in +and functor_params ~expansion_token ~env ~before ~ctx diff = + match diff.got.params, diff.expected.params with + | [], _ -> functor_expected ~before ~ctx + | _, [] -> unexpected_functor ~env:env.i_env ~before ~ctx diff + | _ :: _, _ :: _ -> + compare_functor_params ~expansion_token ~env ~before ~ctx diff + +and compare_functor_params ~expansion_token ~env ~before ~ctx {got;expected;_} = + let d = Functor_suberror.Inclusion.patch env + (got.params, got.res) + (expected.params, expected.res) + in let actual = Functor_suberror.Inclusion.got d in let expected = Functor_suberror.expected d in let main = @@ -849,12 +896,14 @@ and signature ~expansion_token ~env:_ ~before ~ctx sgs = :: before else before - | [], a :: _ -> sigitem ~expansion_token ~env:sgs.env ~before ~ctx a + | [], a :: _ -> + let env = {i_env=sgs.env; i_subst=sgs.subst } in + sigitem ~expansion_token ~env ~before ~ctx a | [], [] -> assert false ) and sigitem ~expansion_token ~env ~before ~ctx (name,s) = match s with | Core c -> - dwith_context ctx (core env name c) :: before + dwith_context ctx (core env.i_env name c) :: before | Module_type diff -> module_type ~expansion_token ~eqmode:false ~env ~before ~ctx:(Context.Module name :: ctx) diff @@ -886,7 +935,8 @@ and module_type_decl ~expansion_token ~env ~before ~ctx id diff = | None -> assert false | Some mty -> with_context (Modtype id::ctx) - (Runtime_coercion.illegal_permutation Context.alt_pp env) (mty,c) + (Runtime_coercion.illegal_permutation Context.alt_pp env.i_env) + (mty,c) :: before end @@ -933,17 +983,17 @@ let module_type_subst ~env id diff = ~ctx:[Modtype id] mts.less_than | Illegal_permutation c -> let mty = diff.got in - let main = - with_context [Modtype id] - (Runtime_coercion.illegal_permutation Context.alt_pp env) (mty,c) in - [main] + [with_context [Modtype id] + (Runtime_coercion.illegal_permutation Context.alt_pp env.i_env) + (mty,c) + ] let all env = function | In_Compilation_unit diff -> let first = Location.msg "%a" interface_mismatch diff in signature ~expansion_token:true ~env ~before:[first] ~ctx:[] diff.symptom | In_Type_declaration (id,reason) -> - [Location.msg "%t" (core env id reason)] + [Location.msg "%t" (core env.i_env id reason)] | In_Module_type diff -> module_type ~expansion_token:true ~eqmode:false ~before:[] ~env ~ctx:[] diff @@ -960,7 +1010,7 @@ let all env = function let err_msgs ppf (env, err) = Printtyp.wrap_printing_env ~error:true env - (fun () -> (coalesce @@ all env err) ppf) + (fun () -> (coalesce @@ all {i_env=env; i_subst=Subst.identity} err) ppf) let report_error_doc err = Location.errorf @@ -979,7 +1029,8 @@ let report_apply_error_doc ~loc env (app_name, mty_f, args) = | [ _, Change (g, e, Err.Mismatch mty_diff) ] -> let more () = subcase_list @@ - module_type_symptom ~eqmode:false ~expansion_token:true ~env ~before:[] + module_type_symptom ~eqmode:false ~expansion_token:true + ~env:{i_env=env; i_subst=Subst.identity} ~before:[] ~ctx:[] mty_diff.symptom in Location.errorf ~loc ~footnote "%t" @@ -1019,6 +1070,7 @@ let report_apply_error_doc ~loc env (app_name, mty_f, args) = let actual = Functor_suberror.App.got d in let expected = Functor_suberror.expected d in let sub = + let env = {i_env=env; i_subst=Subst.identity} in List.rev @@ Functor_suberror.params functor_app_diff env ~expansion_token:true d in diff --git a/typing/mtype.ml b/typing/mtype.ml index 499d85ca..4ac90712 100644 --- a/typing/mtype.ml +++ b/typing/mtype.ml @@ -238,14 +238,7 @@ and nondep_sig_item env va ids = function let pres, mty = nondep_mty_with_presence env va ids pres md.md_type in Sig_module(id, pres, {md with md_type = mty}, rs, vis) | Sig_modtype(id, d, vis) -> - begin try - Sig_modtype(id, nondep_modtype_decl env ids d, vis) - with Ctype.Nondep_cannot_erase _ as exn -> - match va with - Co -> Sig_modtype(id, {mtd_type=None; mtd_loc=Location.none; - mtd_attributes=[]; mtd_uid = d.mtd_uid}, vis) - | _ -> raise exn - end + Sig_modtype(id, nondep_modtype_decl env ids d, vis) | Sig_class(id, d, rs, vis) -> Sig_class(id, Ctype.nondep_class_declaration env ids d, rs, vis) | Sig_class_type(id, d, rs, vis) -> diff --git a/typing/oprint.ml b/typing/oprint.ml index b915fefa..5cb7a7d2 100644 --- a/typing/oprint.ml +++ b/typing/oprint.ml @@ -122,6 +122,20 @@ let escape_string s = Bytes.to_string s' end +let print_label_type ppf = + function + | Some s -> + pp_print_string ppf s; + pp_print_string ppf ":"; + | None -> () + +let print_label ppf = + function + | Some s -> + pp_print_string ppf "~"; + pp_print_string ppf s; + pp_print_string ppf ":"; + | None -> () let print_out_string ppf s = let not_escaped = @@ -200,7 +214,7 @@ let print_out_value ppf tree = end | Oval_list tl -> fprintf ppf "@[<1>[%a]@]" (print_tree_list print_tree_1 ";") tl - | Oval_array tl -> + | Oval_array (tl, _mutability) -> fprintf ppf "@[<2>[|%a|]@]" (print_tree_list print_tree_1 ";") tl | Oval_constr (name, []) -> print_constr ppf name | Oval_variant (name, None) -> fprintf ppf "`%a" print_lident name @@ -210,7 +224,14 @@ let print_out_value ppf tree = | Oval_ellipsis -> raise Ellipsis | Oval_printer f -> f ppf | Oval_tuple tree_list -> - fprintf ppf "@[<1>(%a)@]" (print_tree_list print_tree_1 ",") tree_list + let print_elem ppf (lbl, item) = + print_label ppf lbl; print_tree_1 ppf item + in + fprintf ppf "@[<1>(%a)@]" (print_tree_list print_elem ",") tree_list + | Oval_floatarray arr -> + fprintf ppf "@[<2>[|%a|]@]" + (pp_print_seq ~pp_sep:semicolon pp_print_float) + (Float.Array.to_seq arr) | tree -> fprintf ppf "@[<1>(%a)@]" (cautious print_tree_1) tree and print_fields first ppf = function @@ -220,7 +241,8 @@ let print_out_value ppf tree = fprintf ppf "@[<1>%a@ =@ %a@]" print_ident name (cautious print_tree_1) tree; print_fields false ppf fields - and print_tree_list print_item sep ppf tree_list = + and print_tree_list : 'a . (_ -> 'a -> _) -> _ -> _ -> 'a list -> unit = + fun print_item sep ppf tree_list -> let rec print_list first ppf = function [] -> () @@ -282,16 +304,31 @@ and print_out_type_1 ppf = Otyp_arrow (lab, ty1, ty2) -> pp_open_box ppf 0; print_arg_label ppf lab; - print_out_type_2 ppf ty1; + print_out_type_2 ~arg:true ppf ty1; pp_print_string ppf " ->"; pp_print_space ppf (); print_out_type_1 ppf ty2; pp_close_box ppf () - | ty -> print_out_type_2 ppf ty -and print_out_type_2 ppf = + | ty -> print_out_type_2 ~arg:false ppf ty +and print_out_type_2 ~arg ppf = function Otyp_tuple tyl -> - fprintf ppf "@[<0>%a@]" (print_typlist print_simple_out_type " *") tyl + (* Tuples require parens in argument function argument position (~arg) + when the first element has a label. *) + let parens = + match tyl with + | (Some _, _) :: _ -> arg + | _ -> false + in + if parens then pp_print_char ppf '('; + let print_elem ppf (label, ty) = + pp_open_box ppf 0; + print_label_type ppf label; + print_simple_out_type ppf ty; + pp_close_box ppf () + in + fprintf ppf "@[<0>%a@]" (print_typlist print_elem " *") tyl; + if parens then pp_print_char ppf ')' | ty -> print_simple_out_type ppf ty and print_simple_out_type ppf = function @@ -334,18 +371,19 @@ and print_simple_out_type ppf = | Otyp_abstract | Otyp_open | Otyp_sum _ | Otyp_manifest (_, _) -> () | Otyp_record lbls -> print_record_decl ppf lbls - | Otyp_module (p, fl) -> - fprintf ppf "@[<1>(module %a" print_ident p; - let first = ref true in - List.iter - (fun (s, t) -> - let sep = if !first then (first := false; "with") else "and" in - fprintf ppf " %s type %s = %a" sep s print_out_type t - ) - fl; - fprintf ppf ")@]" + | Otyp_module pack -> + fprintf ppf "@[<1>(module %a)@]" print_package pack | Otyp_attribute (t, attr) -> fprintf ppf "@[<1>(%a [@@%s])@]" print_out_type t attr.oattr_name +and print_package ppf pack = + fprintf ppf "%a" print_ident pack.opack_path; + let first = ref true in + List.iter + (fun (s, t) -> + let sep = if !first then (first := false; "with") else "and" in + fprintf ppf " %s type %s = %a" sep s print_out_type t + ) + pack.opack_cstrs and print_record_decl ppf lbls = fprintf ppf "{%a@;<1 -2>}" (print_list_init print_out_label (fun ppf -> fprintf ppf "@ ")) lbls @@ -368,8 +406,9 @@ and print_row_field ppf (l, opt_amp, tyl) = fprintf ppf "@[`%a%t%a@]" print_lident l pr_of (print_typlist print_out_type " &") tyl -and print_typlist print_elem sep ppf = - function +and print_typlist : 'a . (_ -> 'a -> _) -> _ -> _ -> 'a list -> _ = + fun print_elem sep ppf tyl -> + match tyl with [] -> () | [ty] -> print_elem ppf ty | ty :: tyl -> @@ -388,13 +427,14 @@ and print_typargs ppf = pp_print_char ppf ')'; pp_close_box ppf (); pp_print_space ppf () -and print_out_label ppf {olab_name; olab_mut; olab_type} = - fprintf ppf "@[<2>%s%a :@ %a@];" +and print_out_label ppf {olab_name; olab_mut; olab_atomic; olab_type} = + fprintf ppf "@[<2>%s%a :@ %a%s@];" (match olab_mut with | Mutable -> "mutable " | Immutable -> "") print_lident olab_name print_out_type olab_type + (match olab_atomic with Atomic -> " [@atomic]" | Nonatomic -> "") let out_label = ref print_out_label @@ -410,7 +450,11 @@ let print_type_parameter ?(non_gen=false) ppf s = let type_parameter ppf {ot_non_gen=non_gen; ot_name=ty; ot_variance=var,inj} = let open Asttypes in fprintf ppf "%s%s%a" - (match var with Covariant -> "+" | Contravariant -> "-" | NoVariance -> "") + (match var with + | Covariant -> "+" + | Contravariant -> "-" + | NoVariance -> "" + | Bivariant -> "+-") (match inj with Injective -> "!" | NoInjectivity -> "") (print_type_parameter ~non_gen) ty @@ -434,7 +478,7 @@ let rec print_out_class_type ppf = fprintf ppf "@[%a%a@]" pr_tyl tyl print_ident id | Octy_arrow (lab, ty, cty) -> fprintf ppf "@[%a%a ->@ %a@]" print_arg_label lab - print_out_type_2 ty print_out_class_type cty + (print_out_type_2 ~arg:true) ty print_out_class_type cty | Octy_signature (self_ty, csil) -> let pr_param ppf = function diff --git a/typing/out_type.ml b/typing/out_type.ml index b3f3731a..a7b9ac92 100644 --- a/typing/out_type.ml +++ b/typing/out_type.ml @@ -381,9 +381,9 @@ let rec rewrite_double_underscore_paths env p = | Some i -> let better_lid = Ldot - (Lident (String.sub name 0 i), - Unit_info.modulize - (String.sub name (i + 2) (String.length name - i - 2))) + (Location.mknoloc (Lident (String.sub name 0 i)), + (Location.mknoloc (Unit_info.modulize + (String.sub name (i + 2) (String.length name - i - 2))))) in match Env.find_module_by_name better_lid env with | exception Not_found -> p @@ -572,9 +572,10 @@ let rec lid_of_path = function Path.Pident id -> Longident.Lident (Ident.name id) | Path.Pdot (p1, s) | Path.Pextra_ty (p1, Pcstr_ty s) -> - Longident.Ldot (lid_of_path p1, s) + Longident.Ldot (Location.mknoloc (lid_of_path p1), Location.mknoloc s) | Path.Papply (p1, p2) -> - Longident.Lapply (lid_of_path p1, lid_of_path p2) + Longident.Lapply + (Location.mknoloc (lid_of_path p1), Location.mknoloc (lid_of_path p2)) | Path.Pextra_ty (p, Pext_ty) -> lid_of_path p let is_unambiguous path env = @@ -589,7 +590,7 @@ let is_unambiguous path env = List.for_all (fun p -> Path.same (normalize p) p') rem || (* also allow repeatedly defining and opening (for toplevel) *) let id = lid_of_path p in - List.for_all (fun p -> lid_of_path p = id) rem && + List.for_all (fun p -> Longident.same (lid_of_path p) id) rem && Path.same p (fst (Env.find_type_by_name id env)) let rec get_best_path r = @@ -1054,7 +1055,7 @@ let rec tree_of_typexp mode ty = else tree_of_typexp mode ty1 in Otyp_arrow (lab, t1, tree_of_typexp mode ty2) | Ttuple tyl -> - Otyp_tuple (tree_of_typlist mode tyl) + Otyp_tuple (tree_of_labeled_typlist mode tyl) | Tconstr(p, tyl, _abbrev) -> let p', s = best_type_path p in let tyl' = apply_subst s tyl in @@ -1127,14 +1128,9 @@ let rec tree_of_typexp mode ty = end | Tunivar _ -> Otyp_var (false, Variable_names.(name_of_type new_name) tty) - | Tpackage (p, fl) -> - let fl = - List.map - (fun (li, ty) -> ( - String.concat "." (Longident.flatten li), - tree_of_typexp mode ty - )) fl in - Otyp_module (tree_of_path (Some Module_type) p, fl) + | Tpackage pack -> + let pack = tree_of_package mode pack in + Otyp_module pack in Aliases.remove_delay px; alias_nongen_row mode px ty; @@ -1160,6 +1156,9 @@ and tree_of_row_field mode (l, f) = and tree_of_typlist mode tyl = List.map (tree_of_typexp mode) tyl +and tree_of_labeled_typlist mode tyl = + List.map (fun (label, ty) -> label, tree_of_typexp mode ty) tyl + and tree_of_typobject mode fi nm = begin match nm with | None -> @@ -1201,6 +1200,13 @@ and tree_of_typfields mode rest = function let (fields, rest) = tree_of_typfields mode rest l in (field :: fields, rest) +and tree_of_package mode {pack_path; pack_cstrs} = + { opack_path = tree_of_path (Some Module_type) pack_path; + opack_cstrs = + List.map + (fun (li, ty) -> (String.concat "." li, tree_of_typexp mode ty)) + pack_cstrs } + let typexp mode ppf ty = !Oprint.out_type ppf (tree_of_typexp mode ty) @@ -1233,7 +1239,7 @@ let filter_params tyl = List.fold_left (fun tyl ty -> if List.exists (eq_type ty) tyl - then newty2 ~level:generic_level (Ttuple [ty]) :: tyl + then newty2 ~level:generic_level (Ttuple [None, ty]) :: tyl else ty :: tyl) (* Two parameters might be identical due to a constraint but we need to print them differently in order to make the output syntactically valid. @@ -1250,6 +1256,7 @@ let tree_of_label l = { olab_name = Ident.name l.ld_id; olab_mut = l.ld_mutable; + olab_atomic = l.ld_atomic; olab_type = tree_of_typexp Type l.ld_type; } @@ -1352,8 +1359,9 @@ let tree_of_type_decl id decl = List.map2 (fun ty v -> let is_var = is_Tvar ty in - if abstr || not is_var then + if !Clflags.print_variance || abstr || not is_var then let inj = + !Clflags.print_variance && Variance.mem Inj v || type_kind_is_abstract decl && Variance.mem Inj v && match decl.type_manifest with | None -> true @@ -1361,8 +1369,11 @@ let tree_of_type_decl id decl = decl.type_private = Private && Btype.is_constr_row ~allow_ident:true (Btype.row_of_type ty) and (co, cn) = Variance.get_upper v in - (if not cn then Covariant else - if not co then Contravariant else NoVariance), + (match co, cn with + | false, false -> Bivariant + | true, false -> Covariant + | false, true -> Contravariant + | true, true -> NoVariance), (if inj then Injective else NoInjectivity) else (NoVariance, NoInjectivity)) decl.type_params decl.type_variance @@ -1571,7 +1582,7 @@ let rec prepare_class_type params = function let row = Btype.self_type_row cty in if List.memq (proxy row) !Aliases.visited_objects || not (List.for_all is_Tvar params) - || List.exists (deep_occur row) tyl + || deep_occur_list row tyl then prepare_class_type params cty else List.iter prepare_type tyl | Cty_signature sign -> @@ -1658,9 +1669,13 @@ let tree_of_class_param param variance = let class_variance = let open Variance in let open Asttypes in List.map (fun v -> - (if not (mem May_pos v) then Contravariant else - if not (mem May_neg v) then Covariant else NoVariance), - NoInjectivity) + let inj = !Clflags.print_variance && Variance.mem Inj v in + (match mem May_pos v, mem May_neg v with + | false, false -> Bivariant + | true, false -> Covariant + | false, true -> Contravariant + | true, true -> NoVariance), + (if inj then Injective else NoInjectivity)) let tree_of_class_declaration id cl rs = let params = filter_params cl.cty_params in diff --git a/typing/outcometree.mli b/typing/outcometree.mli index f4b89630..af27c092 100644 --- a/typing/outcometree.mli +++ b/typing/outcometree.mli @@ -39,7 +39,7 @@ type out_attribute = { oattr_name: string } type out_value = - | Oval_array of out_value list + | Oval_array of out_value list * Asttypes.mutable_flag | Oval_char of char | Oval_constr of out_ident * out_value list | Oval_ellipsis @@ -53,9 +53,10 @@ type out_value = | Oval_record of (out_ident * out_value) list | Oval_string of string * int * out_string (* string, size-to-print, kind *) | Oval_stuff of string - | Oval_tuple of out_value list + | Oval_tuple of (string option * out_value) list | Oval_variant of string * out_value option | Oval_lazy of out_value + | Oval_floatarray of floatarray type out_type_param = { ot_non_gen: bool; @@ -75,16 +76,17 @@ type out_type = | Otyp_record of out_label list | Otyp_stuff of string | Otyp_sum of out_constructor list - | Otyp_tuple of out_type list + | Otyp_tuple of (string option * out_type) list | Otyp_var of bool * string | Otyp_variant of out_variant * bool * (string list) option | Otyp_poly of string list * out_type - | Otyp_module of out_ident * (string * out_type) list + | Otyp_module of out_package | Otyp_attribute of out_type * out_attribute and out_label = { olab_name: string; olab_mut: Asttypes.mutable_flag; + olab_atomic: Asttypes.atomic_flag; olab_type: out_type; } @@ -94,6 +96,11 @@ and out_constructor = { ocstr_return_type: out_type option; } +and out_package = { + opack_path: out_ident; + opack_cstrs: (string * out_type) list; +} + and out_variant = | Ovar_fields of (string * bool * out_type list) list | Ovar_typ of out_type diff --git a/typing/parmatch.ml b/typing/parmatch.ml index c1cc84e3..f0c83159 100644 --- a/typing/parmatch.ml +++ b/typing/parmatch.ml @@ -18,6 +18,7 @@ open Misc open Asttypes open Types +open Data_types open Typedtree type 'pattern parmatch_case = @@ -161,11 +162,11 @@ let all_coherent column = | Tuple l1, Tuple l2 -> l1 = l2 | Record (lbl1 :: _), Record (lbl2 :: _) -> Array.length lbl1.lbl_all = Array.length lbl2.lbl_all + | Array (am1, _), Array (am2, _) -> am1 = am2 | Any, _ | _, Any | Record [], Record [] | Variant _, Variant _ - | Array _, Array _ | Lazy, Lazy -> true | _, _ -> false in @@ -291,8 +292,8 @@ let records_args l1 l2 = module Compat (Constr:sig val equal : - Types.constructor_description -> - Types.constructor_description -> + Data_types.constructor_description -> + Data_types.constructor_description -> bool end) = struct @@ -301,8 +302,8 @@ module Compat | ((Tpat_any|Tpat_var _),_) | (_,(Tpat_any|Tpat_var _)) -> true (* Structural induction *) - | Tpat_alias (p,_,_,_),_ -> compat p q - | _,Tpat_alias (q,_,_,_) -> compat p q + | Tpat_alias (p,_,_,_,_),_ -> compat p q + | _,Tpat_alias (q,_,_,_,_) -> compat p q | Tpat_or (p1,p2,_),_ -> (compat p1 q || compat p2 q) | _,Tpat_or (q1,q2,_) -> @@ -315,12 +316,14 @@ module Compat l1=l2 && ocompat op1 op2 | Tpat_constant c1, Tpat_constant c2 -> const_compare c1 c2 = 0 - | Tpat_tuple ps, Tpat_tuple qs -> compats ps qs + | Tpat_tuple labeled_ps, Tpat_tuple labeled_qs -> + tuple_compat labeled_ps labeled_qs | Tpat_lazy p, Tpat_lazy q -> compat p q | Tpat_record (l1,_),Tpat_record (l2,_) -> let ps,qs = records_args l1 l2 in compats ps qs - | Tpat_array ps, Tpat_array qs -> + | Tpat_array (am1, ps), Tpat_array (am2, qs) -> + am1 = am2 && List.length ps = List.length qs && compats ps qs | _,_ -> false @@ -335,12 +338,19 @@ module Compat | p::ps, q::qs -> compat p q && compats ps qs | _,_ -> false + and tuple_compat labeled_ps labeled_qs = match labeled_ps,labeled_qs with + | [], [] -> true + | (p_label, p)::labeled_ps, (q_label, q)::labeled_qs -> + Option.equal String.equal p_label q_label + && compat p q && tuple_compat labeled_ps labeled_qs + | _,_ -> false + end module SyntacticCompat = Compat (struct - let equal c1 c2 = Types.equal_tag c1.cstr_tag c2.cstr_tag + let equal = Data_types.equal_constr end) let compat = SyntacticCompat.compat @@ -375,14 +385,14 @@ let simple_match d h = let open Patterns.Head in match d.pat_desc, h.pat_desc with | Construct c1, Construct c2 -> - Types.equal_tag c1.cstr_tag c2.cstr_tag + Data_types.equal_constr c1 c2 | Variant { tag = t1; _ }, Variant { tag = t2 } -> t1 = t2 | Constant c1, Constant c2 -> const_compare c1 c2 = 0 | Lazy, Lazy -> true | Record _, Record _ -> true - | Tuple len1, Tuple len2 - | Array len1, Array len2 -> len1 = len2 + | Tuple lbls1, Tuple lbls2 -> lbls1 = lbls2 + | Array (am1, len1), Array (am2, len2) -> am1 = am2 && len1 = len2 | _, Any -> true | _, _ -> false @@ -422,8 +432,8 @@ let simple_match_args discr head args = | Variant { has_arg = true } | Lazy -> [Patterns.omega] | Record lbls -> omega_list lbls - | Array len - | Tuple len -> Patterns.omegas len + | Array (_, len) -> Patterns.omegas len + | Tuple lbls -> omega_list lbls | Variant { has_arg = false } | Any | Constant _ -> [] @@ -505,9 +515,10 @@ let rec read_args xs r = match xs,r with fatal_error "Parmatch.read_args" let set_args q r = match q with -| {pat_desc = Tpat_tuple omegas} -> - let args,rest = read_args omegas r in - make_pat (Tpat_tuple args) q.pat_type q.pat_env::rest +| {pat_desc = Tpat_tuple lbls_omegas} -> + let lbls, omegas = List.split lbls_omegas in + let args, rest = read_args omegas r in + make_pat (Tpat_tuple (List.combine lbls args)) q.pat_type q.pat_env :: rest | {pat_desc = Tpat_record (omegas,closed)} -> let args,rest = read_args omegas r in let args = @@ -535,10 +546,10 @@ let set_args q r = match q with make_pat (Tpat_lazy arg) q.pat_type q.pat_env::rest | _ -> fatal_error "Parmatch.do_set_args (lazy)" end -| {pat_desc = Tpat_array omegas} -> +| {pat_desc = Tpat_array (am, omegas)} -> let args,rest = read_args omegas r in make_pat - (Tpat_array args) q.pat_type q.pat_env:: + (Tpat_array (am, args)) q.pat_type q.pat_env:: rest | {pat_desc=Tpat_constant _|Tpat_any} -> q::r (* case any is used in matching.ml *) @@ -848,7 +859,8 @@ let pats_of_type env ty = | Has_no_typedecl -> begin match get_desc (Ctype.expand_head env ty) with Ttuple tl -> - [make_pat (Tpat_tuple (omegas (List.length tl))) ty env] + [make_pat (Tpat_tuple (List.map (fun (lbl, _) -> lbl, omega) tl)) + ty env] | _ -> [omega] end | Typedecl (_, _, {type_kind = Type_abstract _ | Type_open}) @@ -1038,27 +1050,28 @@ let build_other ext env = | _ -> assert false) (function f -> Tpat_constant(Const_float (string_of_float f))) 0.0 (fun f -> f +. 1.0) d env - | Array _ -> + | Array (am, _) -> let all_lengths = List.map (fun (p,_) -> match p.pat_desc with - | Array len -> len + | Array (am', len) when am = am' -> len | _ -> assert false) env in let rec try_arrays l = if List.mem l all_lengths then try_arrays (l+1) else - make_pat (Tpat_array (omegas l)) d.pat_type d.pat_env in + make_pat (Tpat_array (am, omegas l)) d.pat_type d.pat_env in try_arrays 0 | _ -> Patterns.omega let rec has_instance p = match p.pat_desc with | Tpat_variant (l,_,r) when is_absent l r -> false | Tpat_any | Tpat_var _ | Tpat_constant _ | Tpat_variant (_,None,_) -> true - | Tpat_alias (p,_,_,_) | Tpat_variant (_,Some p,_) -> has_instance p + | Tpat_alias (p,_,_,_,_) | Tpat_variant (_,Some p,_) -> has_instance p | Tpat_or (p1,p2,_) -> has_instance p1 || has_instance p2 - | Tpat_construct (_,_,ps,_) | Tpat_tuple ps | Tpat_array ps -> + | Tpat_construct (_,_,ps,_) | Tpat_array (_, ps) -> has_instances ps + | Tpat_tuple labeled_ps -> has_instances (List.map snd labeled_ps) | Tpat_record (lps,_) -> has_instances (List.map (fun (_,_,x) -> x) lps) | Tpat_lazy p -> has_instance p @@ -1260,7 +1273,8 @@ let print_pat pat = Printf.sprintf "(%s)" (String.concat "," (List.map string_of_pat list)) | Tpat_variant (_, _, _) -> "variant" | Tpat_record (_, _) -> "record" - | Tpat_array _ -> "array" + | Tpat_array (Mutable, _) -> "array" + | Tpat_array (Immutable, _) -> "immutable array" in Printf.fprintf stderr "PAT[%s]\n%!" (string_of_pat pat) *) @@ -1509,7 +1523,7 @@ let is_var_column rs = (* Standard or-args for left-to-right matching *) let rec or_args p = match p.pat_desc with | Tpat_or (p1,p2,_) -> p1,p2 -| Tpat_alias (p,_,_,_) -> or_args p +| Tpat_alias (p,_,_,_,_) -> or_args p | _ -> assert false (* Just remove current column *) @@ -1689,23 +1703,24 @@ and every_both pss qs q1 q2 = let rec le_pat p q = match (p.pat_desc, q.pat_desc) with | (Tpat_var _|Tpat_any),_ -> true - | Tpat_alias(p,_,_,_), _ -> le_pat p q - | _, Tpat_alias(q,_,_,_) -> le_pat p q + | Tpat_alias(p,_,_,_,_), _ -> le_pat p q + | _, Tpat_alias(q,_,_,_,_) -> le_pat p q | Tpat_constant(c1), Tpat_constant(c2) -> const_compare c1 c2 = 0 | Tpat_construct(_,c1,ps,_), Tpat_construct(_,c2,qs,_) -> - Types.equal_tag c1.cstr_tag c2.cstr_tag && le_pats ps qs + Data_types.equal_constr c1 c2 && le_pats ps qs | Tpat_variant(l1,Some p1,_), Tpat_variant(l2,Some p2,_) -> (l1 = l2 && le_pat p1 p2) | Tpat_variant(l1,None,_r1), Tpat_variant(l2,None,_) -> l1 = l2 | Tpat_variant(_,_,_), Tpat_variant(_,_,_) -> false - | Tpat_tuple(ps), Tpat_tuple(qs) -> le_pats ps qs + | Tpat_tuple(labeled_ps), Tpat_tuple(labeled_qs) -> + le_tuple_pats labeled_ps labeled_qs | Tpat_lazy p, Tpat_lazy q -> le_pat p q | Tpat_record (l1,_), Tpat_record (l2,_) -> let ps,qs = records_args l1 l2 in le_pats ps qs - | Tpat_array(ps), Tpat_array(qs) -> - List.length ps = List.length qs && le_pats ps qs + | Tpat_array(am1, ps), Tpat_array(am2, qs) -> + am1 = am2 && List.length ps = List.length qs && le_pats ps qs (* In all other cases, enumeration is performed *) | _,_ -> not (satisfiable [[p]] [q]) @@ -1714,6 +1729,13 @@ and le_pats ps qs = p::ps, q::qs -> le_pat p q && le_pats ps qs | _, _ -> true +and le_tuple_pats labeled_ps labeled_qs = + match labeled_ps, labeled_qs with + (p_label, p)::labeled_ps, (q_label, q)::labeled_qs -> + Option.equal String.equal p_label q_label + && le_pat p q && le_tuple_pats labeled_ps labeled_qs + | _, _ -> true + let get_mins le ps = let rec select_rec r = function [] -> r @@ -1733,21 +1755,21 @@ let get_mins le ps = *) let rec lub p q = match p.pat_desc,q.pat_desc with -| Tpat_alias (p,_,_,_),_ -> lub p q -| _,Tpat_alias (q,_,_,_) -> lub p q +| Tpat_alias (p,_,_,_,_),_ -> lub p q +| _,Tpat_alias (q,_,_,_,_) -> lub p q | (Tpat_any|Tpat_var _),_ -> q | _,(Tpat_any|Tpat_var _) -> p | Tpat_or (p1,p2,_),_ -> orlub p1 p2 q | _,Tpat_or (q1,q2,_) -> orlub q1 q2 p (* Thanks god, lub is commutative *) | Tpat_constant c1, Tpat_constant c2 when const_compare c1 c2 = 0 -> p | Tpat_tuple ps, Tpat_tuple qs -> - let rs = lubs ps qs in + let rs = tuple_lubs ps qs in make_pat (Tpat_tuple rs) p.pat_type p.pat_env | Tpat_lazy p, Tpat_lazy q -> let r = lub p q in make_pat (Tpat_lazy r) p.pat_type p.pat_env | Tpat_construct (lid,c1,ps1,_), Tpat_construct (_,c2,ps2,_) - when Types.equal_tag c1.cstr_tag c2.cstr_tag -> + when Data_types.equal_constr c1 c2 -> let rs = lubs ps1 ps2 in make_pat (Tpat_construct (lid, c1, rs, None)) p.pat_type p.pat_env @@ -1760,10 +1782,10 @@ let rec lub p q = match p.pat_desc,q.pat_desc with | Tpat_record (l1,closed),Tpat_record (l2,_) -> let rs = record_lubs l1 l2 in make_pat (Tpat_record (rs, closed)) p.pat_type p.pat_env -| Tpat_array ps, Tpat_array qs - when List.length ps = List.length qs -> +| Tpat_array (am1, ps), Tpat_array (am2, qs) + when am1 = am2 && List.length ps = List.length qs -> let rs = lubs ps qs in - make_pat (Tpat_array rs) p.pat_type p.pat_env + make_pat (Tpat_array (am1, rs)) p.pat_type p.pat_env | _,_ -> raise Empty @@ -1790,6 +1812,13 @@ and record_lubs l1 l2 = (lid1, lbl1,lub p1 p2)::lub_rec rem1 rem2 in lub_rec l1 l2 +and tuple_lubs ps qs = match ps,qs with +| [], [] -> [] +| (p_label, p)::ps, (q_label, q)::qs + when Option.equal String.equal p_label q_label -> + (p_label, lub p q) :: tuple_lubs ps qs +| _,_ -> raise Empty + and lubs ps qs = match ps,qs with | p::ps, q::qs -> lub p q :: lubs ps qs | _,_ -> [] @@ -1882,25 +1911,27 @@ let do_check_partial ~pred loc casel pss = match pss with match counter_examples () with | Seq.Nil -> Total | Seq.Cons (v, _rest) -> - if Warnings.is_active (Warnings.Partial_match "") then begin - let errmsg = - let doc = ref Format_doc.Doc.empty in - let fmt = Format_doc.formatter doc in - Format_doc.fprintf fmt "@[%a" Printpat.top_pretty v; - if do_match (initial_only_guarded casel) [v] then - Format_doc.fprintf fmt - "@,(However, some guarded clause may match this value.)"; - if contains_extension v then - Format_doc.fprintf fmt - "@,@[Matching over values of extensible variant types \ - (the *extension* above)@,\ - must include a wild card pattern@ in order to be exhaustive.@]" - ; - Format_doc.fprintf fmt "@]"; - Format_doc.(asprintf "%a" pp_doc) !doc - in - Location.prerr_warning loc (Warnings.Partial_match errmsg) - end; + if Warnings.is_active (Warnings.Partial_match Format_doc.Doc.empty) then + begin + let errmsg = + let doc = ref Format_doc.Doc.empty in + let fmt = Format_doc.formatter doc in + Format_doc.fprintf fmt "@[%a" + (Misc.Style.as_inline_code Printpat.top_pretty) v; + if do_match (initial_only_guarded casel) [v] then + Format_doc.fprintf fmt + "@,(However, some guarded clause may match this value.)"; + if contains_extension v then + Format_doc.fprintf fmt + "@,@[Matching over values of extensible variant types \ + (the *extension* above)@,\ + must include a wild card pattern@ in order to be exhaustive.@]" + ; + Format_doc.fprintf fmt "@]"; + !doc + in + Location.prerr_warning loc (Warnings.Partial_match errmsg) + end; Partial (*****************) @@ -1931,14 +1962,15 @@ let rec collect_paths_from_pat r p = match p.pat_desc with (if extendable_path path then add_path path r else r) ps | Tpat_any|Tpat_var _|Tpat_constant _| Tpat_variant (_,None,_) -> r -| Tpat_tuple ps | Tpat_array ps -| Tpat_construct (_, {cstr_tag=Cstr_extension _}, ps, _)-> +| Tpat_tuple ps -> + List.fold_left (fun r (_, p) -> collect_paths_from_pat r p) r ps +| Tpat_array (_, ps) | Tpat_construct (_, {cstr_tag=Cstr_extension _}, ps, _)-> List.fold_left collect_paths_from_pat r ps | Tpat_record (lps,_) -> List.fold_left (fun r (_, _, p) -> collect_paths_from_pat r p) r lps -| Tpat_variant (_, Some p, _) | Tpat_alias (p,_,_,_) -> +| Tpat_variant (_, Some p, _) | Tpat_alias (p,_,_,_,_) -> collect_paths_from_pat r p | Tpat_or (p1,p2,_) -> collect_paths_from_pat (collect_paths_from_pat r p1) p2 @@ -2059,7 +2091,7 @@ let inactive ~partial pat = | Total -> begin let rec loop pat = match pat.pat_desc with - | Tpat_lazy _ | Tpat_array _ -> + | Tpat_lazy _ | Tpat_array (Mutable, _) -> false | Tpat_any | Tpat_var _ | Tpat_variant (_, None, _) -> true @@ -2069,9 +2101,11 @@ let inactive ~partial pat = | Const_int _ | Const_char _ | Const_float _ | Const_int32 _ | Const_int64 _ | Const_nativeint _ -> true end - | Tpat_tuple ps | Tpat_construct (_, _, ps, _) -> + | Tpat_tuple ps -> + List.for_all (fun (_,p) -> loop p) ps + | Tpat_construct (_, _, ps, _) | Tpat_array (Immutable, ps) -> List.for_all (fun p -> loop p) ps - | Tpat_alias (p,_,_,_) | Tpat_variant (_, Some p, _) -> + | Tpat_alias (p,_,_,_,_) | Tpat_variant (_, Some p, _) -> loop p | Tpat_record (ldps,_) -> List.for_all @@ -2190,7 +2224,7 @@ type amb_row = { row : pattern list ; varsets : Ident.Set.t list; } let simplify_head_amb_pat head_bound_variables varsets ~add_column p ps k = let rec simpl head_bound_variables varsets p ps k = match (Patterns.General.view p).pat_desc with - | `Alias (p,x,_,_) -> + | `Alias (p,x,_,_,_) -> simpl (Ident.Set.add x head_bound_variables) varsets p ps k | `Var (x,_,_) -> simpl (Ident.Set.add x head_bound_variables) varsets Patterns.omega ps k diff --git a/typing/parmatch.mli b/typing/parmatch.mli index 7e40dd29..675426a3 100644 --- a/typing/parmatch.mli +++ b/typing/parmatch.mli @@ -18,6 +18,7 @@ open Asttypes open Typedtree open Types +open Data_types (** Most checks in this file need not access all information about a case, and just need a few pieces of information. [parmatch_case] is those @@ -55,8 +56,8 @@ module Compat : functor (_ : sig val equal : - Types.constructor_description -> - Types.constructor_description -> + Data_types.constructor_description -> + Data_types.constructor_description -> bool end) -> sig val compat : pattern -> pattern -> bool diff --git a/typing/path.ml b/typing/path.ml index 038ae48f..2d259b1c 100644 --- a/typing/path.ml +++ b/typing/path.ml @@ -122,6 +122,10 @@ let flatten = in fun t -> flatten [] t +let rec scrape_extra_ty = function + | Pextra_ty (t, _) -> scrape_extra_ty t + | t -> t + let heads p = let rec heads p acc = match p with | Pident id -> id :: acc diff --git a/typing/path.mli b/typing/path.mli index 034be004..be55d98a 100644 --- a/typing/path.mli +++ b/typing/path.mli @@ -64,6 +64,9 @@ val exists_free: Ident.t list -> t -> bool val scope: t -> int val flatten : t -> [ `Contains_apply | `Ok of Ident.t * string list ] +val scrape_extra_ty: t -> t +(** Removes surrounding `Pext_ty` constructors from a path *) + val name: ?paren:(string -> bool) -> t -> string (* [paren] tells whether a path suffix needs parentheses *) val head: t -> Ident.t diff --git a/typing/patterns.ml b/typing/patterns.ml index 456f8dff..7b101853 100644 --- a/typing/patterns.ml +++ b/typing/patterns.ml @@ -16,6 +16,7 @@ open Asttypes open Types +open Data_types open Typedtree (* useful pattern auxiliary functions *) @@ -52,13 +53,13 @@ module Simple = struct type view = [ | `Any | `Constant of constant - | `Tuple of pattern list + | `Tuple of (string option * pattern) list | `Construct of Longident.t loc * constructor_description * pattern list | `Variant of label * pattern option * row_desc ref | `Record of (Longident.t loc * label_description * pattern) list * closed_flag - | `Array of pattern list + | `Array of mutable_flag * pattern list | `Lazy of pattern ] @@ -80,7 +81,7 @@ module General = struct type view = [ | Half_simple.view | `Var of Ident.t * string loc * Uid.t - | `Alias of pattern * Ident.t * string loc * Uid.t + | `Alias of pattern * Ident.t * string loc * Uid.t * Types.type_expr ] type pattern = view pattern_data @@ -89,8 +90,8 @@ module General = struct `Any | Tpat_var (id, str, uid) -> `Var (id, str, uid) - | Tpat_alias (p, id, str, uid) -> - `Alias (p, id, str, uid) + | Tpat_alias (p, id, str, uid, ty) -> + `Alias (p, id, str, uid, ty) | Tpat_constant cst -> `Constant cst | Tpat_tuple ps -> @@ -101,7 +102,7 @@ module General = struct `Variant (cstr, arg, row_desc) | Tpat_record (fields, closed) -> `Record (fields, closed) - | Tpat_array ps -> `Array ps + | Tpat_array (am,ps) -> `Array (am, ps) | Tpat_or (p, q, row_desc) -> `Or (p, q, row_desc) | Tpat_lazy p -> `Lazy p @@ -111,7 +112,7 @@ module General = struct let erase_desc = function | `Any -> Tpat_any | `Var (id, str, uid) -> Tpat_var (id, str, uid) - | `Alias (p, id, str, uid) -> Tpat_alias (p, id, str, uid) + | `Alias (p, id, str, uid, ty) -> Tpat_alias (p, id, str, uid, ty) | `Constant cst -> Tpat_constant cst | `Tuple ps -> Tpat_tuple ps | `Construct (cstr, cst_descr, args) -> @@ -120,7 +121,7 @@ module General = struct Tpat_variant (cstr, arg, row_desc) | `Record (fields, closed) -> Tpat_record (fields, closed) - | `Array ps -> Tpat_array ps + | `Array (am, ps) -> Tpat_array (am, ps) | `Or (p, q, row_desc) -> Tpat_or (p, q, row_desc) | `Lazy p -> Tpat_lazy p @@ -129,7 +130,7 @@ module General = struct let rec strip_vars (p : pattern) : Half_simple.pattern = match p.pat_desc with - | `Alias (p, _, _, _) -> strip_vars (view p) + | `Alias (p, _, _, _, _) -> strip_vars (view p) | `Var _ -> { p with pat_desc = `Any } | #Half_simple.view as view -> { p with pat_desc = view } end @@ -141,13 +142,13 @@ module Head : sig | Any | Construct of constructor_description | Constant of constant - | Tuple of int + | Tuple of string option list | Record of label_description list | Variant of { tag: label; has_arg: bool; cstr_row: row_desc ref; type_row : unit -> row_desc; } - | Array of int + | Array of mutable_flag * int | Lazy type t = desc pattern_data @@ -166,7 +167,7 @@ end = struct | Any | Construct of constructor_description | Constant of constant - | Tuple of int + | Tuple of string option list | Record of label_description list | Variant of { tag: label; has_arg: bool; @@ -174,7 +175,7 @@ end = struct type_row : unit -> row_desc; } (* the row of the type may evolve if [close_variant] is called, hence the (unit -> ...) delay *) - | Array of int + | Array of mutable_flag * int | Lazy type t = desc pattern_data @@ -184,7 +185,7 @@ end = struct | `Any -> Any, [] | `Constant c -> Constant c, [] | `Tuple args -> - Tuple (List.length args), args + Tuple (List.map fst args), (List.map snd args) | `Construct (_, c, args) -> Construct c, args | `Variant (tag, arg, cstr_row) -> @@ -199,8 +200,8 @@ end = struct | _ -> assert false in Variant {tag; has_arg; cstr_row; type_row}, pats - | `Array args -> - Array (List.length args), args + | `Array (am, args) -> + Array (am, List.length args), args | `Record (largs, _) -> let lbls = List.map (fun (_,lbl,_) -> lbl) largs in let pats = List.map (fun (_,_,pat) -> pat) largs in @@ -216,7 +217,8 @@ end = struct | Any -> 0 | Constant _ -> 0 | Construct c -> c.cstr_arity - | Tuple n | Array n -> n + | Tuple l -> List.length l + | Array (_, n) -> n | Record l -> List.length l | Variant { has_arg; _ } -> if has_arg then 1 else 0 | Lazy -> 1 @@ -228,8 +230,9 @@ end = struct | Any -> Tpat_any | Lazy -> Tpat_lazy omega | Constant c -> Tpat_constant c - | Tuple n -> Tpat_tuple (omegas n) - | Array n -> Tpat_array (omegas n) + | Tuple lbls -> + Tpat_tuple (List.map (fun lbl -> lbl, omega) lbls) + | Array (am, n) -> Tpat_array (am, omegas n) | Construct c -> let lid_loc = mkloc (Longident.Lident c.cstr_name) in Tpat_construct (lid_loc, c, omegas c.cstr_arity, None) diff --git a/typing/patterns.mli b/typing/patterns.mli index 2ad645b0..9a9ff7c1 100644 --- a/typing/patterns.mli +++ b/typing/patterns.mli @@ -17,6 +17,7 @@ open Asttypes open Typedtree open Types +open Data_types val omega : pattern (** aka. "Tpat_any" or "_" *) @@ -40,13 +41,13 @@ module Simple : sig type view = [ | `Any | `Constant of constant - | `Tuple of pattern list + | `Tuple of (string option * pattern) list | `Construct of Longident.t loc * constructor_description * pattern list | `Variant of label * pattern option * row_desc ref | `Record of (Longident.t loc * label_description * pattern) list * closed_flag - | `Array of pattern list + | `Array of mutable_flag * pattern list | `Lazy of pattern ] type pattern = view pattern_data @@ -66,7 +67,7 @@ module General : sig type view = [ | Half_simple.view | `Var of Ident.t * string loc * Uid.t - | `Alias of pattern * Ident.t * string loc * Uid.t + | `Alias of pattern * Ident.t * string loc * Uid.t * Types.type_expr ] type pattern = view pattern_data @@ -81,7 +82,7 @@ module Head : sig | Any | Construct of constructor_description | Constant of constant - | Tuple of int + | Tuple of string option list | Record of label_description list | Variant of { tag: label; has_arg: bool; @@ -89,7 +90,7 @@ module Head : sig type_row : unit -> row_desc; } (* the row of the type may evolve if [close_variant] is called, hence the (unit -> ...) delay *) - | Array of int + | Array of mutable_flag * int | Lazy type t = desc pattern_data diff --git a/typing/predef.ml b/typing/predef.ml index e7b24bd8..581b829d 100644 --- a/typing/predef.ml +++ b/typing/predef.ml @@ -28,6 +28,60 @@ let wrap create s = let ident_create = wrap Ident.create_predef +type abstract_type_constr = [ + | `Int + | `Char + | `String + | `Bytes + | `Float + | `Continuation + | `Array + | `Nativeint + | `Int32 + | `Int64 + | `Lazy_t + | `Extension_constructor + | `Floatarray + | `Iarray + | `Atomic_loc +] +type data_type_constr = [ + | `Bool + | `Unit + | `Exn + | `Eff + | `List + | `Option +] +type type_constr = [ + | abstract_type_constr + | data_type_constr +] + +let all_type_constrs : type_constr list = [ + `Int; + `Char; + `String; + `Bytes; + `Float; + `Bool; + `Unit; + `Exn; + `Eff; + `Continuation; + `Array; + `List; + `Option; + `Nativeint; + `Int32; + `Int64; + `Lazy_t; + `Extension_constructor; + `Floatarray; + `Iarray; + `Atomic_loc; +] + let ident_int = ident_create "int" and ident_char = ident_create "char" and ident_bytes = ident_create "bytes" @@ -47,6 +101,31 @@ and ident_lazy_t = ident_create "lazy_t" and ident_string = ident_create "string" and ident_extension_constructor = ident_create "extension_constructor" and ident_floatarray = ident_create "floatarray" +and ident_iarray = ident_create "iarray" +and ident_atomic_loc = ident_create "atomic_loc" + +let ident_of_type_constr : type_constr -> Ident.t = function + | `Int -> ident_int + | `Char -> ident_char + | `String -> ident_string + | `Bytes -> ident_bytes + | `Float -> ident_float + | `Bool -> ident_bool + | `Unit -> ident_unit + | `Exn -> ident_exn + | `Eff -> ident_eff + | `Continuation -> ident_continuation + | `Array -> ident_array + | `List -> ident_list + | `Option -> ident_option + | `Nativeint -> ident_nativeint + | `Int32 -> ident_int32 + | `Int64 -> ident_int64 + | `Lazy_t -> ident_lazy_t + | `Extension_constructor -> ident_extension_constructor + | `Floatarray -> ident_floatarray + | `Iarray -> ident_iarray + | `Atomic_loc -> ident_atomic_loc let path_int = Pident ident_int and path_char = Pident ident_char @@ -67,28 +146,42 @@ and path_lazy_t = Pident ident_lazy_t and path_string = Pident ident_string and path_extension_constructor = Pident ident_extension_constructor and path_floatarray = Pident ident_floatarray +and path_iarray = Pident ident_iarray +and path_atomic_loc = Pident ident_atomic_loc + +let path_of_type_constr typ = + Pident (ident_of_type_constr typ) + +let tconstr p args = newgenty (Tconstr(p, args, ref Mnil)) +let type_int = tconstr path_int [] +and type_char = tconstr path_char [] +and type_bytes = tconstr path_bytes [] +and type_float = tconstr path_float [] +and type_bool = tconstr path_bool [] +and type_unit = tconstr path_unit [] +and type_exn = tconstr path_exn [] +and type_eff t = tconstr path_eff [t] +and type_continuation t1 t2 = tconstr path_continuation [t1; t2] +and type_array t = tconstr path_array [t] +and type_list t = tconstr path_list [t] +and type_option t = tconstr path_option [t] +and type_nativeint = tconstr path_nativeint [] +and type_int32 = tconstr path_int32 [] +and type_int64 = tconstr path_int64 [] +and type_lazy_t t = tconstr path_lazy_t [t] +and type_string = tconstr path_string [] +and type_extension_constructor = tconstr path_extension_constructor [] +and type_floatarray = tconstr path_floatarray [] +and type_iarray t = tconstr path_iarray [t] +and type_atomic_loc t = tconstr path_atomic_loc [t] -let type_int = newgenty (Tconstr(path_int, [], ref Mnil)) -and type_char = newgenty (Tconstr(path_char, [], ref Mnil)) -and type_bytes = newgenty (Tconstr(path_bytes, [], ref Mnil)) -and type_float = newgenty (Tconstr(path_float, [], ref Mnil)) -and type_bool = newgenty (Tconstr(path_bool, [], ref Mnil)) -and type_unit = newgenty (Tconstr(path_unit, [], ref Mnil)) -and type_exn = newgenty (Tconstr(path_exn, [], ref Mnil)) -and type_eff t = newgenty (Tconstr(path_eff, [t], ref Mnil)) -and type_continuation t1 t2 = - newgenty (Tconstr(path_continuation, [t1; t2], ref Mnil)) -and type_array t = newgenty (Tconstr(path_array, [t], ref Mnil)) -and type_list t = newgenty (Tconstr(path_list, [t], ref Mnil)) -and type_option t = newgenty (Tconstr(path_option, [t], ref Mnil)) -and type_nativeint = newgenty (Tconstr(path_nativeint, [], ref Mnil)) -and type_int32 = newgenty (Tconstr(path_int32, [], ref Mnil)) -and type_int64 = newgenty (Tconstr(path_int64, [], ref Mnil)) -and type_lazy_t t = newgenty (Tconstr(path_lazy_t, [t], ref Mnil)) -and type_string = newgenty (Tconstr(path_string, [], ref Mnil)) -and type_extension_constructor = - newgenty (Tconstr(path_extension_constructor, [], ref Mnil)) -and type_floatarray = newgenty (Tconstr(path_floatarray, [], ref Mnil)) +let find_type_constr = + let all_predef_paths = + all_type_constrs + |> List.map (fun tconstr -> path_of_type_constr tconstr, tconstr) + |> Path.Map.of_list + in + fun p -> Path.Map.find_opt p all_predef_paths let ident_match_failure = ident_create "Match_failure" and ident_out_of_memory = ident_create "Out_of_memory" @@ -105,7 +198,6 @@ and ident_undefined_recursive_module = ident_create "Undefined_recursive_module" and ident_continuation_already_taken = ident_create "Continuation_already_taken" - let all_predef_exns = [ ident_match_failure; ident_out_of_memory; @@ -126,16 +218,6 @@ let path_match_failure = Pident ident_match_failure and path_assert_failure = Pident ident_assert_failure and path_undefined_recursive_module = Pident ident_undefined_recursive_module -let cstr id args = - { - cd_id = id; - cd_args = Cstr_tuple args; - cd_res = None; - cd_loc = Location.none; - cd_attributes = []; - cd_uid = Uid.of_predef_id id; - } - let ident_false = ident_create "false" and ident_true = ident_create "true" and ident_void = ident_create "()" @@ -144,15 +226,19 @@ and ident_cons = ident_create "::" and ident_none = ident_create "None" and ident_some = ident_create "Some" -let mk_add_type add_type type_ident ?manifest - ?(immediate=Type_immediacy.Unknown) ?(kind=Type_abstract Definition) env = - let decl = +let decl_of_type_constr tconstr = + let type_uid = Uid.of_predef_id (ident_of_type_constr tconstr) in + let decl0 + ?(immediate = Type_immediacy.Unknown) + ?(kind = Type_abstract Definition) + () + = {type_params = []; type_arity = 0; type_kind = kind; type_loc = Location.none; type_private = Asttypes.Public; - type_manifest = manifest; + type_manifest = None; type_variance = []; type_separability = []; type_is_newtype = false; @@ -160,57 +246,91 @@ let mk_add_type add_type type_ident ?manifest type_attributes = []; type_immediate = immediate; type_unboxed_default = false; - type_uid = Uid.of_predef_id type_ident; + type_uid; } in - add_type type_ident decl env - -let build_initial_env add_type add_extension empty_env = - let add_type = mk_add_type add_type - and add_type1 type_ident - ~variance ~separability ?(kind=fun _ -> Type_abstract Definition) env = + let decl1 + ~variance + ?(separability = Separability.Ind) + ?(kind = fun _ -> Type_abstract Definition) + () + = let param = newgenvar () in - let decl = - {type_params = [param]; - type_arity = 1; - type_kind = kind param; - type_loc = Location.none; - type_private = Asttypes.Public; - type_manifest = None; - type_variance = [variance]; - type_separability = [separability]; - type_is_newtype = false; - type_expansion_scope = lowest_level; - type_attributes = []; - type_immediate = Unknown; - type_unboxed_default = false; - type_uid = Uid.of_predef_id type_ident; - } - in - add_type type_ident decl env - and add_continuation type_ident env = - let tvar1 = newgenvar() in - let tvar2 = newgenvar() in - let arity = 2 in - let decl = - {type_params = [tvar1; tvar2]; - type_arity = arity; - type_kind = Type_abstract Definition; - type_loc = Location.none; - type_private = Asttypes.Public; - type_manifest = None; - type_variance = [Variance.contravariant; Variance.covariant]; - type_separability = Types.Separability.default_signature ~arity; - type_is_newtype = false; - type_expansion_scope = lowest_level; - type_attributes = []; - type_immediate = Unknown; - type_unboxed_default = false; - type_uid = Uid.of_predef_id type_ident; - } - in - add_type type_ident decl env + { (decl0 ~kind:(kind param) ()) with + type_params = [param]; + type_arity = 1; + type_variance = [variance]; + type_separability = [separability]; + } in + let decl2 + ~variance:(var1, var2) + ?separability:((sep1, sep2) = (Separability.Ind, Separability.Ind)) + ?(kind = fun _ _ -> Type_abstract Definition) + () + = + let param1, param2 = newgenvar (), newgenvar () in + { (decl0 ~kind:(kind param1 param2) ()) with + type_params = [param1; param2]; + type_arity = 2; + type_variance = [var1; var2]; + type_separability = [sep1; sep2]; + } + in + let cstr id args = + { + cd_id = id; + cd_args = Cstr_tuple args; + cd_res = None; + cd_loc = Location.none; + cd_attributes = []; + cd_uid = Uid.of_predef_id id; + } + in + let variant constrs = + Type_variant (constrs, Variant_regular) in + match tconstr with + | `Int | `Char + -> decl0 ~immediate:Always () + | `String | `Bytes + | `Float + | `Floatarray + | `Nativeint | `Int32 | `Int64 + | `Extension_constructor + -> decl0 () + | `Bool -> + let kind = variant [cstr ident_false []; + cstr ident_true []] in + decl0 ~immediate:Always ~kind () + | `Unit -> + let kind = variant [cstr ident_void []] in + decl0 ~immediate:Always ~kind () + | `Exn -> decl0 ~kind:Type_open () + | `Eff -> + let kind _ = Type_open in + decl1 ~variance:Variance.full ~kind () + | `Continuation -> + let variance = Variance.(contravariant, covariant) in + decl2 ~variance () + | `Array + | `Atomic_loc + -> + decl1 ~variance:Variance.full () + | `Iarray -> + decl1 ~variance:Variance.covariant () + | `List -> + let kind tvar = + variant [cstr ident_nil []; + cstr ident_cons [tvar; type_list tvar]] in + decl1 ~variance:Variance.covariant ~kind () + | `Option -> + let kind tvar = + variant [cstr ident_none []; + cstr ident_some [tvar]] in + decl1 ~variance:Variance.covariant ~kind () + | `Lazy_t -> decl1 ~variance:Variance.covariant () + +let build_initial_env add_type add_extension empty_env = let add_extension id l = add_extension id { ext_type_path = path_exn; @@ -225,63 +345,25 @@ let build_initial_env add_type add_extension empty_env = ext_uid = Uid.of_predef_id id; } in - let variant constrs = Type_variant (constrs, Variant_regular) in - empty_env - (* Predefined types - alphabetical order *) - |> add_type1 ident_array - ~variance:Variance.full - ~separability:Separability.Ind - |> add_type ident_bool - ~immediate:Always - ~kind:(variant [cstr ident_false []; cstr ident_true []]) - |> add_type ident_char ~immediate:Always - |> add_type ident_exn ~kind:Type_open - |> add_type1 ident_eff - ~variance:Variance.full - ~separability:Separability.Ind - ~kind:(fun _ -> Type_open) - |> add_continuation ident_continuation - |> add_type ident_extension_constructor - |> add_type ident_float - |> add_type ident_floatarray - |> add_type ident_int ~immediate:Always - |> add_type ident_int32 - |> add_type ident_int64 - |> add_type1 ident_lazy_t - ~variance:Variance.covariant - ~separability:Separability.Ind - |> add_type1 ident_list - ~variance:Variance.covariant - ~separability:Separability.Ind - ~kind:(fun tvar -> - variant [cstr ident_nil []; cstr ident_cons [tvar; type_list tvar]]) - |> add_type ident_nativeint - |> add_type1 ident_option - ~variance:Variance.covariant - ~separability:Separability.Ind - ~kind:(fun tvar -> - variant [cstr ident_none []; cstr ident_some [tvar]]) - |> add_type ident_string - |> add_type ident_bytes - |> add_type ident_unit - ~immediate:Always - ~kind:(variant [cstr ident_void []]) + List.fold_left (fun env tconstr -> + add_type (ident_of_type_constr tconstr) (decl_of_type_constr tconstr) env + ) empty_env all_type_constrs (* Predefined exceptions - alphabetical order *) |> add_extension ident_assert_failure - [newgenty (Ttuple[type_string; type_int; type_int])] + [newgenty (Ttuple[None, type_string; None, type_int; None, type_int])] |> add_extension ident_division_by_zero [] |> add_extension ident_end_of_file [] |> add_extension ident_failure [type_string] |> add_extension ident_invalid_argument [type_string] |> add_extension ident_match_failure - [newgenty (Ttuple[type_string; type_int; type_int])] + [newgenty (Ttuple[None, type_string; None, type_int; None, type_int])] |> add_extension ident_not_found [] |> add_extension ident_out_of_memory [] |> add_extension ident_stack_overflow [] |> add_extension ident_sys_blocked_io [] |> add_extension ident_sys_error [type_string] |> add_extension ident_undefined_recursive_module - [newgenty (Ttuple[type_string; type_int; type_int])] + [newgenty (Ttuple[None, type_string; None, type_int; None, type_int])] |> add_extension ident_continuation_already_taken [] let builtin_values = diff --git a/typing/predef.mli b/typing/predef.mli index 46535143..37c68140 100644 --- a/typing/predef.mli +++ b/typing/predef.mli @@ -17,6 +17,38 @@ open Types +type abstract_type_constr = [ + | `Int + | `Char + | `String + | `Bytes + | `Float + | `Continuation + | `Array + | `Nativeint + | `Int32 + | `Int64 + | `Lazy_t + | `Extension_constructor + | `Floatarray + | `Iarray + | `Atomic_loc +] +type data_type_constr = [ + | `Bool + | `Unit + | `Exn + | `Eff + | `List + | `Option +] +type type_constr = [ + | abstract_type_constr + | data_type_constr +] + +val find_type_constr : Path.t -> type_constr option + val type_int: type_expr val type_char: type_expr val type_string: type_expr @@ -28,14 +60,16 @@ val type_exn: type_expr val type_eff: type_expr -> type_expr val type_continuation: type_expr -> type_expr -> type_expr val type_array: type_expr -> type_expr +val type_iarray: type_expr -> type_expr val type_list: type_expr -> type_expr val type_option: type_expr -> type_expr val type_nativeint: type_expr val type_int32: type_expr val type_int64: type_expr val type_lazy_t: type_expr -> type_expr -val type_extension_constructor:type_expr -val type_floatarray:type_expr +val type_extension_constructor: type_expr +val type_floatarray: type_expr +val type_atomic_loc: type_expr -> type_expr val path_int: Path.t val path_char: Path.t @@ -47,6 +81,7 @@ val path_unit: Path.t val path_exn: Path.t val path_eff: Path.t val path_array: Path.t +val path_iarray: Path.t val path_list: Path.t val path_option: Path.t val path_nativeint: Path.t diff --git a/typing/printpat.ml b/typing/printpat.ml index d4897294..eea6c01f 100644 --- a/typing/printpat.ml +++ b/typing/printpat.ml @@ -17,7 +17,7 @@ open Asttypes open Typedtree -open Types +open Data_types open Format_doc let is_cons = function @@ -55,7 +55,7 @@ let rec pretty_val : type k . _ -> k general_pattern -> _ = fun ppf v -> | Tpat_var (x,_,_) -> fprintf ppf "%s" (Ident.name x) | Tpat_constant c -> fprintf ppf "%s" (pretty_const c) | Tpat_tuple vs -> - fprintf ppf "@[(%a)@]" (pretty_vals ",") vs + fprintf ppf "@[(%a)@]" (pretty_list pretty_labeled_val ",") vs | Tpat_construct (_, cstr, [], _) -> fprintf ppf "%s" cstr.cstr_name | Tpat_construct (_, cstr, [w], None) -> @@ -94,11 +94,11 @@ let rec pretty_val : type k . _ -> k general_pattern -> _ = fun ppf v -> fprintf ppf "@[{%a%t}@]" pretty_lvals filtered_lvs elision_mark end - | Tpat_array vs -> + | Tpat_array (_, vs) -> fprintf ppf "@[[| %a |]@]" (pretty_vals " ;") vs | Tpat_lazy v -> fprintf ppf "@[<2>lazy@ %a@]" pretty_arg v - | Tpat_alias (v, x,_,_) -> + | Tpat_alias (v, x,_,_,_) -> fprintf ppf "@[(%a@ as %a)@]" pretty_val v Ident.doc_print x | Tpat_value v -> fprintf ppf "%a" pretty_val (v :> pattern) @@ -130,11 +130,22 @@ and pretty_or : type k . _ -> k general_pattern -> _ = fun ppf v -> fprintf ppf "%a|@,%a" pretty_or v pretty_or w | _ -> pretty_val ppf v -and pretty_vals sep ppf = function - | [] -> () - | [v] -> pretty_val ppf v - | v::vs -> - fprintf ppf "%a%s@ %a" pretty_val v sep (pretty_vals sep) vs +and pretty_list : type k . (_ -> k -> _) -> _ -> _ -> k list -> _ = + fun print_val sep ppf -> + function + | [] -> () + | [v] -> print_val ppf v + | v::vs -> + fprintf ppf "%a%s@ %a" print_val v sep (pretty_list print_val sep) vs + +and pretty_vals sep = pretty_list pretty_val sep + +and pretty_labeled_val ppf (l, p) = + begin match l with + | Some s -> fprintf ppf "~%s:" s + | None -> () + end; + pretty_val ppf p and pretty_lvals ppf = function | [] -> () diff --git a/typing/printtyp.ml b/typing/printtyp.ml index 649f4b94..c37105b4 100644 --- a/typing/printtyp.ml +++ b/typing/printtyp.ml @@ -84,7 +84,7 @@ module Doc = struct let constructor_arguments ppf a = let tys = tree_of_constructor_arguments a in - !Oprint.out_type ppf (Otyp_tuple tys) + !Oprint.out_type ppf (Otyp_tuple (List.map (fun t -> None, t) tys)) let label ppf l = prepare_for_printing [l.Types.ld_type]; diff --git a/typing/printtyped.ml b/typing/printtyped.ml index c68c7a6c..74f833fa 100644 --- a/typing/printtyped.ml +++ b/typing/printtyped.ml @@ -35,9 +35,9 @@ let fmt_location f loc = let rec fmt_longident_aux f x = match x with | Longident.Lident (s) -> fprintf f "%s" s; - | Longident.Ldot (y, s) -> fprintf f "%a.%s" fmt_longident_aux y s; + | Longident.Ldot (y, s) -> fprintf f "%a.%s" fmt_longident_aux y.txt s.txt; | Longident.Lapply (y, z) -> - fprintf f "%a(%a)" fmt_longident_aux y fmt_longident_aux z + fprintf f "%a(%a)" fmt_longident_aux y.txt fmt_longident_aux z.txt let fmt_longident f x = fprintf f "\"%a\"" fmt_longident_aux x.txt @@ -76,6 +76,11 @@ let fmt_mutable_flag f x = | Immutable -> fprintf f "Immutable" | Mutable -> fprintf f "Mutable" +let fmt_atomic_flag f x = + match x with + | Nonatomic -> fprintf f "Nonatomic" + | Atomic -> fprintf f "Atomic" + let fmt_virtual_flag f x = match x with | Virtual -> fprintf f "Virtual" @@ -111,6 +116,11 @@ let fmt_partiality f x = | Total -> () | Partial -> fprintf f " (Partial)" +let fmt_presence f x = + match x with + | Types.Mp_present -> fprintf f "(Present)" + | Types.Mp_absent -> fprintf f "(Absent)" + let line i f s (*...*) = fprintf f "%s" (String.make (2*i) ' '); fprintf f s (*...*) @@ -146,6 +156,10 @@ let arg_label i ppf = function | Optional s -> line i ppf "Optional \"%s\"\n" s | Labelled s -> line i ppf "Labelled \"%s\"\n" s +let tuple_component_label i ppf = function + | None -> line i ppf "Label: None\n" + | Some s -> line i ppf "Label: Some \"%s\"\n" s + let typevars ppf vs = List.iter (fun x -> fprintf ppf " %a" Pprintast.tyvar x.txt) vs @@ -181,7 +195,7 @@ let rec core_type i ppf x = core_type i ppf ct2; | Ttyp_tuple l -> line i ppf "Ttyp_tuple\n"; - list i core_type ppf l; + list i labeled_core_type ppf l; | Ttyp_constr (li, _, l) -> line i ppf "Ttyp_constr %a\n" fmt_path li; list i core_type ppf l; @@ -212,13 +226,17 @@ let rec core_type i ppf x = line i ppf "Ttyp_poly%a\n" (fun ppf -> List.iter (fun x -> fprintf ppf " '%s" x)) sl; core_type i ppf ct; - | Ttyp_package { pack_path = s; pack_fields = l } -> + | Ttyp_package { tpt_path = s; tpt_cstrs = l } -> line i ppf "Ttyp_package %a\n" fmt_path s; list i package_with ppf l; | Ttyp_open (path, _mod_ident, t) -> line i ppf "Ttyp_open %a\n" fmt_path path; core_type i ppf t +and labeled_core_type i ppf (l, t) = + tuple_component_label i ppf l; + core_type i ppf t + and package_with i ppf (s, t) = line i ppf "with type %a\n" fmt_longident s; core_type i ppf t @@ -227,22 +245,17 @@ and pattern : type k . _ -> _ -> k general_pattern -> unit = fun i ppf x -> line i ppf "pattern %a\n" fmt_location x.pat_loc; attributes i ppf x.pat_attributes; let i = i+1 in - begin match x.pat_extra with - | [] -> () - | extra -> - line i ppf "extra\n"; - List.iter (pattern_extra (i+1) ppf) extra; - end; + List.iter (pattern_extra i ppf) x.pat_extra; match x.pat_desc with | Tpat_any -> line i ppf "Tpat_any\n"; | Tpat_var (s,_,_) -> line i ppf "Tpat_var \"%a\"\n" fmt_ident s; - | Tpat_alias (p, s,_,_) -> + | Tpat_alias (p, s,_,_,_) -> line i ppf "Tpat_alias \"%a\"\n" fmt_ident s; pattern i ppf p; | Tpat_constant (c) -> line i ppf "Tpat_constant %a\n" fmt_constant c; | Tpat_tuple (l) -> line i ppf "Tpat_tuple\n"; - list i pattern ppf l; + list i labeled_pattern ppf l; | Tpat_construct (li, _, po, vto) -> line i ppf "Tpat_construct %a\n" fmt_longident li; list i pattern ppf po; @@ -258,8 +271,8 @@ and pattern : type k . _ -> _ -> k general_pattern -> unit = fun i ppf x -> | Tpat_record (l, _c) -> line i ppf "Tpat_record\n"; list i longident_x_pattern ppf l; - | Tpat_array (l) -> - line i ppf "Tpat_array\n"; + | Tpat_array (am, l) -> + line i ppf "Tpat_array %a\n" fmt_mutable_flag am; list i pattern ppf l; | Tpat_lazy p -> line i ppf "Tpat_lazy\n"; @@ -275,7 +288,15 @@ and pattern : type k . _ -> _ -> k general_pattern -> unit = fun i ppf x -> pattern i ppf p1; pattern i ppf p2; -and pattern_extra i ppf (extra_pat, _, attrs) = +and labeled_pattern + : type k . _ -> _ -> string option * k general_pattern -> unit = + fun i ppf (label, x) -> + tuple_component_label i ppf label; + pattern i ppf x + +and pattern_extra i ppf (extra_pat, loc, attrs) = + line i ppf "extra %a\n" fmt_location loc; + let i = i + 1 in match extra_pat with | Tpat_unpack -> line i ppf "Tpat_extra_unpack\n"; @@ -302,12 +323,15 @@ and function_body i ppf (body : function_body) = line i ppf "Tfunction_cases%a %a\n" fmt_partiality partial fmt_location loc; - attributes (i+1) ppf attrs; - Option.iter (fun e -> expression_extra (i+1) ppf e []) exp_extra; - list (i+1) case ppf cases + let i = i+1 in + attributes i ppf attrs; + Option.iter (fun e -> expression_extra i ppf (e, loc, [])) exp_extra; + list i case ppf cases -and expression_extra i ppf x attrs = - match x with +and expression_extra i ppf (extra, loc, attrs) = + line i ppf "extra %a\n" fmt_location loc; + let i = i + 1 in + match extra with | Texp_constraint ct -> line i ppf "Texp_constraint\n"; attributes i ppf attrs; @@ -329,12 +353,7 @@ and expression i ppf x = line i ppf "expression %a\n" fmt_location x.exp_loc; attributes i ppf x.exp_attributes; let i = i+1 in - begin match x.exp_extra with - | [] -> () - | extra -> - line i ppf "extra\n"; - List.iter (fun (x, _, attrs) -> expression_extra (i+1) ppf x attrs) extra; - end; + List.iter (expression_extra i ppf) x.exp_extra; match x.exp_desc with | Texp_ident (li,_,_) -> line i ppf "Texp_ident %a\n" fmt_path li; | Texp_instvar (_, li,_) -> line i ppf "Texp_instvar %a\n" fmt_path li; @@ -350,7 +369,7 @@ and expression i ppf x = | Texp_apply (e, l) -> line i ppf "Texp_apply\n"; expression i ppf e; - list i label_x_expression ppf l; + list i label_x_apply_arg ppf l; | Texp_match (e, l1, l2, partial) -> line i ppf "Texp_match%a\n" fmt_partiality partial; expression i ppf e; @@ -363,7 +382,7 @@ and expression i ppf x = list i case ppf l2; | Texp_tuple (l) -> line i ppf "Texp_tuple\n"; - list i expression ppf l; + list i labeled_expression ppf l; | Texp_construct (li, _, eo) -> line i ppf "Texp_construct %a\n" fmt_longident li; list i expression ppf eo; @@ -388,8 +407,12 @@ and expression i ppf x = expression i ppf e1; longident i ppf li; expression i ppf e2; - | Texp_array (l) -> - line i ppf "Texp_array\n"; + | Texp_atomic_loc (e, li, _) -> + line i ppf "Texp_atomic_loc\n"; + expression i ppf e; + longident i ppf li; + | Texp_array (mut, l) -> + line i ppf "Texp_array %a\n" fmt_mutable_flag mut; list i expression ppf l; | Texp_ifthenelse (e1, e2, eo) -> line i ppf "Texp_ifthenelse\n"; @@ -646,7 +669,7 @@ and class_expr i ppf x = | Tcl_apply (ce, l) -> line i ppf "Tcl_apply\n"; class_expr i ppf ce; - list i label_x_expression ppf l; + list i label_x_apply_arg ppf l; | Tcl_let (rf, l1, l2, ce) -> line i ppf "Tcl_let %a\n" fmt_rec_flag rf; list i (value_binding rf) ppf l1; @@ -758,9 +781,8 @@ and signature_item i ppf x = line i ppf "Tsig_exception\n"; type_exception i ppf ext | Tsig_module md -> - line i ppf "Tsig_module \"%a\"\n" fmt_modname md.md_id; - attributes i ppf md.md_attributes; - module_type i ppf md.md_type + line i ppf "Tsig_module %a\n" fmt_presence md.md_presence; + module_declaration i ppf md | Tsig_modsubst ms -> line i ppf "Tsig_modsubst \"%a\" = %a\n" fmt_ident ms.ms_id fmt_path ms.ms_manifest; @@ -795,7 +817,7 @@ and signature_item i ppf x = attribute i ppf "Tsig_attribute" a and module_declaration i ppf md = - line i ppf "%a" fmt_modname md.md_id; + line i ppf "%a\n" fmt_modname md.md_id; attributes i ppf md.md_attributes; module_type (i+1) ppf md.md_type; @@ -883,7 +905,7 @@ and structure_item i ppf x = line i ppf "Tstr_exception\n"; type_exception i ppf ext; | Tstr_module x -> - line i ppf "Tstr_module\n"; + line i ppf "Tstr_module %a\n" fmt_presence x.mb_presence; module_binding i ppf x | Tstr_recmodule bindings -> line i ppf "Tstr_recmodule\n"; @@ -932,11 +954,12 @@ and constructor_arguments i ppf = function | Cstr_tuple l -> list i core_type ppf l | Cstr_record l -> list i label_decl ppf l -and label_decl i ppf {ld_id; ld_name = _; ld_mutable; ld_type; ld_loc; +and label_decl i ppf {ld_id; ld_name= _; ld_mutable; ld_atomic; ld_type; ld_loc; ld_attributes} = line i ppf "%a\n" fmt_location ld_loc; attributes i ppf ld_attributes; line (i+1) ppf "%a\n" fmt_mutable_flag ld_mutable; + line (i+1) ppf "%a\n" fmt_atomic_flag ld_atomic; line (i+1) ppf "%a" fmt_ident ld_id; core_type (i+1) ppf ld_type @@ -976,10 +999,14 @@ and record_field i ppf = function | _, Kept _ -> line i ppf "" -and label_x_expression i ppf (l, e) = +and label_x_apply_arg i ppf (l, e) = line i ppf "\n"; arg_label (i+1) ppf l; - (match e with None -> () | Some e -> expression (i+1) ppf e) + (match e with Omitted () -> () | Arg e -> expression (i+1) ppf e) + +and labeled_expression i ppf (l, e) = + tuple_component_label i ppf l; + expression (i+1) ppf e; and ident_x_expression_def i ppf (l, e) = line i ppf " \"%a\"\n" fmt_ident l; diff --git a/typing/rawprinttyp.ml b/typing/rawprinttyp.ml index 00d94fc2..67ee0cea 100644 --- a/typing/rawprinttyp.ml +++ b/typing/rawprinttyp.ml @@ -63,9 +63,17 @@ let rec raw_type ppf ty = (Transient_expr.get_scope ty) (Transient_expr.get_marks ty) raw_type_desc ty.desc end +and labeled_type ppf (label, ty) = + begin match label with + | Some s -> fprintf ppf "label=\"%s\" " s + | None -> () + end; + raw_type ppf ty and raw_type_list tl = raw_list raw_type tl +and labeled_type_list tl = raw_list labeled_type tl and raw_lid_type_list tl = raw_list (fun ppf (lid, typ) -> + let lid = Longident.unflatten lid |> Option.get in fprintf ppf "(@,%a,@,%a)" longident lid raw_type typ) tl and raw_type_desc ppf = function @@ -75,7 +83,7 @@ and raw_type_desc ppf = function (string_of_label l) raw_type t1 raw_type t2 (if is_commu_ok c then "Cok" else "Cunknown") | Ttuple tl -> - fprintf ppf "@[<1>Ttuple@,%a@]" raw_type_list tl + fprintf ppf "@[<1>Ttuple@,%a@]" labeled_type_list tl | Tconstr (p, tl, abbrev) -> fprintf ppf "@[Tconstr(@,%a,@,%a,@,%a)@]" path p raw_type_list tl @@ -116,8 +124,10 @@ and raw_type_desc ppf = function match name with None -> fprintf ppf "None" | Some(p,tl) -> fprintf ppf "Some(@,%a,@,%a)" path p raw_type_list tl) - | Tpackage (p, fl) -> - fprintf ppf "@[Tpackage(@,%a,@,%a)@]" path p raw_lid_type_list fl + | Tpackage pack -> + fprintf ppf "@[Tpackage(@,%a,@,%a)@]" + path pack.pack_path + raw_lid_type_list pack.pack_cstrs and raw_row_fixed ppf = function | None -> fprintf ppf "None" | Some Types.Fixed_private -> fprintf ppf "Some Fixed_private" diff --git a/typing/shape.ml b/typing/shape.ml index 67e6b7a1..1daf64f0 100644 --- a/typing/shape.ml +++ b/typing/shape.ml @@ -276,26 +276,22 @@ let dummy_mod = let of_path ~find_shape ~namespace path = (* We need to handle the following cases: Path of constructor: - M.t.C + M.t.C [Pextra_ty("M.t", "C")] Path of label: - M.t.lbl + M.t.lbl [Pextra_ty("M.t", "lbl")] Path of label of inline record: - M.t.C.lbl *) + M.t.C.lbl [Pextra_ty(Pextra_ty("M.t", "C"), "lbl")] *) let rec aux : Sig_component_kind.t -> Path.t -> t = fun ns -> function | Pident id -> find_shape ns id - | Pdot (path, name) -> - let namespace : Sig_component_kind.t = - match (ns : Sig_component_kind.t) with - | Constructor -> Type - | Label -> Type - | _ -> Module - in - proj (aux namespace path) (name, ns) + | Pdot (path, name) -> proj (aux Module path) (name, ns) | Papply (p1, p2) -> app (aux Module p1) ~arg:(aux Module p2) | Pextra_ty (path, extra) -> begin - match extra with - Pcstr_ty name -> proj (aux Type path) (name, Constructor) - | Pext_ty -> aux Extension_constructor path + match extra, ns, path with + | Pcstr_ty name, Label, Pextra_ty _ -> + (* Handle the M.t.C.lbl case *) + proj (aux Constructor path) (name, ns) + | Pcstr_ty name, _, _ -> proj (aux Type path) (name, ns) + | Pext_ty, _, _ -> aux Extension_constructor path end in aux namespace path diff --git a/typing/shape_reduce.ml b/typing/shape_reduce.ml index 9f793e7b..b17ea230 100644 --- a/typing/shape_reduce.ml +++ b/typing/shape_reduce.ml @@ -27,18 +27,18 @@ type result = let rec print_result fmt result = match result with | Resolved uid -> - Format.fprintf fmt "@[Resolved: %a@]@;" Uid.print uid + Format.fprintf fmt "@[Resolved:@ %a@]" Uid.print uid | Resolved_alias (uid, r) -> - Format.fprintf fmt "@[Alias: %a -> %a@]@;" + Format.fprintf fmt "@[Alias:@ %a@] ->@ %a" Uid.print uid print_result r | Unresolved shape -> - Format.fprintf fmt "@[Unresolved: %a@]@;" print shape + Format.fprintf fmt "@[Unresolved:@ %a@]" print shape | Approximated (Some uid) -> - Format.fprintf fmt "@[Approximated: %a@]@;" Uid.print uid + Format.fprintf fmt "@[Approximated:@ %a@]" Uid.print uid | Approximated None -> - Format.fprintf fmt "@[Approximated: No uid@]@;" + Format.fprintf fmt "Approximated: No uid" | Internal_error_missing_uid -> - Format.fprintf fmt "@[Missing uid@]@;" + Format.fprintf fmt "Missing uid" let find_shape env id = diff --git a/typing/subst.ml b/typing/subst.ml index 2fb4fe14..8aa2c540 100644 --- a/typing/subst.ml +++ b/typing/subst.ml @@ -275,9 +275,12 @@ let rec typexp copy_scope s ty = | Type_function { params; body } -> Tlink (apply_type_function params args body) end - | Tpackage(p, fl) -> - Tpackage(modtype_path s p, - List.map (fun (n, ty) -> (n, typexp copy_scope s ty)) fl) + | Tpackage {pack_path; pack_cstrs} -> + Tpackage { + pack_path = modtype_path s pack_path; + pack_cstrs = + List.map (fun (n, ty) -> (n, typexp copy_scope s ty)) pack_cstrs; + } | Tobject (t1, name) -> let t1' = typexp copy_scope s t1 in let name' = @@ -350,6 +353,7 @@ let label_declaration copy_scope s l = { ld_id = l.ld_id; ld_mutable = l.ld_mutable; + ld_atomic = l.ld_atomic; ld_type = typexp copy_scope s l.ld_type; ld_loc = loc s l.ld_loc; ld_attributes = attrs s l.ld_attributes; diff --git a/typing/tast_iterator.ml b/typing/tast_iterator.ml index 6ec345d5..4085634c 100644 --- a/typing/tast_iterator.ml +++ b/typing/tast_iterator.ml @@ -68,6 +68,20 @@ type iterator = let iter_snd f (_, y) = f y let iter_loc sub {loc; _} = sub.location sub loc +let rec iter_loc_lid sub lid = + let open Longident in + match lid with + | Lident _ -> () + | Ldot (lid, id) -> + iter_loc sub lid; iter_loc_lid sub lid.txt; iter_loc sub id + | Lapply (lid, lid') -> + iter_loc sub lid; iter_loc_lid sub lid.txt; + iter_loc sub lid'; iter_loc_lid sub lid'.txt + +let iter_loc_lid sub {loc; txt} = + iter_loc sub {loc; txt}; + iter_loc_lid sub txt + let location _sub _l = () let attribute sub x = @@ -113,7 +127,7 @@ let module_substitution sub ms = sub.location sub ms_loc; sub.attributes sub ms_attributes; iter_loc sub ms_name; - iter_loc sub ms_txt + iter_loc_lid sub ms_txt let include_infos sub f {incl_loc; incl_mod; incl_attributes; _} = sub.location sub incl_loc; @@ -203,7 +217,7 @@ let type_declarations sub (_, list) = List.iter (sub.type_declaration sub) list let type_extension sub x = sub.location sub x.tyext_loc; sub.attributes sub x.tyext_attributes; - iter_loc sub x.tyext_txt; + iter_loc_lid sub x.tyext_txt; List.iter (fun (c, _) -> sub.typ sub c) x.tyext_params; List.iter (sub.extension_constructor sub) x.tyext_constructors @@ -223,15 +237,15 @@ let extension_constructor sub ec = List.iter (iter_loc sub) ids; constructor_args sub ctl; Option.iter (sub.typ sub) cto - | Text_rebind (_, lid) -> iter_loc sub lid + | Text_rebind (_, lid) -> iter_loc_lid sub lid let pat_extra sub (e, loc, attrs) = sub.location sub loc; sub.attributes sub attrs; match e with - | Tpat_type (_, lid) -> iter_loc sub lid + | Tpat_type (_, lid) -> iter_loc_lid sub lid | Tpat_unpack -> () - | Tpat_open (_, lid, env) -> iter_loc sub lid; sub.env sub env + | Tpat_open (_, lid, env) -> iter_loc_lid sub lid; sub.env sub env | Tpat_constraint ct -> sub.typ sub ct let pat @@ -245,17 +259,17 @@ let pat | Tpat_any -> () | Tpat_var (_, s, _) -> iter_loc sub s | Tpat_constant _ -> () - | Tpat_tuple l -> List.iter (sub.pat sub) l + | Tpat_tuple l -> List.iter (fun (_, p) -> sub.pat sub p) l | Tpat_construct (lid, _, l, vto) -> - iter_loc sub lid; + iter_loc_lid sub lid; List.iter (sub.pat sub) l; Option.iter (fun (ids, ct) -> List.iter (iter_loc sub) ids; sub.typ sub ct) vto | Tpat_variant (_, po, _) -> Option.iter (sub.pat sub) po | Tpat_record (l, _) -> - List.iter (fun (lid, _, i) -> iter_loc sub lid; sub.pat sub i) l - | Tpat_array l -> List.iter (sub.pat sub) l - | Tpat_alias (p, _, s, _) -> sub.pat sub p; iter_loc sub s + List.iter (fun (lid, _, i) -> iter_loc_lid sub lid; sub.pat sub i) l + | Tpat_array (_, l) -> List.iter (sub.pat sub) l + | Tpat_alias (p, _, s, _, _) -> sub.pat sub p; iter_loc sub s | Tpat_lazy p -> sub.pat sub p | Tpat_value p -> sub.pat sub (p :> pattern) | Tpat_exception p -> sub.pat sub p @@ -298,7 +312,7 @@ let expr sub {exp_loc; exp_extra; exp_desc; exp_env; exp_attributes; _} = List.iter (fun (e, loc, _) -> extra e; sub.location sub loc) exp_extra; sub.env sub exp_env; match exp_desc with - | Texp_ident (_, lid, _) -> iter_loc sub lid + | Texp_ident (_, lid, _) -> iter_loc_lid sub lid | Texp_constant _ -> () | Texp_let (rec_flag, list, exp) -> sub.value_bindings sub (rec_flag, list); @@ -308,7 +322,10 @@ let expr sub {exp_loc; exp_extra; exp_desc; exp_env; exp_attributes; _} = function_body sub body | Texp_apply (exp, list) -> sub.expr sub exp; - List.iter (fun (_, o) -> Option.iter (sub.expr sub) o) list + List.iter (function + | (_, Arg exp) -> sub.expr sub exp + | (_, Omitted ()) -> ()) + list | Texp_match (exp, cases, effs, _) -> sub.expr sub exp; List.iter (sub.case sub) cases; @@ -317,25 +334,28 @@ let expr sub {exp_loc; exp_extra; exp_desc; exp_env; exp_attributes; _} = sub.expr sub exp; List.iter (sub.case sub) cases; List.iter (sub.case sub) effs - | Texp_tuple list -> List.iter (sub.expr sub) list + | Texp_tuple list -> List.iter (fun (_, e) -> sub.expr sub e) list | Texp_construct (lid, _, args) -> - iter_loc sub lid; + iter_loc_lid sub lid; List.iter (sub.expr sub) args | Texp_variant (_, expo) -> Option.iter (sub.expr sub) expo | Texp_record { fields; extended_expression; _} -> Array.iter (function | _, Kept _ -> () - | _, Overridden (lid, exp) -> iter_loc sub lid; sub.expr sub exp) + | _, Overridden (lid, exp) -> iter_loc_lid sub lid; sub.expr sub exp) fields; Option.iter (sub.expr sub) extended_expression; | Texp_field (exp, lid, _) -> - iter_loc sub lid; + iter_loc_lid sub lid; sub.expr sub exp | Texp_setfield (exp1, lid, _, exp2) -> - iter_loc sub lid; + iter_loc_lid sub lid; sub.expr sub exp1; sub.expr sub exp2 - | Texp_array list -> List.iter (sub.expr sub) list + | Texp_atomic_loc (exp, lid, _) -> + iter_loc sub lid; + sub.expr sub exp + | Texp_array (_, list) -> List.iter (sub.expr sub) list | Texp_ifthenelse (exp1, exp2, expo) -> sub.expr sub exp1; sub.expr sub exp2; @@ -352,7 +372,7 @@ let expr sub {exp_loc; exp_extra; exp_desc; exp_env; exp_attributes; _} = sub.expr sub exp3 | Texp_send (exp, _) -> sub.expr sub exp - | Texp_new (_, lid, _) -> iter_loc sub lid + | Texp_new (_, lid, _) -> iter_loc_lid sub lid | Texp_instvar (_, _, s) -> iter_loc sub s | Texp_setinstvar (_, _, s, exp) -> iter_loc sub s; @@ -375,15 +395,15 @@ let expr sub {exp_loc; exp_extra; exp_desc; exp_env; exp_attributes; _} = List.iter (sub.binding_op sub) ands; sub.case sub body | Texp_unreachable -> () - | Texp_extension_constructor (lid, _) -> iter_loc sub lid + | Texp_extension_constructor (lid, _) -> iter_loc_lid sub lid | Texp_open (od, e) -> sub.open_declaration sub od; sub.expr sub e -let package_type sub {pack_fields; pack_txt; _} = - List.iter (fun (lid, p) -> iter_loc sub lid; sub.typ sub p) pack_fields; - iter_loc sub pack_txt +let package_type sub {tpt_cstrs; tpt_txt; _} = + List.iter (fun (lid, p) -> iter_loc_lid sub lid; sub.typ sub p) tpt_cstrs; + iter_loc_lid sub tpt_txt let binding_op sub {bop_loc; bop_op_name; bop_exp; _} = sub.location sub bop_loc; @@ -427,8 +447,8 @@ let module_type sub {mty_loc; mty_desc; mty_env; mty_attributes; _} = sub.attributes sub mty_attributes; sub.env sub mty_env; match mty_desc with - | Tmty_ident (_, lid) -> iter_loc sub lid - | Tmty_alias (_, lid) -> iter_loc sub lid + | Tmty_ident (_, lid) -> iter_loc_lid sub lid + | Tmty_alias (_, lid) -> iter_loc_lid sub lid | Tmty_signature sg -> sub.signature sub sg | Tmty_functor (arg, mtype2) -> functor_parameter sub arg; @@ -436,14 +456,14 @@ let module_type sub {mty_loc; mty_desc; mty_env; mty_attributes; _} = | Tmty_with (mtype, list) -> sub.module_type sub mtype; List.iter (fun (_, lid, e) -> - iter_loc sub lid; sub.with_constraint sub e) list + iter_loc_lid sub lid; sub.with_constraint sub e) list | Tmty_typeof mexpr -> sub.module_expr sub mexpr let with_constraint sub = function | Twith_type decl -> sub.type_declaration sub decl | Twith_typesubst decl -> sub.type_declaration sub decl - | Twith_module (_, lid) -> iter_loc sub lid - | Twith_modsubst (_, lid) -> iter_loc sub lid + | Twith_module (_, lid) -> iter_loc_lid sub lid + | Twith_modsubst (_, lid) -> iter_loc_lid sub lid | Twith_modtype mty -> sub.module_type sub mty | Twith_modtypesubst mty -> sub.module_type sub mty @@ -451,7 +471,7 @@ let with_constraint sub = function let open_description sub {open_loc; open_expr; open_env; open_attributes; _} = sub.location sub open_loc; sub.attributes sub open_attributes; - iter_snd (iter_loc sub) open_expr; + iter_snd (iter_loc_lid sub) open_expr; sub.env sub open_env let open_declaration sub {open_loc; open_expr; open_env; open_attributes; _} = @@ -480,7 +500,7 @@ let module_expr sub {mod_loc; mod_desc; mod_env; mod_attributes; _} = sub.attributes sub mod_attributes; sub.env sub mod_env; match mod_desc with - | Tmod_ident (_, lid) -> iter_loc sub lid + | Tmod_ident (_, lid) -> iter_loc_lid sub lid | Tmod_structure st -> sub.structure sub st | Tmod_functor (arg, mexpr) -> functor_parameter sub arg; @@ -522,13 +542,16 @@ let class_expr sub {cl_loc; cl_desc; cl_env; cl_attributes; _} = sub.class_expr sub cl | Tcl_apply (cl, args) -> sub.class_expr sub cl; - List.iter (fun (_, e) -> Option.iter (sub.expr sub) e) args + List.iter (function + | (_, Arg exp) -> sub.expr sub exp + | (_, Omitted ()) -> ()) + args | Tcl_let (rec_flag, value_bindings, ivars, cl) -> sub.value_bindings sub (rec_flag, value_bindings); List.iter (fun (_, e) -> sub.expr sub e) ivars; sub.class_expr sub cl | Tcl_ident (_, lid, tyl) -> - iter_loc sub lid; + iter_loc_lid sub lid; List.iter (sub.typ sub) tyl | Tcl_open (od, e) -> sub.open_description sub od; @@ -541,7 +564,7 @@ let class_type sub {cltyp_loc; cltyp_desc; cltyp_env; cltyp_attributes; _} = match cltyp_desc with | Tcty_signature csg -> sub.class_signature sub csg | Tcty_constr (_, lid, list) -> - iter_loc sub lid; + iter_loc_lid sub lid; List.iter (sub.typ sub) list | Tcty_arrow (_, ct, cl) -> sub.typ sub ct; @@ -576,20 +599,20 @@ let typ sub {ctyp_loc; ctyp_desc; ctyp_env; ctyp_attributes; _} = | Ttyp_arrow (_, ct1, ct2) -> sub.typ sub ct1; sub.typ sub ct2 - | Ttyp_tuple list -> List.iter (sub.typ sub) list + | Ttyp_tuple list -> List.iter (fun (_, t) -> sub.typ sub t) list | Ttyp_constr (_, lid, list) -> - iter_loc sub lid; + iter_loc_lid sub lid; List.iter (sub.typ sub) list | Ttyp_object (list, _) -> List.iter (sub.object_field sub) list | Ttyp_class (_, lid, list) -> - iter_loc sub lid; + iter_loc_lid sub lid; List.iter (sub.typ sub) list | Ttyp_alias (ct, _) -> sub.typ sub ct | Ttyp_variant (list, _, _) -> List.iter (sub.row_field sub) list | Ttyp_poly (_, ct) -> sub.typ sub ct | Ttyp_package pack -> sub.package_type sub pack | Ttyp_open (_, mod_ident, t) -> - iter_loc sub mod_ident; + iter_loc_lid sub mod_ident; sub.typ sub t let class_structure sub {cstr_self; cstr_fields; _} = diff --git a/typing/tast_mapper.ml b/typing/tast_mapper.ml index 05b7a66c..6a2d858b 100644 --- a/typing/tast_mapper.ml +++ b/typing/tast_mapper.ml @@ -77,6 +77,22 @@ let tuple2 f1 f2 (x, y) = (f1 x, f2 y) let tuple3 f1 f2 f3 (x, y, z) = (f1 x, f2 y, f3 z) let map_loc sub {loc; txt} = {loc=sub.location sub loc; txt} +let rec map_loc_lid sub lid = + let open Longident in + match lid with + | Lident id -> Lident id + | Ldot (lid, id) -> + let lid = { lid with txt = map_loc_lid sub lid.txt } in + Ldot (map_loc sub lid, map_loc sub id) + | Lapply (lid, lid') -> + let lid = { lid with txt = map_loc_lid sub lid.txt } in + let lid' = { lid' with txt = map_loc_lid sub lid'.txt } in + Lapply(map_loc sub lid, map_loc sub lid') + +let map_loc_lid sub {loc; txt} = + let txt = map_loc_lid sub txt in + map_loc sub {loc; txt} + let location _sub l = l let attribute sub x = @@ -125,7 +141,7 @@ let module_declaration sub x = let module_substitution sub x = let ms_loc = sub.location sub x.ms_loc in let ms_name = map_loc sub x.ms_name in - let ms_txt = map_loc sub x.ms_txt in + let ms_txt = map_loc_lid sub x.ms_txt in let ms_attributes = sub.attributes sub x.ms_attributes in {x with ms_loc; ms_name; ms_txt; ms_attributes} @@ -227,7 +243,7 @@ let type_declarations sub (rec_flag, list) = let type_extension sub x = let tyext_loc = sub.location sub x.tyext_loc in - let tyext_txt = map_loc sub x.tyext_txt in + let tyext_txt = map_loc_lid sub x.tyext_txt in let tyext_params = List.map (tuple2 (sub.typ sub) id) x.tyext_params in let tyext_constructors = List.map (sub.extension_constructor sub) x.tyext_constructors @@ -256,16 +272,16 @@ let extension_constructor sub x = Option.map (sub.typ sub) cto ) | Text_rebind (path, lid) -> - Text_rebind (path, map_loc sub lid) + Text_rebind (path, map_loc_lid sub lid) in let ext_attributes = sub.attributes sub x.ext_attributes in {x with ext_loc; ext_name; ext_kind; ext_attributes} let pat_extra sub = function | Tpat_unpack as d -> d - | Tpat_type (path,loc) -> Tpat_type (path, map_loc sub loc) - | Tpat_open (path,loc,env) -> - Tpat_open (path, map_loc sub loc, sub.env sub env) + | Tpat_type (path,lid) -> Tpat_type (path, map_loc_lid sub lid) + | Tpat_open (path,lid,env) -> + Tpat_open (path, map_loc_lid sub lid, sub.env sub env) | Tpat_constraint ct -> Tpat_constraint (sub.typ sub ct) let pat @@ -280,18 +296,20 @@ let pat | Tpat_any | Tpat_constant _ -> x.pat_desc | Tpat_var (id, s, uid) -> Tpat_var (id, map_loc sub s, uid) - | Tpat_tuple l -> Tpat_tuple (List.map (sub.pat sub) l) - | Tpat_construct (loc, cd, l, vto) -> + | Tpat_tuple l -> + Tpat_tuple (List.map (fun (label, p) -> label, sub.pat sub p) l) + | Tpat_construct (lid, cd, l, vto) -> let vto = Option.map (fun (vl,cty) -> List.map (map_loc sub) vl, sub.typ sub cty) vto in - Tpat_construct (map_loc sub loc, cd, List.map (sub.pat sub) l, vto) + Tpat_construct (map_loc_lid sub lid, cd, List.map (sub.pat sub) l, vto) | Tpat_variant (l, po, rd) -> Tpat_variant (l, Option.map (sub.pat sub) po, rd) | Tpat_record (l, closed) -> - Tpat_record (List.map (tuple3 (map_loc sub) id (sub.pat sub)) l, closed) - | Tpat_array l -> Tpat_array (List.map (sub.pat sub) l) - | Tpat_alias (p, id, s, uid) -> - Tpat_alias (sub.pat sub p, id, map_loc sub s, uid) + Tpat_record + (List.map (tuple3 (map_loc_lid sub) id (sub.pat sub)) l, closed) + | Tpat_array (mut, l) -> Tpat_array (mut, List.map (sub.pat sub) l) + | Tpat_alias (p, id, s, uid, ty) -> + Tpat_alias (sub.pat sub p, id, map_loc sub s, uid, ty) | Tpat_lazy p -> Tpat_lazy (sub.pat sub p) | Tpat_value p -> (as_computation_pattern (sub.pat sub (p :> pattern))).pat_desc @@ -348,7 +366,7 @@ let expr sub x = let exp_desc = match x.exp_desc with | Texp_ident (path, lid, vd) -> - Texp_ident (path, map_loc sub lid, vd) + Texp_ident (path, map_loc_lid sub lid, vd) | Texp_constant _ as d -> d | Texp_let (rec_flag, list, exp) -> let (rec_flag, list) = sub.value_bindings sub (rec_flag, list) in @@ -360,7 +378,7 @@ let expr sub x = | Texp_apply (exp, list) -> Texp_apply ( sub.expr sub exp, - List.map (tuple2 id (Option.map (sub.expr sub))) list + List.map (tuple2 id (Typedtree.map_apply_arg (sub.expr sub))) list ) | Texp_match (exp, cases, eff_cases, p) -> Texp_match ( @@ -376,16 +394,16 @@ let expr sub x = List.map (sub.case sub) eff_cases ) | Texp_tuple list -> - Texp_tuple (List.map (sub.expr sub) list) + Texp_tuple (List.map (fun (label, e) -> label, sub.expr sub e) list) | Texp_construct (lid, cd, args) -> - Texp_construct (map_loc sub lid, cd, List.map (sub.expr sub) args) + Texp_construct (map_loc_lid sub lid, cd, List.map (sub.expr sub) args) | Texp_variant (l, expo) -> Texp_variant (l, Option.map (sub.expr sub) expo) | Texp_record { fields; representation; extended_expression } -> let fields = Array.map (function | label, Kept (t, mut) -> label, Kept (t, mut) | label, Overridden (lid, exp) -> - label, Overridden (map_loc sub lid, sub.expr sub exp)) + label, Overridden (map_loc_lid sub lid, sub.expr sub exp)) fields in Texp_record { @@ -393,16 +411,18 @@ let expr sub x = extended_expression = Option.map (sub.expr sub) extended_expression; } | Texp_field (exp, lid, ld) -> - Texp_field (sub.expr sub exp, map_loc sub lid, ld) + Texp_field (sub.expr sub exp, map_loc_lid sub lid, ld) | Texp_setfield (exp1, lid, ld, exp2) -> Texp_setfield ( sub.expr sub exp1, - map_loc sub lid, + map_loc_lid sub lid, ld, sub.expr sub exp2 ) - | Texp_array list -> - Texp_array (List.map (sub.expr sub) list) + | Texp_atomic_loc (exp, lid, ld) -> + Texp_atomic_loc (sub.expr sub exp, map_loc sub lid, ld) + | Texp_array (mut, list) -> + Texp_array (mut, List.map (sub.expr sub) list) | Texp_ifthenelse (exp1, exp2, expo) -> Texp_ifthenelse ( sub.expr sub exp1, @@ -437,7 +457,7 @@ let expr sub x = | Texp_new (path, lid, cd) -> Texp_new ( path, - map_loc sub lid, + map_loc_lid sub lid, cd ) | Texp_instvar (path1, path2, id) -> @@ -490,7 +510,7 @@ let expr sub x = | Texp_unreachable -> Texp_unreachable | Texp_extension_constructor (lid, path) -> - Texp_extension_constructor (map_loc sub lid, path) + Texp_extension_constructor (map_loc_lid sub lid, path) | Texp_open (od, e) -> Texp_open (sub.open_declaration sub od, sub.expr sub e) in @@ -499,10 +519,10 @@ let expr sub x = let package_type sub x = - let pack_txt = map_loc sub x.pack_txt in - let pack_fields = List.map - (tuple2 (map_loc sub) (sub.typ sub)) x.pack_fields in - {x with pack_txt; pack_fields} + let tpt_txt = map_loc_lid sub x.tpt_txt in + let tpt_cstrs = List.map + (tuple2 (map_loc_lid sub) (sub.typ sub)) x.tpt_cstrs in + {x with tpt_txt; tpt_cstrs} let binding_op sub x = let bop_loc = sub.location sub x.bop_loc in @@ -565,15 +585,15 @@ let module_type sub x = let mty_env = sub.env sub x.mty_env in let mty_desc = match x.mty_desc with - | Tmty_ident (path, lid) -> Tmty_ident (path, map_loc sub lid) - | Tmty_alias (path, lid) -> Tmty_alias (path, map_loc sub lid) + | Tmty_ident (path, lid) -> Tmty_ident (path, map_loc_lid sub lid) + | Tmty_alias (path, lid) -> Tmty_alias (path, map_loc_lid sub lid) | Tmty_signature sg -> Tmty_signature (sub.signature sub sg) | Tmty_functor (arg, mtype2) -> Tmty_functor (functor_parameter sub arg, sub.module_type sub mtype2) | Tmty_with (mtype, list) -> Tmty_with ( sub.module_type sub mtype, - List.map (tuple3 id (map_loc sub) (sub.with_constraint sub)) list + List.map (tuple3 id (map_loc_lid sub) (sub.with_constraint sub)) list ) | Tmty_typeof mexpr -> Tmty_typeof (sub.module_expr sub mexpr) @@ -586,12 +606,12 @@ let with_constraint sub = function | Twith_typesubst decl -> Twith_typesubst (sub.type_declaration sub decl) | Twith_modtype mty -> Twith_modtype (sub.module_type sub mty) | Twith_modtypesubst mty -> Twith_modtypesubst (sub.module_type sub mty) - | Twith_module (path, lid) -> Twith_module (path, map_loc sub lid) - | Twith_modsubst (path, lid) -> Twith_modsubst (path, map_loc sub lid) + | Twith_module (path, lid) -> Twith_module (path, map_loc_lid sub lid) + | Twith_modsubst (path, lid) -> Twith_modsubst (path, map_loc_lid sub lid) let open_description sub od = {od with open_loc = sub.location sub od.open_loc; - open_expr = tuple2 id (map_loc sub) od.open_expr; + open_expr = tuple2 id (map_loc_lid sub) od.open_expr; open_env = sub.env sub od.open_env; open_attributes = sub.attributes sub od.open_attributes} @@ -622,7 +642,7 @@ let module_expr sub x = let mod_env = sub.env sub x.mod_env in let mod_desc = match x.mod_desc with - | Tmod_ident (path, lid) -> Tmod_ident (path, map_loc sub lid) + | Tmod_ident (path, lid) -> Tmod_ident (path, map_loc_lid sub lid) | Tmod_structure st -> Tmod_structure (sub.structure sub st) | Tmod_functor (arg, mexpr) -> Tmod_functor (functor_parameter sub arg, sub.module_expr sub mexpr) @@ -687,7 +707,7 @@ let class_expr sub x = | Tcl_apply (cl, args) -> Tcl_apply ( sub.class_expr sub cl, - List.map (tuple2 id (Option.map (sub.expr sub))) args + List.map (tuple2 id (Typedtree.map_apply_arg (sub.expr sub))) args ) | Tcl_let (rec_flag, value_bindings, ivars, cl) -> let (rec_flag, value_bindings) = @@ -700,7 +720,7 @@ let class_expr sub x = sub.class_expr sub cl ) | Tcl_ident (path, lid, tyl) -> - Tcl_ident (path, map_loc sub lid, List.map (sub.typ sub) tyl) + Tcl_ident (path, map_loc_lid sub lid, List.map (sub.typ sub) tyl) | Tcl_open (od, e) -> Tcl_open (sub.open_description sub od, sub.class_expr sub e) in @@ -716,7 +736,7 @@ let class_type sub x = | Tcty_constr (path, lid, list) -> Tcty_constr ( path, - map_loc sub lid, + map_loc_lid sub lid, List.map (sub.typ sub) list ) | Tcty_arrow (label, ct, cl) -> @@ -763,15 +783,16 @@ let typ sub x = | Ttyp_var _ as d -> d | Ttyp_arrow (label, ct1, ct2) -> Ttyp_arrow (label, sub.typ sub ct1, sub.typ sub ct2) - | Ttyp_tuple list -> Ttyp_tuple (List.map (sub.typ sub) list) + | Ttyp_tuple list -> + Ttyp_tuple (List.map (fun (label, t) -> label, sub.typ sub t) list) | Ttyp_constr (path, lid, list) -> - Ttyp_constr (path, map_loc sub lid, List.map (sub.typ sub) list) + Ttyp_constr (path, map_loc_lid sub lid, List.map (sub.typ sub) list) | Ttyp_object (list, closed) -> Ttyp_object ((List.map (sub.object_field sub) list), closed) | Ttyp_class (path, lid, list) -> Ttyp_class (path, - map_loc sub lid, + map_loc_lid sub lid, List.map (sub.typ sub) list ) | Ttyp_alias (ct, s) -> @@ -783,7 +804,7 @@ let typ sub x = | Ttyp_package pack -> Ttyp_package (sub.package_type sub pack) | Ttyp_open (path, mod_ident, t) -> - Ttyp_open (path, map_loc sub mod_ident, sub.typ sub t) + Ttyp_open (path, map_loc_lid sub mod_ident, sub.typ sub t) in let ctyp_attributes = sub.attributes sub x.ctyp_attributes in {x with ctyp_loc; ctyp_desc; ctyp_env; ctyp_attributes} diff --git a/typing/typeclass.ml b/typing/typeclass.ml index 043b9e90..b8a90c56 100644 --- a/typing/typeclass.ml +++ b/typing/typeclass.ml @@ -1122,19 +1122,22 @@ and class_expr_aux cl_num val_env met_env virt self_scope scl = let scases = [ Exp.case (Pat.construct ~loc - (mknoloc (Longident.(Ldot (Lident "*predef*", "Some")))) + (mknoloc (Longident.(Ldot (mknoloc (Lident "*predef*"), + mknoloc "Some")))) (Some ([], Pat.var ~loc (mknoloc "*sth*")))) (Exp.ident ~loc (mknoloc (Longident.Lident "*sth*"))); Exp.case (Pat.construct ~loc - (mknoloc (Longident.(Ldot (Lident "*predef*", "None")))) + (mknoloc (Longident.(Ldot (mknoloc (Lident "*predef*"), + mknoloc "None")))) None) default; ] in let smatch = - Exp.match_ ~loc (Exp.ident ~loc (mknoloc (Longident.Lident "*opt*"))) + Exp.match_ ~loc + (Exp.ident ~loc (mknoloc (Longident.Lident "*opt*"))) scases in let sfun = @@ -1160,7 +1163,8 @@ and class_expr_aux cl_num val_env met_env virt self_scope scl = let vd = Env.find_value path val_env' in (id, {exp_desc = - Texp_ident(path, mknoloc (Longident.Lident (Ident.name id)), vd); + Texp_ident(path, mknoloc + (Longident.Lident (Ident.name id)), vd); exp_loc = Location.none; exp_extra = []; exp_type = Ctype.instance vd.val_type; exp_attributes = []; (* check *) @@ -1226,7 +1230,7 @@ and class_expr_aux cl_num val_env met_env virt self_scope scl = let name = Btype.label_name l and optional = Btype.is_optional l in let use_arg sarg l' = - Some ( + Arg ( if not optional || Btype.is_optional l' then type_argument val_env sarg ty ty0 else @@ -1237,7 +1241,7 @@ and class_expr_aux cl_num val_env met_env virt self_scope scl = ) in let eliminate_optional_arg () = - Some (option_none val_env ty0 Location.none) + Arg (option_none val_env ty0 Location.none) in let remaining_sargs, arg = if ignore_labels then begin @@ -1269,9 +1273,13 @@ and class_expr_aux cl_num val_env met_env virt self_scope scl = if Btype.is_optional l && List.mem_assoc Nolabel sargs then eliminate_optional_arg () else - None + Omitted () + in + let omitted = + match arg with + | Omitted () -> (l,ty0) :: omitted + | Arg _ -> omitted in - let omitted = if arg = None then (l,ty0) :: omitted else omitted in type_args ((l,arg)::args) omitted ty_fun ty_fun0 remaining_sargs | _ -> match sargs with @@ -1311,7 +1319,8 @@ and class_expr_aux cl_num val_env met_env virt self_scope scl = in let expr = {exp_desc = - Texp_ident(path, mknoloc(Longident.Lident (Ident.name id)),vd); + Texp_ident(path, mknoloc( + Longident.Lident (Ident.name id)),vd); exp_loc = Location.none; exp_extra = []; exp_type = ty; exp_attributes = []; @@ -1928,30 +1937,45 @@ let () = (*******************************) (* Check that there is no references through recursive modules (GPR#6491) *) -let rec check_recmod_class_type env cty = +let rec check_recmod_class_type env name cty = match cty.pcty_desc with | Pcty_constr(lid, _) -> - ignore (Env.lookup_cltype ~use:false ~loc:lid.loc lid.txt env) + begin try + ignore (Env.lookup_cltype ~use:false ~loc:lid.loc lid.txt env) + with + | Env.Error + (Lookup_error + (location, env, + Illegal_reference_to_recursive_module { container; unbound; })) -> + Env.lookup_error + location env + (Illegal_reference_to_recursive_class_type + { container; + unbound; + unbound_class_type = lid.txt; + container_class_type = name.txt; + }) + end | Pcty_extension _ -> () | Pcty_arrow(_, _, cty) -> - check_recmod_class_type env cty + check_recmod_class_type env name cty | Pcty_open(od, cty) -> let _, env = !type_open_descr env od in - check_recmod_class_type env cty + check_recmod_class_type env name cty | Pcty_signature csig -> - check_recmod_class_sig env csig + check_recmod_class_sig env name csig -and check_recmod_class_sig env csig = +and check_recmod_class_sig env name csig = List.iter (fun ctf -> match ctf.pctf_desc with - | Pctf_inherit cty -> check_recmod_class_type env cty + | Pctf_inherit cty -> check_recmod_class_type env name cty | Pctf_val _ | Pctf_method _ | Pctf_constraint _ | Pctf_attribute _ | Pctf_extension _ -> ()) csig.pcsig_fields let check_recmod_decl env sdecl = - check_recmod_class_type env sdecl.pci_expr + check_recmod_class_type env sdecl.pci_name sdecl.pci_expr (* Approximate the class declaration as class ['params] id = object end *) let approx_class sdecl = @@ -1965,6 +1989,8 @@ let approx_class_declarations env sdecls = List.iter (check_recmod_decl env) sdecls; decls, env + + (*******************************) (* Error report *) diff --git a/typing/typecore.ml b/typing/typecore.ml index efa97077..9d63b927 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -22,6 +22,7 @@ open Misc open Asttypes open Parsetree open Types +open Data_types open Typedtree open Btype open Ctype @@ -81,10 +82,12 @@ type contains_gadt = let wrong_kind_sort_of_constructor (lid : Longident.t) = match lid with - | Lident "true" | Lident "false" | Ldot(_, "true") | Ldot(_, "false") -> + | Lident "true" | Lident "false" + | Ldot(_, {txt="true"; _}) | Ldot(_, {txt="false"; _}) -> Boolean - | Lident "[]" | Lident "::" | Ldot(_, "[]") | Ldot(_, "::") -> List - | Lident "()" | Ldot(_, "()") -> Unit + | Lident "[]" | Lident "::" + | Ldot(_, {txt="[]"; _}) | Ldot(_, {txt="::"; _}) -> List + | Lident "()" | Ldot(_, {txt="()"; _}) -> Unit | _ -> Constructor type existential_restriction = @@ -187,6 +190,9 @@ type error = | Unrefuted_pattern of pattern | Invalid_extension_constructor_payload | Not_an_extension_constructor + | Invalid_atomic_loc_payload + | Label_not_atomic of Longident.t + | Atomic_in_pattern of Longident.t | Literal_overflow of string | Unknown_literal of string * char | Illegal_letrec_pat @@ -200,6 +206,12 @@ type error = | Missing_type_constraint | Wrong_expected_kind of wrong_kind_sort * wrong_kind_context * type_expr | Expr_not_a_record_type of type_expr + | Constructor_labeled_arg + | Partial_tuple_pattern_bad_type + | Extra_tuple_label of string option * type_expr + | Missing_tuple_label of string option * type_expr + | Repeated_tuple_exp_label of string + | Repeated_tuple_pat_label of string let not_principal fmt = @@ -341,6 +353,16 @@ let extract_option_type env ty = Tconstr(path, [ty], _) when Path.same path Predef.path_option -> ty | _ -> assert false +let is_floatarray_type env ty = + match get_desc (expand_head env ty) with + Tconstr(path, [], _) -> Path.same path Predef.path_floatarray + | _ -> false + +let is_iarray_type env ty = + match get_desc (expand_head env ty) with + | Tconstr(path, [_], _) -> Path.same path Predef.path_iarray + | _ -> false + let protect_expansion env ty = if Env.has_local_constraints env then generic_instance ty else ty @@ -381,6 +403,26 @@ let extract_label_names env ty = let is_principal ty = not !Clflags.principal || get_level ty = generic_level +(* Represents information about an array type inferred using type-directed + disambiguation. *) +type array_info = + { ty_elt : type_expr option; + mut : mutable_flag } + +let disambiguate_array_literal ~loc env expected_ty = + let return (ty_elt : type_expr option) (mut : mutable_flag) = + if not (is_principal expected_ty) then + Location.prerr_warning loc + (not_principal "this type-based array disambiguation"); + { ty_elt; mut } + in + if is_floatarray_type env expected_ty then + return (Some (instance Predef.type_float)) Mutable + else if is_iarray_type env expected_ty then + return None Immutable + else + { ty_elt = None; mut = Mutable } + (* Typing of patterns *) (* Simplified patterns for effect continuations *) @@ -412,10 +454,42 @@ let unify_exp_types loc env ty expected_ty = | Tags(l1,l2) -> raise(Typetexp.Error(loc, env, Typetexp.Variant_tags (l1, l2))) +(* Getting proper location of already typed expressions. + + Used to avoid confusing locations on type error messages in presence of + type constraints. + For example: + + (* Before patch *) + # let x : string = (5 : int);; + ^ + (* After patch *) + # let x : string = (5 : int);; + ^^^^^^^^^ +*) +let proper_exp_loc exp = + let rec aux = function + | [] -> exp.exp_loc + | ((Texp_constraint _ | Texp_coerce _), loc, _) :: _ -> loc + | _ :: rest -> aux rest + in + aux exp.exp_extra + +(** [sexp] is used by error messages to report literals in their + original formatting *) +let unify_exp ~sexp env exp expected_ty = + let loc = proper_exp_loc exp in + try + unify_exp_types loc env exp.exp_type expected_ty + with Error(loc, env, Expr_type_clash(err, tfc, None)) -> + raise (Error(loc, env, Expr_type_clash(err, tfc, Some sexp))) + (* helper notation for Pattern_env.t *) let (!!) (penv : Pattern_env.t) = penv.env (* Unification inside type_pat *) +(* If [penv] is available, calling this function requires + [penv.in_counterexample = false] *) let unify_pat_types loc env ty ty' = try unify env ty ty' with | Unify err -> @@ -424,35 +498,47 @@ let unify_pat_types loc env ty ty' = raise(Typetexp.Error(loc, env, Typetexp.Variant_tags (l1, l2))) (* GADT unification inside solve_Ppat_construct and check_counter_example_pat *) +(* We need to distinguish [pat] and [expected] if [refine = true] and + [penv.in_counterexample = false] (see [unify_gadt] for details) *) let nothing_equated = TypePairs.create 0 -let unify_pat_types_return_equated_pairs ~refine loc penv ty ty' = +let unify_pat_types_return_equated_pairs ~refine loc penv ~pat ~expected = try - if refine then unify_gadt penv ty ty' - else (unify !!penv ty ty'; nothing_equated) + if refine || penv.Pattern_env.in_counterexample + then unify_gadt penv ~pat ~expected + else (unify !!penv pat expected; nothing_equated) with | Unify err -> raise(Error(loc, !!penv, Pattern_type_clash(err, None))) | Tags(l1,l2) -> raise(Typetexp.Error(loc, !!penv, Typetexp.Variant_tags (l1, l2))) -let unify_pat_types_refine ~refine loc penv ty ty' = - (* [refine=true] only in calls originating from [check_counter_example_pat], +(* Unify pattern types in functions that can be called either from + [type_pat] or [check_counter_example_pat]. + Since it calls normal unification when [penv.in_counterexample = false], + or [unify_gadt] when [penv.in_counterexample = true], + [ty] and [ty'] always have symmetric roles. *) +let unify_pat_types_penv loc penv ty ty' = + (* [penv.in_counterexample = true] only in calls originating + from [check_counter_example_pat], which in turn may contain only non-leaking type variables *) - ignore (unify_pat_types_return_equated_pairs ~refine loc penv ty ty') + ignore (unify_pat_types_return_equated_pairs ~refine:false loc penv + ~pat:ty ~expected:ty') (** [sdesc_for_hint] is used by error messages to report literals in their original formatting *) +(* If [penv] is available, calling this function requires + [penv.in_counterexample = false] *) let unify_pat ?sdesc_for_hint env pat expected_ty = try unify_pat_types pat.pat_loc env pat.pat_type expected_ty with Error (loc, env, Pattern_type_clash(err, None)) -> raise(Error(loc, env, Pattern_type_clash(err, sdesc_for_hint))) (* unification of a type with a Tconstr with freshly created arguments *) -let unify_head_only ~refine loc penv ty constr = - let path = cstr_type_path constr in +let unify_head_only loc penv constr ~expected:ty = + let path = cstr_res_type_path constr in let decl = Env.find_type path !!penv in let ty' = Ctype.newconstr path (Ctype.instance_list decl.type_params) in - unify_pat_types_refine ~refine loc penv ty' ty + unify_pat_types_penv loc penv ty' ty (* Creating new conjunctive types is not allowed when typing patterns *) (* make all Reither present in open variants *) @@ -717,10 +803,11 @@ and build_as_type_extra env p = function and build_as_type_aux (env : Env.t) p = match p.pat_desc with - Tpat_alias(p1,_, _, _) -> build_as_type env p1 + Tpat_alias(p1,_, _, _, _) -> build_as_type env p1 | Tpat_tuple pl -> - let tyl = List.map (build_as_type env) pl in - newty (Ttuple tyl) + let labeled_tyl = + List.map (fun (label, p) -> label, build_as_type env p) pl in + newty (Ttuple labeled_tyl) | Tpat_construct(_, cstr, pl, vto) -> let keep = cstr.cstr_private = Private || cstr.cstr_existentials <> [] || @@ -791,15 +878,66 @@ let solve_Ppat_poly_constraint tps env loc sty expected_ty = let solve_Ppat_alias env pat = with_local_level_generalize (fun () -> build_as_type env pat) -let solve_Ppat_tuple (type a) ~refine loc env (args : a list) expected_ty = - let vars = List.map (fun _ -> newgenvar ()) args in +(* Extracts the first element from a list matching a label. Roughly: + pat <- List.assoc_opt label patl; + return (pat, List.remove_assoc label patl) + *) +let extract_pat label patl = + let rec extract_pat_aux acc = function + | [] -> None + | ((label', t) as pat) :: rest -> + if Option.equal String.equal label label' then + Some (t, List.rev_append acc rest) + else + extract_pat_aux (pat::acc) rest + in + extract_pat_aux [] patl + +let extract_or_mk_pat label rem closed = + match extract_pat label rem, closed with + (* Take the first match from patl *) + | (Some _ as pat_and_rem), _ -> pat_and_rem + (* No match, but the partial pattern allows us to generate a _ *) + | None, Open -> Some (Ast_helper.Pat.mk Ppat_any, rem) + | None, Closed -> None + +(* Reorders [patl] to match the label order in [labeled_tl], erroring if [patl] + is missing a label or has an a extra label (unlabeled components morally + share the same special label). + + If [closed] is [Open], then no "missing label" errors are possible; instead, + [_] patterns will be generated for those labels. An unnecessarily [Open] + pattern results in a warning. + *) +let reorder_pat loc penv patl closed labeled_tl expected_ty = + let take_next (taken, rem) (label, _) = + match extract_or_mk_pat label rem closed with + | Some (pat, rem) -> (label, pat) :: taken, rem + | None -> + raise (Error (loc, !!penv, Missing_tuple_label(label, expected_ty))) + in + match List.fold_left take_next ([], patl) labeled_tl with + | taken, [] -> + if closed = Open + && Int.equal (List.length labeled_tl) (List.length patl) then + Location.prerr_warning loc Warnings.Unnecessarily_partial_tuple_pattern; + List.rev taken + | _, (extra_label, _) :: _ -> + raise + (Error (loc, !!penv, Extra_tuple_label(extra_label, expected_ty))) + +(* This assumes the [args] have already been reordered according to the + [expected_ty], if needed. *) +let solve_Ppat_tuple loc env args expected_ty = + let vars = List.map (fun (label, _) -> (label, newgenvar ())) args in let ty = newgenty (Ttuple vars) in let expected_ty = generic_instance expected_ty in - unify_pat_types_refine ~refine loc env ty expected_ty; + unify_pat_types_penv loc env ty expected_ty; vars let solve_constructor_annotation tps (penv : Pattern_env.t) name_list sty ty_args ty_ex unify_res = + assert (not penv.in_counterexample); let expansion_scope = penv.equations_scope in (* Introduce fresh type names that expand to type variables. They should eventually be bound to ground types. *) @@ -832,9 +970,10 @@ let solve_constructor_annotation unify_pat_types cty.ctyp_loc !!penv ty1 ty_arg; [ty2] | _ -> - unify_pat_types cty.ctyp_loc !!penv ty1 (newty (Ttuple ty_args)); + unify_pat_types cty.ctyp_loc !!penv ty1 + (newty (Ttuple (List.map (fun t -> None, t) ty_args))); match get_desc (expand_head !!penv ty2) with - Ttuple tyl -> tyl + Ttuple tyl -> List.map snd tyl | _ -> assert false in if ids_decls <> [] then begin @@ -894,20 +1033,20 @@ let solve_constructor_annotation end; ty_args, Some (List.map fst ids_decls, cty) -let solve_Ppat_construct ~refine tps penv loc constr no_existentials +let solve_Ppat_construct tps (penv : Pattern_env.t) loc constr no_existentials existential_styp expected_ty = (* if constructor is gadt, we must verify that the expected type has the correct head *) if constr.cstr_generalized then - unify_head_only ~refine loc penv (instance expected_ty) constr; + unify_head_only loc penv constr ~expected:(instance expected_ty); (* PR#7214: do not use gadt unification for toplevel lets *) let unify_res ty_res expected_ty = - let refine = - refine || constr.cstr_generalized && no_existentials = None in + let refine = constr.cstr_generalized && no_existentials = None in (* Here [ty_res] contains only fresh (non-leaking) type variables, so the requirement of [unify_gadt] is fulfilled. *) - unify_pat_types_return_equated_pairs ~refine loc penv ty_res expected_ty + unify_pat_types_return_equated_pairs ~refine loc penv ~pat:ty_res + ~expected:expected_ty in let ty_args, equated_types, existential_ctyp = @@ -944,7 +1083,7 @@ let solve_Ppat_construct ~refine tps penv loc constr no_existentials (ty_args, equated_types, existential_ctyp) end in - if !Clflags.principal && not refine then begin + if !Clflags.principal && not penv.in_counterexample then begin (* Do not warn for counter-examples *) let exception Warn_only_once in try @@ -953,11 +1092,11 @@ let solve_Ppat_construct ~refine tps penv loc constr no_existentials if not (fully_generic t1 && fully_generic t2) then let msg = Format_doc.doc_printf - "typing this pattern requires considering@ %a@ and@ %a@ as \ - equal.@,\ - But the knowledge of these types" - Printtyp.Doc.type_expr t1 - Printtyp.Doc.type_expr t2 + "typing this pattern requires considering@ @[%a@]@ and@ \ + @[%a@]@ as@ equal.@ \ + But@ the@ knowledge@ of@ these@ types" + (Style.as_inline_code Printtyp.Doc.type_expr) t1 + (Style.as_inline_code Printtyp.Doc.type_expr) t2 in Location.prerr_warning loc (Warnings.Not_principal msg); raise Warn_only_once) @@ -966,11 +1105,11 @@ let solve_Ppat_construct ~refine tps penv loc constr no_existentials end; (ty_args, existential_ctyp) -let solve_Ppat_record_field ~refine loc penv label label_lid record_ty = +let solve_Ppat_record_field loc penv label label_lid record_ty = with_local_level_generalize_structure begin fun () -> let (_, ty_arg, ty_res) = instance_label ~fixed:false label in begin try - unify_pat_types_refine ~refine loc penv ty_res (instance record_ty) + unify_pat_types_penv loc penv ty_res (instance record_ty) with Error(_loc, _env, Pattern_type_clash(err, _)) -> raise(Error(label_lid.loc, !!penv, Label_mismatch(label_lid.txt, err))) @@ -978,16 +1117,22 @@ let solve_Ppat_record_field ~refine loc penv label label_lid record_ty = ty_arg end -let solve_Ppat_array ~refine loc env expected_ty = - let ty_elt = newgenvar() in +let solve_Ppat_array loc env expected_ty = let expected_ty = generic_instance expected_ty in - unify_pat_types_refine ~refine - loc env (Predef.type_array ty_elt) expected_ty; - ty_elt + match disambiguate_array_literal ~loc !!env expected_ty with + | { ty_elt = Some ty_elt; mut } -> ty_elt, mut + | { ty_elt = None; mut } -> + let array_type = match mut with + | Immutable -> Predef.type_iarray + | Mutable -> Predef.type_array + in + let ty_elt = newgenvar() in + unify_pat_types_penv loc env (array_type ty_elt) expected_ty; + ty_elt, mut -let solve_Ppat_lazy ~refine loc env expected_ty = +let solve_Ppat_lazy loc env expected_ty = let nv = newgenvar () in - unify_pat_types_refine ~refine loc env (Predef.type_lazy_t nv) + unify_pat_types_penv loc env (Predef.type_lazy_t nv) (generic_instance expected_ty); nv @@ -1001,7 +1146,7 @@ let solve_Ppat_constraint tps loc env sty expected_ty = unify_pat_types loc env ty (instance expected_ty); (cty, ty, expected_ty') -let solve_Ppat_variant ~refine loc env tag no_arg expected_ty = +let solve_Ppat_variant loc env tag no_arg expected_ty = let arg_type = if no_arg then [] else [newgenvar()] in let fields = [tag, rf_either ~no_arg arg_type ~matched:true] in let make_row more = @@ -1012,7 +1157,7 @@ let solve_Ppat_variant ~refine loc env tag no_arg expected_ty = (* PR#7404: allow some_private_tag blindly, as it would not unify with the abstract row variable *) if tag <> Parmatch.some_private_tag then - unify_pat_types_refine ~refine loc env (newgenty(Tvariant row)) expected_ty; + unify_pat_types_penv loc env (newgenty(Tvariant row)) expected_ty; (arg_type, make_row (newvar ()), instance expected_ty) (* Building the or-pattern corresponding to a polymorphic variant type *) @@ -1421,7 +1566,8 @@ let disambiguate_lid_a_list loc closed env usage expected_type lid_a_list = let qual_lid = match qual, lid.txt with | Some modname, Longident.Lident s -> - {lid with txt = Longident.Ldot (modname, s)} + let name = { lid with txt = s } in + {lid with txt = Longident.Ldot (modname, name)} | _ -> lid in lid, process_label qual_lid, a @@ -1577,9 +1723,10 @@ let rec has_literal_pattern p = match p.ppat_desc with | Ppat_lazy p | Ppat_open (_, p) -> has_literal_pattern p - | Ppat_tuple ps | Ppat_array ps -> List.exists has_literal_pattern ps + | Ppat_tuple (ps, _) -> + List.exists (fun (_,p) -> has_literal_pattern p) ps | Ppat_record (ps, _) -> List.exists (fun (_,p) -> has_literal_pattern p) ps | Ppat_effect (p, q) @@ -1645,6 +1792,17 @@ let as_comp_pattern | Value -> as_computation_pattern pat | Computation -> pat +let forbid_atomic_field_patterns loc penv (label_lid, label, pat) = + (* Pattern-matching under atomic record fields is not allowed. We + still allow wildcard patterns, so that it is valid to list all + record fields exhaustively. *) + let wildcard pat = match pat.pat_desc with + | Tpat_any -> true + | _ -> false + in + if label.lbl_atomic = Atomic && not (wildcard pat) then + raise (Error (loc, !!penv, Atomic_in_pattern label_lid.txt)) + (** [type_pat] propagates the expected type, and unification may update the typing environment. *) let rec type_pat @@ -1662,6 +1820,7 @@ and type_pat_aux : type k . type_pat_state -> k pattern_category -> no_existentials:_ -> penv:Pattern_env.t -> _ -> _ -> k general_pattern = fun tps category ~no_existentials ~penv sp expected_ty -> + assert (penv.in_counterexample = false); let type_pat tps category ?(penv=penv) = type_pat tps category ~no_existentials ~penv in @@ -1743,7 +1902,7 @@ and type_pat_aux enter_variable ~is_as_variable:true tps name.loc name ty_var sp.ppat_attributes in - rvp { pat_desc = Tpat_alias(q, id, name, uid); + rvp { pat_desc = Tpat_alias(q, id, name, uid, ty_var); pat_loc = loc; pat_extra=[]; pat_type = q.pat_type; pat_attributes = sp.ppat_attributes; @@ -1777,15 +1936,34 @@ and type_pat_aux let p = {p with ppat_loc=loc} in type_pat tps category p expected_ty (* TODO: record 'extra' to remember about interval *) - | Ppat_tuple spl -> - assert (List.length spl >= 2); + | Ppat_tuple (spl, closed) -> + assert (closed = Open || List.length spl >= 2); + Option.iter + (fun l -> raise (Error (loc, !!penv, Repeated_tuple_pat_label l))) + (Misc.repeated_label spl); + let args = + match get_desc (expand_head !!penv expected_ty) with + (* If it's a principally-known tuple pattern, try to reorder *) + | Ttuple labeled_tl when is_principal expected_ty -> + reorder_pat loc penv spl closed labeled_tl expected_ty + (* If not, it's not allowed to be open (partial) *) + | _ -> + match closed with + | Open -> raise (Error (loc, !!penv, Partial_tuple_pattern_bad_type)) + | Closed -> spl + in let expected_tys = - solve_Ppat_tuple ~refine:false loc penv spl expected_ty in - let pl = List.map2 (type_pat tps Value) spl expected_tys in + solve_Ppat_tuple loc penv args expected_ty + in + let pl = + List.map2 (fun (lbl, t) (_, p) -> lbl, type_pat tps Value p t) + expected_tys args + in rvp { pat_desc = Tpat_tuple pl; pat_loc = loc; pat_extra=[]; - pat_type = newty (Ttuple(List.map (fun p -> p.pat_type) pl)); + pat_type = + newty (Ttuple (List.map (fun (lbl, p) -> lbl, p.pat_type) pl)); pat_attributes = sp.ppat_attributes; pat_env = !!penv } | Ppat_construct(lid, sarg) -> @@ -1827,10 +2005,15 @@ and type_pat_aux let sargs = match sarg' with None -> [] - | Some {ppat_desc = Ppat_tuple spl} when + | Some {ppat_desc = Ppat_tuple (spl, _)} when constr.cstr_arity > 1 || Builtin_attributes.explicit_arity sp.ppat_attributes - -> spl + -> + List.map (fun (l, sp) -> + match l with + | Some _ -> raise (Error(loc, !!penv, Constructor_labeled_arg)) + | None -> sp + ) spl | Some({ppat_desc = Ppat_any} as sp) when constr.cstr_arity = 0 && existential_styp = None -> @@ -1851,7 +2034,7 @@ and type_pat_aux constr.cstr_arity, List.length sargs))); let (ty_args, existential_ctyp) = - solve_Ppat_construct ~refine:false tps penv loc constr no_existentials + solve_Ppat_construct tps penv loc constr no_existentials existential_styp expected_ty in @@ -1882,7 +2065,7 @@ and type_pat_aux assert (tag <> Parmatch.some_private_tag); let constant = (sarg = None) in let arg_type, row, pat_type = - solve_Ppat_variant ~refine:false loc penv tag constant expected_ty in + solve_Ppat_variant loc penv tag constant expected_ty in let arg = (* PR#6235: propagate type information *) match sarg, arg_type with @@ -1909,12 +2092,12 @@ and type_pat_aux in let type_label_pat (label_lid, label, sarg) = let ty_arg = - solve_Ppat_record_field ~refine:false loc penv label label_lid - record_ty in + solve_Ppat_record_field loc penv label label_lid record_ty in (label_lid, label, type_pat tps Value sarg ty_arg) in let make_record_pat lbl_pat_list = check_recordpat_labels loc lbl_pat_list closed; + List.iter (forbid_atomic_field_patterns loc penv) lbl_pat_list; { pat_desc = Tpat_record (lbl_pat_list, closed); pat_loc = loc; pat_extra=[]; @@ -1931,11 +2114,11 @@ and type_pat_aux lid_sp_list in rvp @@ solve_expected (make_record_pat lbl_a_list) - | Ppat_array spl -> - let ty_elt = solve_Ppat_array ~refine:false loc penv expected_ty in + | Ppat_array(spl) -> + let ty_elt, expected_mutability = solve_Ppat_array loc penv expected_ty in let pl = List.map (fun p -> type_pat tps Value p ty_elt) spl in rvp { - pat_desc = Tpat_array pl; + pat_desc = Tpat_array (expected_mutability, pl); pat_loc = loc; pat_extra=[]; pat_type = instance expected_ty; pat_attributes = sp.ppat_attributes; @@ -1999,7 +2182,7 @@ and type_pat_aux pat_attributes = sp.ppat_attributes; pat_env = !!penv } | Ppat_lazy sp1 -> - let nv = solve_Ppat_lazy ~refine:false loc penv expected_ty in + let nv = solve_Ppat_lazy loc penv expected_ty in let p1 = type_pat tps Value sp1 nv in rvp { pat_desc = Tpat_lazy p1; @@ -2019,7 +2202,8 @@ and type_pat_aux pat_type = ty; pat_desc = Tpat_alias - ({p with pat_desc = Tpat_any; pat_attributes = []}, id,s, uid); + ({p with pat_desc = Tpat_any; pat_attributes = []}, + id, s, uid, ty); pat_extra = [extra]; } | _, p -> @@ -2115,7 +2299,7 @@ let type_pat tps category ?no_existentials penv = let type_pattern category ~lev env spat expected_ty ?cont allow_modules = let tps = create_type_pat_state ?cont allow_modules in let new_penv = Pattern_env.make env - ~equations_scope:lev ~allow_recursive_equations:false in + ~equations_scope:lev ~in_counterexample:false in let pat = type_pat tps category new_penv spat expected_ty in let { tps_pattern_variables = pvs; tps_module_variables = mvs; @@ -2129,7 +2313,7 @@ let type_pattern_list let tps = create_type_pat_state allow_modules in let equations_scope = get_current_level () in let new_penv = Pattern_env.make env - ~equations_scope ~allow_recursive_equations:false in + ~equations_scope ~in_counterexample:false in let type_pat (attrs, pat) ty = Builtin_attributes.warning_scope ~ppwarning:false attrs (fun () -> @@ -2148,7 +2332,7 @@ let type_class_arg_pattern cl_num val_env met_env l spat = let nv = newvar () in let equations_scope = get_current_level () in let new_penv = Pattern_env.make val_env - ~equations_scope ~allow_recursive_equations:false in + ~equations_scope ~in_counterexample:false in let pat = type_pat tps Value ~no_existentials:In_class_args new_penv spat nv in if has_variants pat then begin @@ -2198,7 +2382,7 @@ let type_self_pattern env spat = let nv = newvar() in let equations_scope = get_current_level () in let new_penv = Pattern_env.make env - ~equations_scope ~allow_recursive_equations:false in + ~equations_scope ~in_counterexample:false in let pat = type_pat tps Value ~no_existentials:In_self_pattern new_penv spat nv in List.iter (fun f -> f()) tps.tps_pattern_force; @@ -2362,12 +2546,12 @@ let enter_nonsplit_or info = let rec check_counter_example_pat ~info ~(penv : Pattern_env.t) type_pat_state tp expected_ty k = + assert (penv.in_counterexample = true); let check_rec ?(info=info) ?(penv=penv) = check_counter_example_pat ~info ~penv type_pat_state in let loc = tp.pat_loc in - let refine = true in let solve_expected (x : pattern) : pattern = - unify_pat_types_refine ~refine x.pat_loc penv x.pat_type + unify_pat_types_penv x.pat_loc penv x.pat_type (instance expected_ty); x in @@ -2399,23 +2583,27 @@ let rec check_counter_example_pat in check_rec ~info:(decrease 5) tp expected_ty k end - | Tpat_alias (p, _, _, _) -> check_rec ~info p expected_ty k + | Tpat_alias (p, _, _, _, _) -> check_rec ~info p expected_ty k | Tpat_constant cst -> let cst = constant_or_raise !!penv loc (Untypeast.constant cst) in k @@ solve_expected (mp (Tpat_constant cst) ~pat_type:(type_constant cst)) | Tpat_tuple tpl -> assert (List.length tpl >= 2); - let expected_tys = solve_Ppat_tuple ~refine loc penv tpl expected_ty in + let expected_tys = solve_Ppat_tuple loc penv tpl expected_ty in let tpl_ann = List.combine tpl expected_tys in - map_fold_cont (fun (p,t) -> check_rec p t) tpl_ann (fun pl -> - mkp k (Tpat_tuple pl) - ~pat_type:(newty (Ttuple(List.map (fun p -> p.pat_type) pl)))) + map_fold_cont (fun ((l,p),(_,t)) k -> check_rec p t (fun p -> k (l, p))) + tpl_ann + (fun pl -> + let pat_type = + newty (Ttuple(List.map (fun (l, p) -> l, p.pat_type) pl)) + in + mkp k (Tpat_tuple pl) ~pat_type) | Tpat_construct(cstr_lid, constr, targs, _) -> if constr.cstr_generalized && must_backtrack_on_gadt then raise Need_backtrack; let (ty_args, existential_ctyp) = solve_Ppat_construct - ~refine type_pat_state penv loc constr None None expected_ty + type_pat_state penv loc constr None None expected_ty in map_fold_cont (fun (p,t) -> check_rec p t) @@ -2425,7 +2613,7 @@ let rec check_counter_example_pat | Tpat_variant(tag, targ, _) -> let constant = (targ = None) in let arg_type, row, pat_type = - solve_Ppat_variant ~refine loc penv tag constant expected_ty in + solve_Ppat_variant loc penv tag constant expected_ty in let k arg = mkp k ~pat_type (Tpat_variant(tag, arg, ref row)) in begin @@ -2438,15 +2626,15 @@ let rec check_counter_example_pat let record_ty = generic_instance expected_ty in let type_label_pat (label_lid, label, targ) k = let ty_arg = - solve_Ppat_record_field ~refine loc penv label label_lid record_ty in + solve_Ppat_record_field loc penv label label_lid record_ty in check_rec targ ty_arg (fun arg -> k (label_lid, label, arg)) in map_fold_cont type_label_pat fields (fun fields -> mkp k (Tpat_record (fields, closed))) - | Tpat_array tpl -> - let ty_elt = solve_Ppat_array ~refine loc penv expected_ty in + | Tpat_array (mutability, tpl) -> + let ty_elt, _ = solve_Ppat_array loc penv expected_ty in map_fold_cont (fun p -> check_rec p ty_elt) tpl - (fun pl -> mkp k (Tpat_array pl)) + (fun pl -> mkp k (Tpat_array (mutability, pl))) | Tpat_or(tp1, tp2, _) -> (* We are in counter-example mode, but try to avoid backtracking *) let must_split = @@ -2488,7 +2676,7 @@ let rec check_counter_example_pat mkp k (Tpat_or (p1, p2, None)) end | Tpat_lazy tp1 -> - let nv = solve_Ppat_lazy ~refine loc penv expected_ty in + let nv = solve_Ppat_lazy loc penv expected_ty in (* do not explode under lazy: PR#7421 *) check_rec ~info:(no_explosion info) tp1 nv (fun p1 -> mkp k (Tpat_lazy p1)) @@ -2507,7 +2695,7 @@ let check_counter_example_pat ~counter_example_args penv tp expected_ty = to type check gadt nonexhaustiveness *) let partial_pred ~lev ~splitting_mode ?(explode=0) env expected_ty p = let penv = Pattern_env.make env - ~equations_scope:lev ~allow_recursive_equations:true in + ~equations_scope:lev ~in_counterexample:true in let state = save_state penv in let counter_example_args = { @@ -2579,6 +2767,271 @@ let rec final_subexpression exp = -> final_subexpression e | _ -> exp +let is_prim ~name funct = + match funct.exp_desc with + | Texp_ident (_, _, {val_kind=Val_prim{Primitive.prim_name; _}}) -> + prim_name = name + | _ -> false + +(* List labels in a function type, and whether return type is a variable *) +let rec list_labels_aux env visited ls ty_fun = + let ty = expand_head env ty_fun in + if TypeSet.mem ty visited then + List.rev ls, false + else match get_desc ty with + | Tarrow (l, _, ty_res, _) -> + list_labels_aux env (TypeSet.add ty visited) (l::ls) ty_res + | _ -> + List.rev ls, is_Tvar ty + +let list_labels env ty = + let snap = Btype.snapshot () in + let result = + wrap_trace_gadt_instances env (list_labels_aux env TypeSet.empty []) ty + in + Btype.backtrack snap; + result + + +(* Collecting arguments for function applications. *) + +type untyped_apply_arg = + | Known_arg of + { + sarg : Parsetree.expression; + ty_arg : type_expr; + ty_arg0 : type_expr; + wrapped_in_some : bool; + } + (* [arg] is a [Known_arg] in: + - [f arg] when is known to be a function (f : _ -> _) + - [f ~lab:arg] when (f : lab:_ -> _) + - [f ?lab:arg] when (f : ?lab:_ -> _) + In these cases we have [wrapped_in_some = false]. + + - [f ~lab:arg] when (f : ?lab:_ -> _) + In this case [wrapped_in_some = true]. + + [ty_arg] is the (possibly generic) expected type of the argument, + and [ty_arg0] is an instance of [ty_arg]. *) + | Unknown_arg of + { + sarg : Parsetree.expression; + ty_arg : type_expr; + } + (* [arg] is an [Unknown_arg] in: + [f arg] when [f] is not known (either a type variable, + or the [commu_ok] case where a function type is known + but not principally). + + [ty_arg] is the expected type of the argument, usually just + a fresh type variable. *) + | Eliminated_optional_arg of + { + ty_arg : type_expr; + level: int; + } + (* When [f : ?foo:ty -> _ -> _], [~foo] is an [Eliminated_optional_arg] + in [f x] ([foo] is an optional argument that was not passed, but a + following positional argument was passed). + + [level] is the level of the function arrow. *) + +type untyped_omitted_param = + { + ty_arg : type_expr; + level: int; + } + +let remaining_function_type_for_error ty_ret rev_args = + List.fold_left + (fun ty_ret (lbl, arg) -> + match arg with + | Arg (Unknown_arg _ | Known_arg _) -> ty_ret + | Arg (Eliminated_optional_arg { ty_arg; level }) + | Omitted { ty_arg; level } -> + let ty_ret = + newty2 ~level + (Tarrow (lbl, ty_arg, ty_ret, commu_ok)) + in + ty_ret) + ty_ret rev_args + +let previous_arg_loc rev_args ~funct = + (* [rev_args] is the arguments typed until now, in reverse + order of appearance. Not all arguments have a location + attached (eg. an optional argument that is not passed). *) + rev_args + |> List.find_map (function + | _, Arg (Known_arg { sarg = {pexp_loc = loc; _ }} + | Unknown_arg { sarg = {pexp_loc = loc; _}}) -> + Some loc + | _ -> None) + |> Option.value ~default:funct.exp_loc + +let collect_unknown_apply_args env funct ty_fun0 rev_args sargs = + let labels_match ~param ~arg = + param = arg + || !Clflags.classic && arg = Nolabel && not (is_optional param) + in + let has_label l ty_fun = + let ls, tvar = list_labels env ty_fun in + tvar || List.mem l ls + in + let rec loop ty_fun rev_args sargs = + match sargs with + | [] -> ty_fun, List.rev rev_args + | (lbl, sarg) :: rest -> + let (ty_arg, ty_res) = + let ty_fun = expand_head env ty_fun in + match get_desc ty_fun with + | Tvar _ -> + let ty_arg = newvar () in + let ty_res = newvar () in + if get_level ty_fun >= get_level ty_arg && + not (is_prim ~name:"%identity" funct) + then + Location.prerr_warning sarg.pexp_loc + Warnings.Ignored_extra_argument; + unify env ty_fun (newty (Tarrow(lbl,ty_arg,ty_res,commu_var ()))); + (ty_arg, ty_res) + | Tarrow (l, ty_arg, ty_res, _) when labels_match ~param:l ~arg:lbl -> + (ty_arg, ty_res) + | td -> + let ty_fun = match td with Tarrow _ -> newty td | _ -> ty_fun in + let ty_res = remaining_function_type_for_error ty_fun rev_args in + match get_desc ty_res with + | Tarrow _ -> + if !Clflags.classic || not (has_label lbl ty_fun) then + raise (Error(sarg.pexp_loc, env, + Apply_wrong_label(lbl, ty_res, false))) + else + raise (Error(funct.exp_loc, env, Incoherent_label_order)) + | _ -> + raise(Error(funct.exp_loc, env, Apply_non_function { + funct; + func_ty = expand_head env funct.exp_type; + res_ty = expand_head env ty_res; + previous_arg_loc = previous_arg_loc rev_args ~funct; + extra_arg_loc = sarg.pexp_loc; })) + in + let arg = Unknown_arg { sarg; ty_arg } in + loop ty_res ((lbl, Arg arg) :: rev_args) rest + in + loop ty_fun0 rev_args sargs + +let collect_apply_args env funct ignore_labels ty_fun ty_fun0 sargs = + let warned = ref false in + let rec loop ty_fun ty_fun0 rev_args sargs = + if sargs = [] then + collect_unknown_apply_args env funct ty_fun0 rev_args sargs + else + let ty_fun' = expand_head env ty_fun in + let lv = get_level ty_fun' in + let may_warn loc w = + if not !warned && !Clflags.principal && lv <> generic_level + then begin + warned := true; + Location.prerr_warning loc w + end + in + let lopt = + match get_desc ty_fun', get_desc (expand_head env ty_fun0) with + | Tarrow (l, ty_arg, ty_ret, com), Tarrow (_, ty_arg0, ty_ret0, _) + when is_commu_ok com -> + Some (l, `Arrow (ty_arg, ty_ret, ty_arg0, ty_ret0)) + | _ -> None + in + match lopt with + | None -> + (* We're not looking at a *known* function type anymore. *) + collect_unknown_apply_args env funct ty_fun0 rev_args sargs + | Some (l, arrow_kind) -> + begin + let name = label_name l + and optional = is_optional l in + let remaining_sargs, arg_opt = + if ignore_labels then begin + (* No reordering is allowed, process arguments in order *) + match sargs with + | [] -> assert false + | (l', sarg) :: remaining_sargs -> + if name = label_name l' || (not optional && l' = Nolabel) then + (remaining_sargs, Some (sarg, l')) + else if + optional && + not (List.exists (fun (l, _) -> name = label_name l) + remaining_sargs) && + List.exists (function (Nolabel, _) -> true | _ -> false) + sargs + then + (sargs, None) + else + raise(Error(sarg.pexp_loc, env, + Apply_wrong_label(l', ty_fun', optional))) + end else + (* Arguments can be commuted, try to fetch the argument + corresponding to the first parameter. *) + match extract_label name sargs with + | Some (l', sarg, commuted, remaining_sargs) -> + if commuted then begin + may_warn sarg.pexp_loc + (not_principal "commuting this argument") + end; + if not optional && is_optional l' then + Location.prerr_warning sarg.pexp_loc + (Warnings.Nonoptional_label (Asttypes.string_of_label l)); + remaining_sargs, Some (sarg, l') + | None -> + sargs, None + in + match arrow_kind with + | `Arrow (ty_arg, ty_ret, ty_arg0, ty_ret0) -> + let arg = + match arg_opt with + | Some (sarg, l') -> + let wrapped_in_some = optional && not (is_optional l') in + if wrapped_in_some then + may_warn sarg.pexp_loc + (not_principal "using an optional argument here"); + Arg (Known_arg { sarg; ty_arg; ty_arg0; wrapped_in_some }) + | None -> + if optional && List.mem_assoc Nolabel sargs then begin + may_warn funct.exp_loc (Warnings.Non_principal_labels + "eliminated optional argument"); + Arg (Eliminated_optional_arg { ty_arg; level = lv }) + end else begin + (* No argument was given for this parameter, we abstract + over it. *) + may_warn funct.exp_loc + (Warnings.Non_principal_labels "commuted an argument"); + Omitted { ty_arg; level = lv } + end + in + loop ty_ret ty_ret0 ((l, arg) :: rev_args) remaining_sargs + end + in + loop ty_fun ty_fun0 [] sargs + +let type_omitted_parameters_and_build_result_type ty_ret args = + let ty_ret, args = + List.fold_left + (fun (ty_ret, args) (lbl, arg) -> + match arg with + | Arg _exp as arg -> + let args = (lbl, arg) :: args in + (ty_ret, args) + | Omitted { ty_arg; level } -> + let ty_ret = + newty2 ~level + (Tarrow ((lbl, ty_arg, ty_ret, commu_ok))) + in + let args = (lbl, Omitted ()) :: args in + (ty_ret, args)) + (ty_ret, []) (List.rev args) + in + ty_ret, args + (* Generalization criterion for expressions *) let rec is_nonexpansive exp = @@ -2587,12 +3040,12 @@ let rec is_nonexpansive exp = | Texp_constant _ | Texp_unreachable | Texp_function _ - | Texp_array [] -> true + | Texp_array (_, []) -> true | Texp_let(_rec_flag, pat_exp_list, body) -> List.for_all (fun vb -> is_nonexpansive vb.vb_expr) pat_exp_list && is_nonexpansive body - | Texp_apply(e, (_,None)::el) -> - is_nonexpansive e && List.for_all is_nonexpansive_opt (List.map snd el) + | Texp_apply(e, (_,Omitted ())::el) -> + is_nonexpansive e && List.for_all is_nonexpansive_arg (List.map snd el) | Texp_match(e, cases, _, _) -> (* Not sure this is necessary, if [e] is nonexpansive then we shouldn't care if there are exception patterns. But the previous version enforced @@ -2610,7 +3063,7 @@ let rec is_nonexpansive exp = && not (contains_exception_pat c_lhs) ) cases | Texp_tuple el -> - List.for_all is_nonexpansive el + List.for_all (fun (_, e) -> is_nonexpansive e) el | Texp_construct( _, _, el) -> List.for_all is_nonexpansive el | Texp_variant(_, arg) -> is_nonexpansive_opt arg @@ -2623,6 +3076,7 @@ let rec is_nonexpansive exp = | Kept _ -> true) fields && is_nonexpansive_opt extended_expression + | Texp_atomic_loc(exp, _, _) -> is_nonexpansive exp | Texp_field(exp, _, _) -> is_nonexpansive exp | Texp_ifthenelse(_cond, ifso, ifnot) -> is_nonexpansive ifso && is_nonexpansive_opt ifnot @@ -2662,9 +3116,9 @@ let rec is_nonexpansive exp = { exp_desc = Texp_ident (_, _, {val_kind = Val_prim {Primitive.prim_name = ("%raise" | "%reraise" | "%raise_notrace")}}) }, - [Nolabel, Some e]) -> + [Nolabel, Arg e]) -> is_nonexpansive e - | Texp_array (_ :: _) + | Texp_array (_, _ :: _) | Texp_apply _ | Texp_try _ | Texp_setfield _ @@ -2717,6 +3171,10 @@ and is_nonexpansive_opt = function | None -> true | Some e -> is_nonexpansive e +and is_nonexpansive_arg = function + | Omitted () -> true + | Arg e -> is_nonexpansive e + let maybe_expansive e = not (is_nonexpansive e) let annotate_recursive_bindings env valbinds = @@ -2737,11 +3195,6 @@ let check_recursive_class_bindings env ids exprs = raise(Error(expr.cl_loc, env, Illegal_class_expr))) exprs -let is_prim ~name funct = - match funct.exp_desc with - | Texp_ident (_, _, {val_kind=Val_prim{Primitive.prim_name; _}}) -> - prim_name = name - | _ -> false (* Approximate the type of an expression, for better recursion *) let rec approx_type env sty = @@ -2750,7 +3203,7 @@ let rec approx_type env sty = let ty1 = if is_optional p then type_option (newvar ()) else newvar () in newty (Tarrow (p, ty1, approx_type env sty, commu_ok)) | Ptyp_tuple args -> - newty (Ttuple (List.map (approx_type env) args)) + newty (Ttuple (List.map (fun (l, t) -> l, approx_type env t) args)) | Ptyp_constr (lid, ctl) -> let path, decl = Env.lookup_type ~use:false ~loc:lid.loc lid.txt env in if List.length ctl <> decl.type_arity then newvar () @@ -2813,7 +3266,9 @@ let rec type_approx env sexp = type_approx_function env params c body ~loc | Pexp_match (_, {pc_rhs=e}::_) -> type_approx env e | Pexp_try (e, _) -> type_approx env e - | Pexp_tuple l -> newty (Ttuple(List.map (type_approx env) l)) + | Pexp_tuple l -> + let labeled_tys = List.map (fun (label, l) -> label, type_approx env l) l in + newty (Ttuple labeled_tys) | Pexp_ifthenelse (_,e,_) -> type_approx env e | Pexp_sequence (_,e) -> type_approx env e | Pexp_constraint (e, sty) -> @@ -2822,6 +3277,10 @@ let rec type_approx env sexp = | Pexp_coerce (e, sty1, sty2) -> let ty = type_approx env e in type_approx_constraint env ty (Pcoerce (sty1, sty2)) ~loc + | Pexp_pack (_, Some ptyp) -> + let ty = newvar () in + let sty = Ast_helper.Typ.package ~loc ptyp in + type_approx_constraint env ty (Pconstraint sty) ~loc | _ -> newvar () and type_approx_function env params c body ~loc = @@ -2846,25 +3305,6 @@ and type_approx_function env params c body ~loc = in type_approx_constraint_opt env body_ty c ~loc -(* List labels in a function type, and whether return type is a variable *) -let rec list_labels_aux env visited ls ty_fun = - let ty = expand_head env ty_fun in - if TypeSet.mem ty visited then - List.rev ls, false - else match get_desc ty with - Tarrow (l, _, ty_res, _) -> - list_labels_aux env (TypeSet.add ty visited) (l::ls) ty_res - | _ -> - List.rev ls, is_Tvar ty - -let list_labels env ty = - let snap = Btype.snapshot () in - let result = - wrap_trace_gadt_instances env (list_labels_aux env TypeSet.empty []) ty - in - Btype.backtrack snap; - result - (* Check that all univars are safe in a type. Both exp.exp_type and ty_expected should already be generalized. *) let check_univars env kind exp ty_expected vars = @@ -2960,7 +3400,7 @@ let check_partial_application ~statement exp = match exp_desc with | Texp_ident _ | Texp_constant _ | Texp_tuple _ | Texp_construct _ | Texp_variant _ | Texp_record _ - | Texp_field _ | Texp_setfield _ | Texp_array _ + | Texp_atomic_loc _ | Texp_field _ | Texp_setfield _ | Texp_array _ | Texp_while _ | Texp_for _ | Texp_instvar _ | Texp_setinstvar _ | Texp_override _ | Texp_assert _ | Texp_lazy _ | Texp_object _ | Texp_pack _ | Texp_unreachable @@ -3055,7 +3495,7 @@ let shallow_iter_ppat f p = | Ppat_or (p1,p2) | Ppat_effect(p1, p2) -> f p1; f p2 | Ppat_variant (_, arg) -> Option.iter f arg - | Ppat_tuple lst -> List.iter f lst + | Ppat_tuple (lst, _) -> List.iter (fun (_, p) -> f p) lst | Ppat_construct (_, Some (_, p)) | Ppat_exception p | Ppat_alias (p,_) | Ppat_open (_,p) @@ -3096,6 +3536,22 @@ let may_contain_gadts p = | _ -> false) p +(* One of the things we do in the presence of GADT constructors (see above + definition) is treat `let p = e in ...` as a match `match e with p -> ...`. + This changes the way type inference works to check the expression first, and + use its type in the checking of the pattern. We want that behavior for + labeled tuple patterns as well. *) +let turn_let_into_match p = + exists_ppat + (fun p -> + match p.ppat_desc with + | Ppat_construct _ -> true + | Ppat_tuple (_, Open) -> true + | Ppat_tuple (spl, Closed) -> + List.exists (fun (l, _) -> Option.is_some l) spl + | _ -> false) + p + (* There are various things that we need to do in presence of module patterns that aren't required if there are none. Most notably, we need to ensure the modules are entered at the appropriate scope. The caller should use @@ -3132,27 +3588,6 @@ let check_absent_variant env = (duplicate_type pat.pat_type) | _ -> () } -(* Getting proper location of already typed expressions. - - Used to avoid confusing locations on type error messages in presence of - type constraints. - For example: - - (* Before patch *) - # let x : string = (5 : int);; - ^ - (* After patch *) - # let x : string = (5 : int);; - ^^^^^^^^^ -*) -let proper_exp_loc exp = - let rec aux = function - | [] -> exp.exp_loc - | ((Texp_constraint _ | Texp_coerce _), loc, _) :: _ -> loc - | _ :: rest -> aux rest - in - aux exp.exp_extra - (* To find reasonable names for let-bound and lambda-bound idents *) let rec name_pattern default = function @@ -3160,7 +3595,7 @@ let rec name_pattern default = function | p :: rem -> match p.pat_desc with Tpat_var (id, _, _) -> id - | Tpat_alias(_, id, _, _) -> id + | Tpat_alias(_, id, _, _, _) -> id | _ -> name_pattern default rem let name_cases default lst = @@ -3168,22 +3603,13 @@ let name_cases default lst = (* Typing of expressions *) -(** [sexp_for_hint] is used by error messages to report literals in their - original formatting *) -let unify_exp ~sexp env exp expected_ty = - let loc = proper_exp_loc exp in - try - unify_exp_types loc env exp.exp_type expected_ty - with Error(loc, env, Expr_type_clash(err, tfc, None)) -> - raise (Error(loc, env, Expr_type_clash(err, tfc, Some sexp))) - (* If [is_inferred e] is true, [e] will be typechecked without using the "expected type" provided by the context. *) let rec is_inferred sexp = match sexp.pexp_desc with | Pexp_ident _ | Pexp_apply _ | Pexp_field _ | Pexp_constraint _ - | Pexp_coerce _ | Pexp_send _ | Pexp_new _ -> true + | Pexp_coerce _ | Pexp_send _ | Pexp_new _ | Pexp_pack (_, Some _) -> true | Pexp_sequence (_, e) | Pexp_open (_, e) -> is_inferred e | Pexp_ifthenelse (_, e1, Some e2) -> is_inferred e1 && is_inferred e2 | _ -> false @@ -3393,7 +3819,7 @@ and type_expect_ exp_env = env } | Pexp_let(Nonrecursive, [{pvb_pat=spat; pvb_attributes=[]; _ } as vb], sbody) - when may_contain_gadts spat -> + when turn_let_into_match spat -> (* TODO: allow non-empty attributes? *) let sval = vb_exp_constraint vb in type_expect env @@ -3643,19 +4069,24 @@ and type_expect_ exp_env = env } | Pexp_tuple sexpl -> assert (List.length sexpl >= 2); - let subtypes = List.map (fun _ -> newgenvar ()) sexpl in - let to_unify = newgenty (Ttuple subtypes) in + Option.iter + (fun l -> raise (Error (loc, env, Repeated_tuple_exp_label l))) + (Misc.repeated_label sexpl); + let labeled_subtypes = List.map (fun (l, _) -> l, newgenvar ()) sexpl in + let to_unify = newgenty (Ttuple labeled_subtypes) in with_explanation (fun () -> unify_exp_types loc env to_unify (generic_instance ty_expected)); let expl = - List.map2 (fun body ty -> type_expect env body (mk_expected ty)) - sexpl subtypes + List.map2 + (fun (l, body) (_, ty) -> + (l, type_expect env body (mk_expected ty))) + sexpl labeled_subtypes in re { exp_desc = Texp_tuple expl; exp_loc = loc; exp_extra = []; (* Keep sharing *) - exp_type = newty (Ttuple (List.map (fun e -> e.exp_type) expl)); + exp_type = newty (Ttuple (List.map (fun (l, e) -> l, e.exp_type) expl)); exp_attributes = sexp.pexp_attributes; exp_env = env } | Pexp_construct(lid, sarg) -> @@ -3844,11 +4275,9 @@ and type_expect_ exp_attributes = sexp.pexp_attributes; exp_env = env } | Pexp_field(srecord, lid) -> - let (record, label, _) = - type_label_access env srecord Env.Projection lid + let record, label, ty_arg = + solve_Pexp_field ~label_usage:Env.Projection env sexp srecord lid in - let (_, ty_arg, ty_res) = instance_label ~fixed:false label in - unify_exp ~sexp env record ty_res; rue { exp_desc = Texp_field(record, lid, label); exp_loc = loc; exp_extra = []; @@ -3872,14 +4301,26 @@ and type_expect_ exp_attributes = sexp.pexp_attributes; exp_env = env } | Pexp_array(sargl) -> - let ty = newgenvar() in - let to_unify = Predef.type_array ty in - with_explanation (fun () -> - unify_exp_types loc env to_unify (generic_instance ty_expected)); + let ty_elt, mutability = + let ty_expected = generic_instance ty_expected in + match disambiguate_array_literal ~loc env ty_expected with + | { ty_elt = Some ty; mut } -> ty, mut + | { ty_elt = None; mut } -> + let ty = newgenvar () in + let to_unify = + match mut with + | Mutable -> Predef.type_array ty + | Immutable -> Predef.type_iarray ty + in + with_explanation (fun () -> + unify_exp_types loc env to_unify ty_expected); + ty, mut + in let argl = - List.map (fun sarg -> type_expect env sarg (mk_expected ty)) sargl in + List.map (fun sarg -> type_expect env sarg (mk_expected ty_elt)) sargl + in re { - exp_desc = Texp_array argl; + exp_desc = Texp_array (mutability, argl); exp_loc = loc; exp_extra = []; exp_type = instance ty_expected; exp_attributes = sexp.pexp_attributes; @@ -4251,30 +4692,50 @@ and type_expect_ exp_extra = (Texp_newtype name.txt, loc, sexp.pexp_attributes) :: body.exp_extra } - | Pexp_pack m -> - let (p, fl) = - match get_desc (Ctype.expand_head env (instance ty_expected)) with - Tpackage (p, fl) -> - if !Clflags.principal && - get_level (Ctype.expand_head env - (protect_expansion env ty_expected)) - < Btype.generic_level - then - Location.prerr_warning loc - (not_principal "this module packing"); - (p, fl) - | Tvar _ -> - raise (Error (loc, env, Cannot_infer_signature)) - | _ -> - raise (Error (loc, env, Not_a_packed_module ty_expected)) - in - let (modl, fl') = !type_package env m p fl in - rue { - exp_desc = Texp_pack modl; - exp_loc = loc; exp_extra = []; - exp_type = newty (Tpackage (p, fl')); - exp_attributes = sexp.pexp_attributes; - exp_env = env } + | Pexp_pack (m, optyp) -> + begin match optyp with + | Some ptyp -> + let t = Ast_helper.Typ.package ~loc:ptyp.ppt_loc ptyp in + let pty, exp_extra = type_constraint env t in + begin match get_desc (instance pty) with + | Tpackage pack -> + let (modl, pack') = !type_package env m pack in + let ty = newty (Tpackage pack') in + unify_exp_types m.pmod_loc env (instance pty) ty; + rue { + exp_desc = Texp_pack modl; + exp_loc = loc; exp_extra = [exp_extra, loc, []]; + exp_type = instance pty; + exp_attributes = sexp.pexp_attributes; + exp_env = env } + | _ -> + fatal_error "[type_expect] Package not translated to a package" + end + | None -> + let pack = + match get_desc (Ctype.expand_head env (instance ty_expected)) with + Tpackage pack -> + if !Clflags.principal && + get_level (Ctype.expand_head env + (protect_expansion env ty_expected)) + < Btype.generic_level + then + Location.prerr_warning loc + (not_principal "this module packing"); + pack + | Tvar _ -> + raise (Error (loc, env, Cannot_infer_signature)) + | _ -> + raise (Error (loc, env, Not_a_packed_module ty_expected)) + in + let (modl, pack') = !type_package env m pack in + rue { + exp_desc = Texp_pack modl; + exp_loc = loc; exp_extra = []; + exp_type = newty (Tpackage pack'); + exp_attributes = sexp.pexp_attributes; + exp_env = env } + end | Pexp_open (od, e) -> let tv = newvar () in let (od, _, newenv) = !type_open_decl env od in @@ -4297,8 +4758,10 @@ and type_expect_ | { pbop_pat = spat; _} :: rest -> let ty = newvar () in let loc = { slet.pbop_op.loc with Location.loc_ghost = true } in - let spat_acc = Ast_helper.Pat.tuple ~loc [spat_acc; spat] in - let ty_acc = newty (Ttuple [ty_acc; ty]) in + let spat_acc = + Ast_helper.Pat.tuple ~loc [None, spat_acc; None, spat] Closed + in + let ty_acc = newty (Ttuple [None, ty_acc; None, ty]) in loop spat_acc ty_acc rest in let op_path, op_desc, op_type, spat_params, ty_params, @@ -4381,6 +4844,30 @@ and type_expect_ | _ -> raise (Error (loc, env, Invalid_extension_constructor_payload)) end + | Pexp_extension ({ txt = ("ocaml.atomic.loc" + |"atomic.loc"); _ }, + payload) -> + begin match payload with + | PStr [ { pstr_desc = + Pstr_eval ( + { pexp_desc = Pexp_field (srecord, lid); _ } as sexp, _ + ) + } ] -> + let record, label, ty_arg = + solve_Pexp_field ~label_usage:Env.Mutation env sexp srecord lid + in + Env.mark_label_used Env.Projection label.lbl_uid; + if label.lbl_atomic = Nonatomic then + raise (Error (loc, env, Label_not_atomic lid.txt)) ; + rue { + exp_desc = Texp_atomic_loc (record, lid, label); + exp_loc = loc; exp_extra = []; + exp_type = instance (Predef.type_atomic_loc ty_arg); + exp_attributes = sexp.pexp_attributes; + exp_env = env } + | _ -> + raise (Error (loc, env, Invalid_atomic_loc_payload)) + end | Pexp_extension ext -> raise (Error_forward (Builtin_attributes.error_of_extension ext)) @@ -4421,7 +4908,9 @@ and type_coerce match sty with | None -> let (cty', ty', force) = - Typetexp.transl_simple_type_delayed env sty' + with_local_level_generalize_structure begin fun () -> + Typetexp.transl_simple_type_delayed env sty' + end in let arg, arg_type, gen = let lv = get_current_level () in @@ -4442,14 +4931,14 @@ and type_coerce && closed_type_expr ~env ty' -> if not gen && (* first try a single coercion *) let snap = snapshot () in - let ty, _b = enlarge_type env ty' in + let ty, _b = enlarge_type env (generic_instance ty') in try force (); Ctype.unify env arg_type ty; true with Unify _ -> backtrack snap; false then () else begin try - let force' = subtype env arg_type ty' in + let force' = subtype env arg_type (generic_instance ty') in force (); force' (); if not gen && !Clflags.principal then Location.prerr_warning loc @@ -4459,7 +4948,7 @@ and type_coerce raise (Error (loc, env, Not_subtype err)) end; | _ -> - let ty, b = enlarge_type env ty' in + let ty, b = enlarge_type env (generic_instance ty') in force (); begin try Ctype.unify env arg_type ty with Unify err -> let expanded = full_expand ~may_forget_scope:true env ty' in @@ -4480,7 +4969,9 @@ and type_coerce end in begin try - let force'' = subtype env (instance ty) (instance ty') in + let force'' = + subtype env (generic_instance ty) (generic_instance ty') + in force (); force' (); force'' () with Subtype err -> raise (Error (loc, env, Not_subtype err)) @@ -4886,6 +5377,14 @@ and type_label_access env srecord usage lid = (Label.disambiguate usage lid env expected_type) labels in (record, label, expected_type) +and solve_Pexp_field ~label_usage env sexp srecord lid = + let (record, label, _) = + type_label_access env srecord label_usage lid + in + let (_, ty_arg, ty_res) = instance_label ~fixed:false label in + unify_exp ~sexp env record ty_res; + (record, label, ty_arg) + (* Typing format strings for printing or reading. These formats are used by functions in modules Printf, Format, and Scanf. (Handling of * modifiers contributed by Thorsten Ohl.) *) @@ -4904,11 +5403,16 @@ and type_format loc str env = loc = loc; } in let mk_constr name args = - let lid = Longident.(Ldot(Lident "CamlinternalFormatBasics", name)) in + let lid = + Longident.(Ldot(mknoloc (Lident "CamlinternalFormatBasics"), + mknoloc name)) + in let arg = match args with | [] -> None | [ e ] -> Some e - | _ :: _ :: _ -> Some (mk_exp_loc (Pexp_tuple args)) in + | _ :: _ :: _ -> + Some (mk_exp_loc (Pexp_tuple (List.map (fun e -> None, e) args))) + in mk_exp_loc (Pexp_construct (mk_lid_loc lid, arg)) in let mk_cst cst = mk_exp_loc (Pexp_constant {pconst_desc = cst; pconst_loc = loc}) @@ -4976,7 +5480,7 @@ and type_format loc str env = | Float_H -> mk_constr "Float_H" [] | Float_F -> mk_constr "Float_F" [] | Float_CF -> mk_constr "Float_CF" [] in - mk_exp_loc (Pexp_tuple [flag; kind]) + mk_exp_loc (Pexp_tuple [None, flag; None, kind]) and mk_counter cnt = match cnt with | Line_counter -> mk_constr "Line_counter" [] | Char_counter -> mk_constr "Char_counter" [] @@ -5138,7 +5642,7 @@ and type_label_exp create env loc ty_expected (lid, label, sarg) = (* Here also ty_expected may be at generic_level *) let separate = !Clflags.principal || Env.has_local_constraints env in - let is_poly = label_is_poly label in + let is_poly = is_poly_Tpoly label.lbl_arg in let (vars, arg) = (* raise level to check univars *) with_local_level_generalize_if is_poly begin fun () -> @@ -5204,7 +5708,7 @@ and type_argument ?explanation ?recarg env sarg ty_expected' ty_expected = match get_desc (expand_head env ty_fun) with | Tarrow (l,ty_arg,ty_fun,_) when is_optional l -> let ty = option_none env (instance ty_arg) sarg.pexp_loc in - make_args ((l, Some ty) :: args) ty_fun + make_args ((l, Arg ty) :: args) ty_fun | Tarrow (l,_,ty_res',_) when l = Nolabel || !Clflags.classic -> List.rev args, ty_fun, no_labels ty_res' | Tvar _ -> List.rev args, ty_fun, false @@ -5254,7 +5758,7 @@ and type_argument ?explanation ?recarg env sarg ty_expected' ty_expected = {texp with exp_type = ty_res; exp_desc = Texp_apply (texp, - args @ [Nolabel, Some eta_var])} + args @ [Nolabel, Arg eta_var])} in let cases = [ case eta_pat e ] in let cases_loc = { texp.exp_loc with loc_ghost = true } in @@ -5287,194 +5791,32 @@ and type_argument ?explanation ?recarg env sarg ty_expected' ty_expected = unify_exp ~sexp:sarg env texp ty_expected; texp -and type_application env funct sargs = - (* funct.exp_type may be generic *) - let result_type omitted ty_fun = - List.fold_left - (fun ty_fun (l,ty,lv) -> newty2 ~level:lv (Tarrow(l,ty,ty_fun,commu_ok))) - ty_fun omitted - in - let has_label l ty_fun = - let ls, tvar = list_labels env ty_fun in - tvar || List.mem l ls - in - let eliminated_optional_arguments = ref [] in - let omitted_parameters = ref [] in - let type_unknown_arg (ty_fun, typed_args) (lbl, sarg) = - let (ty_arg, ty_res) = - let ty_fun = expand_head env ty_fun in - match get_desc ty_fun with - | Tvar _ -> - let t1 = newvar () and t2 = newvar () in - if get_level ty_fun >= get_level t1 && - not (is_prim ~name:"%identity" funct) - then - Location.prerr_warning sarg.pexp_loc - Warnings.Ignored_extra_argument; - unify env ty_fun (newty (Tarrow(lbl,t1,t2,commu_var ()))); - (t1, t2) - | Tarrow (l,t1,t2,_) when l = lbl - || !Clflags.classic && lbl = Nolabel && not (is_optional l) -> - (t1, t2) - | td -> - let ty_fun = match td with Tarrow _ -> newty td | _ -> ty_fun in - let ty_res = - result_type (!omitted_parameters @ !eliminated_optional_arguments) - ty_fun - in - match get_desc ty_res with - | Tarrow _ -> - if !Clflags.classic || not (has_label lbl ty_fun) then - raise (Error(sarg.pexp_loc, env, - Apply_wrong_label(lbl, ty_res, false))) - else - raise (Error(funct.exp_loc, env, Incoherent_label_order)) - | _ -> - let previous_arg_loc = - (* [typed_args] is the arguments typed until now, in reverse - order of appearance. Not all arguments have a location - attached (eg. an optional argument that is not passed). *) - typed_args - |> List.find_map - (function (_, Some (_, loc)) -> loc | _ -> None) - |> Option.value ~default:funct.exp_loc - in - raise(Error(funct.exp_loc, env, Apply_non_function { - funct; - func_ty = expand_head env funct.exp_type; - res_ty = expand_head env ty_res; - previous_arg_loc; - extra_arg_loc = sarg.pexp_loc; })) - in - let arg () = +and type_apply_arg env (lbl, arg) = + match arg with + | Arg (Unknown_arg { sarg; ty_arg }) -> let arg = type_expect env sarg (mk_expected ty_arg) in if is_optional lbl then unify_exp ~sexp:sarg env arg (type_option(newvar())); - arg - in - (ty_res, (lbl, Some (arg, Some sarg.pexp_loc)) :: typed_args) - in - let ignore_labels = - !Clflags.classic || - begin - let ls, tvar = list_labels env funct.exp_type in - not tvar && - let labels = List.filter (fun l -> not (is_optional l)) ls in - List.length labels = List.length sargs && - List.for_all (fun (l,_) -> l = Nolabel) sargs && - List.exists (fun l -> l <> Nolabel) labels && - (Location.prerr_warning - funct.exp_loc - (Warnings.Labels_omitted - (List.map Asttypes.string_of_label - (List.filter ((<>) Nolabel) labels))); - true) - end - in - let warned = ref false in - (* [args] remember the location of each argument in sources. *) - let rec type_args args ty_fun ty_fun0 sargs = - let type_unknown_args () = - (* We're not looking at a *known* function type anymore, or there are no - arguments left. *) - let ty_fun, typed_args = - List.fold_left type_unknown_arg (ty_fun0, args) sargs + (lbl, Arg arg) + | Arg (Known_arg { sarg; ty_arg; ty_arg0; wrapped_in_some }) -> + let arg = + if wrapped_in_some then + option_some env + (type_argument env sarg + (extract_option_type env ty_arg) + (extract_option_type env ty_arg0)) + else + type_argument env sarg ty_arg ty_arg0 in - let args = - (* Force typing of arguments. - Careful: the order matters here. Using [List.rev_map] would be - incorrect. *) - List.map - (function - | l, None -> l, None - | l, Some (f, _loc) -> l, Some (f ())) - (List.rev typed_args) + (lbl, Arg arg) + | Arg (Eliminated_optional_arg { ty_arg; _ }) -> + let arg = + option_none env (instance ty_arg) Location.none in - let result_ty = instance (result_type !omitted_parameters ty_fun) in - args, result_ty - in - if sargs = [] then type_unknown_args () else - let ty_fun' = expand_head env ty_fun in - match get_desc ty_fun', get_desc (expand_head env ty_fun0) with - | Tarrow (l, ty, ty_fun, com), Tarrow (_, ty0, ty_fun0, _) - when is_commu_ok com -> - let lv = get_level ty_fun' in - let may_warn loc w = - if not !warned && !Clflags.principal && lv <> generic_level - then begin - warned := true; - Location.prerr_warning loc w - end - in - let name = label_name l - and optional = is_optional l in - let use_arg sarg l' = - if not optional || is_optional l' then - (fun () -> type_argument env sarg ty ty0) - else begin - may_warn sarg.pexp_loc - (not_principal "using an optional argument here"); - (fun () -> option_some env (type_argument env sarg - (extract_option_type env ty) - (extract_option_type env ty0))) - end - in - let eliminate_optional_arg () = - may_warn funct.exp_loc - (Warnings.Non_principal_labels "eliminated optional argument"); - eliminated_optional_arguments := - (l,ty,lv) :: !eliminated_optional_arguments; - (fun () -> option_none env (instance ty) Location.none) - in - let remaining_sargs, arg = - if ignore_labels then begin - (* No reordering is allowed, process arguments in order *) - match sargs with - | [] -> assert false - | (l', sarg) :: remaining_sargs -> - if name = label_name l' || (not optional && l' = Nolabel) then - (remaining_sargs, Some (use_arg sarg l', Some sarg.pexp_loc)) - else if - optional && - not (List.exists (fun (l, _) -> name = label_name l) - remaining_sargs) && - List.exists (function (Nolabel, _) -> true | _ -> false) - sargs - then - (sargs, Some (eliminate_optional_arg (), Some sarg.pexp_loc)) - else - raise(Error(sarg.pexp_loc, env, - Apply_wrong_label(l', ty_fun', optional))) - end else - (* Arguments can be commuted, try to fetch the argument - corresponding to the first parameter. *) - match extract_label name sargs with - | Some (l', sarg, commuted, remaining_sargs) -> - if commuted then begin - may_warn sarg.pexp_loc - (not_principal "commuting this argument") - end; - if not optional && is_optional l' then - Location.prerr_warning sarg.pexp_loc - (Warnings.Nonoptional_label (Asttypes.string_of_label l)); - remaining_sargs, Some (use_arg sarg l', Some sarg.pexp_loc) - | None -> - sargs, - if optional && List.mem_assoc Nolabel sargs then - Some (eliminate_optional_arg (), None) - else begin - (* No argument was given for this parameter, we abstract over - it. *) - may_warn funct.exp_loc - (Warnings.Non_principal_labels "commuted an argument"); - omitted_parameters := (l,ty,lv) :: !omitted_parameters; - None - end - in - type_args ((l,arg)::args) ty_fun ty_fun0 remaining_sargs - | _ -> - type_unknown_args () - in + (lbl, Arg arg) + | Omitted _ as arg -> (lbl, arg) + +and type_application env funct sargs = let is_ignore funct = is_prim ~name:"%ignore" funct && (try ignore (filter_arrow env (instance funct.exp_type) Nolabel); true @@ -5487,10 +5829,51 @@ and type_application env funct sargs = filter_arrow env (instance funct.exp_type) Nolabel in let exp = type_expect env sarg (mk_expected ty_arg) in check_partial_application ~statement:false exp; - ([Nolabel, Some exp], ty_res) + ([Nolabel, Arg exp], ty_res) | _ -> let ty = funct.exp_type in - type_args [] ty (instance ty) sargs + let ignore_labels = + !Clflags.classic || + begin + let ls, tvar = list_labels env ty in + not tvar && + let labels = List.filter (fun l -> not (is_optional l)) ls in + List.length labels = List.length sargs && + List.for_all (fun (l,_) -> l = Nolabel) sargs && + List.exists (fun l -> l <> Nolabel) labels && + (Location.prerr_warning + funct.exp_loc + (Warnings.Labels_omitted + (List.map Asttypes.string_of_label + (List.filter ((<>) Nolabel) labels))); + true) + end + in + (* Consider for example the application + [f n] + with + [f : a:bar -> ?opt:baz -> int -> unit] *) + let ty_ret, args = + collect_apply_args env funct ignore_labels ty (instance ty) sargs + in + (* example: [collect_apply_args] returns + [ty_ret = unit] and + [args = [(Label "a", Omitted bar); + (Optional "opt", Arg (Eliminated_optional_arg baz)); + (Nolabel, Arg (Known_arg n))]] *) + let args = List.map (fun arg -> type_apply_arg env arg) args in + (* example: type-check [n] and generate [None] for [?opt]. + [args] becomes [(Label "a", Omitted bar); + (Optional "opt", Arg None); + (Nolabel, Arg n)] *) + let ty_ret, args = + type_omitted_parameters_and_build_result_type ty_ret args in + (* example: + [ty_ret] becomes [a:bar -> unit] + [args] becomes [(Label "a", Omitted ()); + (Optional "opt", Arg None); + (Nolabel, Arg n)] *) + args, instance ty_ret and type_construct env ~sexp lid sarg ty_expected_explained = let { ty = ty_expected; explanation } = ty_expected_explained in @@ -5519,7 +5902,13 @@ and type_construct env ~sexp lid sarg ty_expected_explained = | Some {pexp_desc = Pexp_tuple sel} when constr.cstr_arity > 1 || Builtin_attributes.explicit_arity sexp.pexp_attributes - -> sel + -> + List.map (fun (l, se) -> + match l with + | Some _ -> + raise (Error(sexp.pexp_loc, env, Constructor_labeled_arg)) + | None -> se + ) sel | Some se -> [se] in if List.length sargs <> constr.cstr_arity then raise(Error(sexp.pexp_loc, env, @@ -6034,7 +6423,7 @@ and type_let ?check ?check_strict let new_env = add_pattern_variables new_env pvs in let pat_list = List.map - (fun pat -> {pat with pat_type = instance pat.pat_type}) + (fun pat -> {pat with pat_type = instance pat.pat_type}, pat.pat_type) pat_list in (* Only bind pattern variables after generalizing *) @@ -6051,9 +6440,9 @@ and type_let ?check ?check_strict in type_let_def_wrap_warnings ?check ?check_strict ~is_recursive ~exp_env ~new_env ~spat_sexp_list ~attrs_list ~pat_list ~pvs - (fun exp_env ({pvb_attributes; _} as vb) pat -> + (fun exp_env ({pvb_attributes; _} as vb) expected_ty -> let sexp = vb_exp_constraint vb in - match get_desc pat.pat_type with + match get_desc expected_ty with | Tpoly (ty, tl) -> let vars, ty' = with_local_level_generalize_structure_if_principal @@ -6067,12 +6456,12 @@ and type_let ?check ?check_strict | _ -> let exp = Builtin_attributes.warning_scope pvb_attributes (fun () -> - type_expect exp_env sexp (mk_expected pat.pat_type)) + type_expect exp_env sexp (mk_expected expected_ty)) in exp, None) in List.iter2 - (fun pat (attrs, exp) -> + (fun (pat, _) (attrs, exp) -> Builtin_attributes.warning_scope ~ppwarning:false attrs (fun () -> let case = Parmatch.typed_case (case pat exp) in @@ -6085,7 +6474,7 @@ and type_let ?check ?check_strict (pat_list, exp_list, new_env, mvs) end ~before_generalize: begin fun (pat_list, exp_list, _, _) -> - List.iter2 (fun pat (exp, vars) -> + List.iter2 (fun (pat, _) (exp, vars) -> if maybe_expansive exp then begin lower_contravariant env pat.pat_type; if vars <> None then lower_contravariant env exp.exp_type @@ -6094,13 +6483,13 @@ and type_let ?check ?check_strict end in List.iter2 - (fun pat (exp, vars) -> - Option.iter (check_univars env "definition" exp pat.pat_type) vars) + (fun (_, expected_ty) (exp, vars) -> + Option.iter (check_univars env "definition" exp expected_ty) vars) pat_list exp_list; let l = List.combine pat_list exp_list in let l = List.map2 - (fun (p, (e, _)) pvb -> + (fun ((p, _), (e, _)) pvb -> (* vb_rec_kind will be computed later for recursive bindings *) {vb_pat=p; vb_expr=e; vb_attributes=pvb.pvb_attributes; vb_loc=pvb.pvb_loc; vb_rec_kind = Dynamic; @@ -6111,7 +6500,7 @@ and type_let ?check ?check_strict List.iter (fun {vb_pat=pat} -> match pat.pat_desc with Tpat_var _ -> () - | Tpat_alias ({pat_desc=Tpat_any}, _, _, _) -> () + | Tpat_alias ({pat_desc=Tpat_any}, _, _, _, _) -> () | _ -> raise(Error(pat.pat_loc, env, Illegal_letrec_pat))) l; List.iter (fun vb -> @@ -6186,11 +6575,11 @@ and type_let_def_wrap_warnings *) let current_slot = ref None in let rec_needed = ref false in - let pat_slot_list = + let typ_slot_list = List.map2 - (fun attrs pat -> + (fun attrs (pat, expected_ty) -> Builtin_attributes.warning_scope ~ppwarning:false attrs (fun () -> - if not warn_about_unused_bindings then pat, None + if not warn_about_unused_bindings then expected_ty, None else let some_used = ref false in (* has one of the identifier of this pattern been used? *) @@ -6222,7 +6611,7 @@ and type_let_def_wrap_warnings ) ) (Typedtree.pat_bound_idents pat); - pat, Some slot + expected_ty, Some slot )) attrs_list pat_list @@ -6232,7 +6621,7 @@ and type_let_def_wrap_warnings (fun case (pat, slot) -> if is_recursive then current_slot := slot; type_def exp_env case pat) - spat_sexp_list pat_slot_list + spat_sexp_list typ_slot_list in current_slot := None; if is_recursive && not !rec_needed then begin @@ -6409,21 +6798,32 @@ let type_expression env sexp = (* Error report *) -let spellcheck ppf unbound_name valid_names = - Misc.did_you_mean ppf (fun () -> - Misc.spellcheck valid_names unbound_name - ) +let spellcheck unbound_name valid_names = + Misc.did_you_mean (Misc.spellcheck valid_names unbound_name) -let spellcheck_idents ppf unbound valid_idents = - spellcheck ppf (Ident.name unbound) (List.map Ident.name valid_idents) +let spellcheck_idents unbound valid_idents = + spellcheck (Ident.name unbound) (List.map Ident.name valid_idents) open Format_doc module Fmt = Format_doc + module Printtyp = Printtyp.Doc let quoted_longident = Style.as_inline_code Pprintast.Doc.longident let quoted_constr = Style.as_inline_code Pprintast.Doc.constr +let tuple_component ~print_article ppf lbl = + let article = + match print_article, lbl with + | true, Some _ -> "a " + | true, None -> "an " + | false, _ -> "" + in + match lbl with + | Some s -> + fprintf ppf "%scomponent with label %a" article Style.inline_code s + | None -> fprintf ppf "%sunlabeled component" article + (* Returns the first diff of the trace *) let type_clash_of_trace trace = Errortrace.(explain trace (fun ~prev:_ -> function @@ -6511,8 +6911,8 @@ let report_partial_application = function match get_desc tr.Errortrace.got.Errortrace.expanded with | Tarrow _ -> [ Location.msg - "@[@{Hint@}: This function application is partial,@ \ - maybe some arguments are missing.@]" ] + "@[@{Hint@}:@ This function application is partial,@ \ + maybe@ some@ arguments@ are missing.@]" ] | _ -> [] end | None -> [] @@ -6587,17 +6987,20 @@ let report_too_many_arg_error ~funct ~func_ty ~previous_arg_loc loc_end = cnum_offset ~+1 arg_end; loc_ghost = false } in - let hint_semicolon = if returns_unit then [ - msg ~loc:tail_loc "@{Hint@}: Did you forget a ';'?"; - ] else [] in - let sub = hint_semicolon @ [ - msg ~loc:extra_arg_loc "This extra argument is not expected."; - ] in - errorf ~loc:app_loc ~sub + errorf ~loc:app_loc "@[@[<2>%a@ %a@]\ @ It is applied to too many arguments@]" (report_this_texp_has_type (Some "function")) funct Printtyp.type_expr func_ty + ~sub:( + let semicolon = + if returns_unit then + [msg ~loc:tail_loc "@{Hint@}: Did you forget a ';'?"] + else [] + in + semicolon @ + [msg ~loc:extra_arg_loc "This extra argument is not expected."] + ) let msg = Fmt.doc_printf @@ -6607,6 +7010,33 @@ let report_error ~loc env = function "@[The constructor %a@ expects %i argument(s),@ \ but is applied here to %i argument(s)@]" quoted_constr lid expected provided + | Constructor_labeled_arg -> + Location.errorf ~loc + "Constructors cannot have labeled arguments.@ \ + Consider using an inline record instead." + | Partial_tuple_pattern_bad_type -> + Location.errorf ~loc + "Could not determine the type of this partial tuple pattern." + | Extra_tuple_label (lbl, typ) -> + Location.errorf ~loc + "This pattern was expected to match values of type@ %a,@ but it \ + contains an extra %a." + (Style.as_inline_code Printtyp.type_expr) typ + (tuple_component ~print_article:false) lbl; + | Missing_tuple_label (lbl, typ) -> + let hint ppf () = + (* We only hint if the missing component is labeled. This is + unlikely to be a correct fix for traditional tuples. *) + match lbl with + | Some _ -> fprintf ppf "@ Hint: use .. to ignore some components." + | None -> () + in + Location.errorf ~loc + "This pattern was expected to match values of type@ %a,@ but it is \ + missing %a.%a" + (Style.as_inline_code Printtyp.type_expr) typ + (tuple_component ~print_article:true) lbl + hint () | Label_mismatch(lid, err) -> report_unification_error ~loc env err (msg "The record field %a@ belongs to the type" quoted_longident lid) @@ -6627,14 +7057,11 @@ let report_error ~loc env = function "Variable %a is bound several times in this matching" Style.inline_code name | Orpat_vars (id, valid_idents) -> - Location.error_of_printer ~loc (fun ppf () -> - fprintf ppf - "Variable %a must occur on both sides of this %a pattern" - Style.inline_code (Ident.name id) - Style.inline_code "|" - ; - spellcheck_idents ppf id valid_idents - ) () + Location.aligned_error_hint ~loc + "@{Variable @}%a must occur on both sides of this %a pattern" + Style.inline_code (Ident.name id) + Style.inline_code "|" + (spellcheck_idents id valid_idents) | Expr_type_clash (err, explanation, exp) -> let diff = type_clash_of_trace err.trace in let sub = report_expr_type_clash_hints exp diff in @@ -6730,27 +7157,35 @@ let report_error ~loc env = function Location.errorf ~loc "The record field %a is not mutable" quoted_longident lid | Wrong_name (eorp, ty_expected, { type_path; kind; name; valid_names; }) -> - Location.error_of_printer ~loc (fun ppf () -> - Printtyp.wrap_printing_env ~error:true env (fun () -> - let { ty; explanation } = ty_expected in - if Path.is_constructor_typath type_path then begin - fprintf ppf - "@[The field %a is not part of the record \ - argument for the %a constructor@]" - Style.inline_code name.txt - (Style.as_inline_code Printtyp.type_path) type_path; - end else begin - fprintf ppf - "@[@[<2>%s type@ %a%a@]@ \ - There is no %s %a within type %a@]" - eorp (Style.as_inline_code Printtyp.type_expr) ty - pp_doc (report_type_expected_explanation_opt explanation) - (Datatype_kind.label_name kind) - Style.inline_code name.txt - (Style.as_inline_code Printtyp.type_path) type_path; - end; - spellcheck ppf name.txt valid_names - )) () + Printtyp.wrap_printing_env ~error:true env (fun () -> + let { ty; explanation } = ty_expected in + if Path.is_constructor_typath type_path then + Location.aligned_error_hint ~loc + "@{The field @}%a is not part of the record argument \ + for the %a constructor" + Style.inline_code name.txt + (Style.as_inline_code Printtyp.type_path) type_path + (spellcheck name.txt valid_names) + else + let intro ppf = Fmt.fprintf ppf "@[%s type@;<1 2>%a%a@]@\n" + eorp (Style.as_inline_code Printtyp.type_expr) ty + pp_doc (report_type_expected_explanation_opt explanation) + in + let main = + Fmt.doc_printf "@{There is no %s @}%a within type %a" + (Datatype_kind.label_name kind) + Style.inline_code name.txt + (Style.as_inline_code Printtyp.type_path) type_path + in + let main, sub = + match spellcheck name.txt valid_names with + | None -> main, [] + | Some hint -> + let main, hint = Misc.align_error_hint ~main ~hint in + main, [Location.mknoloc hint] + in + Location.errorf ~loc ~sub "%t%a" intro pp_doc main + ) | Name_type_mismatch (kind, lid, tp, tpl) -> let type_name = Datatype_kind.type_name kind in let name = Datatype_kind.label_name kind in @@ -6758,7 +7193,7 @@ let report_error ~loc env = function | Datatype_kind.Record -> quoted_longident | Datatype_kind.Variant -> quoted_constr in - Location.error_of_printer ~loc (fun ppf () -> + Location.errorf ~loc "%t" (fun ppf -> Errortrace_report.ambiguous_type ppf env tp tpl (msg "The %s %a@ belongs to the %s type" name pr lid type_name) @@ -6766,49 +7201,53 @@ let report_error ~loc env = function name pr lid type_name) (msg "but a %s was expected belonging to the %s type" name type_name) - ) () + ) | Invalid_format msg -> Location.errorf ~loc "%s" msg | Not_an_object (ty, explanation) -> - Location.error_of_printer ~loc (fun ppf () -> - fprintf ppf "This expression is not an object;@ \ - it has type %a" - (Style.as_inline_code Printtyp.type_expr) ty; - pp_doc ppf @@ report_type_expected_explanation_opt explanation - ) () + Location.errorf ~loc + "This expression is not an object;@ it has type %a%a" + (Style.as_inline_code Printtyp.type_expr) ty + pp_doc (report_type_expected_explanation_opt explanation) | Undefined_method (ty, me, valid_methods) -> - Location.error_of_printer ~loc (fun ppf () -> - Printtyp.wrap_printing_env ~error:true env (fun () -> - fprintf ppf - "@[@[This expression has type@;<1 2>%a@]@,\ - It has no method %a@]" - (Style.as_inline_code Printtyp.type_expr) ty - Style.inline_code me; - begin match valid_methods with - | None -> () - | Some valid_methods -> spellcheck ppf me valid_methods - end - )) () + Printtyp.wrap_printing_env ~error:true env (fun () -> + let intro ppf = + Fmt.fprintf ppf + "@[@[This expression has type@;<1 2>%a@]@,@]" + (Style.as_inline_code Printtyp.type_expr) ty + in + let main = + Fmt.doc_printf "@{It has no method @}%a" + Style.inline_code me + in + let main, sub = + match Option.bind valid_methods (spellcheck me) with + | None -> main, [] + | Some hint -> + let main, hint = Misc.align_error_hint ~main ~hint in + main, [Location.mknoloc hint] + in + Location.errorf ~sub ~loc "%t%a" intro pp_doc main + ) | Undefined_self_method (me, valid_methods) -> - Location.error_of_printer ~loc (fun ppf () -> - fprintf ppf "This expression has no method %a" Style.inline_code me; - spellcheck ppf me valid_methods; - ) () + Location.aligned_error_hint ~loc + "@{This expression has no method @}%a" + Style.inline_code me + (spellcheck me valid_methods) | Virtual_class cl -> - Location.errorf ~loc "Cannot instantiate the virtual class %a" - quoted_longident cl + Location.errorf ~loc "Cannot instantiate the virtual class %a" + quoted_longident cl | Unbound_instance_variable (var, valid_vars) -> - Location.error_of_printer ~loc (fun ppf () -> - fprintf ppf "Unbound instance variable %a" Style.inline_code var; - spellcheck ppf var valid_vars; - ) () + Location.aligned_error_hint ~loc + "@{Unbound instance variable @}%a" Style.inline_code var + (spellcheck var valid_vars) | Instance_variable_not_mutable v -> - Location.errorf ~loc "The instance variable %a is not mutable" - Style.inline_code v + Location.errorf ~loc "The instance variable %a is not mutable" + Style.inline_code v | Not_subtype err -> - Location.error_of_printer ~loc (fun ppf () -> + Location.errorf ~loc "%t" (fun ppf -> Errortrace_report.subtype ppf env err "is not a subtype of" - ) () + ) | Outside_class -> Location.errorf ~loc "This object duplication occurs outside a method definition" @@ -6817,23 +7256,26 @@ let report_error ~loc env = function "The instance variable %a is overridden several times" Style.inline_code v | Coercion_failure (ty_exp, err, b) -> - Location.error_of_printer ~loc (fun ppf () -> - let intro = - let ty_exp = Out_type.prepare_expansion ty_exp in - doc_printf "This expression cannot be coerced to type@;<1 2>%a;@ \ - it has type" - (Style.as_inline_code @@ Printtyp.type_expansion Type) ty_exp - in + let intro = + let ty_exp = Out_type.prepare_expansion ty_exp in + doc_printf "This expression cannot be coerced to type@;<1 2>%a;@ \ + it has type" + (Style.as_inline_code @@ Printtyp.type_expansion Type) ty_exp + in + Location.errorf ~loc "%t" (fun ppf -> Errortrace_report.unification ppf env err intro - (Fmt.doc_printf "but is here used with type"); - if b then - fprintf ppf - ".@.@[This simple coercion was not fully general.@ \ - @{Hint@}: Consider using a fully explicit coercion@ \ - of the form: %a@]" - Style.inline_code "(foo : ty1 :> ty2)" - ) () + (Fmt.Doc.msg "but is here used with type") + ) + ~sub:( + if not b then [] else + [ Location.msg "This simple coercion was not fully general"; + Location.msg + "@{Hint@}: Consider using a fully explicit coercion@ \ + of the form: %a" + Style.inline_code "(foo : ty1 :> ty2)" + ] + ) | Not_a_function (ty, explanation) -> Location.errorf ~loc "This expression should not be a function,@ \ @@ -6920,7 +7362,7 @@ let report_error ~loc env = function | At_toplevel -> dprintf "Existential types are not allowed in toplevel bindings" | In_group -> - dprintf "Existential types are not allowed in %a bindings" + dprintf "Existential types are not allowed in grouped (%a) bindings" Style.inline_code "let ... and ..." | In_rec -> dprintf "Existential types are not allowed in recursive bindings" @@ -6975,6 +7417,20 @@ let report_error ~loc env = function | Not_an_extension_constructor -> Location.errorf ~loc "This constructor is not an extension constructor." + | Invalid_atomic_loc_payload -> + Location.errorf ~loc + "Invalid %a payload, a record field access is expected." + Style.inline_code "[%atomic.loc]" + | Label_not_atomic lid -> + Location.errorf ~loc "The record field %a is not atomic" + quoted_longident lid + | Atomic_in_pattern lid -> + Location.errorf ~loc + "Atomic fields (here %a) are forbidden in patterns,@ \ + as it is difficult to reason about when the atomic read@ \ + will happen during pattern matching:@ the field may be read@ \ + zero, one or several times depending on the patterns around it." + quoted_longident lid | Literal_overflow ty -> Location.errorf ~loc "Integer literal exceeds the range of representable integers of type %a" @@ -7061,6 +7517,14 @@ let report_error ~loc env = function "This expression has type %a@ \ which is not a record type." (Style.as_inline_code Printtyp.type_expr) ty + | Repeated_tuple_exp_label l -> + Location.errorf ~loc + "@[This tuple expression has two labels named %a@]" + Style.inline_code l + | Repeated_tuple_pat_label l -> + Location.errorf ~loc + "@[This tuple pattern has two labels named %a@]" + Style.inline_code l let report_error ~loc env err = Printtyp.wrap_printing_env ~error:true env diff --git a/typing/typecore.mli b/typing/typecore.mli index 1b89ddd6..c245d42a 100644 --- a/typing/typecore.mli +++ b/typing/typecore.mli @@ -190,7 +190,7 @@ type error = | Virtual_class of Longident.t | Private_type of type_expr | Private_label of Longident.t * type_expr - | Private_constructor of constructor_description * type_expr + | Private_constructor of Data_types.constructor_description * type_expr | Unbound_instance_variable of string * string list | Instance_variable_not_mutable of string | Not_subtype of Errortrace.Subtype.error @@ -226,6 +226,9 @@ type error = | Unrefuted_pattern of Typedtree.pattern | Invalid_extension_constructor_payload | Not_an_extension_constructor + | Invalid_atomic_loc_payload + | Label_not_atomic of Longident.t + | Atomic_in_pattern of Longident.t | Literal_overflow of string | Unknown_literal of string * char | Illegal_letrec_pat @@ -239,6 +242,12 @@ type error = | Missing_type_constraint | Wrong_expected_kind of wrong_kind_sort * wrong_kind_context * type_expr | Expr_not_a_record_type of type_expr + | Constructor_labeled_arg + | Partial_tuple_pattern_bad_type + | Extra_tuple_label of string option * type_expr + | Missing_tuple_label of string option * type_expr + | Repeated_tuple_exp_label of string + | Repeated_tuple_pat_label of string exception Error of Location.t * Env.t * error exception Error_forward of Location.error @@ -264,8 +273,8 @@ val type_object: (Env.t -> Location.t -> Parsetree.class_structure -> Typedtree.class_structure * string list) ref val type_package: - (Env.t -> Parsetree.module_expr -> Path.t -> (Longident.t * type_expr) list -> - Typedtree.module_expr * (Longident.t * type_expr) list) ref + (Env.t -> Parsetree.module_expr -> package -> + Typedtree.module_expr * package) ref val constant: Parsetree.constant -> (Asttypes.constant, error) result diff --git a/typing/typedecl.ml b/typing/typedecl.ml index 60bc6b93..7964b41f 100644 --- a/typing/typedecl.ml +++ b/typing/typedecl.ml @@ -75,6 +75,7 @@ type error = | Boxed_and_unboxed | Nonrec_gadt | Invalid_private_row_declaration of type_expr + | Atomic_field_must_be_mutable of string open Typedtree @@ -229,10 +230,15 @@ let transl_labels env univars closed lbls = (fun () -> let arg = Ast_helper.Typ.force_poly arg in let cty = transl_simple_type env ?univars ~closed arg in + let is_atomic = Builtin_attributes.has_atomic attrs in + let is_mutable = match mut with Mutable -> true | Immutable -> false in + if is_atomic && not is_mutable then + raise (Error (loc, Atomic_field_must_be_mutable name.txt)); {ld_id = Ident.create_local name.txt; ld_name = name; ld_uid = Uid.mk ~current_unit:(Env.get_current_unit ()); ld_mutable = mut; + ld_atomic = if is_atomic then Atomic else Nonatomic; ld_type = cty; ld_loc = loc; ld_attributes = attrs} ) in @@ -244,6 +250,7 @@ let transl_labels env univars closed lbls = let ty = match get_desc ty with Tpoly(t,[]) -> t | _ -> ty in {Types.ld_id = ld.ld_id; ld_mutable = ld.ld_mutable; + ld_atomic = ld.ld_atomic; ld_type = ty; ld_loc = ld.ld_loc; ld_attributes = ld.ld_attributes; @@ -360,7 +367,7 @@ let transl_declaration env sdecl (id, uid) = | [] -> bad "it has no fields" | _::_::_ -> bad "it has more than one field" | [{pld_mutable = Mutable}] -> bad "it is mutable" - | [{pld_mutable = Immutable}] -> () + | [{pld_mutable = Immutable; _}] -> () end | Ptype_variant constructors -> begin match constructors with | [] -> bad "it has no constructor" @@ -449,10 +456,16 @@ let transl_declaration env sdecl (id, uid) = | Ptype_record lbls -> let lbls, lbls' = transl_labels env None true lbls in let rep = - if unbox then Record_unboxed false - else if List.for_all (fun l -> is_float env l.Types.ld_type) lbls' - then Record_float - else Record_regular + if unbox then ( + Record_unboxed false + ) else if + List.for_all (fun (l : Types.label_declaration) -> + is_float env l.ld_type && l.ld_atomic = Nonatomic + ) lbls' + then + Record_float + else + Record_regular in Ttype_record lbls, Type_record(lbls', rep) | Ptype_open -> Ttype_open, Type_open @@ -1125,7 +1138,7 @@ let transl_type_decl env rec_flag sdecl_list = (* Translate each declaration. *) let current_slot = ref None in let warn_unused = - Warnings.is_active (Warnings.Unused_type_declaration "") in + Warnings.(is_active (Unused_type_declaration ("", Declaration))) in let ids_slots (id, _uid as ids) = match rec_flag with | Asttypes.Recursive when warn_unused -> @@ -1281,9 +1294,7 @@ let transl_extension_constructor ~scope env type_path type_params end; (* Remove "_" names from parameters used in the constructor *) if not cdescr.cstr_generalized then begin - let vars = - Ctype.free_variables (Btype.newgenty (Ttuple args)) - in + let vars = Ctype.free_variables_list args in List.iter (fun ty -> if get_desc ty = Tvar (Some "_") @@ -1292,12 +1303,13 @@ let transl_extension_constructor ~scope env type_path type_params typext_params end; (* Ensure that constructor's type matches the type being extended *) - let cstr_type_path = Btype.cstr_type_path cdescr in - let cstr_type_params = (Env.find_type cstr_type_path env).type_params in + let cstr_res_type_path = Data_types.cstr_res_type_path cdescr in + let cstr_res_type_params = + (Env.find_type cstr_res_type_path env).type_params in let cstr_types = (Btype.newgenty - (Tconstr(cstr_type_path, cstr_type_params, ref Mnil))) - :: cstr_type_params + (Tconstr(cstr_res_type_path, cstr_res_type_params, ref Mnil))) + :: cstr_res_type_params in let ext_types = (Btype.newgenty @@ -1306,7 +1318,7 @@ let transl_extension_constructor ~scope env type_path type_params in if not (Ctype.is_equal env true cstr_types ext_types) then raise (Error(lid.loc, - Rebind_mismatch(lid.txt, cstr_type_path, type_path))); + Rebind_mismatch(lid.txt, cstr_res_type_path, type_path))); (* Disallow rebinding private constructors to non-private *) begin match cdescr.cstr_private, priv with @@ -1951,7 +1963,8 @@ let explain_unbound_single ppf tv ty = (fun (_l,f) -> match row_field_repr f with Rpresent (Some t) -> t | Reither (_,[t],_) -> t - | Reither (_,tl,_) -> Btype.newgenty (Ttuple tl) + | Reither (_,tl,_) -> + Btype.newgenty (Ttuple (List.map (fun e -> None, e) tl)) | _ -> Btype.newgenty (Ttuple[])) "case" (fun (lab,_) -> "`" ^ lab ^ " of ") | _ -> trivial ty @@ -2003,30 +2016,115 @@ module Reaching_path = struct Fmt.(pp_print_list ~pp_sep:comma) pp_step ppf reaching_path let pp_colon ppf path = - Fmt.fprintf ppf ":@;<1 2>@[%a@]" pp path + Fmt.fprintf ppf ":@\n @[%a@]" pp path end let quoted_out_type ppf ty = Style.as_inline_code !Oprint.out_type ppf ty let quoted_type ppf ty = Style.as_inline_code Printtyp.type_expr ppf ty let quoted_constr = Style.as_inline_code Pprintast.Doc.constr -let report_error_doc ppf = function +let explain_unbounded ty decl ppf = + match decl.type_kind, decl.type_manifest with + | Type_variant (tl, _rep), _ -> + explain_unbound_gen ppf ty tl (fun c -> + let tl = tys_of_constr_args c.Types.cd_args in + Btype.newgenty (Ttuple (List.map (fun t -> None, t) tl)) + ) + "case" (fun ppf c -> + fprintf ppf + "%a of %a" Printtyp.ident c.Types.cd_id + Printtyp.constructor_arguments c.Types.cd_args) + | Type_record (tl, _), _ -> + explain_unbound ppf ty tl (fun l -> l.Types.ld_type) + "field" (fun l -> Ident.name l.Types.ld_id ^ ": ") + | Type_abstract _, Some ty' -> + explain_unbound_single ppf ty ty' + | _ -> () + +let variance (p,n,i) = + let inj = if i then "injective " else "" in + match p, n with + true, true -> inj ^ "invariant" + | true, false -> inj ^ "covariant" + | false, true -> inj ^ "contravariant" + | false, false -> if inj = "" then "unrestricted" else inj + +let variance_context = + let open Typedecl_variance in + function + | Type_declaration (id, decl) -> + Out_type.add_type_declaration_to_preparation id decl; + Format_doc.doc_printf "In the definition@\n @[%a@]@\n" + (Style.as_inline_code @@ Out_type.prepared_type_declaration id) + decl + | Gadt_constructor c -> + Out_type.add_constructor_to_preparation c; + doc_printf "In the GADT constructor@\n @[%a@]@\n" + (Style.as_inline_code Out_type.prepared_constructor) + c + | Extension_constructor (id, e) -> + Out_type.add_extension_constructor_to_preparation e; + doc_printf "In the extension constructor@\n @[%a@]@\n" + (Out_type.prepared_extension_constructor id) + e + +let variance_variable_error ~v1 ~v2 variable error ppf = + let open Typedecl_variance in + match error with + | Variance_not_reflected -> + fprintf ppf + "the type variable@ %a@ has a variance that@ \ + is not reflected by its occurrence in type parameters.@ \ + It was expected to be %s,@ but it is %s." + (Style.as_inline_code Out_type.prepared_type_expr) variable + (variance v2) (variance v1) + | No_variable -> + fprintf ppf + "the type variable@ %a@ cannot be deduced@ \ + from the type parameters." + (Style.as_inline_code Out_type.prepared_type_expr) variable + | Variance_not_deducible -> + fprintf ppf + "the type variable@ %a@ has a variance that@ \ + cannot be deduced from the type parameters.@ \ + It was expected to be %s,@ but it is %s." + (Style.as_inline_code Out_type.prepared_type_expr) variable + (variance v2) (variance v1) + +let variance_error ~loc ~v1 ~v2 = + let open Typedecl_variance in + function + | Variance_variable_error { error; variable; context } -> + Out_type.prepare_for_printing [ variable ]; + let intro = variance_context context in + Location.errorf ~loc "%a%t" pp_doc intro + (variance_variable_error ~v1 ~v2 variable error) + | Variance_not_satisfied n -> + Location.errorf ~loc + "In this definition, expected parameter@ \ + variances are not satisfied.@ \ + The %d%s type parameter was expected to be %s,@ but it is %s." + n (Misc.ordinal_suffix n) + (variance v2) (variance v1) + +let report_error ~loc = function | Repeated_parameter -> - fprintf ppf "A type parameter occurs several times" + Location.errorf ~loc "A type parameter occurs several times" | Duplicate_constructor s -> - fprintf ppf "Two constructors are named %a" Style.inline_code s + Location.errorf ~loc "Two constructors are named %a" Style.inline_code s | Too_many_constructors -> - fprintf ppf - "@[Too many non-constant constructors@ -- maximum is %i %s@]" - (Config.max_tag + 1) "non-constant constructors" + Location.errorf ~loc + "Too many non-constant constructors@ \ + -- maximum is %i non-constant constructors@]" + (Config.max_tag + 1) | Duplicate_label s -> - fprintf ppf "Two labels are named %a" Style.inline_code s + Location.errorf "Two labels are named %a" Style.inline_code s | Recursive_abbrev (s, env, reaching_path) -> let reaching_path = Reaching_path.simplify reaching_path in Printtyp.wrap_printing_env ~error:true env @@ fun () -> Out_type.reset (); Reaching_path.add_to_preparation reaching_path; - fprintf ppf "@[The type abbreviation %a is cyclic%a@]" + Location.errorf ~loc "The type abbreviation %a is cyclic%a" Style.inline_code s Reaching_path.pp_colon reaching_path | Cycle_in_def (s, env, reaching_path) -> @@ -2034,35 +2132,37 @@ let report_error_doc ppf = function Printtyp.wrap_printing_env ~error:true env @@ fun () -> Out_type.reset (); Reaching_path.add_to_preparation reaching_path; - fprintf ppf "@[The definition of %a contains a cycle%a@]" + Location.errorf ~loc "The definition of %a contains a cycle%a" Style.inline_code s Reaching_path.pp_colon reaching_path - | Definition_mismatch (ty, _env, None) -> - fprintf ppf "@[@[%s@ %s@;<1 2>%a@]@]" - "This variant or record definition" "does not match that of type" - quoted_type ty - | Definition_mismatch (ty, env, Some err) -> - fprintf ppf "@[@[%s@ %s@;<1 2>%a@]%a@]" - "This variant or record definition" "does not match that of type" + | Definition_mismatch (ty, env, err) -> + let err ppf = match err with + | None -> () + | Some err -> + Format_doc.fprintf ppf "@\n@[%a@]" + (Includecore.report_type_mismatch "the original" "this" "definition" + env) err + in + Location.errorf ~loc + "@[This variant or record definition@ \ + does not match that of type@;<1 2>%a@]%t" quoted_type ty - (Includecore.report_type_mismatch - "the original" "this" "definition" env) err | Constraint_failed (env, err) -> - let msg = Format_doc.Doc.msg in - fprintf ppf "@[Constraints are not satisfied in this type.@ "; - Errortrace_report.unification ppf env err - (msg "Type") - (msg "should be an instance of"); - fprintf ppf "@]" + Location.errorf ~loc "Constraints are not satisfied in this type.@\n%t" + (fun ppf -> + Errortrace_report.unification ppf env err + (Doc.msg "Type") + (Doc.msg "should be an instance of") + ) | Non_regular { definition; used_as; defined_as; reaching_path } -> let reaching_path = Reaching_path.simplify reaching_path in Out_type.prepare_for_printing [used_as; defined_as]; Reaching_path.add_to_preparation reaching_path; - fprintf ppf - "@[This recursive type is not regular.@ \ - The type constructor %a is defined as@;<1 2>type %a@ \ - but it is used as@;<1 2>%a%t\ + Location.errorf ~loc + "This recursive type is not regular.@ \ + @[The type constructor %a is defined as@;<1 2>type %a@ \ + but it is used as@;<1 2>%a%t@,\ All uses need to match the definition for the recursive type \ to be regular.@]" Style.inline_code (Path.name definition) @@ -2071,197 +2171,143 @@ let report_error_doc ppf = function (fun pp -> let is_expansion = function Expands_to _ -> true | _ -> false in if List.exists is_expansion reaching_path then - fprintf pp "@ after the following expansion(s)%a@ " + fprintf pp "@ after the following expansion(s)%a" Reaching_path.pp_colon reaching_path - else fprintf pp ".@ ") + else fprintf pp ".") | Inconsistent_constraint (env, err) -> - let msg = Format_doc.Doc.msg in - fprintf ppf "@[The type constraints are not consistent.@ "; - Errortrace_report.unification ppf env err - (msg "Type") - (msg "is not compatible with type"); - fprintf ppf "@]" + Location.errorf ~loc "The type constraints are not consistent.@\n%t" + (fun ppf -> Errortrace_report.unification ppf env err + (Doc.msg "Type") + (Doc.msg "is not compatible with type") + ) | Type_clash (env, err) -> let msg = Format_doc.Doc.msg in - Errortrace_report.unification ppf env err + Location.errorf ~loc "%t" @@ fun ppf -> + Errortrace_report.unification ppf env err (msg "This type constructor expands to type") (msg "but is used here with type") | Null_arity_external -> - fprintf ppf "External identifiers must be functions" + Location.errorf ~loc "External identifiers must be functions" | Missing_native_external -> - fprintf ppf "@[An external function with more than 5 arguments \ - requires a second stub function@ \ - for native-code compilation@]" + Location.errorf ~loc + "An external function with more than 5 arguments \ + requires a second stub function@ + for native-code compilation" | Unbound_type_var (ty, decl) -> - fprintf ppf "@[A type variable is unbound in this type declaration"; - begin match decl.type_kind, decl.type_manifest with - | Type_variant (tl, _rep), _ -> - explain_unbound_gen ppf ty tl (fun c -> - let tl = tys_of_constr_args c.Types.cd_args in - Btype.newgenty (Ttuple tl) - ) - "case" (fun ppf c -> - fprintf ppf - "%a of %a" Printtyp.ident c.Types.cd_id - Printtyp.constructor_arguments c.Types.cd_args) - | Type_record (tl, _), _ -> - explain_unbound ppf ty tl (fun l -> l.Types.ld_type) - "field" (fun l -> Ident.name l.Types.ld_id ^ ": ") - | Type_abstract _, Some ty' -> - explain_unbound_single ppf ty ty' - | _ -> () - end; - fprintf ppf "@]" + Location.errorf ~loc + "A type variable is unbound in this type declaration%t" + (explain_unbounded ty decl) | Unbound_type_var_ext (ty, ext) -> - fprintf ppf "@[A type variable is unbound in this extension constructor"; - let args = tys_of_constr_args ext.ext_args in - explain_unbound ppf ty args (fun c -> c) "type" (fun _ -> ""); - fprintf ppf "@]" + let explain ppf = + let args = tys_of_constr_args ext.ext_args in + explain_unbound ppf ty args (fun c -> c) "type" (fun _ -> "") + in + Location.errorf ~loc + "A type variable is unbound in this extension constructor%t" + explain | Cannot_extend_private_type path -> - fprintf ppf "@[%s@ %a@]" - "Cannot extend private type definition" + Location.errorf ~loc + "Cannot extend private type definition@ %a" Printtyp.path path | Not_extensible_type path -> - fprintf ppf "@[%s@ %a@ %s@]" - "Type definition" + Location.errorf ~loc + "Type definition@ %a@ is not extensible@]" (Style.as_inline_code Printtyp.path) path - "is not extensible" | Extension_mismatch (path, env, err) -> - fprintf ppf "@[@[%s@ %s@;<1 2>%a@]%a@]" - "This extension" "does not match the definition of type" + Location.errorf ~loc + "@[This extension@ does not match the definition of type\ + @;<1 2>%a@]@\n@[%a@]" Style.inline_code (Path.name path) (Includecore.report_type_mismatch "the type" "this extension" "definition" env) err | Rebind_wrong_type (lid, env, err) -> - let msg = Format_doc.doc_printf in + Location.errorf ~loc "%t" @@ fun ppf -> Errortrace_report.unification ppf env err - (msg "The constructor %a@ has type" + (doc_printf "The constructor %a@ has type" quoted_constr lid) - (msg "but was expected to be of type") + (Doc.msg "but was expected to be of type") | Rebind_mismatch (lid, p, p') -> - fprintf ppf - "@[%s@ %a@ %s@ %a@ %s@ %s@ %a@]" - "The constructor" + Location.errorf ~loc + "The constructor@ %a@ extends type@ %a@ \ + whose declaration does not match@ the declaration of type@ %a" quoted_constr lid - "extends type" Style.inline_code (Path.name p) - "whose declaration does not match" - "the declaration of type" Style.inline_code (Path.name p') + Style.inline_code (Path.name p) + Style.inline_code (Path.name p') | Rebind_private lid -> - fprintf ppf "@[%s@ %a@ %s@]" - "The constructor" + Location.errorf ~loc "The constructor@ %a@ is private" quoted_constr lid - "is private" | Variance (Typedecl_variance.Bad_variance (n, v1, v2)) -> - let variance (p,n,i) = - let inj = if i then "injective " else "" in - match p, n with - true, true -> inj ^ "invariant" - | true, false -> inj ^ "covariant" - | false, true -> inj ^ "contravariant" - | false, false -> if inj = "" then "unrestricted" else inj - in - (match n with - | Variance_variable_error { error; variable; context } -> - Out_type.prepare_for_printing [ variable ]; - begin match context with - | Type_declaration (id, decl) -> - Out_type.add_type_declaration_to_preparation id decl; - fprintf ppf "@[%s@;<1 2>%a@;" - "In the definition" - (Style.as_inline_code @@ Out_type.prepared_type_declaration id) - decl - | Gadt_constructor c -> - Out_type.add_constructor_to_preparation c; - fprintf ppf "@[%s@;<1 2>%a@;" - "In the GADT constructor" - (Style.as_inline_code Out_type.prepared_constructor) - c - | Extension_constructor (id, e) -> - Out_type.add_extension_constructor_to_preparation e; - fprintf ppf "@[%s@;<1 2>%a@;" - "In the extension constructor" - (Out_type.prepared_extension_constructor id) - e - end; - begin match error with - | Variance_not_reflected -> - fprintf ppf "@[%s@ %a@ %s@ %s@ It" - "the type variable" - (Style.as_inline_code Out_type.prepared_type_expr) variable - "has a variance that" - "is not reflected by its occurrence in type parameters." - | No_variable -> - fprintf ppf "@[%s@ %a@ %s@ %s@]@]" - "the type variable" - (Style.as_inline_code Out_type.prepared_type_expr) variable - "cannot be deduced" - "from the type parameters." - | Variance_not_deducible -> - fprintf ppf "@[%s@ %a@ %s@ %s@ It" - "the type variable" - (Style.as_inline_code Out_type.prepared_type_expr) variable - "has a variance that" - "cannot be deduced from the type parameters." - end - | Variance_not_satisfied n -> - fprintf ppf "@[@[%s@ %s@ The %d%s type parameter" - "In this definition, expected parameter" - "variances are not satisfied." - n (Misc.ordinal_suffix n)); - (match n with - | Variance_variable_error { error = No_variable; _ } -> () - | _ -> - fprintf ppf " was expected to be %s,@ but it is %s.@]@]" - (variance v2) (variance v1)) + variance_error ~loc ~v1 ~v2 n | Unavailable_type_constructor p -> - fprintf ppf "The definition of type %a@ is unavailable" + Location.errorf ~loc "The definition of type %a@ is unavailable" (Style.as_inline_code Printtyp.path) p - | Variance Typedecl_variance.Varying_anonymous -> - fprintf ppf "@[%s@ %s@ %s@]" - "In this GADT definition," "the variance of some parameter" - "cannot be checked" + | Variance (Typedecl_variance.Varying_anonymous (n, reason)) -> + let reason_text = + match reason with + | Variable_constrained ty -> + dprintf + ", because the type variable %a appears@ in other parameters.@ \ + In GADTS, covariant or contravariant type parameters@ \ + must not depend@ on other parameters." + (Style.as_inline_code Printtyp.type_expr) ty + | Variable_instantiated ty -> + dprintf + ", because it is instantiated to the type %a.@ \ + Covariant or contravariant type parameters@ \ + may only appear@ as type variables@ \ + in GADT constructor definitions." + (Style.as_inline_code Printtyp.type_expr) ty + in + Location.errorf ~loc + "In this GADT constructor definition,@ \ + the variance of the@ %d%s parameter@ \ + cannot be checked%t" + n (Misc.ordinal_suffix n) + reason_text | Val_in_structure -> - fprintf ppf "Value declarations are only allowed in signatures" + Location.errorf ~loc "Value declarations are only allowed in signatures" | Multiple_native_repr_attributes -> - fprintf ppf "Too many %a/%a attributes" + Location.errorf ~loc "Too many %a/%a attributes" Style.inline_code "[@@unboxed]" Style.inline_code "[@@untagged]" | Cannot_unbox_or_untag_type Unboxed -> - fprintf ppf "@[Don't know how to unbox this type.@ \ - Only %a, %a, %a, and %a can be unboxed.@]" + Location.errorf ~loc + "Don't know how to unbox this type.@ \ + Only %a, %a, %a, and %a can be unboxed." Style.inline_code "float" Style.inline_code "int32" Style.inline_code "int64" Style.inline_code "nativeint" | Cannot_unbox_or_untag_type Untagged -> - fprintf ppf "@[Don't know how to untag this type. Only %a@ \ - and other immediate types can be untagged.@]" + Location.errorf ~loc + "Don't know how to untag this type. Only %a@ \ + and other immediate types can be untagged." Style.inline_code "int" | Deep_unbox_or_untag_attribute kind -> - fprintf ppf - "@[The attribute %a should be attached to@ \ + Location.errorf ~loc + "The attribute %a should be attached to@ \ a direct argument or result of the primitive,@ \ - it should not occur deeply into its type.@]" + it should not occur deeply into its type." Style.inline_code (match kind with Unboxed -> "@unboxed" | Untagged -> "@untagged") | Immediacy (Typedecl_immediacy.Bad_immediacy_attribute violation) -> (match violation with | Type_immediacy.Violation.Not_always_immediate -> - fprintf ppf - "@[Types@ marked@ with@ the@ immediate@ attribute@ must@ be@ \ - non-pointer@ types@ like@ %a@ or@ %a.@]" + Location.errorf ~loc + "Types@ marked@ with@ the@ immediate@ attribute@ must@ be@ \ + non-pointer@ types@ like@ %a@ or@ %a." Style.inline_code "int" Style.inline_code "bool" | Type_immediacy.Violation.Not_always_immediate_on_64bits -> - fprintf ppf - "@[Types@ marked@ with@ the@ %a@ attribute@ must@ be@ \ - produced@ using@ the@ %a@ functor.@]" + Location.errorf ~loc + "Types@ marked@ with@ the@ %a@ attribute@ must@ be@ \ + produced@ using@ the@ %a@ functor." Style.inline_code "immediate64" Style.inline_code "Stdlib.Sys.Immediate64.Make" ) | Bad_unboxed_attribute msg -> - fprintf ppf "@[This type cannot be unboxed because@ %s.@]" msg + Location.errorf ~loc "This type cannot be unboxed because@ %s." msg | Separability (Typedecl_separability.Non_separable_evar evar) -> let pp_evar ppf = function | None -> @@ -2269,37 +2315,44 @@ let report_error_doc ppf = function | Some str -> fprintf ppf "the existential variable %a" (Style.as_inline_code Pprintast.Doc.tyvar) str in - fprintf ppf "@[This type cannot be unboxed because@ \ - it might contain both float and non-float values,@ \ - depending on the instantiation of %a.@ \ - You should annotate it with %a.@]" + Location.errorf ~loc + "This type cannot be unboxed because@ \ + it might contain both float and non-float values,@ \ + depending on the instantiation of %a.@ \ + You should annotate it with %a." pp_evar evar Style.inline_code "[@@ocaml.boxed]" | Boxed_and_unboxed -> - fprintf ppf "@[A type cannot be boxed and unboxed at the same time.@]" + Location.errorf ~loc + "A type cannot be boxed and unboxed at the same time." | Nonrec_gadt -> - fprintf ppf - "@[GADT case syntax cannot be used in a %a block.@]" + Location.errorf ~loc + "GADT case syntax cannot be used in a %a block." Style.inline_code "nonrec" | Invalid_private_row_declaration ty -> let pp_private ppf ty = fprintf ppf "private %a" Printtyp.type_expr ty in - fprintf ppf - "@[This private row type declaration is invalid.@ \ - The type expression on the right-hand side reduces to@;<1 2>%a@ \ - which does not have a free row type variable.@]@,\ - @[@[@{Hint@}: If you intended to define a private \ - type abbreviation,@ \ - write explicitly@]@;<1 2>%a@]" + let sub = [ + Location.msg + "@[@[@{Hint@}: If you intended to define a private \ + type abbreviation,@ \ + write explicitly@]@;<1 2>%a@]" + (Style.as_inline_code pp_private) ty + ] + in + Location.errorf ~sub ~loc + "This private row type declaration is invalid.@\n\ + @[The type expression on the right-hand side reduces to@;<1 2>%a@ \ + which does not have a free row type variable.@]" (Style.as_inline_code Printtyp.type_expr) ty - (Style.as_inline_code pp_private) ty + | Atomic_field_must_be_mutable name -> + Location.errorf ~loc + "@[The label %a must be mutable to be declared atomic.@]" + Style.inline_code name let () = Location.register_error_of_exn (function - | Error (loc, err) -> - Some (Location.error_of_printer ~loc report_error_doc err) + | Error (loc, err) -> Some (report_error ~loc err) | _ -> None ) - -let report_error = Format_doc.compat report_error_doc diff --git a/typing/typedecl.mli b/typing/typedecl.mli index 38c00487..4ad1f3f9 100644 --- a/typing/typedecl.mli +++ b/typing/typedecl.mli @@ -106,8 +106,8 @@ type error = | Boxed_and_unboxed | Nonrec_gadt | Invalid_private_row_declaration of type_expr + | Atomic_field_must_be_mutable of string exception Error of Location.t * error -val report_error: error Format_doc.format_printer -val report_error_doc: error Format_doc.printer +val report_error: loc:Location.t -> error -> Location.report diff --git a/typing/typedecl_separability.ml b/typing/typedecl_separability.ml index c8f2f3b1..c2a26375 100644 --- a/typing/typedecl_separability.ml +++ b/typing/typedecl_separability.ml @@ -132,8 +132,8 @@ let rec immediate_subtypes : type_expr -> type_expr list = fun ty -> on which immediate_subtypes is called from [check_type] *) | Tarrow(_,ty1,ty2,_) -> [ty1; ty2] - | Ttuple(tys) -> tys - | Tpackage(_, fl) -> (snd (List.split fl)) + | Ttuple(tys) -> List.map snd tys + | Tpackage pack -> (snd (List.split pack.pack_cstrs)) | Tobject(row,class_ty) -> let class_subtys = match !class_ty with @@ -409,14 +409,14 @@ let check_type | (Tvariant(_) , Sep ) | (Tobject(_,_) , Sep ) | ((Tnil | Tfield _) , Sep ) - | (Tpackage(_,_) , Sep ) -> empty + | (Tpackage _ , Sep ) -> empty (* "Deeply separable" case for these same constructors. *) | (Tarrow _ , Deepsep) | (Ttuple _ , Deepsep) | (Tvariant(_) , Deepsep) | (Tobject(_,_) , Deepsep) | ((Tnil | Tfield _) , Deepsep) - | (Tpackage(_,_) , Deepsep) -> + | (Tpackage _ , Deepsep) -> let tys = immediate_subtypes ty in let on_subtype context ty = context ++ check_type (Hyps.guard hyps) ty Deepsep in diff --git a/typing/typedecl_variance.ml b/typing/typedecl_variance.ml index c384e8c4..19fe2891 100644 --- a/typing/typedecl_variance.ml +++ b/typing/typedecl_variance.ml @@ -40,9 +40,13 @@ type variance_error = variable : type_expr } +type anonymous_variance_error = + | Variable_constrained of type_expr + | Variable_instantiated of type_expr + type error = | Bad_variance of variance_error * surface_variance * surface_variance - | Varying_anonymous + | Varying_anonymous of int * anonymous_variance_error exception Error of Location.t * error @@ -65,7 +69,7 @@ let compute_variance env visited vari ty = compute_variance_rec (Variance.conjugate vari) ty1; compute_same ty2 | Ttuple tl -> - List.iter compute_same tl + List.iter (fun (_,t) -> compute_same t) tl | Tconstr (path, tl, _) -> let open Variance in if tl = [] then () else begin @@ -99,9 +103,9 @@ let compute_variance env visited vari ty = | Tpoly (ty, _) -> compute_same ty | Tvar _ | Tnil | Tlink _ | Tunivar _ -> () - | Tpackage (_, fl) -> + | Tpackage pack -> let v = Variance.(compose vari full) in - List.iter (fun (_, ty) -> compute_variance_rec v ty) fl + List.iter (fun (_, ty) -> compute_variance_rec v ty) pack.pack_cstrs in compute_variance_rec vari ty @@ -118,7 +122,10 @@ let compute_variance_type env ~check (required, loc) decl tyl = List.map (fun (c,n,i) -> let i = if check_injectivity then i else false in - if c || n then (c,n,i) else (true,true,i)) + (* c and n reflects respectively + and - in the syntax, + and maps respectively to `not May_neg` and `not May_pos` + in the {!Types.Variance.f} fields *) + not n, not c, i) required in (* Prepare *) @@ -174,8 +181,7 @@ let compute_variance_type env ~check (required, loc) decl tyl = (c,n,i))))) params required; (* Check propagation from constrained parameters *) - let args = Btype.newgenty (Ttuple params) in - let fvl = Ctype.free_variables args in + let fvl = Ctype.free_variables_list params in let fvl = List.filter (fun v -> not (List.exists (eq_type v) params)) fvl in (* If there are no extra variables there is nothing to do *) @@ -249,8 +255,12 @@ let add_false = List.map (fun ty -> false, ty) or it is a variable appearing in another parameter *) let constrained vars ty = match get_desc ty with - | Tvar _ -> List.exists (List.exists (eq_type ty)) vars - | _ -> true + | Tvar _ -> + begin match List.find_map (List.find_opt (eq_type ty)) vars with + | Some var -> Some (Variable_constrained var) + | None -> None + end + | _ -> Some (Variable_instantiated ty) let for_constr = function | Types.Cstr_tuple l -> add_false l @@ -259,8 +269,8 @@ let for_constr = function (fun {Types.ld_mutable; ld_type} -> (ld_mutable = Mutable, ld_type)) l -let compute_variance_gadt env ~check (required, loc as rloc) decl - (tl, ret_type_opt) = +let compute_variance_gadt env ~check (required, _ as rloc) decl + (cloc, tl, ret_type_opt) = match ret_type_opt with | None -> compute_variance_type env ~check rloc {decl with type_private = Private} @@ -272,14 +282,20 @@ let compute_variance_gadt env ~check (required, loc as rloc) decl let fvl = List.map (Ctype.free_variables ?env:None) tyl in let _ = List.fold_left2 - (fun (fv1,fv2) ty (c,n,_) -> + (fun (index, fv1,fv2) ty (c,n,_) -> match fv2 with [] -> assert false | fv :: fv2 -> (* fv1 @ fv2 = free_variables of other parameters *) - if (c||n) && constrained (fv1 @ fv2) ty then - raise (Error(loc, Varying_anonymous)); - (fv :: fv1, fv2)) - ([], fvl) tyl required + if (c || n) + then begin + match constrained (fv1 @ fv2) ty with + | None -> () + | Some reason -> + raise (Error(cloc, + Varying_anonymous (index, reason))) + end; + (succ index, fv :: fv1, fv2)) + (1, [], fvl) tyl required in compute_variance_type env ~check rloc {decl with type_params = tyl; type_private = Private} @@ -293,7 +309,7 @@ let compute_variance_extension env decl ext rloc = let ext = ext.Typedtree.ext_type in compute_variance_gadt env ~check rloc {decl with type_params = ext.ext_type_params} - (ext.ext_args, ext.ext_ret_type) + (ext.ext_loc, ext.ext_args, ext.ext_ret_type) let compute_variance_gadt_constructor env ~check rloc decl tl = let check = @@ -302,18 +318,20 @@ let compute_variance_gadt_constructor env ~check rloc decl tl = | None -> None in compute_variance_gadt env ~check rloc decl - (tl.Types.cd_args, tl.Types.cd_res) + (tl.Types.cd_loc, tl.Types.cd_args, tl.Types.cd_res) let compute_variance_decl env ~check decl (required, _ as rloc) = let check = Option.map (fun id -> Type_declaration (id, decl)) check in let abstract = Btype.type_kind_is_abstract decl in - if (abstract || decl.type_kind = Type_open) && decl.type_manifest = None then + match decl with + | {type_kind = Type_abstract _ | Type_open; type_manifest = None} -> List.map (fun (c, n, i) -> make (not n) (not c) (not abstract || i)) required - else begin + | { type_kind = _; type_manifest = Some _ } + | { type_kind = Type_record _ | Type_variant _; type_manifest = _ } -> let mn = match decl.type_manifest with None -> [] @@ -356,7 +374,6 @@ let compute_variance_decl env ~check decl (required, _ as rloc) = if mn = [] || not abstract then List.map Variance.strengthen vari else vari - end let is_hash id = let s = Ident.name id in @@ -403,6 +420,7 @@ let transl_variance (v, i) = | Covariant -> (true, false) | Contravariant -> (false, true) | NoVariance -> (false, false) + | Bivariant -> (true, true) in (co, cn, match i with Injective -> true | NoInjectivity -> false) diff --git a/typing/typedecl_variance.mli b/typing/typedecl_variance.mli index 6392e61d..e80be0e5 100644 --- a/typing/typedecl_variance.mli +++ b/typing/typedecl_variance.mli @@ -47,9 +47,13 @@ type variance_error = variable : type_expr } +type anonymous_variance_error = + | Variable_constrained of type_expr + | Variable_instantiated of type_expr + type error = | Bad_variance of variance_error * surface_variance * surface_variance - | Varying_anonymous + | Varying_anonymous of int * anonymous_variance_error exception Error of Location.t * error diff --git a/typing/typedtree.ml b/typing/typedtree.ml index ff0060e1..2739321b 100644 --- a/typing/typedtree.ml +++ b/typing/typedtree.ml @@ -17,6 +17,7 @@ open Asttypes open Types +open Data_types module Uid = Shape.Uid @@ -57,9 +58,11 @@ and 'k pattern_desc = | Tpat_any : value pattern_desc | Tpat_var : Ident.t * string loc * Uid.t -> value pattern_desc | Tpat_alias : - value general_pattern * Ident.t * string loc * Uid.t -> value pattern_desc + value general_pattern * Ident.t * string loc * Uid.t * type_expr -> + value pattern_desc | Tpat_constant : constant -> value pattern_desc - | Tpat_tuple : value general_pattern list -> value pattern_desc + | Tpat_tuple : + (string option * value general_pattern) list -> value pattern_desc | Tpat_construct : Longident.t loc * constructor_description * value general_pattern list * (Ident.t loc list * core_type) option -> @@ -71,7 +74,8 @@ and 'k pattern_desc = (Longident.t loc * label_description * value general_pattern) list * closed_flag -> value pattern_desc - | Tpat_array : value general_pattern list -> value pattern_desc + | Tpat_array : + mutable_flag * value general_pattern list -> value pattern_desc | Tpat_lazy : value general_pattern -> value pattern_desc (* computation patterns *) | Tpat_value : tpat_value_argument -> computation pattern_desc @@ -103,22 +107,23 @@ and expression_desc = | Texp_constant of constant | Texp_let of rec_flag * value_binding list * expression | Texp_function of function_param list * function_body - | Texp_apply of expression * (arg_label * expression option) list + | Texp_apply of expression * (arg_label * apply_arg) list | Texp_match of expression * computation case list * value case list * partial | Texp_try of expression * value case list * value case list - | Texp_tuple of expression list + | Texp_tuple of (string option * expression) list | Texp_construct of Longident.t loc * constructor_description * expression list | Texp_variant of label * expression option | Texp_record of { - fields : ( Types.label_description * record_label_definition ) array; + fields : ( Data_types.label_description * record_label_definition ) array; representation : Types.record_representation; extended_expression : expression option; } + | Texp_atomic_loc of expression * Longident.t loc * label_description | Texp_field of expression * Longident.t loc * label_description | Texp_setfield of expression * Longident.t loc * label_description * expression - | Texp_array of expression list + | Texp_array of mutable_flag * expression list | Texp_ifthenelse of expression * expression * expression option | Texp_sequence of expression * expression | Texp_while of expression * expression @@ -201,6 +206,12 @@ and binding_op = bop_loc : Location.t; } +and ('a, 'b) arg_or_omitted = + | Arg of 'a + | Omitted of 'b + +and apply_arg = (expression, unit) arg_or_omitted + (* Value expressions for the class language *) and class_expr = @@ -218,7 +229,7 @@ and class_expr_desc = | Tcl_fun of arg_label * pattern * (Ident.t * expression) list * class_expr * partial - | Tcl_apply of class_expr * (arg_label * expression option) list + | Tcl_apply of class_expr * (arg_label * apply_arg) list | Tcl_let of rec_flag * value_binding list * (Ident.t * expression) list * class_expr | Tcl_constraint of @@ -473,7 +484,7 @@ and core_type_desc = Ttyp_any | Ttyp_var of string | Ttyp_arrow of arg_label * core_type * core_type - | Ttyp_tuple of core_type list + | Ttyp_tuple of (string option * core_type) list | Ttyp_constr of Path.t * Longident.t loc * core_type list | Ttyp_object of object_field list * closed_flag | Ttyp_class of Path.t * Longident.t loc * core_type list @@ -484,10 +495,10 @@ and core_type_desc = | Ttyp_open of Path.t * Longident.t loc * core_type and package_type = { - pack_path : Path.t; - pack_fields : (Longident.t loc * core_type) list; - pack_type : Types.module_type; - pack_txt : Longident.t loc; + tpt_path : Path.t; + tpt_cstrs : (Longident.t loc * core_type) list; + tpt_type : Types.module_type; + tpt_txt : Longident.t loc; } and row_field = { @@ -545,6 +556,7 @@ and label_declaration = ld_name: string loc; ld_uid: Uid.t; ld_mutable: mutable_flag; + ld_atomic: atomic_flag; ld_type: core_type; ld_loc: Location.t; ld_attributes: attribute list; @@ -720,13 +732,13 @@ type pattern_action = let shallow_iter_pattern_desc : type k . pattern_action -> k pattern_desc -> unit = fun f -> function - | Tpat_alias(p, _, _, _) -> f.f p - | Tpat_tuple patl -> List.iter f.f patl + | Tpat_alias(p, _, _, _, _) -> f.f p + | Tpat_tuple patl -> List.iter (fun (_, p) -> f.f p) patl | Tpat_construct(_, _, patl, _) -> List.iter f.f patl | Tpat_variant(_, pat, _) -> Option.iter f.f pat | Tpat_record (lbl_pat_list, _) -> List.iter (fun (_, _, pat) -> f.f pat) lbl_pat_list - | Tpat_array patl -> List.iter f.f patl + | Tpat_array (_, patl) -> List.iter f.f patl | Tpat_lazy p -> f.f p | Tpat_any | Tpat_var _ @@ -740,16 +752,16 @@ type pattern_transformation = let shallow_map_pattern_desc : type k . pattern_transformation -> k pattern_desc -> k pattern_desc = fun f d -> match d with - | Tpat_alias (p1, id, s, uid) -> - Tpat_alias (f.f p1, id, s, uid) + | Tpat_alias (p1, id, s, uid, ty) -> + Tpat_alias (f.f p1, id, s, uid, ty) | Tpat_tuple pats -> - Tpat_tuple (List.map f.f pats) + Tpat_tuple (List.map (fun (label, pat) -> label, f.f pat) pats) | Tpat_record (lpats, closed) -> Tpat_record (List.map (fun (lid, l,p) -> lid, l, f.f p) lpats, closed) | Tpat_construct (lid, c, pats, ty) -> Tpat_construct (lid, c, List.map f.f pats, ty) - | Tpat_array pats -> - Tpat_array (List.map f.f pats) + | Tpat_array (am, pats) -> + Tpat_array (am, List.map f.f pats) | Tpat_lazy p1 -> Tpat_lazy (f.f p1) | Tpat_variant (x1, Some p1, x2) -> Tpat_variant (x1, Some (f.f p1), x2) @@ -804,9 +816,9 @@ let rec iter_bound_idents match pat.pat_desc with | Tpat_var (id, s, uid) -> f (id,s,pat.pat_type, uid) - | Tpat_alias(p, id, s, uid) -> + | Tpat_alias(p, id, s, uid, ty) -> iter_bound_idents f p; - f (id,s,pat.pat_type, uid) + f (id, s, ty, uid) | Tpat_or(p1, _, _) -> (* Invariant : both arguments bind the same variables *) iter_bound_idents f p1 @@ -849,10 +861,10 @@ let rec alpha_pat {p with pat_desc = try Tpat_var (alpha_var env id, s, uid) with | Not_found -> Tpat_any} - | Tpat_alias (p1, id, s, uid) -> + | Tpat_alias (p1, id, s, uid, ty) -> let new_p = alpha_pat env p1 in begin try - {p with pat_desc = Tpat_alias (new_p, alpha_var env id, s, uid)} + {p with pat_desc = Tpat_alias (new_p, alpha_var env id, s, uid, ty)} with | Not_found -> new_p end @@ -893,3 +905,7 @@ let split_pattern pat = combine_opts (into cpat) exns1 exns2 in split_pattern pat + +let map_apply_arg f = function + | Arg arg -> Arg (f arg) + | Omitted _ as arg -> arg diff --git a/typing/typedtree.mli b/typing/typedtree.mli index 7dd2ed7a..8459b4b3 100644 --- a/typing/typedtree.mli +++ b/typing/typedtree.mli @@ -81,17 +81,21 @@ and 'k pattern_desc = | Tpat_var : Ident.t * string loc * Uid.t -> value pattern_desc (** x *) | Tpat_alias : - value general_pattern * Ident.t * string loc * Uid.t -> value pattern_desc + value general_pattern * Ident.t * string loc * Uid.t * Types.type_expr -> + value pattern_desc (** P as a *) | Tpat_constant : constant -> value pattern_desc (** 1, 'a', "true", 1.0, 1l, 1L, 1n *) - | Tpat_tuple : value general_pattern list -> value pattern_desc - (** (P1, ..., Pn) + | Tpat_tuple : + (string option * value general_pattern) list -> value pattern_desc + (** (P1, ..., Pn) [(None,P1); ...; (None,Pn)]) + (L1:P1, ... Ln:Pn) [(Some L1,P1); ...; (Some Ln,Pn)]) + Any mix, e.g. (L1:P1, P2) [(Some L1,P1); ...; (None,P2)]) Invariant: n >= 2 *) | Tpat_construct : - Longident.t loc * Types.constructor_description * + Longident.t loc * Data_types.constructor_description * value general_pattern list * (Ident.t loc list * core_type) option -> value pattern_desc (** C ([], None) @@ -111,15 +115,18 @@ and 'k pattern_desc = See {!Types.row_desc} for an explanation of the last parameter. *) | Tpat_record : - (Longident.t loc * Types.label_description * value general_pattern) list * - closed_flag -> - value pattern_desc + (Longident.t loc + * Data_types.label_description + * value general_pattern + ) list + * closed_flag + -> value pattern_desc (** { l1=P1; ...; ln=Pn } (flag = Closed) { l1=P1; ...; ln=Pn; _} (flag = Open) Invariant: n > 0 *) - | Tpat_array : value general_pattern list -> value pattern_desc + | Tpat_array : mutable_flag * value general_pattern list -> value pattern_desc (** [| P1; ...; Pn |] *) | Tpat_lazy : value general_pattern -> value pattern_desc (** lazy P *) @@ -195,10 +202,10 @@ and expression_desc = Parameters' effects are run left-to-right when an n-ary function is saturated with n arguments. *) - | Texp_apply of expression * (arg_label * expression option) list + | Texp_apply of expression * (arg_label * apply_arg) list (** E0 ~l1:E1 ... ~ln:En - The expression can be None if the expression is abstracted over + The expression can be Omitted if the expression is abstracted over this argument. It currently appears when a label is applied. For example: @@ -207,8 +214,8 @@ and expression_desc = The resulting typedtree for the application is: Texp_apply (Texp_ident "f/1037", - [(Nolabel, None); - (Labelled "y", Some (Texp_constant Const_int 3)) + [(Nolabel, Omitted ()); + (Labelled "y", Arg (Texp_constant Const_int 3)) ]) *) | Texp_match of expression * computation case list * value case list * partial @@ -227,17 +234,24 @@ and expression_desc = | effect P2 k -> E2 [Texp_try (E, [(P1, E1)], [(P2, E2)])] *) - | Texp_tuple of expression list - (** (E1, ..., EN) *) + | Texp_tuple of (string option * expression) list + (** [Texp_tuple(el)] represents + - [(E1, ..., En)] + when [el] is [(None, E1);...;(None, En)], + - [(L1:E1, ..., Ln:En)] + when [el] is [(Some L1, E1);...;(Some Ln, En)], + - Any mix, e.g. [(L1: E1, E2)] + when [el] is [(Some L1, E1); (None, E2)] + *) | Texp_construct of - Longident.t loc * Types.constructor_description * expression list + Longident.t loc * Data_types.constructor_description * expression list (** C [] C E [E] C (E1, ..., En) [E1;...;En] *) | Texp_variant of label * expression option | Texp_record of { - fields : ( Types.label_description * record_label_definition ) array; + fields : ( Data_types.label_description * record_label_definition ) array; representation : Types.record_representation; extended_expression : expression option; } @@ -252,10 +266,13 @@ and expression_desc = { fields = [| l1, Kept t1; l2 Override P2 |]; representation; extended_expression = Some E0 } *) - | Texp_field of expression * Longident.t loc * Types.label_description + | Texp_atomic_loc of + expression * Longident.t loc * Data_types.label_description + | Texp_field of + expression * Longident.t loc * Data_types.label_description | Texp_setfield of - expression * Longident.t loc * Types.label_description * expression - | Texp_array of expression list + expression * Longident.t loc * Data_types.label_description * expression + | Texp_array of mutable_flag * expression list | Texp_ifthenelse of expression * expression * expression option | Texp_sequence of expression * expression | Texp_while of expression * expression @@ -364,6 +381,12 @@ and binding_op = bop_loc : Location.t; } +and ('a, 'b) arg_or_omitted = + | Arg of 'a + | Omitted of 'b + +and apply_arg = (expression, unit) arg_or_omitted + (* Value expressions for the class language *) and class_expr = @@ -381,7 +404,7 @@ and class_expr_desc = | Tcl_fun of arg_label * pattern * (Ident.t * expression) list * class_expr * partial - | Tcl_apply of class_expr * (arg_label * expression option) list + | Tcl_apply of class_expr * (arg_label * apply_arg) list | Tcl_let of rec_flag * value_binding list * (Ident.t * expression) list * class_expr | Tcl_constraint of @@ -655,7 +678,7 @@ and core_type_desc = Ttyp_any | Ttyp_var of string | Ttyp_arrow of arg_label * core_type * core_type - | Ttyp_tuple of core_type list + | Ttyp_tuple of (string option * core_type) list | Ttyp_constr of Path.t * Longident.t loc * core_type list | Ttyp_object of object_field list * closed_flag | Ttyp_class of Path.t * Longident.t loc * core_type list @@ -666,10 +689,10 @@ and core_type_desc = | Ttyp_open of Path.t * Longident.t loc * core_type and package_type = { - pack_path : Path.t; - pack_fields : (Longident.t loc * core_type) list; - pack_type : Types.module_type; - pack_txt : Longident.t loc; + tpt_path : Path.t; + tpt_cstrs : (Longident.t loc * core_type) list; + tpt_type : Types.module_type; + tpt_txt : Longident.t loc; } and row_field = { @@ -728,6 +751,7 @@ and label_declaration = ld_name: string loc; ld_uid: Uid.t; ld_mutable: mutable_flag; + ld_atomic: atomic_flag; ld_type: core_type; ld_loc: Location.t; ld_attributes: attributes; @@ -919,3 +943,6 @@ val pat_bound_idents_full: (** Splits an or pattern into its value (left) and exception (right) parts. *) val split_pattern: computation general_pattern -> pattern option * pattern option + +val map_apply_arg: + ('a -> ' b) -> ('a, 'omitted) arg_or_omitted -> ('b, 'omitted) arg_or_omitted diff --git a/typing/typemod.ml b/typing/typemod.ml index 0ff6c75b..56445ec8 100644 --- a/typing/typemod.ml +++ b/typing/typemod.ml @@ -436,7 +436,8 @@ let params_are_constrained = in loop -type with_info = +type merge_constraint = + (* Normal merging cases that returns a typed tree *) | With_type of Parsetree.type_declaration | With_typesubst of Parsetree.type_declaration | With_module of { @@ -448,16 +449,38 @@ type with_info = | With_modsubst of Longident.t loc * Path.t * Types.module_declaration | With_modtype of Typedtree.module_type | With_modtypesubst of Typedtree.module_type + + (* Package with type constraints only use this last case. *) | With_type_package of Typedtree.core_type - (* Package with type constraints only use this last case. Normal module - with constraints never use it. *) -let merge_constraint initial_env loc sg lid constr = + (* Merging of module types during signature approximation *) + | Approx_with_modtype of Types.module_type + | Approx_with_modtypesubst of Types.module_type + +type merge_result = Path.t * merge_info * Types.signature +and merge_info = + (* Result of normal merging *) + | Built_TypedTree of { + lid: Longident.t Asttypes.loc ; + constr : Typedtree.with_constraint + } + (* Result of merging a package_type or merging approximated module types + (without typedtree) *) + | No_TypedTree + +let merge_constraint_aux initial_env loc sg lid constr : merge_result = let destructive_substitution = match constr with | With_type _ | With_module _ | With_modtype _ + | Approx_with_modtype _ | With_type_package _ -> false - | With_typesubst _ | With_modsubst _ | With_modtypesubst _ -> true + | With_typesubst _ | With_modsubst _ | With_modtypesubst _ + | Approx_with_modtypesubst _ -> true + in + let approx_substitution = + match constr with + | Approx_with_modtype _ | Approx_with_modtypesubst _ -> true + | _ -> false in let real_ids = ref [] in let split_row_id s ghosts = @@ -485,6 +508,32 @@ let merge_constraint initial_env loc sg lid constr = let return ?(ghosts=ghosts) ~replace_by info = Some (info, {Signature_group.ghosts; replace_by}) in + let patch_modtype_item + id (mtd: Types.modtype_declaration) priv mty = + let sig_env = Env.add_signature sg_for_env outer_sig_env in + (* Check for equivalence if the previous module type was not empty. During + approximation, the equivalence check is ignored. *) + let () = match approx_substitution, mtd.mtd_type with + | false, Some previous_mty -> + Includemod.check_modtype_equiv ~loc sig_env + id previous_mty mty + | _ -> () + in + if not destructive_substitution then + let mtd': modtype_declaration = + { + mtd_uid = Uid.mk ~current_unit:(Env.get_current_unit ()); + mtd_type = Some mty; + mtd_attributes = []; + mtd_loc = loc; + } + in Some(Sig_modtype(id, mtd', priv)) + else begin + let path = Pident id in + real_ids := [path]; + None + end + in match item, namelist, constr with | Sig_type(id, decl, rs, priv), [s], With_type ({ptype_kind = Ptype_abstract} as sdecl) @@ -506,6 +555,7 @@ let merge_constraint initial_env loc sg lid constr = | Covariant -> true, false | Contravariant -> false, true | NoVariance -> false, false + | Bivariant -> true, true in make_variance (not n) (not c) (i = Injective) ) @@ -540,9 +590,9 @@ let merge_constraint initial_env loc sg lid constr = in return ~ghosts ~replace_by:(Some (Sig_type(id, newdecl, rs, priv))) - (Pident id, lid, Some (Twith_type tdecl)) + (Pident id, Built_TypedTree {lid=lid; constr=Twith_type tdecl} ) | Sig_type(id, sig_decl, rs, priv) , [s], - (With_type sdecl | With_typesubst sdecl as constr) + (With_type sdecl | With_typesubst sdecl) when Ident.name id = s -> let sig_env = Env.add_signature sg_for_env outer_sig_env in let tdecl = @@ -553,15 +603,16 @@ let merge_constraint initial_env loc sg lid constr = let ghosts = List.rev_append before_ghosts after_ghosts in check_type_decl outer_sig_env sg_for_env loc id row_id newdecl sig_decl; - begin match constr with - With_type _ -> - return ~ghosts - ~replace_by:(Some(Sig_type(id, newdecl, rs, priv))) - (Pident id, lid, Some (Twith_type tdecl)) - | (* With_typesubst *) _ -> - real_ids := [Pident id]; - return ~ghosts ~replace_by:None - (Pident id, lid, Some (Twith_typesubst tdecl)) + if not destructive_substitution then + return ~ghosts + ~replace_by:(Some(Sig_type(id, newdecl, rs, priv))) + (Pident id, Built_TypedTree { + lid=lid; constr=(Twith_type tdecl)}) + else begin + real_ids := [Pident id]; + return ~ghosts ~replace_by:None + (Pident id, Built_TypedTree { + lid=lid; constr=(Twith_typesubst tdecl)}) end | Sig_type(id, sig_decl, rs, priv), [s], With_type_package cty when Ident.name id = s -> @@ -570,41 +621,31 @@ let merge_constraint initial_env loc sg lid constr = | Some ty -> raise (Error(loc, outer_sig_env, With_package_manifest (lid.txt, ty))) end; + Env.mark_type_used sig_decl.type_uid; let tdecl = Typedecl.transl_package_constraint ~loc outer_sig_env cty.ctyp_type in check_type_decl outer_sig_env sg_for_env loc id None tdecl sig_decl; let tdecl = { tdecl with type_manifest = None } in return ~ghosts ~replace_by:(Some(Sig_type(id, tdecl, rs, priv))) - (Pident id, lid, None) + (Pident id, No_TypedTree) | Sig_modtype(id, mtd, priv), [s], (With_modtype mty | With_modtypesubst mty) when Ident.name id = s -> - let sig_env = Env.add_signature sg_for_env outer_sig_env in - let () = match mtd.mtd_type with - | None -> () - | Some previous_mty -> - Includemod.check_modtype_equiv ~loc sig_env - id previous_mty mty.mty_type + let new_item = patch_modtype_item id mtd priv mty.mty_type in + let constr_tt = + if not destructive_substitution then + (Twith_modtype mty) + else + (Twith_modtypesubst mty) in - if not destructive_substitution then - let mtd': modtype_declaration = - { - mtd_uid = Uid.mk ~current_unit:(Env.get_current_unit ()); - mtd_type = Some mty.mty_type; - mtd_attributes = []; - mtd_loc = loc; - } - in - return - ~replace_by:(Some(Sig_modtype(id, mtd', priv))) - (Pident id, lid, Some (Twith_modtype mty)) - else begin - let path = Pident id in - real_ids := [path]; - return ~replace_by:None - (Pident id, lid, Some (Twith_modtypesubst mty)) - end + return ~replace_by:new_item + (Pident id, Built_TypedTree {lid; constr=constr_tt}) + | Sig_modtype(id, mtd, priv), [s], + (Approx_with_modtype mty | Approx_with_modtypesubst mty) + when Ident.name id = s -> + let new_item = patch_modtype_item id mtd priv mty in + return ~replace_by:new_item (Pident id, No_TypedTree) | Sig_module(id, pres, md, rs, priv), [s], With_module {lid=lid'; md=md'; path; remove_aliases} when Ident.name id = s -> @@ -617,7 +658,8 @@ let merge_constraint initial_env loc sg lid constr = newmd.md_type md.md_type); return ~replace_by:(Some(Sig_module(id, pres, newmd, rs, priv))) - (Pident id, lid, Some (Twith_module (path, lid'))) + (Pident id, Built_TypedTree { + lid=lid; constr=(Twith_module (path, lid'))}) | Sig_module(id, _, md, _rs, _), [s], With_modsubst (lid',path,md') when Ident.name id = s -> let sig_env = Env.add_signature sg_for_env outer_sig_env in @@ -627,41 +669,52 @@ let merge_constraint initial_env loc sg lid constr = ~aliasable sig_env md' path md); real_ids := [Pident id]; return ~replace_by:None - (Pident id, lid, Some (Twith_modsubst (path, lid'))) - | Sig_module(id, _, md, rs, priv) as item, s :: namelist, constr + (Pident id, Built_TypedTree { + lid=lid; constr=(Twith_modsubst (path, lid'))}) + + (* When the constraint affects a component of a submodule *) + | Sig_module(id, _, md, rs, priv) as current_item, s :: namelist, _ when Ident.name id = s -> let sig_env = Env.add_signature sg_for_env outer_sig_env in let sg = extract_sig sig_env loc md.md_type in - let ((path, _, tcstr), newsg) = merge_signature sig_env sg namelist in - let path = path_concat id path in - real_ids := path :: !real_ids; - let item = - match md.md_type, constr with - Mty_alias _, (With_module _ | With_type _) -> - (* A module alias cannot be refined, so keep it - and just check that the constraint is correct *) - item - | _ -> - let newmd = {md with md_type = Mty_signature newsg} in - Sig_module(id, Mp_present, newmd, rs, priv) - in - return ~replace_by:(Some item) (path, lid, tcstr) + let subpath, merge_info, newsg = merge_signature sig_env sg namelist in + let path = path_concat id subpath in + real_ids := path :: !real_ids ; + begin match md.md_type, merge_info with + (* A module alias cannot be refined, so keep it + and just check that the constraint is correct *) + | Mty_alias _, Built_TypedTree + { lid; constr = (Twith_module _ + | Twith_type _ + | Twith_modtype _) as tcstr } -> + return ~replace_by:(Some current_item) + (path, Built_TypedTree { lid; constr=tcstr} ) + | _, Built_TypedTree { lid; constr } -> + let new_md = {md with md_type = Mty_signature newsg} in + let new_item = Sig_module(id, Mp_present, new_md, rs, priv) in + return ~replace_by:(Some new_item) + (path, Built_TypedTree {lid; constr}) + | _, No_TypedTree -> + let new_md = {md with md_type = Mty_signature newsg} in + let new_item = Sig_module(id, Mp_present, new_md, rs, priv) in + return ~replace_by:(Some new_item) (path, No_TypedTree) + end | _ -> None and merge_signature env sg namelist = match Signature_group.replace_in_place (patch_item constr namelist env sg) sg with - | Some (x,sg) -> x, sg + | Some ((path, res), sg) -> path, res, sg | None -> raise(Error(loc, env, With_no_component lid.txt)) in try let names = Longident.flatten lid.txt in - let (tcstr, sg) = merge_signature initial_env sg names in + let (path, merge_info, sg) = merge_signature initial_env sg names in if destructive_substitution then check_usage_after_substitution ~loc ~lid initial_env !real_ids sg; let sg = - match tcstr with - | (_, _, Some (Twith_typesubst tdecl)) -> + match merge_info, constr with + | Built_TypedTree {constr=Twith_typesubst tdecl},_ -> let how_to_extend_subst = let sdecl = match constr with @@ -686,7 +739,7 @@ let merge_constraint initial_env loc sg lid constr = let sub = Subst.change_locs Subst.identity loc in let sub = List.fold_left how_to_extend_subst sub !real_ids in unsafe_signature_subst sub sg - | (_, _, Some (Twith_modsubst (real_path, _))) -> + | Built_TypedTree {constr=Twith_modsubst (real_path, _)},_ -> let sub = Subst.change_locs Subst.identity loc in let sub = List.fold_left @@ -695,8 +748,9 @@ let merge_constraint initial_env loc sg lid constr = !real_ids in unsafe_signature_subst sub sg - | (_, _, Some (Twith_modtypesubst tmty)) -> - let add s p = Subst.Unsafe.add_modtype_path p tmty.mty_type s in + | Built_TypedTree {constr=Twith_modtypesubst {mty_type=mty}}, _ + | _, Approx_with_modtypesubst mty -> + let add s p = Subst.Unsafe.add_modtype_path p mty s in let sub = Subst.change_locs Subst.identity loc in let sub = List.fold_left add sub !real_ids in unsafe_signature_subst sub sg @@ -705,13 +759,22 @@ let merge_constraint initial_env loc sg lid constr = in check_well_formed_module initial_env loc "this instantiated signature" (Mty_signature sg); - (tcstr, sg) + (path, merge_info, sg) with Includemod.Error explanation -> raise(Error(loc, initial_env, With_mismatch(lid.txt, explanation))) -let merge_package_constraint initial_env loc sg lid cty = - let _, s = merge_constraint initial_env loc sg lid (With_type_package cty) in - s +(* Normal merge function - build the typed tree *) +let merge_constraint env loc sg lid cty = + match merge_constraint_aux env loc sg lid cty with + | path, Built_TypedTree { lid; constr }, newsg -> + (path, lid, constr, newsg) + | _, No_TypedTree, _ -> assert false + +(* Specialized merge function for package types *) +let merge_package_constraint env loc sg lid cty = + match merge_constraint_aux env loc sg lid (With_type_package cty) with + | _, No_TypedTree, newsg -> newsg + | _, Built_TypedTree _, _ -> assert false let check_package_with_type_constraints loc env mty constraints = let sg = extract_sig env loc mty in @@ -728,6 +791,18 @@ let () = Typetexp.check_package_with_type_constraints := check_package_with_type_constraints +(* Specialized merge function for merging during signature approximation *) +let merge_constraint_approx env loc sg lid mty ~destructive = + let constr = + if not destructive then + Approx_with_modtype mty + else + Approx_with_modtypesubst mty + in + match merge_constraint_aux env loc sg lid constr with + | _, No_TypedTree, newsg -> newsg + | _, Built_TypedTree _, _ -> assert false + (* Add recursion flags on declarations arising from a mutually recursive block. *) @@ -802,24 +877,26 @@ let rec approx_modtype env smty = let res = approx_modtype newenv sres in Mty_functor(param, res) | Pmty_with(sbody, constraints) -> - let body = approx_modtype env sbody in - List.iter - (fun sdecl -> - match sdecl with - | Pwith_type _ - | Pwith_typesubst _ - | Pwith_modtype _ - | Pwith_modtypesubst _ -> () - | Pwith_module (_, lid') -> - (* Lookup the module to make sure that it is not recursive. - (GPR#1626) *) - ignore (Env.lookup_module_path ~use:false ~load:false - ~loc:lid'.loc lid'.txt env) - | Pwith_modsubst (_, lid') -> - ignore (Env.lookup_module_path ~use:false ~load:false - ~loc:lid'.loc lid'.txt env)) - constraints; - body + (* the module type body is approximated and resolved to a signature.*) + let approx_body = approx_modtype env sbody in + let initial_sig = extract_sig env sbody.pmty_loc approx_body in + (* then, the constraints are approximated and merged, instead of merged + and approximated. For (1) type constraints, (2) module constraints and + (3) module type constraints replacing an abstract module type, it + should be equivalent. + + However, for module type constraints replacing a concrete module type, + approximating the constraint and the body before merging can interact + with the equivalence check that is done between the constraint and the + original definition. As approximation only tries to build a skeleton of + non-recursive module types that can be used as an under-approximation + of the name-spaces for the typechecking phase, the equivalence check is + disabled, allowing for ill-formed constraints to be merged. It is + should be harmless, because the ill-formedness is caught when + re-typechecking the module types (with the approximation in the + environment). *) + Mty_signature (List.fold_left + (approx_constraint env) initial_sig constraints) | Pmty_typeof smod -> let (_, mty) = !type_module_type_of_fwd env smod in mty @@ -941,7 +1018,30 @@ and approx_modtype_info env sinfo = mtd_attributes = sinfo.pmtd_attributes; mtd_loc = sinfo.pmtd_loc; mtd_uid = Uid.internal_not_actually_unique; - } + } + +and approx_constraint env body constr = + match constr with + (* type substitutions are ignored *) + | Pwith_type _ + | Pwith_typesubst _ -> body + (* module type substitutions are approximated then merged *) + | Pwith_modtype (id, smty) + | Pwith_modtypesubst (id, smty) -> + let destructive = + (match constr with | Pwith_modtypesubst _ -> true | _ -> false) in + let approx_smty = approx_modtype env smty in + merge_constraint_approx ~destructive + env smty.pmty_loc body id approx_smty + (* module substitutions are ignored, but checked for cyclicity *) + | Pwith_module (_, lid') -> + (* Lookup the module to make sure that it is not recursive. + (GPR#1626) *) + ignore (Env.lookup_module_path ~use:false ~load:false + ~loc:lid'.loc lid'.txt env) ; body + | Pwith_modsubst (_, lid') -> + ignore (Env.lookup_module_path ~use:false ~load:false + ~loc:lid'.loc lid'.txt env) ; body let approx_modtype env smty = Warnings.without_warnings @@ -1350,11 +1450,8 @@ and transl_with ~loc env remove_aliases (rev_tcstrs,sg) constr = let mty = transl_modtype env smty in l, With_modtypesubst mty in - let ((path, lid, tcstr), sg) = merge_constraint env loc sg lid with_info in - (* Only package with constraints result in None here. *) - let tcstr = Option.get tcstr in - ((path, lid, tcstr) :: rev_tcstrs, sg) - + let (path, lid, constr, sg) = merge_constraint env loc sg lid with_info in + ((path, lid, constr) :: rev_tcstrs, sg) and transl_signature env sg = @@ -1737,12 +1834,14 @@ and transl_recmodule_modtypes env sdecls = List.map (fun x -> Option.map (Ident.create_scoped ~scope) x.pmd_name.txt) sdecls in - let approx_env = + let approx_env container = List.fold_left (fun env -> Option.fold ~none:env ~some:(fun id -> (* cf #5965 *) Env.enter_unbound_module (Ident.name id) - Mod_unbound_illegal_recursion env + (Mod_unbound_illegal_recursion + { container; unbound = Ident.name id }) + env )) env ids in @@ -1751,7 +1850,8 @@ and transl_recmodule_modtypes env sdecls = (fun id pmd -> let md_uid = Uid.mk ~current_unit:(Env.get_current_unit ()) in let md = - { md_type = approx_modtype approx_env pmd.pmd_type; + { md_type = + approx_modtype (approx_env pmd.pmd_name.txt) pmd.pmd_type; md_loc = pmd.pmd_loc; md_attributes = pmd.pmd_attributes; md_uid } @@ -1975,7 +2075,7 @@ let check_recmodule_inclusion env bindings = and mty_actual' = subst_and_strengthen env scope s id mty_actual in let coercion, shape = try - Includemod.modtypes_with_shape ~shape + Includemod.modtypes_constraint ~shape ~loc:modl.mod_loc ~mark:true env mty_actual' mty_decl' with Includemod.Error msg -> @@ -2043,22 +2143,22 @@ and package_constraints env loc mty constrs = | Mty_ident p -> raise(Error(loc, env, Cannot_scrape_package_type p)) end -let modtype_of_package env loc p fl = +let modtype_of_package env loc pack = (* We call Ctype.duplicate_type to ensure that the types being added to the module type are at generic_level. *) let mty = - package_constraints env loc (Mty_ident p) - (List.map (fun (n, t) -> Longident.flatten n, Ctype.duplicate_type t) fl) + package_constraints env loc (Mty_ident pack.pack_path) + (List.map (fun (n, t) -> n, Ctype.duplicate_type t) pack.pack_cstrs) in Subst.modtype Keep Subst.identity mty -let package_subtype env p1 fl1 p2 fl2 = - let mkmty p fl = +let package_subtype env pack1 pack2 = + let mkmty pack = let fl = - List.filter (fun (_n,t) -> Ctype.closed_type_expr t) fl in - modtype_of_package env Location.none p fl + List.filter (fun (_n,t) -> Ctype.closed_type_expr t) pack.pack_cstrs in + modtype_of_package env Location.none {pack with pack_cstrs = fl} in - match mkmty p1 fl1, mkmty p2 fl2 with + match mkmty pack1, mkmty pack2 with | exception Error(_, _, Cannot_scrape_package_type r) -> Result.Error (Errortrace.Package_cannot_scrape r) | mty1, mty2 -> @@ -2094,7 +2194,7 @@ let wrap_constraint_with_shape env mark arg mty shape explicit = let coercion, shape = try - Includemod.modtypes_with_shape ~shape ~loc:arg.mod_loc env ~mark + Includemod.modtypes_constraint ~shape ~loc:arg.mod_loc env ~mark arg.mod_type mty with Includemod.Error msg -> raise(Error(arg.mod_loc, env, Not_included msg)) in @@ -2132,13 +2232,18 @@ let simplify_app_summary app_view = match app_view.arg with | false, Some p -> Includemod.Error.Named p, mty | false, None -> Includemod.Error.Anonymous, mty +let check_package_closed ~loc ~env ~typ fl = + if List.exists (fun (_n, t) -> not (Ctype.closed_type_expr t)) fl + then + raise (Error (loc, env, Incomplete_packed_module typ)) + let not_principal msg = Warnings.Not_principal (Format_doc.Doc.msg msg) -let rec type_module ?(alias=false) sttn funct_body anchor env smod = +let rec type_module ?(alias=false) ~strengthen ~funct_body anchor env smod = Builtin_attributes.warning_scope smod.pmod_attributes - (fun () -> type_module_aux ~alias sttn funct_body anchor env smod) + (fun () -> type_module_aux ~alias ~strengthen ~funct_body anchor env smod) -and type_module_aux ~alias sttn funct_body anchor env smod = +and type_module_aux ~alias ~strengthen ~funct_body anchor env smod = match smod.pmod_desc with Pmod_ident lid -> let path = @@ -2159,7 +2264,7 @@ and type_module_aux ~alias sttn funct_body anchor env smod = (Env.add_required_global (Path.head path); md) else begin let mty = - if sttn then + if strengthen then Env.find_strengthened_module ~aliasable path env else (Env.find_module path env).md_type @@ -2168,7 +2273,7 @@ and type_module_aux ~alias sttn funct_body anchor env smod = | Mty_alias p1 when not alias -> let p1 = Env.normalize_module_path (Some smod.pmod_loc) env p1 in let mty = Includemod.expand_module_alias - ~strengthen:sttn env p1 in + ~strengthen env p1 in { md with mod_desc = Tmod_constraint (md, mty, Tmodtype_implicit, @@ -2181,7 +2286,7 @@ and type_module_aux ~alias sttn funct_body anchor env smod = md, shape | Pmod_structure sstr -> let (str, sg, names, shape, _finalenv) = - type_structure funct_body anchor env sstr in + type_structure ~funct_body anchor env sstr in let md = { mod_desc = Tmod_structure str; mod_type = Mty_signature sg; @@ -2223,7 +2328,9 @@ and type_module_aux ~alias sttn funct_body anchor env smod = Named (id, param, mty), Types.Named (id, mty.mty_type), newenv, var, true in - let body, body_shape = type_module true funct_body None newenv sbody in + let body, body_shape = + type_module ~strengthen:true ~funct_body None newenv sbody + in { mod_desc = Tmod_functor(t_arg, body); mod_type = Mty_functor(ty_arg, body.mod_type); mod_env = env; @@ -2231,9 +2338,11 @@ and type_module_aux ~alias sttn funct_body anchor env smod = mod_loc = smod.pmod_loc }, Shape.abs funct_shape_param body_shape | Pmod_apply _ | Pmod_apply_unit _ -> - type_application smod.pmod_loc sttn funct_body env smod + type_application smod.pmod_loc ~strengthen ~funct_body env smod | Pmod_constraint(sarg, smty) -> - let arg, arg_shape = type_module ~alias true funct_body anchor env sarg in + let arg, arg_shape = + type_module ~alias ~strengthen:true ~funct_body anchor env sarg + in let mty = transl_modtype env smty in let md, final_shape = wrap_constraint_with_shape env true arg mty.mty_type arg_shape @@ -2251,17 +2360,15 @@ and type_module_aux ~alias sttn funct_body anchor env smod = in let mty = match get_desc (Ctype.expand_head env exp.exp_type) with - Tpackage (p, fl) -> - if List.exists (fun (_n, t) -> not (Ctype.closed_type_expr t)) fl - then - raise (Error (smod.pmod_loc, env, - Incomplete_packed_module exp.exp_type)); + Tpackage pack -> + check_package_closed ~loc:smod.pmod_loc ~env ~typ:exp.exp_type + pack.pack_cstrs; if !Clflags.principal && not (Typecore.generalizable (Btype.generic_level-1) exp.exp_type) then Location.prerr_warning smod.pmod_loc (not_principal "this module unpacking"); - modtype_of_package env smod.pmod_loc p fl + modtype_of_package env smod.pmod_loc pack | Tvar _ -> raise (Typecore.Error (smod.pmod_loc, env, Typecore.Cannot_infer_signature)) @@ -2279,11 +2386,13 @@ and type_module_aux ~alias sttn funct_body anchor env smod = | Pmod_extension ext -> raise (Error_forward (Builtin_attributes.error_of_extension ext)) -and type_application loc strengthen funct_body env smod = - let rec extract_application funct_body env sargs smod = +and type_application loc ~strengthen ~funct_body env smod = + let rec extract_application ~funct_body env sargs smod = match smod.pmod_desc with | Pmod_apply (f, sarg) -> - let arg, shape = type_module true funct_body None env sarg in + let arg, shape = + type_module ~strengthen:true ~funct_body None env sarg + in let summary = { loc = smod.pmod_loc; attributes = smod.pmod_attributes; @@ -2295,7 +2404,7 @@ and type_application loc strengthen funct_body env smod = shape; } } in - extract_application funct_body env (summary::sargs) f + extract_application ~funct_body env (summary::sargs) f | Pmod_apply_unit f -> let summary = { loc = smod.pmod_loc; @@ -2303,17 +2412,17 @@ and type_application loc strengthen funct_body env smod = f_loc = f.pmod_loc; arg = None } in - extract_application funct_body env (summary::sargs) f + extract_application ~funct_body env (summary::sargs) f | _ -> smod, sargs in - let sfunct, args = extract_application funct_body env [] smod in + let sfunct, args = extract_application ~funct_body env [] smod in let funct, funct_shape = let has_path { arg } = match arg with | None | Some { path = None } -> false | Some { path = Some _ } -> true in let strengthen = strengthen && List.for_all has_path args in - type_module strengthen funct_body None env sfunct + type_module ~strengthen ~funct_body None env sfunct in List.fold_left (type_one_application ~ctx:(loc, sfunct, funct, args) funct_body env) @@ -2424,13 +2533,13 @@ and type_one_application ~ctx:(apply_loc,sfunct,md_f,args) in raise(Includemod.Apply_error {loc=apply_loc;env;app_name;mty_f;args}) -and type_open_decl ?used_slot ?toplevel funct_body names env sod = +and type_open_decl ?used_slot ?toplevel ~funct_body names env sod = Builtin_attributes.warning_scope sod.popen_attributes (fun () -> - type_open_decl_aux ?used_slot ?toplevel funct_body names env sod + type_open_decl_aux ?used_slot ?toplevel ~funct_body names env sod ) -and type_open_decl_aux ?used_slot ?toplevel funct_body names env od = +and type_open_decl_aux ?used_slot ?toplevel ~funct_body names env od = let loc = od.popen_loc in match od.popen_expr.pmod_desc with | Pmod_ident lid -> @@ -2453,7 +2562,9 @@ and type_open_decl_aux ?used_slot ?toplevel funct_body names env od = } in open_descr, [], newenv | _ -> - let md, mod_shape = type_module true funct_body None env od.popen_expr in + let md, mod_shape = + type_module ~strengthen:true ~funct_body None env od.popen_expr + in let scope = Ctype.create_scope () in let sg, newenv = Env.enter_signature ~scope ~mod_shape @@ -2488,7 +2599,7 @@ and type_open_decl_aux ?used_slot ?toplevel funct_body names env od = } in open_descr, sg, newenv -and type_structure ?(toplevel = false) funct_body anchor env sstr = +and type_structure ?(toplevel = false) ~funct_body anchor env sstr = let names = Signature_names.create () in let type_str_item env shape_map {pstr_loc = loc; pstr_desc = desc} = @@ -2590,7 +2701,7 @@ and type_structure ?(toplevel = false) funct_body anchor env sstr = let modl, md_shape = Builtin_attributes.warning_scope attrs (fun () -> - type_module ~alias:true true funct_body + type_module ~alias:true ~strengthen:true ~funct_body (anchor_submodule name.txt anchor) env smodl ) in @@ -2669,8 +2780,8 @@ and type_structure ?(toplevel = false) funct_body anchor env sstr = let modl, shape = Builtin_attributes.warning_scope attrs (fun () -> - type_module true funct_body (anchor_recmodule id) - newenv smodl + type_module ~strengthen:true ~funct_body + (anchor_recmodule id) newenv smodl ) in let mty' = @@ -2731,7 +2842,7 @@ and type_structure ?(toplevel = false) funct_body anchor env sstr = Tstr_modtype mtd, [Sig_modtype (id, decl, Exported)], map, newenv | Pstr_open sod -> let (od, sg, newenv) = - type_open_decl ~toplevel funct_body names env sod + type_open_decl ~toplevel ~funct_body names env sod in Tstr_open od, sg, shape_map, newenv | Pstr_class cl -> @@ -2797,7 +2908,7 @@ and type_structure ?(toplevel = false) funct_body anchor env sstr = let smodl = sincl.pincl_mod in let modl, modl_shape = Builtin_attributes.warning_scope sincl.pincl_attributes - (fun () -> type_module true funct_body None env smodl) + (fun () -> type_module ~strengthen:true ~funct_body None env smodl) in let scope = Ctype.create_scope () in (* Rename all identifiers bound by this signature to avoid clashes *) @@ -2849,11 +2960,14 @@ and type_structure ?(toplevel = false) funct_body anchor env sstr = let type_toplevel_phrase env s = Env.reset_required_globals (); - type_structure ~toplevel:true false None env s + type_structure ~toplevel:true ~funct_body:false None env s -let type_module_alias = type_module ~alias:true true false None -let type_module = type_module true false None -let type_structure = type_structure false None +let type_module_alias = + type_module ~alias:true ~strengthen:true ~funct_body:false None +let type_module = + type_module ~strengthen:true ~funct_body:false None +let type_structure = + type_structure ~funct_body:false None (* Normalize types in a signature *) @@ -2899,7 +3013,7 @@ let rec extend_path path = fun lid -> match lid with | Lident name -> Pdot(path, name) - | Ldot(m, name) -> Pdot(extend_path path m, name) + | Ldot({ txt = m; _ }, { txt = name; _ }) -> Pdot(extend_path path m, name) | Lapply _ -> assert false (* Lookup a type's longident within a signature *) @@ -2921,16 +3035,16 @@ let lookup_type_in_sig sg = in let rec module_path = function | Lident name -> Pident (String.Map.find name modules) - | Ldot(m, name) -> Pdot(module_path m, name) + | Ldot({ txt = m; _ }, { txt = name; _ }) -> Pdot(module_path m, name) | Lapply _ -> assert false in fun lid -> match lid with | Lident name -> Pident (String.Map.find name types) - | Ldot(m, name) -> Pdot(module_path m, name) + | Ldot({ txt = m; _ }, { txt = name; _ }) -> Pdot(module_path m, name) | Lapply _ -> assert false -let type_package env m p fl = +let type_package env m pack = (* Same as Pexp_letmodule *) let modl, scope = Typetexp.TyVarEnv.with_local_scope begin fun () -> @@ -2943,7 +3057,7 @@ let type_package env m p fl = end in let fl', env = - match fl with + match pack.pack_cstrs with | [] -> [], env | fl -> let type_path, env = @@ -2965,7 +3079,7 @@ let type_package env m p fl = let fl' = List.fold_right (fun (lid, _t) fl -> - match type_path lid with + match type_path (Longident.unflatten lid |> Option.get) with | exception Not_found -> fl | path -> begin match Env.find_type path env with @@ -2983,23 +3097,24 @@ let type_package env m p fl = fl', env in let mty = - if fl = [] then (Mty_ident p) - else modtype_of_package env modl.mod_loc p fl' + if pack.pack_cstrs = [] then (Mty_ident pack.pack_path) + else modtype_of_package env modl.mod_loc {pack with pack_cstrs = fl'} in List.iter (fun (n, ty) -> try Ctype.unify env ty (Ctype.newvar ()) with Ctype.Unify _ -> - raise (Error(modl.mod_loc, env, Scoping_pack (n,ty)))) + let lid = Longident.unflatten n |> Option.get in + raise (Error(modl.mod_loc, env, Scoping_pack (lid,ty)))) fl'; let modl = wrap_constraint_package env true modl mty Tmodtype_implicit in - modl, fl' + modl, {pack with pack_cstrs = fl'} (* Fill in the forward declarations *) let type_open_decl ?used_slot env od = - type_open_decl ?used_slot ?toplevel:None false (Signature_names.create ()) env - od + type_open_decl ?used_slot ?toplevel:None ~funct_body:false + (Signature_names.create ()) env od let type_open_descr ?used_slot env od = type_open_descr ?used_slot ?toplevel:None env od @@ -3334,21 +3449,19 @@ let report_error ~loc _env = function let[@manual.ref "ss:valuerestriction"] manual_ref = [ 6; 1; 2 ] in Out_type.prepare_for_printing vars; Out_type.add_type_to_preparation item.val_type; - let sub = - [ Location.msg ~loc:item.val_loc - "The type of this value,@ %a,@ \ - contains the non-generalizable type variable(s) %a." - (Style.as_inline_code Out_type.prepared_type_scheme) - item.val_type - (pp_print_list ~pp_sep:(fun f () -> fprintf f ",@ ") - @@ Style.as_inline_code Out_type.prepared_type_scheme) vars - ] - in - Location.errorf ~loc ~sub + Location.errorf ~loc "@[The type of this module,@ %a,@ \ contains non-generalizable type variable(s).@ %a@]" modtype mty Misc.print_see_manual manual_ref + ~sub:[ Location.msg ~loc:item.val_loc + "The type of this value,@ %a,@ \ + contains the non-generalizable type variable(s) %a." + (Style.as_inline_code Out_type.prepared_type_scheme) + item.val_type + (pp_print_list ~pp_sep:(fun f () -> fprintf f ",@ ") + @@ Style.as_inline_code Out_type.prepared_type_scheme) vars + ] | Implementation_is_required intf_name -> Location.errorf ~loc "@[The interface %a@ declares values, not just types.@ \ @@ -3395,9 +3508,13 @@ let report_error ~loc _env = function "The type of this packed module refers to %a, which is missing" (Style.as_inline_code path) p | Badly_formed_signature (context, err) -> - Location.errorf ~loc "@[In %s:@ %a@]" - context - Typedecl.report_error_doc err + let report = Typedecl.report_error ~loc err in + let txt = + Format_doc.doc_printf "In %s:@ %a" + context + Format_doc.pp_doc report.main.txt + in + { report with main = { report.main with txt} } | Cannot_hide_id Illegal_shadowing { shadowed_item_kind; shadowed_item_id; shadowed_item_loc; shadower_id; user_id; user_kind; user_loc } -> diff --git a/typing/typemod.mli b/typing/typemod.mli index 8833a8e9..da9a2b31 100644 --- a/typing/typemod.mli +++ b/typing/typemod.mli @@ -52,8 +52,7 @@ val type_open_: Env.t -> Location.t -> Longident.t Asttypes.loc -> Path.t * Env.t *) val modtype_of_package: - Env.t -> Location.t -> - Path.t -> (Longident.t * type_expr) list -> module_type + Env.t -> Location.t -> package -> module_type val path_of_module : Typedtree.module_expr -> Path.t option diff --git a/typing/typeopt.ml b/typing/typeopt.ml index 2b8fd3e9..2a135bc6 100644 --- a/typing/typeopt.ml +++ b/typing/typeopt.ml @@ -29,36 +29,35 @@ let scrape_ty env ty = | Tconstr (p, _, _) -> begin match Env.find_type p env with | {type_kind = ( Type_variant (_, Variant_unboxed) - | Type_record (_, Record_unboxed _) ); _} -> begin - match Typedecl_unboxed.get_unboxed_type_representation env ty with - | None -> ty - | Some ty2 -> ty2 - end - | _ -> ty - | exception Not_found -> ty + | Type_record (_, Record_unboxed _) ); _} -> + Typedecl_unboxed.get_unboxed_type_representation env ty + | _ -> Some ty + | exception Not_found -> None end | _ -> - ty + Some ty end - | _ -> ty + | _ -> Some ty let scrape env ty = - get_desc (scrape_ty env ty) + Option.map get_desc (scrape_ty env ty) let scrape_poly env ty = let ty = scrape_ty env ty in - match get_desc ty with - | Tpoly (ty, _) -> get_desc ty - | d -> d + Option.map (fun ty -> + match get_desc ty with + | Tpoly (ty, _) -> get_desc ty + | d -> d) + ty let is_function_type env ty = match scrape env ty with - | Tarrow (_, lhs, rhs, _) -> Some (lhs, rhs) + | Some (Tarrow (_, lhs, rhs, _)) -> Some (lhs, rhs) | _ -> None let is_base_type env ty base_ty_path = match scrape env ty with - | Tconstr(p, _, _) -> Path.same p base_ty_path + | Some (Tconstr(p, _, _)) -> Path.same p base_ty_path | _ -> false let is_immediate = function @@ -70,9 +69,11 @@ let is_immediate = function !Clflags.native_code && Sys.word_size = 64 let maybe_pointer_type env ty = - let ty = scrape_ty env ty in - if is_immediate (Ctype.immediacy env ty) then Immediate - else Pointer + match scrape_ty env ty with + | Some ty -> + if is_immediate (Ctype.immediacy env ty) then Immediate + else Pointer + | None -> Pointer let maybe_pointer exp = maybe_pointer_type exp.exp_env exp.exp_type @@ -83,22 +84,26 @@ type classification = | Addr (* anything except a float or a lazy *) | Any -let classify env ty = - let ty = scrape_ty env ty in +let classify env ty : classification = + match scrape_ty env ty with + | None -> Any + | Some ty -> if maybe_pointer_type env ty = Immediate then Int else match get_desc ty with | Tvar _ | Tunivar _ -> Any | Tconstr (p, _args, _abbrev) -> - if Path.same p Predef.path_float then Float - else if Path.same p Predef.path_lazy_t then Lazy - else if Path.same p Predef.path_string - || Path.same p Predef.path_bytes - || Path.same p Predef.path_array - || Path.same p Predef.path_nativeint - || Path.same p Predef.path_int32 - || Path.same p Predef.path_int64 then Addr - else begin + begin match Predef.find_type_constr p with + | Some `Float -> Float + | Some `Lazy_t -> Lazy + | Some (`Int | `Char) -> Int + | Some (`String | `Bytes + | `Int32 | `Int64 | `Nativeint + | `Extension_constructor | `Continuation + | `Array | `Floatarray | `Iarray + | `Atomic_loc) + -> Addr + | Some #Predef.data_type_constr | None -> try match (Env.find_type p env).type_kind with | Type_abstract _ -> @@ -118,14 +123,15 @@ let classify env ty = let array_type_kind env ty = match scrape_poly env ty with - | Tconstr(p, [elt_ty], _) when Path.same p Predef.path_array -> + | Some (Tconstr(p, [elt_ty], _)) + when Path.same p Predef.path_array || Path.same p Predef.path_iarray -> begin match classify env elt_ty with | Any -> if Config.flat_float_array then Pgenarray else Paddrarray | Float -> if Config.flat_float_array then Pfloatarray else Paddrarray | Addr | Lazy -> Paddrarray | Int -> Pintarray end - | Tconstr(p, [], _) when Path.same p Predef.path_floatarray -> + | Some (Tconstr(p, [], _)) when Path.same p Predef.path_floatarray -> Pfloatarray | _ -> (* This can happen with e.g. Obj.field *) @@ -137,7 +143,7 @@ let array_pattern_kind pat = array_type_kind pat.pat_env pat.pat_type let bigarray_decode_type env ty tbl dfl = match scrape env ty with - | Tconstr(Pdot(Pident mod_id, type_name), [], _) + | Some (Tconstr(Pdot(Pident mod_id, type_name), [], _)) when Ident.name mod_id = "Stdlib__Bigarray" -> begin try List.assoc type_name tbl with Not_found -> dfl end | _ -> @@ -164,7 +170,7 @@ let layout_table = let bigarray_type_kind_and_layout env typ = match scrape env typ with - | Tconstr(_p, [_caml_type; elt_type; layout_type], _abbrev) -> + | Some (Tconstr(_p, [_caml_type; elt_type; layout_type], _abbrev)) -> (bigarray_decode_type env elt_type kind_table Pbigarray_unknown, bigarray_decode_type env layout_type layout_table Pbigarray_unknown_layout) @@ -172,7 +178,9 @@ let bigarray_type_kind_and_layout env typ = (Pbigarray_unknown, Pbigarray_unknown_layout) let value_kind env ty = - let ty = scrape_ty env ty in + match scrape_ty env ty with + | None -> Pgenval + | Some ty -> if is_immediate (Ctype.immediacy env ty) then Pintval else begin match get_desc ty with diff --git a/typing/types.ml b/typing/types.ml index c66c98ea..5b23573d 100644 --- a/typing/types.ml +++ b/typing/types.ml @@ -34,7 +34,7 @@ and type_expr = transient_expr and type_desc = Tvar of string option | Tarrow of arg_label * type_expr * type_expr * commutable - | Ttuple of type_expr list + | Ttuple of (string option * type_expr) list | Tconstr of Path.t * type_expr list * abbrev_memo ref | Tobject of type_expr * (Path.t * type_expr list) option ref | Tfield of string * field_kind * type_expr * type_expr @@ -44,7 +44,11 @@ and type_desc = | Tvariant of row_desc | Tunivar of string option | Tpoly of type_expr * type_expr list - | Tpackage of Path.t * (Longident.t * type_expr) list + | Tpackage of package + +and package = + { pack_path : Path.t; + pack_cstrs : (string list * type_expr) list } and row_desc = { row_fields: (label * row_field) list; @@ -146,18 +150,25 @@ and method_privacy = 0 <= may_pos <= pos 0 <= may_weak <= may_neg <= neg 0 <= inj + may_pos/may_neg mean possible positive/negative occurrences; + thus, may_pos + may_neg = invariant Additionally, the following implications are valid pos => inj neg => inj Examples: - type 'a t : may_pos + may_neg + may_weak + type 'a t : may_pos + may_neg + type +'a t : may_pos + type -'a t : may_neg + type +-'a t : null (no occurrence of 'a assured) + type !'a t : may_pos + may_neg + inj + type +!'a t : may_pos + inj + type -!'a t : may_neg + inj + type +-!'a t : inj type 'a t = 'a : pos type 'a t = 'a -> unit : neg type 'a t = ('a -> unit) -> unit : pos + may_weak type 'a t = A of (('a -> unit) -> unit) : pos type +'a p = .. : may_pos + inj - type +!'a t : may_pos + inj - type -!'a t : may_neg + inj type 'a t = A : inj *) @@ -283,6 +294,7 @@ and label_declaration = { ld_id: Ident.t; ld_mutable: mutable_flag; + ld_atomic: atomic_flag; ld_type: type_expr; ld_loc: Location.t; ld_attributes: Parsetree.attributes; @@ -406,52 +418,6 @@ and ext_status = | Text_next (* not first constructor of an extension *) | Text_exception (* an exception *) - -(* Constructor and record label descriptions inserted held in typing - environments *) - -type constructor_description = - { cstr_name: string; (* Constructor name *) - cstr_res: type_expr; (* Type of the result *) - cstr_existentials: type_expr list; (* list of existentials *) - cstr_args: type_expr list; (* Type of the arguments *) - cstr_arity: int; (* Number of arguments *) - cstr_tag: constructor_tag; (* Tag for heap blocks *) - cstr_consts: int; (* Number of constant constructors *) - cstr_nonconsts: int; (* Number of non-const constructors *) - cstr_generalized: bool; (* Constrained return type? *) - cstr_private: private_flag; (* Read-only constructor? *) - cstr_loc: Location.t; - cstr_attributes: Parsetree.attributes; - cstr_inlined: type_declaration option; - cstr_uid: Uid.t; - } - -and constructor_tag = - Cstr_constant of int (* Constant constructor (an int) *) - | Cstr_block of int (* Regular constructor (a block) *) - | Cstr_unboxed (* Constructor of an unboxed type *) - | Cstr_extension of Path.t * bool (* Extension constructor - true if a constant false if a block*) - -let equal_tag t1 t2 = - match (t1, t2) with - | Cstr_constant i1, Cstr_constant i2 -> i2 = i1 - | Cstr_block i1, Cstr_block i2 -> i2 = i1 - | Cstr_unboxed, Cstr_unboxed -> true - | Cstr_extension (path1, b1), Cstr_extension (path2, b2) -> - Path.same path1 path2 && b1 = b2 - | (Cstr_constant _|Cstr_block _|Cstr_unboxed|Cstr_extension _), _ -> false - -let may_equal_constr c1 c2 = - c1.cstr_arity = c2.cstr_arity - && (match c1.cstr_tag,c2.cstr_tag with - | Cstr_extension _,Cstr_extension _ -> - (* extension constructors may be rebindings of each other *) - true - | tag1, tag2 -> - equal_tag tag1 tag2) - let item_visibility = function | Sig_value (_, _, vis) | Sig_type (_, _, _, vis) @@ -461,20 +427,6 @@ let item_visibility = function | Sig_class (_, _, _, vis) | Sig_class_type (_, _, _, vis) -> vis -type label_description = - { lbl_name: string; (* Short name *) - lbl_res: type_expr; (* Type of the result *) - lbl_arg: type_expr; (* Type of the argument *) - lbl_mut: mutable_flag; (* Is this a mutable field? *) - lbl_pos: int; (* Position in block *) - lbl_all: label_description array; (* All the labels in this type *) - lbl_repres: record_representation; (* Representation for this record *) - lbl_private: private_flag; (* Read-only field? *) - lbl_loc: Location.t; - lbl_attributes: Parsetree.attributes; - lbl_uid: Uid.t; - } - let rec bound_value_identifiers = function [] -> [] | Sig_value(id, {val_kind = Val_reg}, _) :: rem -> @@ -855,7 +807,7 @@ let set_level ty level = (* TODO: introduce a guard and rename it to set_higher_scope? *) let set_scope ty scope = let ty = repr ty in - let prev_scope = ty.scope land marks_mask in + let prev_scope = ty.scope land scope_mask in if scope <> prev_scope then begin if ty.id <= !last_snapshot then log_change (Cscope (ty, prev_scope)); Transient_expr.set_scope ty scope diff --git a/typing/types.mli b/typing/types.mli index ca0cc6e0..ffce6cfa 100644 --- a/typing/types.mli +++ b/typing/types.mli @@ -73,8 +73,13 @@ type type_desc = See [commutable] for the last argument. *) - | Ttuple of type_expr list - (** [Ttuple [t1;...;tn]] ==> [(t1 * ... * tn)] *) + | Ttuple of (string option * type_expr) list + (** [Ttuple [None, t1; ...; None, tn]] ==> [t1 * ... * tn] + [Ttuple [Some "l1", t1; ...; Some "ln", tn]] ==> [l1:t1 * ... * ln:tn] + + Any mix of labeled and unlabeled components also works: + [Ttuple [Some "l1", t1; None, t2; Some "l3", t3]] ==> [l1:t1 * t2 * l3:t3] + *) | Tconstr of Path.t * type_expr list * abbrev_memo ref (** [Tconstr (`A.B.t', [t1;...;tn], _)] ==> [(t1,...,tn) A.B.t] @@ -129,9 +134,14 @@ type type_desc = where 'a1 ... 'an are names given to types in tyl and occurrences of those types in ty. *) - | Tpackage of Path.t * (Longident.t * type_expr) list + | Tpackage of package (** Type of a first-class module (a.k.a package). *) +(** [package] corresponds to the type of a first-class module *) +and package = + { pack_path : Path.t; + pack_cstrs : (string list * type_expr) list } + and fixed_explanation = | Univar of type_expr (** The row type was bound to an univar *) | Fixed_private (** The row type is private *) @@ -535,6 +545,7 @@ and label_declaration = { ld_id: Ident.t; ld_mutable: mutable_flag; + ld_atomic: atomic_flag; ld_type: type_expr; ld_loc: Location.t; ld_attributes: Parsetree.attributes; @@ -661,54 +672,6 @@ and ext_status = val item_visibility : signature_item -> visibility -(* Constructor and record label descriptions inserted held in typing - environments *) - -type constructor_description = - { cstr_name: string; (* Constructor name *) - cstr_res: type_expr; (* Type of the result *) - cstr_existentials: type_expr list; (* list of existentials *) - cstr_args: type_expr list; (* Type of the arguments *) - cstr_arity: int; (* Number of arguments *) - cstr_tag: constructor_tag; (* Tag for heap blocks *) - cstr_consts: int; (* Number of constant constructors *) - cstr_nonconsts: int; (* Number of non-const constructors *) - cstr_generalized: bool; (* Constrained return type? *) - cstr_private: private_flag; (* Read-only constructor? *) - cstr_loc: Location.t; - cstr_attributes: Parsetree.attributes; - cstr_inlined: type_declaration option; - cstr_uid: Uid.t; - } - -and constructor_tag = - Cstr_constant of int (* Constant constructor (an int) *) - | Cstr_block of int (* Regular constructor (a block) *) - | Cstr_unboxed (* Constructor of an unboxed type *) - | Cstr_extension of Path.t * bool (* Extension constructor - true if a constant false if a block*) - -(* Constructors are the same *) -val equal_tag : constructor_tag -> constructor_tag -> bool - -(* Constructors may be the same, given potential rebinding *) -val may_equal_constr : - constructor_description -> constructor_description -> bool - -type label_description = - { lbl_name: string; (* Short name *) - lbl_res: type_expr; (* Type of the result *) - lbl_arg: type_expr; (* Type of the argument *) - lbl_mut: mutable_flag; (* Is this a mutable field? *) - lbl_pos: int; (* Position in block *) - lbl_all: label_description array; (* All the labels in this type *) - lbl_repres: record_representation; (* Representation for this record *) - lbl_private: private_flag; (* Read-only field? *) - lbl_loc: Location.t; - lbl_attributes: Parsetree.attributes; - lbl_uid: Uid.t; - } - (** Extracts the list of "value" identifiers bound by a signature. "Value" identifiers are identifiers for signature components that correspond to a run-time value: values, extensions, modules, classes. diff --git a/typing/typetexp.ml b/typing/typetexp.ml index 1be07aa3..a162bd26 100644 --- a/typing/typetexp.ml +++ b/typing/typetexp.ml @@ -18,7 +18,6 @@ (* Typechecking of type expressions for the core language *) open Asttypes -open Misc open Parsetree open Typedtree open Types @@ -46,6 +45,7 @@ type error = | Method_mismatch of string * type_expr * type_expr | Opened_object of Path.t option | Not_an_object of type_expr + | Repeated_tuple_label of string exception Error of Location.t * Env.t * error exception Error_forward of Location.error @@ -56,7 +56,7 @@ module TyVarEnv : sig val is_in_scope : string -> bool - val add : string -> type_expr -> unit + val add : ?unused:bool ref -> string -> type_expr -> unit (* add a global type variable to the environment *) val with_local_scope : (unit -> 'a) -> 'a @@ -103,7 +103,8 @@ module TyVarEnv : sig row_context:type_expr option ref list -> string -> type_expr (* look up a local type variable; throws Not_found if it isn't in scope *) - val remember_used : string -> type_expr -> Location.t -> unit + val remember_used : + ?check:Location.t -> string -> type_expr -> Location.t -> unit (* remember that a given name is bound to a given type *) val globalize_used_variables : policy -> Env.t -> unit -> unit @@ -126,13 +127,13 @@ end = struct (* These are the "global" type variables: they were in scope before we started processing the current type. *) - let type_variables = ref (TyVarMap.empty : type_expr TyVarMap.t) + let type_variables = ref (TyVarMap.empty : (type_expr * bool ref) TyVarMap.t) (* These are variables that have been used in the currently-being-checked type. *) let used_variables = - ref (TyVarMap.empty : (type_expr * Location.t) TyVarMap.t) + ref (TyVarMap.empty : (type_expr * Location.t * bool ref) TyVarMap.t) (* These are variables we expect to become univars (they were introduced with e.g. ['a .]), but we need to make sure they don't unify first. Why not @@ -164,9 +165,9 @@ end = struct let is_in_scope name = TyVarMap.mem name !type_variables - let add name v = + let add ?(unused = ref false) name v = assert (not_generic v); - type_variables := TyVarMap.add name v !type_variables + type_variables := TyVarMap.add name (v, unused) !type_variables let narrow () = (increase_global_level (), !type_variables) @@ -183,7 +184,9 @@ end = struct (* throws Not_found if the variable is not in scope *) let lookup_global_type_variable name = - TyVarMap.find name !type_variables + let (v, unused) = TyVarMap.find name !type_variables in + unused := false; + v let get_in_scope_names () = let add_name name _ l = @@ -266,14 +269,29 @@ end = struct associate row_context p; p.univar with Not_found -> - instance (fst (TyVarMap.find name !used_variables)) + let (v, _, unused) = TyVarMap.find name !used_variables in + unused := false; + instance v (* This call to instance might be redundant; all variables inserted into [used_variables] are non-generic, but some might get generalized. *) - let remember_used name v loc = + let remember_used ?check name v loc = assert (not_generic v); - used_variables := TyVarMap.add name (v, loc) !used_variables + let unused = match check with + | Some check_loc + when Warnings.(is_active (Unused_type_declaration ("", Alias))) -> + let unused = ref true in + !Env.add_delayed_check_forward begin fun () -> + let warn = Warnings.(Unused_type_declaration ("'" ^ name, Alias)) + in + if !unused && Warnings.is_active warn + then Location.prerr_warning check_loc warn + end; + unused + | _ -> ref false + in + used_variables := TyVarMap.add name (v, loc, unused) !used_variables type flavor = Unification | Universal @@ -308,21 +326,27 @@ end = struct let globalize_used_variables { flavor; extensibility } env = let r = ref [] in TyVarMap.iter - (fun name (ty, loc) -> + (fun name (ty, loc, unused) -> if flavor = Unification || is_in_scope name then let v = new_global_var () in let snap = Btype.snapshot () in - if try unify env v ty; true with _ -> Btype.backtrack snap; false - then try - r := (loc, v, lookup_global_type_variable name) :: !r - with Not_found -> - if extensibility = Fixed && Btype.is_Tvar ty then - raise(Error(loc, env, - Unbound_type_variable (Pprintast.tyvar_of_name name, - get_in_scope_names ()))); - let v2 = new_global_var () in - r := (loc, v, v2) :: !r; - add name v2) + if try unify env v ty; true + with + Unify err when is_in_scope name -> + raise (Error(loc, env, Type_mismatch err)) + | _ -> Btype.backtrack snap; false + then match lookup_global_type_variable name with + | global_var -> + r := (loc, v, global_var) :: !r; + unused := false + | exception Not_found -> + if extensibility = Fixed && Btype.is_Tvar ty then + raise(Error(loc, env, + Unbound_type_variable (Pprintast.tyvar_of_name name, + get_in_scope_names ()))); + let v2 = new_global_var () in + r := (loc, v, v2) :: !r; + add ~unused name v2) !used_variables; used_variables := TyVarMap.empty; fun () -> @@ -342,7 +366,7 @@ let check_package_with_type_constraints = ref (fun _ -> assert false) let sort_constraints_no_duplicates loc env l = List.sort (fun (s1, _t1) (s2, _t2) -> - if s1.txt = s2.txt then + if Longident.same s1.txt s2.txt then raise (Error (loc, env, Multiple_constraints_on_type s1.txt)); compare s1.txt s2.txt) l @@ -364,6 +388,10 @@ let newvar ?name () = let valid_tyvar_name name = name <> "" && name.[0] <> '_' +let check_tyvar_name env loc name = + if not (valid_tyvar_name name) then + raise (Error (loc, env, Invalid_variable_name ("'" ^ name))) + let transl_type_param env styp = let loc = styp.ptyp_loc in match styp.ptyp_desc with @@ -373,8 +401,7 @@ let transl_type_param env styp = ctyp_loc = loc; ctyp_attributes = styp.ptyp_attributes; } | Ptyp_var name -> let ty = - if not (valid_tyvar_name name) then - raise (Error (loc, Env.empty, Invalid_variable_name ("'" ^ name))); + check_tyvar_name Env.empty loc name; if TyVarEnv.is_in_scope name then raise Already_bound; let v = new_global_var ~name () in @@ -415,8 +442,7 @@ and transl_type_aux env ~row_context ~aliased ~policy styp = ctyp Ttyp_any ty | Ptyp_var name -> let ty = - if not (valid_tyvar_name name) then - raise (Error (styp.ptyp_loc, env, Invalid_variable_name ("'" ^ name))); + check_tyvar_name env styp.ptyp_loc name; begin try TyVarEnv.lookup_local ~row_context:row_context name with Not_found -> @@ -438,8 +464,14 @@ and transl_type_aux env ~row_context ~aliased ~policy styp = ctyp (Ttyp_arrow (l, cty1, cty2)) ty | Ptyp_tuple stl -> assert (List.length stl >= 2); - let ctys = List.map (transl_type env ~policy ~row_context) stl in - let ty = newty (Ttuple (List.map (fun ctyp -> ctyp.ctyp_type) ctys)) in + Option.iter (fun l -> raise (Error (loc, env, Repeated_tuple_label l))) + (Misc.repeated_label stl); + let ctys = + List.map (fun (l, t) -> l, transl_type env ~policy ~row_context t) stl + in + let ty = + newty (Ttuple (List.map (fun (l, ctyp) -> l, ctyp.ctyp_type) ctys)) + in ctyp (Ttyp_tuple ctys) ty | Ptyp_constr(lid, stl) -> let (path, decl) = Env.lookup_type ~loc:lid.loc lid.txt env in @@ -507,6 +539,7 @@ and transl_type_aux env ~row_context ~aliased ~policy styp = | Ptyp_alias(st, alias) -> let cty = try + check_tyvar_name env alias.loc alias.txt; let t = TyVarEnv.lookup_local ~row_context alias.txt in let ty = transl_type env ~policy ~aliased:true ~row_context st in begin try unify_var env t ty.ctyp_type with Unify err -> @@ -519,7 +552,7 @@ and transl_type_aux env ~row_context ~aliased ~policy styp = with_local_level_generalize_structure_if_principal begin fun () -> let t = newvar () in (* Use the whole location, which is used by [Type_mismatch]. *) - TyVarEnv.remember_used alias.txt t styp.ptyp_loc; + TyVarEnv.remember_used ~check:alias.loc alias.txt t styp.ptyp_loc; let ty = transl_type env ~policy ~row_context st in begin try unify_var env t ty.ctyp_type with Unify err -> let err = Errortrace.swap_unification_error err in @@ -655,28 +688,18 @@ and transl_type_aux env ~row_context ~aliased ~policy styp = let ty' = Btype.newgenty (Tpoly(ty, ty_list)) in unify_var env (newvar()) ty'; ctyp (Ttyp_poly (vars, cty)) ty' - | Ptyp_package (p, l) -> - let loc = styp.ptyp_loc in - let l = sort_constraints_no_duplicates loc env l in - let mty = Ast_helper.Mty.mk ~loc (Pmty_ident p) in - let mty = TyVarEnv.with_local_scope (fun () -> !transl_modtype env mty) in - let ptys = - List.map (fun (s, pty) -> s, transl_type env ~policy ~row_context pty) l - in - let mty = - if ptys <> [] then - !check_package_with_type_constraints loc env mty.mty_type ptys - else mty.mty_type - in - let path = !transl_modtype_longident loc env p.txt in - let ty = newty (Tpackage (path, - List.map (fun (s, cty) -> (s.txt, cty.ctyp_type)) ptys)) + | Ptyp_package ptyp -> + let path, mty, ptys = transl_package env ~policy ~row_context ptyp in + let ty = newty (Tpackage { + pack_path = path; + pack_cstrs = List.map (fun (s, cty) -> + (Longident.flatten s.txt, cty.ctyp_type)) ptys}) in ctyp (Ttyp_package { - pack_path = path; - pack_type = mty; - pack_fields = ptys; - pack_txt = p; + tpt_path = path; + tpt_type = mty; + tpt_cstrs = ptys; + tpt_txt = ptyp.ppt_path; }) ty | Ptyp_open (mod_ident, t) -> let path, new_env = @@ -753,6 +776,21 @@ and transl_fields env ~policy ~row_context o fields = newty (Tfield (s, field_public, ty', ty))) ty_init fields in ty, object_fields +and transl_package env ~policy ~row_context ptyp = + let loc = ptyp.ppt_loc in + let l = sort_constraints_no_duplicates loc env ptyp.ppt_cstrs in + let mty = Ast_helper.Mty.mk ~loc (Pmty_ident ptyp.ppt_path) in + let mty = TyVarEnv.with_local_scope (fun () -> !transl_modtype env mty) in + let ptys = + List.map (fun (s, pty) -> s, transl_type env ~policy ~row_context pty) l + in + let mty = + if ptys <> [] then + !check_package_with_type_constraints loc env mty.mty_type ptys + else mty.mty_type + in + let path = !transl_modtype_longident loc env ptyp.ppt_path.txt in + path, mty, ptys (* Make the rows "fixed" in this type, to make universal check easier *) let rec make_fixed_univars mark ty = @@ -855,118 +893,131 @@ let pp_tag ppf t = fprintf ppf "`%s" t let pp_out_type ppf ty = Style.as_inline_code !Oprint.out_type ppf ty let pp_type ppf ty = Style.as_inline_code Printtyp.Doc.type_expr ppf ty -let report_error_doc env ppf = function +let report_error_doc loc env = function | Unbound_type_variable (name, in_scope_names) -> - fprintf ppf "The type variable %a is unbound in this type declaration.@ %a" - Style.inline_code name - did_you_mean (fun () -> Misc.spellcheck in_scope_names name ) + Location.aligned_error_hint ~loc + "@{The type variable @}%a is unbound in this type declaration." + Style.inline_code name + (Misc.did_you_mean (Misc.spellcheck in_scope_names name)) | No_type_wildcards -> - fprintf ppf "A type wildcard %a is not allowed in this type declaration." + Location.errorf ~loc + "A type wildcard %a is not allowed in this type declaration." Style.inline_code "_" | Undefined_type_constructor p -> - fprintf ppf "The type constructor@ %a@ is not yet completely defined" - (Style.as_inline_code path) p + Location.errorf ~loc + "The type constructor@ %a@ is not yet completely defined" + (Style.as_inline_code path) p | Type_arity_mismatch(lid, expected, provided) -> - fprintf ppf - "@[The type constructor %a@ expects %i argument(s),@ \ - but is here applied to %i argument(s)@]" - (Style.as_inline_code longident) lid expected provided + Location.errorf ~loc + "The type constructor %a@ expects %i argument(s),@ \ + but is here applied to %i argument(s)" + (Style.as_inline_code longident) lid expected provided | Bound_type_variable name -> - fprintf ppf "Already bound type parameter %a" + Location.errorf ~loc "Already bound type parameter %a" (Style.as_inline_code Pprintast.Doc.tyvar) name | Recursive_type -> - fprintf ppf "This type is recursive" + Location.errorf ~loc "This type is recursive" | Type_mismatch trace -> let msg = Format_doc.Doc.msg in - Errortrace_report.unification ppf Env.empty trace - (msg "This type") - (msg "should be an instance of type") + Location.errorf ~loc "%t" @@ fun ppf -> + Errortrace_report.unification ppf Env.empty trace + (msg "This type") + (msg "should be an instance of type") | Alias_type_mismatch trace -> let msg = Format_doc.Doc.msg in - Errortrace_report.unification ppf Env.empty trace - (msg "This alias is bound to type") - (msg "but is used as an instance of type") + Location.errorf ~loc "%t" @@ fun ppf -> + Errortrace_report.unification ppf Env.empty trace + (msg "This alias is bound to type") + (msg "but is used as an instance of type") | Present_has_conjunction l -> - fprintf ppf "The present constructor %a has a conjunctive type" + Location.errorf ~loc "The present constructor %a has a conjunctive type" Style.inline_code l | Present_has_no_type l -> - fprintf ppf - "@[@[The constructor %a is missing from the upper bound@ \ + Location.errorf ~loc + "The constructor %a is missing from the upper bound@ \ (between %a@ and %a)@ of this polymorphic variant@ \ - but is present in@ its lower bound (after %a).@]@,\ - @[@{Hint@}: Either add %a in the upper bound,@ \ - or remove it@ from the lower bound.@]@]" + but is present in@ its lower bound (after %a)." (Style.as_inline_code pp_tag) l Style.inline_code "<" Style.inline_code ">" Style.inline_code ">" - (Style.as_inline_code pp_tag) l + ~sub:[ + Location.msg + "@{Hint@}: Either add %a in the upper bound,@ \ + or@ remove@ it@ from the lower bound." + (Style.as_inline_code pp_tag) l + ] | Constructor_mismatch (ty, ty') -> wrap_printing_env ~error:true env (fun () -> Out_type.prepare_for_printing [ty; ty']; - fprintf ppf "@[%s %a@ %s@ %a@]" - "This variant type contains a constructor" + Location.errorf ~loc + "This variant type contains a constructor %a@ \ + which should be@ %a" pp_out_type (Out_type.tree_of_typexp Type ty) - "which should be" - pp_out_type (Out_type.tree_of_typexp Type ty')) + pp_out_type (Out_type.tree_of_typexp Type ty') + ) | Not_a_variant ty -> - fprintf ppf - "@[The type %a@ does not expand to a polymorphic variant type@]" - pp_type ty; - begin match get_desc ty with + Location.aligned_error_hint ~loc + "@{The type @}%a@ does not expand to a polymorphic variant type" + pp_type ty + begin match get_desc ty with | Tvar (Some s) -> (* PR#7012: help the user that wrote 'Foo instead of `Foo *) - Misc.did_you_mean ppf (fun () -> ["`" ^ s]) - | _ -> () - end + Misc.did_you_mean ["`" ^ s] + | _ -> None + end | Variant_tags (lab1, lab2) -> - fprintf ppf - "@[Variant tags %a@ and %a have the same hash value.@ %s@]" + Location.errorf ~loc + "Variant tags %a@ and %a have the same hash value.@ \ + Change one of them." (Style.as_inline_code pp_tag) lab1 (Style.as_inline_code pp_tag) lab2 - "Change one of them." | Invalid_variable_name name -> - fprintf ppf "The type variable name %a is not allowed in programs" + Location.errorf ~loc + "The type variable name %a is not allowed in programs" Style.inline_code name | Cannot_quantify (name, v) -> - fprintf ppf - "@[The universal type variable %a cannot be generalized:@ " - (Style.as_inline_code Pprintast.Doc.tyvar) name; - if Btype.is_Tvar v then - fprintf ppf "it escapes its scope" - else if Btype.is_Tunivar v then - fprintf ppf "it is already bound to another variable" - else - fprintf ppf "it is bound to@ %a" pp_type v; - fprintf ppf ".@]"; + let explanation ppf v = + if Btype.is_Tvar v then + fprintf ppf "it escapes its scope." + else if Btype.is_Tunivar v then + fprintf ppf "it is already bound to another variable." + else + fprintf ppf "it is bound to@ %a." pp_type v + in + Location.errorf ~loc + "The universal type variable %a cannot be generalized:@ %a" + (Style.as_inline_code Pprintast.Doc.tyvar) name + explanation v | Multiple_constraints_on_type s -> - fprintf ppf "Multiple constraints for type %a" + Location.errorf ~loc "Multiple constraints for type %a" (Style.as_inline_code longident) s | Method_mismatch (l, ty, ty') -> wrap_printing_env ~error:true env (fun () -> - fprintf ppf "@[Method %a has type %a,@ which should be %a@]" + Location.errorf ~loc "Method %a has type %a,@ which should be %a" Style.inline_code l pp_type ty pp_type ty') | Opened_object nm -> - fprintf ppf + Location.errorf ~loc "Illegal open object type%a" (fun ppf -> function Some p -> fprintf ppf "@ %a" (Style.as_inline_code path) p | None -> fprintf ppf "") nm | Not_an_object ty -> - fprintf ppf "@[The type %a@ is not an object type@]" + Location.errorf ~loc "@[The type %a@ is not an object type@]" pp_type ty + | Repeated_tuple_label l -> + Location.errorf ~loc "@[This tuple type has two labels named %a@]" + Style.inline_code l let () = Location.register_error_of_exn (function | Error (loc, env, err) -> - Some (Location.error_of_printer ~loc (report_error_doc env) err) + Some (report_error_doc loc env err) | Error_forward err -> Some err | _ -> None ) - -let report_error = Format_doc.compat1 report_error_doc diff --git a/typing/typetexp.mli b/typing/typetexp.mli index bd03489f..f3a90326 100644 --- a/typing/typetexp.mli +++ b/typing/typetexp.mli @@ -92,12 +92,10 @@ type error = | Method_mismatch of string * type_expr * type_expr | Opened_object of Path.t option | Not_an_object of type_expr + | Repeated_tuple_label of string exception Error of Location.t * Env.t * error -val report_error: Env.t -> error Format_doc.format_printer -val report_error_doc: Env.t -> error Format_doc.printer - (* Support for first-class modules. *) val transl_modtype_longident: (* from Typemod *) (Location.t -> Env.t -> Longident.t -> Path.t) ref diff --git a/typing/untypeast.ml b/typing/untypeast.ml index 07e4e864..705e7999 100644 --- a/typing/untypeast.ml +++ b/typing/untypeast.ml @@ -88,16 +88,14 @@ Some notes: (** Utility functions. *) -let string_is_prefix sub str = - let sublen = String.length sub in - String.length str >= sublen && String.sub str 0 sublen = sub - -let rec lident_of_path = function +let rec lident_of_path = + let noloc_lident_of_path p = mknoloc (lident_of_path p) in + function | Path.Pident id -> Longident.Lident (Ident.name id) | Path.Papply (p1, p2) -> - Longident.Lapply (lident_of_path p1, lident_of_path p2) + Longident.Lapply (noloc_lident_of_path p1, noloc_lident_of_path p2) | Path.Pdot (p, s) | Path.Pextra_ty (p, Pcstr_ty s) -> - Longident.Ldot (lident_of_path p, s) + Longident.Ldot (noloc_lident_of_path p, mknoloc s) | Path.Pextra_ty (p, _) -> lident_of_path p let map_loc sub {loc; txt} = {loc = sub.location sub loc; txt} @@ -107,7 +105,9 @@ let rec extract_letop_patterns n pat = if n = 0 then pat, [] else begin match pat.pat_desc with - | Tpat_tuple([first; rest]) -> + | Tpat_tuple([None, first; None, rest]) -> + (* Labels should always be None, from when [Texp_letop] are created in + [Typecore.type_expect] *) let next, others = extract_letop_patterns (n-1) rest in first, next :: others | _ -> @@ -312,15 +312,16 @@ let pattern : type k . _ -> k T.general_pattern -> _ = fun sub pat -> The compiler transforms (x:t) into (_ as x : t). This avoids transforming a warning 27 into a 26. *) - | Tpat_alias ({pat_desc = Tpat_any; pat_loc}, _id, name, _) + | Tpat_alias ({pat_desc = Tpat_any; pat_loc}, _id, name, _, _ty) when pat_loc = pat.pat_loc -> Ppat_var name - | Tpat_alias (pat, _id, name, _) -> + | Tpat_alias (pat, _id, name, _, _ty) -> Ppat_alias (sub.pat sub pat, name) | Tpat_constant cst -> Ppat_constant (constant cst) | Tpat_tuple list -> - Ppat_tuple (List.map (sub.pat sub) list) + Ppat_tuple + (List.map (fun (label, p) -> label, sub.pat sub p) list, Closed) | Tpat_construct (lid, _, args, vto) -> let tyo = match vto with @@ -335,7 +336,10 @@ let pattern : type k . _ -> k T.general_pattern -> _ = fun sub pat -> match args with [] -> None | [arg] -> Some (sub.pat sub arg) - | args -> Some (Pat.tuple ~loc (List.map (sub.pat sub) args)) + | args -> + Some (Pat.tuple ~loc + (List.map (fun p -> None, sub.pat sub p) args) + Closed) in Ppat_construct (map_loc sub lid, match tyo, arg with @@ -348,7 +352,7 @@ let pattern : type k . _ -> k T.general_pattern -> _ = fun sub pat -> | Tpat_record (list, closed) -> Ppat_record (List.map (fun (lid, _, pat) -> map_loc sub lid, sub.pat sub pat) list, closed) - | Tpat_array list -> Ppat_array (List.map (sub.pat sub) list) + | Tpat_array (_mut, list) -> Ppat_array (List.map (sub.pat sub) list) | Tpat_lazy p -> Ppat_lazy (sub.pat sub p) | Tpat_exception p -> Ppat_exception (sub.pat sub p) @@ -383,9 +387,17 @@ let case : type k . mapper -> k case -> _ = fun sub {c_lhs; c_guard; c_rhs} -> let value_binding sub vb = let loc = sub.location sub vb.vb_loc in let attrs = sub.attributes sub vb.vb_attributes in - Vb.mk ~loc ~attrs - (sub.pat sub vb.vb_pat) - (sub.expr sub vb.vb_expr) + let pat = sub.pat sub vb.vb_pat in + let pat, value_constraint = + match pat.ppat_desc with + | Ppat_constraint (pat, ({ ptyp_desc = Ptyp_poly _; _ } as cty)) -> + let constr = + Pvc_constraint { locally_abstract_univars = []; typ = cty } + in + pat, Some constr + | _ -> pat, None + in + Vb.mk ~loc ~attrs ?value_constraint pat (sub.expr sub vb.vb_expr) let expression sub exp = let loc = sub.location sub exp.exp_loc in @@ -445,10 +457,10 @@ let expression sub exp = Pexp_function (params, constraint_, body) | Texp_apply (exp, list) -> Pexp_apply (sub.expr sub exp, - List.fold_right (fun (label, expo) list -> - match expo with - None -> list - | Some exp -> (label, sub.expr sub exp) :: list + List.fold_right (fun (label, arg) list -> + match arg with + | Omitted () -> list + | Arg exp -> (label, sub.expr sub exp) :: list ) list []) | Texp_match (exp, cases, eff_cases, _) -> let merged_cases = List.map (sub.case sub) cases @@ -477,7 +489,7 @@ let expression sub exp = in Pexp_try (sub.expr sub exp, merged_cases) | Texp_tuple list -> - Pexp_tuple (List.map (sub.expr sub) list) + Pexp_tuple (List.map (fun (lbl, e) -> lbl, sub.expr sub e) list) | Texp_construct (lid, _, args) -> Pexp_construct (map_loc sub lid, (match args with @@ -485,7 +497,7 @@ let expression sub exp = | [ arg ] -> Some (sub.expr sub arg) | args -> Some - (Exp.tuple ~loc (List.map (sub.expr sub) args)) + (Exp.tuple ~loc (List.map (fun e -> None, sub.expr sub e) args)) )) | Texp_variant (label, expo) -> Pexp_variant (label, Option.map (sub.expr sub) expo) @@ -496,12 +508,19 @@ let expression sub exp = [] fields in Pexp_record (list, Option.map (sub.expr sub) extended_expression) + | Texp_atomic_loc (exp, lid, _label) -> + Pexp_extension ({ txt = "ocaml.atomic.loc"; loc }, + PStr [ Str.eval ~loc + (Exp.field ~loc + (sub.expr sub exp) + (map_loc sub lid)) + ]) | Texp_field (exp, lid, _label) -> Pexp_field (sub.expr sub exp, map_loc sub lid) | Texp_setfield (exp1, lid, _label, exp2) -> Pexp_setfield (sub.expr sub exp1, map_loc sub lid, sub.expr sub exp2) - | Texp_array list -> + | Texp_array (_mut, list) -> Pexp_array (List.map (sub.expr sub) list) | Texp_ifthenelse (exp1, exp2, expo) -> Pexp_ifthenelse (sub.expr sub exp1, @@ -540,7 +559,7 @@ let expression sub exp = | Texp_object (cl, _) -> Pexp_object (sub.class_structure sub cl) | Texp_pack (mexpr) -> - Pexp_pack (sub.module_expr sub mexpr) + Pexp_pack (sub.module_expr sub mexpr, None) | Texp_letop {let_; ands; body; _} -> let pat, and_pats = extract_letop_patterns (List.length ands) body.c_lhs @@ -570,9 +589,10 @@ let binding_op sub bop pat = {pbop_op; pbop_pat; pbop_exp; pbop_loc} let package_type sub pack = - (map_loc sub pack.pack_txt, - List.map (fun (s, ct) -> - (s, sub.typ sub ct)) pack.pack_fields) + { ppt_path = map_loc sub pack.tpt_txt; + ppt_cstrs = List.map (fun (s, ct) -> (s, sub.typ sub ct)) pack.tpt_cstrs; + ppt_attrs = []; + ppt_loc = sub.location sub pack.tpt_txt.loc } let module_type_declaration sub mtd = let loc = sub.location sub mtd.mtd_loc in @@ -742,8 +762,8 @@ let class_expr sub cexpr = Pcl_apply (sub.class_expr sub cl, List.fold_right (fun (label, expo) list -> match expo with - None -> list - | Some exp -> (label, sub.expr sub exp) :: list + | Omitted () -> list + | Arg exp -> (label, sub.expr sub exp) :: list ) args []) | Tcl_let (rec_flat, bindings, _ivars, cl) -> @@ -805,7 +825,8 @@ let core_type sub ct = | Ttyp_var s -> Ptyp_var s | Ttyp_arrow (label, ct1, ct2) -> Ptyp_arrow (label, sub.typ sub ct1, sub.typ sub ct2) - | Ttyp_tuple list -> Ptyp_tuple (List.map (sub.typ sub) list) + | Ttyp_tuple list -> + Ptyp_tuple (List.map (fun (l, typ) -> l, sub.typ sub typ) list) | Ttyp_constr (_path, lid, list) -> Ptyp_constr (map_loc sub lid, List.map (sub.typ sub) list) @@ -828,8 +849,8 @@ let core_type sub ct = let class_structure sub cs = let rec remove_self = function - | { pat_desc = Tpat_alias (p, id, _s, _) } - when string_is_prefix "selfpat-" (Ident.name id) -> + | { pat_desc = Tpat_alias (p, id, _s, _, _ty) } + when String.starts_with ~prefix:"selfpat-" (Ident.name id) -> remove_self p | p -> p in @@ -858,8 +879,8 @@ let object_field sub {of_loc; of_desc; of_attributes;} = Of.mk ~loc ~attrs desc and is_self_pat = function - | { pat_desc = Tpat_alias(_pat, id, _, _) } -> - string_is_prefix "self-" (Ident.name id) + | { pat_desc = Tpat_alias(_pat, id, _, _, _ty) } -> + String.starts_with ~prefix:"self-" (Ident.name id) | _ -> false (* [Typeclass] adds a [self] parameter to initializers and methods that isn't diff --git a/typing/value_rec_check.ml b/typing/value_rec_check.ml index 4f4e4d05..feeff67c 100644 --- a/typing/value_rec_check.ml +++ b/typing/value_rec_check.ml @@ -119,9 +119,9 @@ let is_ref : Types.value_description -> bool = function (* See the note on abstracted arguments in the documentation for Typedtree.Texp_apply *) -let is_abstracted_arg : arg_label * expression option -> bool = function - | (_, None) -> true - | (_, Some _) -> false +let is_abstracted_arg : arg_label * apply_arg -> bool = function + | (_, Omitted ()) -> true + | (_, Arg _) -> false let classify_expression : Typedtree.expression -> sd = (* We need to keep track of the size of expressions @@ -182,6 +182,7 @@ let classify_expression : Typedtree.expression -> sd = | Texp_variant _ | Texp_tuple _ + | Texp_atomic_loc _ | Texp_extension_constructor _ | Texp_constant _ -> Static @@ -632,7 +633,7 @@ let rec expression : Typedtree.expression -> term_judg = path pth << Dereference | Texp_instvar (self_path, pth, _inst_var) -> join [path self_path << Dereference; path pth] - | Texp_apply ({exp_desc = Texp_ident (_, _, vd)}, [_, Some arg]) + | Texp_apply ({exp_desc = Texp_ident (_, _, vd)}, [_, Arg arg]) when is_ref vd -> (* G |- e: m[Guard] @@ -652,8 +653,8 @@ let rec expression : Typedtree.expression -> term_judg = function is stored in the closure without being called. *) let rec split_args ~has_omitted_arg = function | [] -> [], [] - | (_, None) :: rest -> split_args ~has_omitted_arg:true rest - | (_, Some arg) :: rest -> + | (_, Omitted ()) :: rest -> split_args ~has_omitted_arg:true rest + | (_, Arg arg) :: rest -> let applied, delayed = split_args ~has_omitted_arg rest in if has_omitted_arg then applied, arg :: delayed @@ -669,8 +670,10 @@ let rec expression : Typedtree.expression -> term_judg = list expression applied << Dereference; list expression delayed << Guard] | Texp_tuple exprs -> - list expression exprs << Guard - | Texp_array exprs -> + list expression (List.map snd exprs) << Guard + | Texp_atomic_loc (expr, _, _) -> + expression expr << Guard + | Texp_array (_, exprs) -> let array_mode = match Typeopt.array_kind exp with | Lambda.Pfloatarray -> (* (flat) float arrays unbox their elements *) @@ -1189,7 +1192,11 @@ and class_expr : Typedtree.class_expr -> term_judg = let ids = List.map fst args in remove_ids ids (class_expr ce << Delay) | Tcl_apply (ce, args) -> - let arg (_label, eo) = option expression eo in + let arg (_, arg) = + match arg with + | Omitted () -> empty + | Arg e -> expression e + in join [ class_expr ce << Dereference; list arg args << Dereference; @@ -1345,7 +1352,7 @@ and is_destructuring_pattern : type k . k general_pattern -> bool = fun pat -> match pat.pat_desc with | Tpat_any -> false | Tpat_var (_, _, _) -> false - | Tpat_alias (pat, _, _, _) -> is_destructuring_pattern pat + | Tpat_alias (pat, _, _, _, _) -> is_destructuring_pattern pat | Tpat_constant _ -> true | Tpat_tuple _ -> true | Tpat_construct _ -> true diff --git a/utils/clflags.ml b/utils/clflags.ml index be10f235..bf79b30b 100644 --- a/utils/clflags.ml +++ b/utils/clflags.ml @@ -51,6 +51,7 @@ and hidden_include_dirs = ref ([] : string list) (* -H *) and no_std_include = ref false (* -nostdlib *) and no_cwd = ref false (* -nocwd *) and print_types = ref false (* -i *) +and print_variance = ref false (* -i-variance *) and make_archive = ref false (* -a *) and debug = ref false (* -g *) and debug_full = ref false (* For full DWARF support *) @@ -100,13 +101,15 @@ and make_package = ref false (* -pack *) and for_package = ref (None: string option) (* -for-pack *) and error_size = ref 500 (* -error-size *) and float_const_prop = ref true (* -no-float-const-prop *) -and transparent_modules = ref false (* -trans-mod *) -let unique_ids = ref true (* -d(no-)unique-ds *) +and no_alias_deps = ref false (* -no-alias-deps *) +let unique_ids = ref true (* -d(no-)unique-ids *) +let canonical_ids = ref false (* -d(no-)canonical-ids *) let locations = ref true (* -d(no-)locations *) let dump_source = ref false (* -dsource *) let dump_parsetree = ref false (* -dparsetree *) and dump_typedtree = ref false (* -dtypedtree *) and dump_shape = ref false (* -dshape *) +and dump_matchcomp = ref false (* -dmatchcomp *) and dump_rawlambda = ref false (* -drawlambda *) and dump_lambda = ref false (* -dlambda *) and dump_rawclambda = ref false (* -drawclambda *) @@ -126,19 +129,19 @@ and opaque = ref false (* -opaque *) and dump_cmm = ref false (* -dcmm *) let dump_selection = ref false (* -dsel *) +let dump_combine = ref false (* -dcombine *) let dump_cse = ref false (* -dcse *) let dump_live = ref false (* -dlive *) let dump_spill = ref false (* -dspill *) let dump_split = ref false (* -dsplit *) let dump_interf = ref false (* -dinterf *) let dump_prefer = ref false (* -dprefer *) +let dump_interval = ref false (* -dinterval *) let dump_regalloc = ref false (* -dalloc *) let dump_reload = ref false (* -dreload *) let dump_scheduling = ref false (* -dscheduling *) let dump_linear = ref false (* -dlinear *) -let dump_interval = ref false (* -dinterval *) let keep_startup_file = ref false (* -dstartup *) -let dump_combine = ref false (* -dcombine *) let profile_columns : Profile.column list ref = ref [] (* -dprofile/-dtimings *) let native_code = ref false (* set to true under ocamlopt *) @@ -148,6 +151,9 @@ let clambda_checks = ref false (* -clambda-checks *) let cmm_invariants = ref Config.with_cmm_invariants (* -dcmm-invariants *) +let parsetree_ghost_loc_invariant = ref false + (* -dparsetree-ghost-loc-invariant *) + let flambda_invariant_checks = ref Config.with_flambda_invariants (* -flambda-(no-)invariants *) @@ -553,6 +559,197 @@ let set_save_ir_after pass enabled = in save_ir_after := new_passes +module Dump_option = struct + type t = + | Source + | Parsetree + | Typedtree + | Shape + | Match_comp + | Raw_lambda + | Lambda + | Instr + | Raw_clambda + | Clambda + | Raw_flambda + | Flambda + | Cmm + | Selection + | Combine + | CSE + | Live + | Spill + | Split + | Interf + | Prefer + | Regalloc + | Scheduling + | Linear + | Interval + + let compare (op1 : t) op2 = + Stdlib.compare op1 op2 + + let to_string = function + | Source -> "source" + | Parsetree -> "parsetree" + | Typedtree -> "typedtree" + | Shape -> "shape" + | Match_comp -> "matchcomp" + | Raw_lambda -> "rawlambda" + | Lambda -> "lambda" + | Instr -> "instr" + | Raw_clambda -> "rawclambda" + | Clambda -> "clambda" + | Raw_flambda -> "rawflambda" + | Flambda -> "flambda" + | Cmm -> "cmm" + | Selection -> "selection" + | Combine -> "combine" + | CSE -> "cse" + | Live -> "live" + | Spill -> "spill" + | Split -> "split" + | Interf -> "interf" + | Prefer -> "prefer" + | Regalloc -> "regalloc" + | Scheduling -> "scheduling" + | Linear -> "linear" + | Interval -> "interval" + + let of_string = function + | "source" -> Some Source + | "parsetree" -> Some Parsetree + | "typedtree" -> Some Typedtree + | "shape" -> Some Shape + | "matchcomp" -> Some Match_comp + | "rawlambda" -> Some Raw_lambda + | "lambda" -> Some Lambda + | "instr" -> Some Instr + | "rawclambda" -> Some Raw_clambda + | "clambda" -> Some Clambda + | "rawflambda" -> Some Raw_flambda + | "flambda" -> Some Flambda + | "cmm" -> Some Cmm + | "selection" -> Some Selection + | "combine" -> Some Combine + | "cse" -> Some CSE + | "live" -> Some Live + | "spill" -> Some Spill + | "split" -> Some Split + | "interf" -> Some Interf + | "prefer" -> Some Prefer + | "regalloc" -> Some Regalloc + | "scheduling" -> Some Scheduling + | "linear" -> Some Linear + | "interval" -> Some Interval + | _ -> None + + let flag = function + | Source -> dump_source + | Parsetree -> dump_parsetree + | Typedtree -> dump_typedtree + | Shape -> dump_shape + | Match_comp -> dump_matchcomp + | Raw_lambda -> dump_rawlambda + | Lambda -> dump_lambda + | Instr -> dump_instr + | Raw_clambda -> dump_rawclambda + | Clambda -> dump_clambda + | Raw_flambda -> dump_rawflambda + | Flambda -> dump_flambda + | Cmm -> dump_cmm + | Selection -> dump_selection + | Combine -> dump_combine + | CSE -> dump_cse + | Live -> dump_live + | Spill -> dump_spill + | Split -> dump_split + | Interf -> dump_interf + | Prefer -> dump_prefer + | Regalloc -> dump_regalloc + | Scheduling -> dump_scheduling + | Linear -> dump_linear + | Interval -> dump_interval + + type middle_end = + | Flambda + | Any + | Closure + + type class_ = + | Frontend + | Bytecode + | Middle of middle_end + | Backend + + let _ = + (* no Closure-specific dump option for now, silence a warning *) + Closure + + let classify : t -> class_ = function + | Source + | Parsetree + | Typedtree + | Shape + | Match_comp + | Raw_lambda + | Lambda + -> Frontend + | Instr + -> Bytecode + | Raw_clambda + | Clambda + -> Middle Any + | Raw_flambda + | Flambda + -> Middle Flambda + | Cmm + | Selection + | Combine + | CSE + | Live + | Spill + | Split + | Interf + | Prefer + | Regalloc + | Scheduling + | Linear + | Interval + -> Backend + + let available (option : t) : (unit, string) result = + let pass = Result.ok () in + let ( let* ) = Result.bind in + let fail descr = + Error ( + Printf.sprintf + "this compiler does not support %s-specific options" + descr + ) in + let guard descr cond = + if cond then pass + else fail descr in + let check_bytecode = guard "bytecode" (not !native_code) in + let check_native = guard "native" !native_code in + let check_middle_end = function + | Flambda -> guard "flambda" Config.flambda + | Closure -> guard "closure" (not Config.flambda) + | Any -> pass + in + match classify option with + | Frontend -> + pass + | Bytecode -> + check_bytecode + | Middle middle_end -> + let* () = check_native in + check_middle_end middle_end + | Backend -> + check_native +end + let parse_keyword_edition s = let parse_version s = let bad_version () = diff --git a/utils/clflags.mli b/utils/clflags.mli index 248a7d86..3e54d98a 100644 --- a/utils/clflags.mli +++ b/utils/clflags.mli @@ -115,6 +115,7 @@ val use_prims : string ref val use_runtime : string ref val plugin : bool ref val principal : bool ref +val print_variance : bool ref val real_paths : bool ref val recursive_types : bool ref val strict_sequence : bool ref @@ -128,13 +129,15 @@ val make_package : bool ref val for_package : string option ref val error_size : int ref val float_const_prop : bool ref -val transparent_modules : bool ref +val no_alias_deps : bool ref val unique_ids : bool ref +val canonical_ids : bool ref val locations : bool ref val dump_source : bool ref val dump_parsetree : bool ref val dump_typedtree : bool ref val dump_shape : bool ref +val dump_matchcomp : bool ref val dump_rawlambda : bool ref val dump_lambda : bool ref val dump_rawclambda : bool ref @@ -207,6 +210,7 @@ val unbox_free_vars_of_closures : bool ref val unbox_specialised_args : bool ref val clambda_checks : bool ref val cmm_invariants : bool ref +val parsetree_ghost_loc_invariant : bool ref val default_inline_max_depth : int val inline_max_depth : Int_arg_helper.parsed ref val remove_unused_arguments : bool ref @@ -256,11 +260,51 @@ module Compiler_pass : sig val to_output_filename: t -> prefix:string -> string val of_input_filename: string -> t option end + val stop_after : Compiler_pass.t option ref val should_stop_after : Compiler_pass.t -> bool val set_save_ir_after : Compiler_pass.t -> bool -> unit val should_save_ir_after : Compiler_pass.t -> bool +module Dump_option : sig + type t = + | Source + | Parsetree + | Typedtree + | Shape + | Match_comp + | Raw_lambda + | Lambda + | Instr + | Raw_clambda + | Clambda + | Raw_flambda + | Flambda + (* Note: no support for [-dflambda-let ] for now. *) + | Cmm + | Selection + | Combine + | CSE + | Live + | Spill + | Split + | Interf + | Prefer + | Regalloc + | Scheduling + | Linear + | Interval + + val compare : t -> t -> int + + val of_string : string -> t option + val to_string : t -> string + + val flag : t -> bool ref + + val available : t -> (unit, string) Result.t +end + val arg_spec : (string * Arg.spec * string) list ref (* [add_arguments __LOC__ args] will add the arguments from [args] at diff --git a/utils/config.common.ml.in b/utils/config.common.ml.in index 3603fe6c..0f956d2f 100644 --- a/utils/config.common.ml.in +++ b/utils/config.common.ml.in @@ -58,7 +58,7 @@ let max_young_wosize = 256 let stack_threshold = 32 (* see runtime/caml/config.h *) let stack_safety_margin = 6 let default_executable_name = - match Sys.os_type with + match target_os_type with "Unix" -> "a.out" | "Win32" | "Cygwin" -> "camlprog.exe" | _ -> "camlprog" @@ -89,6 +89,7 @@ let configuration_variables () = p "native_c_compiler" native_c_compiler; p "bytecomp_c_libraries" bytecomp_c_libraries; p "native_c_libraries" native_c_libraries; + p "compression_c_libraries" compression_c_libraries; p "native_ldflags" native_ldflags; p "native_pack_linker" native_pack_linker; p_bool "native_compiler" native_compiler; @@ -99,13 +100,15 @@ let configuration_variables () = p "system" system; p "asm" asm; p_bool "asm_cfi_supported" asm_cfi_supported; + p_bool "asm_size_type_directives" asm_size_type_directives; p_bool "with_frame_pointers" with_frame_pointers; + p_bool "with_nonexecstack_note" with_nonexecstack_note; p "ext_exe" ext_exe; p "ext_obj" ext_obj; p "ext_asm" ext_asm; p "ext_lib" ext_lib; p "ext_dll" ext_dll; - p "os_type" Sys.os_type; + p "os_type" target_os_type; p "default_executable_name" default_executable_name; p_bool "systhread_supported" systhread_supported; p "host" host; @@ -114,6 +117,8 @@ let configuration_variables () = p_bool "safe_string" safe_string; p_bool "default_safe_string" default_safe_string; p_bool "flat_float_array" flat_float_array; + p_bool "align_double" align_double; + p_bool "align_int64" align_int64; p_bool "function_sections" function_sections; p_bool "afl_instrument" afl_instrument; p_bool "tsan" tsan; @@ -121,6 +126,7 @@ let configuration_variables () = p_bool "supports_shared_libraries" supports_shared_libraries; p_bool "native_dynlink" native_dynlink; p_bool "naked_pointers" naked_pointers; + p_bool "with_codegen_invariants" with_codegen_invariants; p "exec_magic_number" exec_magic_number; p "cmi_magic_number" cmi_magic_number; diff --git a/utils/config.fixed.ml b/utils/config.fixed.ml index 807b9293..a334b1d7 100644 --- a/utils/config.fixed.ml +++ b/utils/config.fixed.ml @@ -35,7 +35,9 @@ let bytecomp_c_libraries = "" let bytecomp_c_compiler = "" let native_c_compiler = c_compiler let native_c_libraries = "" +let compression_c_libraries = "" let native_ldflags = "" +let with_nonexecstack_note = false let native_pack_linker = boot_cannot_call "the linker" let default_rpath = "" let mksharedlibrpath = "" @@ -48,8 +50,11 @@ let mkmaindll = native_pack_linker let flambda = false let with_flambda_invariants = false let with_cmm_invariants = false +let with_codegen_invariants = false let windows_unicode = false let flat_float_array = true +let align_double = true +let align_int64 = true let function_sections = false let afl_instrument = false let native_compiler = false @@ -57,8 +62,11 @@ let tsan = false let architecture = "none" let model = "default" let system = "unknown" +let target_os_type = + "The boot compiler should not be using Config.target_os_type" let asm = boot_cannot_call "the assembler" let asm_cfi_supported = false +let asm_size_type_directives = false let with_frame_pointers = false let reserved_header_bits = 0 let ext_exe = ".ex_The boot compiler should not be using Config.ext_exe" diff --git a/utils/config.generated.ml.in b/utils/config.generated.ml.in index aa034554..e5e1b15d 100644 --- a/utils/config.generated.ml.in +++ b/utils/config.generated.ml.in @@ -22,7 +22,7 @@ let bindir = {@QS@|@ocaml_bindir@|@QS@} let standard_library_default = {@QS@|@ocaml_libdir@|@QS@} -let ccomp_type = {@QS@|@ccomptype@|@QS@} +let ccomp_type = {@QS@|@ccomp_type@|@QS@} let c_compiler = {@QS@|@CC@|@QS@} let c_output_obj = {@QS@|@outputobj@|@QS@} let c_has_debug_prefix_map = @cc_has_debug_prefix_map@ @@ -44,7 +44,9 @@ let bytecomp_c_compiler = let native_c_compiler = c_compiler ^ " " ^ native_cflags ^ " " ^ native_cppflags let native_c_libraries = {@QS@|@cclibs@|@QS@} +let compression_c_libraries = {@QS@|@zstd_libs@|@QS@} let native_ldflags = {@QS@|@native_ldflags@|@QS@} +let with_nonexecstack_note = @with_nonexecstack_note@ let native_pack_linker = {@QS@|@PACKLD@|@QS@} let default_rpath = {@QS@|@rpath@|@QS@} let mksharedlibrpath = {@QS@|@mksharedlibrpath@|@QS@} @@ -58,9 +60,12 @@ let mkmaindll = {@QS@|@mkmaindll_exp@|@QS@} let flambda = @flambda@ let with_flambda_invariants = @flambda_invariants@ let with_cmm_invariants = @cmm_invariants@ +let with_codegen_invariants = @codegen_invariants@ let windows_unicode = @windows_unicode@ != 0 let flat_float_array = @flat_float_array@ +let align_double = @align_double@ +let align_int64 = @align_int64@ let function_sections = @function_sections@ let afl_instrument = @afl@ @@ -70,13 +75,15 @@ let native_compiler = @native_compiler@ let architecture = {@QS@|@arch@|@QS@} let model = {@QS@|@model@|@QS@} let system = {@QS@|@system@|@QS@} +let target_os_type = {@QS@|@target_os_type@|@QS@} let asm = {@QS@|@AS@|@QS@} let asm_cfi_supported = @asm_cfi_supported@ +let asm_size_type_directives = @asm_size_type_directives@ let with_frame_pointers = @frame_pointers@ let reserved_header_bits = @reserved_header_bits@ -let ext_exe = {@QS@|@exeext@|@QS@} +let ext_exe = {@QS@|@EXEEXT@|@QS@} let ext_obj = "." ^ {@QS@|@OBJEXT@|@QS@} let ext_asm = "." ^ {@QS@|@S@|@QS@} let ext_lib = "." ^ {@QS@|@libext@|@QS@} diff --git a/utils/config.mli b/utils/config.mli index 51e31a37..3e61d6e6 100644 --- a/utils/config.mli +++ b/utils/config.mli @@ -65,9 +65,21 @@ val bytecomp_c_libraries: string val native_c_libraries: string (** The C libraries to link with native-code programs *) +val compression_c_libraries: string +(** The C libraries needed with -lcomprmarsh (should appear before + {!native_c_libraries} in a call to the C compiler) + + @since 5.4 *) + val native_ldflags : string (* Flags to pass to the system linker *) +val with_nonexecstack_note : bool +(** Whether an explicit ".note.GNU-stack" section is to be added to indicate + the stack should not be executable + + @since 5.4 *) + val native_pack_linker: string (** The linker to use for packaging (ocamlopt -pack) and for partial links (ocamlopt -output-obj). *) @@ -163,6 +175,12 @@ val model: string val system: string (** Name of operating system for the native-code compiler *) +val target_os_type: string +(** Operating system targetted by the native-code compiler. One of +- ["Unix"] (for all Unix versions, including Linux and macOS), +- ["Win32"] (for MS-Windows, OCaml compiled with MSVC++ or MinGW-w64), +- ["Cygwin"] (for MS-Windows, OCaml compiled with Cygwin). *) + val asm: string (** The assembler (and flags) to use for assembling ocamlopt-generated code. *) @@ -170,6 +188,11 @@ val asm: string val asm_cfi_supported: bool (** Whether assembler understands CFI directives *) +val asm_size_type_directives: bool +(** Whether the [.size] and [.type] assembler directives can be used + + @since 5.4 *) + val with_frame_pointers : bool (** Whether assembler should maintain frame pointers *) @@ -215,6 +238,9 @@ val with_flambda_invariants : bool val with_cmm_invariants : bool (** Whether the invariants checks for Cmm are enabled *) +val with_codegen_invariants : bool +(** Whether the invariant checks for native code generation are enabled. *) + val reserved_header_bits : int (** How many bits of a block's header are reserved *) @@ -222,6 +248,13 @@ val flat_float_array : bool (** Whether the compiler and runtime automagically flatten float arrays *) +val align_double : bool +(** Whether the compiler and runtime need to align double values. + If [false], a [floatarray] value can be cast to a C array of doubles. *) + +val align_int64 : bool +(** Whether the compiler and runtime need to align int64 values *) + val function_sections : bool (** Whether the compiler was configured to generate each function in a separate section *) diff --git a/utils/format_doc.ml b/utils/format_doc.ml index 97014afd..ab68b0ea 100644 --- a/utils/format_doc.ml +++ b/utils/format_doc.ml @@ -251,6 +251,82 @@ module Doc = struct let msg fmt = kmsg Fun.id fmt + + let ralign_tag = Format.String_tag "ralign" + + let rec split_on_open_tag tag rbefore = function + | [] -> rbefore, [] + | Open_tag t :: rest when t = tag -> + rbefore, rest + | elt :: rest -> + split_on_open_tag tag (elt::rbefore) rest + + let rec split_on_close opened rbefore = function + | [] -> rbefore, [] + | Open_tag _ as elt :: rest -> + split_on_close (opened+1) (elt::rbefore) rest + | Close_tag as elt :: rest -> + if opened = 0 then rbefore, rest + else split_on_close (opened-1) (elt::rbefore) rest + | elt :: rest -> + split_on_close opened (elt::rbefore) rest + + let rec approx_len acc = function + | [] -> Some acc + | Text x :: r-> + let len = Format.utf_8_scalar_width ~pos:0 ~len:(String.length x) x in + approx_len (acc + len) r + | With_size n :: Text _ :: r -> approx_len (acc + n) r + | (Open_box _ | Close_box | Open_tag _ | Close_tag + | Open_tbox | Close_tbox | Set_tab | With_size _ + ) :: r -> + approx_len acc r + | (Tab_break _ | Break _ | Simple_break _ | Flush _ | Newline | If_newline + | Deprecated _ ) :: _ -> + None + + type ralign_split = { + close_pos:int; + before: element list; + mid: element list; + after: element list; + } + + let split_ralign (doc, shift) = + let l = to_list doc in + let before, rest = + split_on_open_tag ralign_tag [] l in + let mid, after = split_on_close 0 [] rest in + let len = Option.bind (approx_len 0 before) (fun n -> approx_len n mid) in + match len with + | None -> Error doc + | Some len -> + Ok { close_pos= shift + len; before; mid; after } + + let align_doc max_pos r = + let aligned_before = + let before = Open_tag ralign_tag :: r.before in + if r.close_pos >= max_pos then before + else Text (String.make (max_pos - r.close_pos) ' ') :: before + in + let mid_to_start = Close_tag :: r.mid @ aligned_before in + { rev = List.rev_append r.after mid_to_start } + + let align_prefix l = + let l = List.map split_ralign l in + let max_pos = + List.fold_left (fun mx r -> + match r with + | Ok r -> max mx r.close_pos + | Error _ -> mx + ) 0 l + in + List.map (Result.fold ~ok:(align_doc max_pos) ~error:Fun.id) l + + let align_prefix2 x y = match align_prefix [x;y] with + | [x;y] -> x, y + | _ -> assert false + end (** Compatibility interface *) @@ -456,6 +532,7 @@ let pp_print_either ~left ~right ppf e = ppf := Doc.either ~left:(doc_printer left) ~right:(doc_printer right) e !ppf let comma ppf () = fprintf ppf ",@ " +let semicolon ppf () = fprintf ppf ";@ " let pp_two_columns ?(sep = "|") ?max_lines ppf (lines: (string * string) list) = let left_column_size = diff --git a/utils/format_doc.mli b/utils/format_doc.mli index bf36829a..d6c3e47c 100644 --- a/utils/format_doc.mli +++ b/utils/format_doc.mli @@ -140,6 +140,14 @@ module Doc: sig val result: ok:'a printer -> error:'e printer -> ('a,'e) result printer val either: left:'a printer -> right:'b printer -> ('a,'b) Either.t printer + (** {1 Alignment functions } *) + + (** Align the right side of one ["@{...@}"] tag box by inserting + spaces at the beginning of boxes. Those function do nothing if the tag box + appears after a break hint. *) + val align_prefix: (t * int) list -> t list + val align_prefix2: (t * int) -> (t * int) -> t * t + end (** {1 Compatibility API} *) @@ -269,6 +277,7 @@ val pp_print_newline: unit printer (** {2 Separators }*) val comma: unit printer +val semicolon: unit printer (** {2 Compiler output} *) diff --git a/utils/misc.ml b/utils/misc.ml index b3d75dbb..e769e5ba 100644 --- a/utils/misc.ml +++ b/utils/misc.ml @@ -260,6 +260,16 @@ module Stdlib = struct external compare : 'a -> 'a -> int = "%compare" end +let repeated_label l = + let module Set = Stdlib.String.Set in + let rec go s = function + | [] -> None + | (None, _) :: l -> go s l + | (Some lbl, _) :: l -> + if Set.mem lbl s then Some lbl else go (Set.add lbl s) l + in + go Set.empty l + (** {1 Minimal support for Unicode characters in identifiers} *) module Utf8_lexeme = struct @@ -793,6 +803,7 @@ module Color = struct let default_setting = Auto let enabled = ref true + let is_enabled () = !enabled end @@ -863,7 +874,7 @@ module Style = struct error = no_markup [Bold; FG Red]; loc = no_markup [Bold]; hint = no_markup [Bold; FG Blue]; - inline_code= { ansi=[Bold]; text_open = {|"|}; text_close = {|"|} } + inline_code= no_markup [Bold] } let cur_styles = ref default_styles @@ -878,6 +889,7 @@ module Style = struct | Format.String_tag "loc" -> (!cur_styles).loc | Format.String_tag "hint" -> (!cur_styles).hint | Format.String_tag "inline_code" -> (!cur_styles).inline_code + | Format.String_tag "ralign" -> no_markup [] | Style s -> no_markup s | _ -> raise Not_found @@ -889,6 +901,7 @@ module Style = struct pp_close_stag ppf () let inline_code ppf s = as_inline_code Format_doc.pp_print_string ppf s + let hint ppf = Format_doc.fprintf ppf "@{Hint@}" (* either prints the tag of [s] or delegates to [or_else] *) let mark_open_tag ~or_else s = @@ -1002,22 +1015,34 @@ let spellcheck env name = let env = List.sort_uniq (fun s1 s2 -> String.compare s2 s1) env in fst (List.fold_left (compare name) ([], max_int) env) +let align_hint ~prefix ~main ~hint = + let prefix_shift = String.length prefix in + Format_doc.Doc.align_prefix2 (main,prefix_shift) (hint,0) -let did_you_mean ppf get_choices = +let align_error_hint ~main ~hint = align_hint ~prefix:"Error: " ~main ~hint + +let aligned_hint ~prefix ppf main_fmt = + let open Format_doc in + kdoc_printf (fun main hint -> + match hint with + | None -> pp_doc ppf main + | Some hint -> + let main, hint = align_hint ~prefix ~main ~hint in + fprintf ppf "%a@.%a" pp_doc main pp_doc hint + ) main_fmt + +let did_you_mean ?(pp=Style.inline_code) choices = let open Format_doc in - (* flush now to get the error report early, in the (unheard of) case - where the search in the get_choices function would take a bit of - time; in the worst case, the user has seen the error, she can - interrupt the process before the spell-checking terminates. *) - fprintf ppf "@?"; - match get_choices () with - | [] -> () + match choices with + | [] -> None | choices -> let rest, last = split_last choices in - fprintf ppf "@\n@[@{Hint@}: Did you mean %a%s%a?@]" - (pp_print_list ~pp_sep:comma Style.inline_code) rest - (if rest = [] then "" else " or ") - Style.inline_code last + Some (doc_printf + "@[@{Hint@}: @{Did you mean @}%a%s%a?@]" + (pp_print_list ~pp_sep:comma pp) rest + (if rest = [] then "" else " or ") + pp last + ) module Error_style = struct type setting = diff --git a/utils/misc.mli b/utils/misc.mli index 54354eba..7622cc62 100644 --- a/utils/misc.mli +++ b/utils/misc.mli @@ -99,6 +99,9 @@ val list_remove: 'a -> 'a list -> 'a list val split_last: 'a list -> 'a list * 'a (** Return the last element and the other elements of the given list. *) +val repeated_label : (string option * 'a) list -> string option + (** Detects a repeated label - for use with labeled tuples. *) + (** {1 Hash table operations} *) val create_hashtable: int -> ('a * 'b) list -> ('a, 'b) Hashtbl.t @@ -446,18 +449,59 @@ val spellcheck : string list -> string -> string list list of suggestions taken from [env], that are close enough to [name] that it may be a typo for one of them. *) + +val align_hint: + prefix:string -> main:Format_doc.t -> hint:Format_doc.t -> + Format_doc.t * Format_doc.t +(** [aligned_hint main hint] vertically aligns a [main] message and a hint + message. The vertical alignment is controlled by the use of [@{ ... + @}] boxes: the start of one box, in either the hint or the main message, + will be shifted on the left to ensure that the end of the two boxes are + vertically aligned, taking in account a pre-existing [prefix] before the + main message. For instance, +{[ +let main, sub = + align_hint + ~prefix:"Error: " + (doc_printf "@{The value @}%a is not an instance variable" + Style.inline_code "foobar" + ) + (doc_printf + "@{Did you mean @}%a" Style.inline_code "foobaz" + ) in + printf "Error: %a%a" pp_doc main pp_doc sub +]} + + produces the following text: + +{[ +Error: The value "foobaz" is not an instance variable +Hint: Did you mean "foobar"? +]} + + where the main message has been shifted to the left to align ["foobaz"] and + ["foobar"]. +*) + + +val align_error_hint: + main:Format_doc.t -> hint:Format_doc.t -> Format_doc.t * Format_doc.t +(** Same as [align_hint ~prefix:"Error: "] *) + +val aligned_hint: + prefix:string -> Format_doc.formatter -> + ('a, Format_doc.formatter, unit, Format_doc.t option -> unit) format4 -> 'a +(** [aligned_hint ~prefix fmt ... hint] align the potential hint with the main + error message generated by the format string [fmt] before printing the two + message. *) + val did_you_mean : - Format_doc.formatter -> (unit -> string list) -> unit -(** [did_you_mean ppf get_choices] hints that the user may have meant - one of the option returned by calling [get_choices]. It does nothing - if the returned list is empty. - - The [unit -> ...] thunking is meant to delay any potentially-slow - computation (typically computing edit-distance with many things - from the current environment) to when the hint message is to be - printed. You should print an understandable error message before - calling [did_you_mean], so that users get a clear notification of - the failure even if producing the hint is slow. + ?pp:string Format_doc.printer -> string list -> Format_doc.t option +(** [did_you_mean ~pp choices] hints that the user may have meant one of the + option in [choices]. + + Each choice is printed with the [pp] function, or [Style.inline_code] if + [pp]=[None]. *) (** {1 Color support detection }*) @@ -466,7 +510,7 @@ module Color: sig type setting = Auto | Always | Never val default_setting : setting - + val is_enabled : unit -> bool end @@ -507,6 +551,7 @@ module Style : sig inline_code: tag_style; } + val hint: Format_doc.formatter -> unit val as_inline_code: 'a Format_doc.printer -> 'a Format_doc.printer val inline_code: string Format_doc.printer diff --git a/utils/numbers.ml b/utils/numbers.ml index 1680675b..db7b8ad6 100644 --- a/utils/numbers.ml +++ b/utils/numbers.ml @@ -17,7 +17,7 @@ module Int_base = Identifiable.Make (struct type t = int - let compare x y = x - y + let compare = Int.compare let output oc x = Printf.fprintf oc "%i" x let hash i = i let equal (i : int) j = i = j diff --git a/utils/warnings.ml b/utils/warnings.ml index d9670caf..fa58cb3f 100644 --- a/utils/warnings.ml +++ b/utils/warnings.ml @@ -34,6 +34,10 @@ type constructor_usage_warning = | Not_constructed | Only_exported_private +type type_declaration_usage_warning = + | Declaration + | Alias + type t = | Comment_start (* 1 *) | Comment_not_end (* 2 *) @@ -42,7 +46,7 @@ type t = | Ignored_partial_application (* 5 *) | Labels_omitted of string list (* 6 *) | Method_override of string list (* 7 *) - | Partial_match of string (* 8 *) + | Partial_match of Format_doc.t (* 8 *) | Missing_record_field_pattern of string (* 9 *) | Non_unit_statement (* 10 *) | Redundant_case (* 11 *) @@ -69,7 +73,7 @@ type t = was turned into a hard error *) | Unused_value_declaration of string (* 32 *) | Unused_open of string (* 33 *) - | Unused_type_declaration of string (* 34 *) + | Unused_type_declaration of string * type_declaration_usage_warning (* 34 *) | Unused_for_index of string (* 35 *) | Unused_ancestor of string (* 36 *) | Unused_constructor of string * constructor_usage_warning (* 37 *) @@ -110,6 +114,7 @@ type t = | Tmc_breaks_tailcall (* 72 *) | Generative_application_expects_unit (* 73 *) | Degraded_to_partial_match (* 74 *) + | Unnecessarily_partial_tuple_pattern (* 75 *) (* If you remove a warning, leave a hole in the numbering. NEVER change the numbers of existing warnings. @@ -192,12 +197,13 @@ let number = function | Tmc_breaks_tailcall -> 72 | Generative_application_expects_unit -> 73 | Degraded_to_partial_match -> 74 + | Unnecessarily_partial_tuple_pattern -> 75 ;; (* DO NOT REMOVE the ;; above: it is used by the testsuite/ests/warnings/mnemonics.mll test to determine where the definition of the number function above ends *) -let last_warning_number = 74 +let last_warning_number = 75 type description = { number : int; @@ -541,6 +547,11 @@ let descriptions = [ description = "A pattern-matching is compiled as partial \ even if it appears to be total."; since = since 5 3 }; + { number = 75; + names = ["unnecessarily-partial-tuple-pattern"]; + description = "A tuple pattern ends in .. but fully matches its expected \ + type."; + since = since 5 4 }; ] let name_to_number = @@ -879,291 +890,387 @@ let () = ignore @@ parse_options true defaults_warn_error let () = List.iter (set_alert ~error:false ~enable:false) default_disabled_alerts +module Fmt = Format_doc +module Style = Misc.Style +let msg = Fmt.doc_printf +let comma_inline_list = Fmt.(pp_print_list ~pp_sep:comma Style.inline_code) +let space_inline_list ppf l = + let pp_sep = Fmt.pp_print_space in + Fmt.fprintf ppf "@[%a@]" (Fmt.pp_print_list ~pp_sep Style.inline_code) l +let expand ppf s = if s = "" then () else Fmt.fprintf ppf "@ %s" s + let message = function | Comment_start -> - "this `(*' is the start of a comment.\n\ - Hint: Did you forget spaces when writing the infix operator `( * )'?" - | Comment_not_end -> "this is not the end of a comment." + msg + "this %a is the start of a comment.@ \ + %t: Did you forget spaces when writing the infix operator %a?" + Style.inline_code "(*" + Style.hint + Style.inline_code "( * )" + | Comment_not_end -> msg "this is not the end of a comment." | Fragile_match "" -> - "this pattern-matching is fragile." + msg "this pattern-matching is fragile." | Fragile_match s -> - "this pattern-matching is fragile.\n\ - It will remain exhaustive when constructors are added to type " ^ s ^ "." + msg "this pattern-matching is fragile.@ \ + It will remain exhaustive when constructors are added to type %a." + Style.inline_code s | Ignored_partial_application -> - "this function application is partial,\n\ - maybe some arguments are missing." + msg "this function application is partial,@ \ + maybe@ some@ arguments@ are@ missing." | Labels_omitted [] -> assert false | Labels_omitted [l] -> - "label " ^ l ^ " was omitted in the application of this function." + msg "label %a@ was omitted@ in@ the@ application@ of@ this@ function." + Style.inline_code l | Labels_omitted ls -> - "labels " ^ String.concat ", " ls ^ - " were omitted in the application of this function." + msg "labels %a@ were omitted@ in@ the@ application@ of@ this@ function." + comma_inline_list ls | Method_override [lab] -> - "the method " ^ lab ^ " is overridden." + msg "the method %a is overridden." + Style.inline_code lab | Method_override (cname :: slist) -> - String.concat " " - ("the following methods are overridden by the class" - :: cname :: ":\n " :: slist) + msg "the following methods are overridden@ by@ the@ class@ %a:@;<1 2>%a" + Style.inline_code cname + space_inline_list slist | Method_override [] -> assert false - | Partial_match "" -> "this pattern-matching is not exhaustive." - | Partial_match s -> - "this pattern-matching is not exhaustive.\n\ - Here is an example of a case that is not matched:\n" ^ s + | Partial_match doc -> + if doc = Format_doc.Doc.empty then + msg "this pattern-matching is not exhaustive." + else + msg "this pattern-matching is not exhaustive.@ \ + @[Here is an example of a case that is not matched:@;<1 2>%a@]" + Format_doc.pp_doc doc | Missing_record_field_pattern s -> - "the following labels are not bound in this record pattern:\n" ^ s ^ - "\nEither bind these labels explicitly or add '; _' to the pattern." + msg "the following labels are not bound@ in@ this@ \ + record@ pattern:@;<1 2>%a.@ \ + @[Either bind these labels explicitly or add %a to the pattern.@]" + Style.inline_code s + Style.inline_code "; _" | Non_unit_statement -> - "this expression should have type unit." - | Redundant_case -> "this match case is unused." - | Redundant_subpat -> "this sub-pattern is unused." + msg "this expression should have type unit." + | Redundant_case -> msg "this match case is unused." + | Redundant_subpat -> msg "this sub-pattern is unused." | Instance_variable_override [lab] -> - "the instance variable " ^ lab ^ " is overridden." + msg "the instance variable %a is overridden." + Style.inline_code lab | Instance_variable_override (cname :: slist) -> - String.concat " " - ("the following instance variables are overridden by the class" - :: cname :: ":\n " :: slist) + msg + "the following instance variables@ are overridden@ \ + by the class %a:@;<1 2>%a" + Style.inline_code cname + space_inline_list slist | Instance_variable_override [] -> assert false | Illegal_backslash -> - "illegal backslash escape in string.\n\ - Hint: Single backslashes \\ are reserved for escape sequences\n\ - (\\n, \\r, ...). Did you check the list of OCaml escape sequences?\n\ - To get a backslash character, escape it with a second backslash: \\\\." + msg "illegal backslash escape in string.@ \ + %t: Single backslashes %a are reserved for escape sequences@ \ + (%a, %a, ...).@ Did you check the list of OCaml escape sequences?@ \ + To get a backslash character, escape it with a second backslash: %a." + Style.hint + Style.inline_code {|\|} + Style.inline_code {|\n|} + Style.inline_code {|\r|} + Style.inline_code {|\\|} | Implicit_public_methods l -> - "the following private methods were made public implicitly:\n " - ^ String.concat " " l ^ "." - | Unerasable_optional_argument -> "this optional argument cannot be erased." - | Undeclared_virtual_method m -> "the virtual method "^m^" is not declared." - | Not_principal msg -> - Format_doc.asprintf "%a is not principal." - Format_doc.pp_doc msg - | Non_principal_labels s -> s^" without principality." - | Ignored_extra_argument -> "this argument will not be used by the function." + msg + "the following private methods@ were@ made@ public@ \ + implicitly:@;<1 2>%a." + space_inline_list l + | Unerasable_optional_argument -> + msg "this optional argument cannot be erased." + | Undeclared_virtual_method m -> + msg "the virtual method %a is not declared." + Style.inline_code m + | Not_principal emsg -> + msg "%a@ is@ not@ principal." Fmt.pp_doc emsg + | Non_principal_labels s -> msg "%s without principality." s + | Ignored_extra_argument -> + msg "this argument will not be used by the function." | Nonreturning_statement -> - "this statement never returns (or has an unsound type.)" - | Preprocessor s -> s + msg "this statement never returns (or has an unsound type.)" + | Preprocessor s -> msg "%s" s | Useless_record_with -> - "all the fields are explicitly listed in this record:\n\ - the 'with' clause is useless." + msg "all the fields are explicitly listed in this record:@ \ + the %a clause is useless." + Style.inline_code "with" | Bad_module_name (modname) -> - "bad source file name: \"" ^ modname ^ "\" is not a valid module name." + msg "bad source file name: %a is not a valid module name." + Style.inline_code modname | All_clauses_guarded -> - "this pattern-matching is not exhaustive.\n\ - All clauses in this pattern-matching are guarded." - | Unused_var v | Unused_var_strict v -> "unused variable " ^ v ^ "." + msg "this pattern-matching is not exhaustive.@ \ + All clauses in this pattern-matching are guarded." + | Unused_var v | Unused_var_strict v -> + msg "unused variable %a." + Style.inline_code v | Wildcard_arg_to_constant_constr -> - "wildcard pattern given as argument to a constant constructor" + msg "wildcard pattern given as argument to a constant constructor" | Eol_in_string -> - "unescaped end-of-line in a string constant\n\ - (non-portable behavior before OCaml 5.2)" + msg "unescaped end-of-line in a string constant@ \ + (non-portable behavior before OCaml 5.2)" | Duplicate_definitions (kind, cname, tc1, tc2) -> - Printf.sprintf "the %s %s is defined in both types %s and %s." - kind cname tc1 tc2 - | Unused_value_declaration v -> "unused value " ^ v ^ "." - | Unused_open s -> "unused open " ^ s ^ "." - | Unused_open_bang s -> "unused open! " ^ s ^ "." - | Unused_type_declaration s -> "unused type " ^ s ^ "." - | Unused_for_index s -> "unused for-loop index " ^ s ^ "." - | Unused_ancestor s -> "unused ancestor variable " ^ s ^ "." - | Unused_constructor (s, Unused) -> "unused constructor " ^ s ^ "." + msg "the %s %a is defined in both types %a and %a." + kind + Style.inline_code cname + Style.inline_code tc1 + Style.inline_code tc2 + | Unused_value_declaration v -> + msg "unused value %a." Style.inline_code v + | Unused_open s -> msg "unused open %a." Style.inline_code s + | Unused_open_bang s -> msg "unused open! %a." Style.inline_code s + | Unused_type_declaration (s, Declaration) -> + msg "unused type %a." Style.inline_code s + | Unused_type_declaration (s, Alias) -> + msg "unused type alias %a." Style.inline_code s + | Unused_for_index s -> msg "unused for-loop index %a." Style.inline_code s + | Unused_ancestor s -> msg "unused ancestor variable %a." Style.inline_code s + | Unused_constructor (s, Unused) -> + msg "unused constructor %a." Style.inline_code s | Unused_constructor (s, Not_constructed) -> - "constructor " ^ s ^ - " is never used to build values.\n\ - (However, this constructor appears in patterns.)" + msg "constructor %a is never used to build values.@ \ + (However, this constructor appears in patterns.)" + Style.inline_code s | Unused_constructor (s, Only_exported_private) -> - "constructor " ^ s ^ - " is never used to build values.\n\ - Its type is exported as a private type." + msg "constructor %a is never used to build values.@ \ + Its type is exported as a private type." + Style.inline_code s | Unused_extension (s, is_exception, complaint) -> - let kind = - if is_exception then "exception" else "extension constructor" in - let name = kind ^ " " ^ s in - begin match complaint with - | Unused -> "unused " ^ name - | Not_constructed -> - name ^ - " is never used to build values.\n\ - (However, this constructor appears in patterns.)" - | Only_exported_private -> - name ^ - " is never used to build values.\n\ - It is exported or rebound as a private extension." - end + let kind = + if is_exception then "exception" else "extension constructor" in + begin match complaint with + | Unused -> msg "unused %s %a" kind Style.inline_code s + | Not_constructed -> + msg + "%s %a is never used@ to@ build@ values.@ \ + (However, this constructor appears in patterns.)" + kind Style.inline_code s + | Only_exported_private -> + msg + "%s %a is never used@ to@ build@ values.@ \ + It is exported or rebound as a private extension." + kind Style.inline_code s + end | Unused_rec_flag -> - "unused rec flag." + msg "unused rec flag." | Name_out_of_scope (ty, [nm], false) -> - nm ^ " was selected from type " ^ ty ^ - ".\nIt is not visible in the current scope, and will not \n\ - be selected if the type becomes unknown." + msg "%a was selected from type %a.@ \ + @[It is not visible in the current scope,@ and@ will@ not@ \ + be@ selected@ if the type becomes unknown@]." + Style.inline_code nm + Style.inline_code ty | Name_out_of_scope (_, _, false) -> assert false | Name_out_of_scope (ty, slist, true) -> - "this record of type "^ ty ^" contains fields that are \n\ - not visible in the current scope: " - ^ String.concat " " slist ^ ".\n\ - They will not be selected if the type becomes unknown." + msg "this record of type %a@ contains@ fields@ that@ are@ \ + not@ visible in the current scope:@;<1 2>%a.@ \ + @[They will not be selected@ if the type@ becomes@ unknown.@]" + Style.inline_code ty + space_inline_list slist | Ambiguous_name ([s], tl, false, expansion) -> - s ^ " belongs to several types: " ^ String.concat " " tl ^ - "\nThe first one was selected. Please disambiguate if this is wrong." - ^ expansion + msg "%a belongs to several types:@;<1 2>%a.@ \ + The first one was selected.@ \ + @[Please disambiguate@ if@ this@ is wrong.%a@]" + Style.inline_code s + space_inline_list tl + expand expansion | Ambiguous_name (_, _, false, _ ) -> assert false | Ambiguous_name (_slist, tl, true, expansion) -> - "these field labels belong to several types: " ^ - String.concat " " tl ^ - "\nThe first one was selected. Please disambiguate if this is wrong." - ^ expansion + msg "these field labels belong to several types:@;<1 2>%a.@ \ + @[The first one was selected.@ \ + Please disambiguate@ if@ this@ is@ wrong.%a@]" + space_inline_list tl + expand expansion | Disambiguated_name s -> - "this use of " ^ s ^ " relies on type-directed disambiguation,\n\ - it will not compile with OCaml 4.00 or earlier." + msg "this use of %a@ relies@ on@ type-directed@ disambiguation,@ \ + @[it@ will@ not@ compile@ with@ OCaml@ 4.00@ or@ earlier.@]" + Style.inline_code s | Nonoptional_label s -> - "the label " ^ s ^ " is not optional." + msg "the label %a is not optional." + Style.inline_code s | Open_shadow_identifier (kind, s) -> - Printf.sprintf - "this open statement shadows the %s identifier %s (which is later used)" - kind s + msg + "this open statement shadows@ the@ %s identifier@ %a@ \ + (which is later used)" + kind Style.inline_code s | Open_shadow_label_constructor (kind, s) -> - Printf.sprintf - "this open statement shadows the %s %s (which is later used)" - kind s + msg + "this open statement shadows@ the@ %s %a@ (which is later used)" + kind Style.inline_code s | Bad_env_variable (var, s) -> - Printf.sprintf "illegal environment variable %s : %s" var s + msg "illegal environment variable %a : %s" + Style.inline_code var + s | Attribute_payload (a, s) -> - Printf.sprintf "illegal payload for attribute '%s'.\n%s" a s + msg "illegal payload for attribute %a.@ %s" + Style.inline_code a + s | Eliminated_optional_arguments sl -> - Printf.sprintf "implicit elimination of optional argument%s %s" + msg "implicit elimination@ of optional argument%s@ %a" (if List.length sl = 1 then "" else "s") - (String.concat ", " sl) + comma_inline_list sl | No_cmi_file(name, None) -> - "no cmi file was found in path for module " ^ name - | No_cmi_file(name, Some msg) -> - Printf.sprintf - "no valid cmi file was found in path for module %s. %s" - name msg + msg "no cmi file was found@ in path for module %a" + Style.inline_code name + | No_cmi_file(name, Some wmsg) -> + msg + "no valid cmi file was found@ in path for module %a.@ %s" + Style.inline_code name + wmsg | Unexpected_docstring unattached -> - if unattached then "unattached documentation comment (ignored)" - else "ambiguous documentation comment" + if unattached then msg "unattached documentation comment (ignored)" + else msg "ambiguous documentation comment" | Wrong_tailcall_expectation b -> - Printf.sprintf "expected %s" + msg "expected %s" (if b then "tailcall" else "non-tailcall") | Fragile_literal_pattern -> let[@manual.ref "ss:warn52"] ref_manual = [ 13; 5; 3 ] in - Format.asprintf - "Code should not depend on the actual values of\n\ - this constructor's arguments. They are only for information\n\ - and may change in future versions. %a" - (Format_doc.compat Misc.print_see_manual) ref_manual + msg + "Code should not depend@ on@ the@ actual@ values of@ \ + this@ constructor's arguments.@ @[They are only for@ information@ \ + and@ may@ change@ in@ future versions.@ %a@]" + Misc.print_see_manual ref_manual | Unreachable_case -> - "this match case is unreachable.\n\ - Consider replacing it with a refutation case ' -> .'" + msg "this match case is unreachable.@ \ + Consider replacing it with a refutation case %a" + Style.inline_code " -> ." | Misplaced_attribute attr_name -> - Printf.sprintf "the %S attribute cannot appear in this context" attr_name + msg "the %a attribute cannot appear in this context" + Style.inline_code attr_name | Duplicated_attribute attr_name -> - Printf.sprintf "the %S attribute is used more than once on this \ - expression" - attr_name + msg "the %a attribute is used more than once@ on@ this@ \ + expression" + Style.inline_code attr_name | Inlining_impossible reason -> - Printf.sprintf "Cannot inline: %s" reason + msg "Cannot inline:@ %s" reason | Ambiguous_var_in_pattern_guard vars -> let[@manual.ref "ss:warn57"] ref_manual = [ 13; 5; 4 ] in let vars = List.sort String.compare vars in let vars_explanation = - let in_different_places = - "in different places in different or-pattern alternatives" - in match vars with | [] -> assert false - | [x] -> "variable " ^ x ^ " appears " ^ in_different_places + | [x] -> + Fmt.dprintf + "variable %a appears in@ different@ places@ in@ \ + different@ or-pattern@ alternatives." + Style.inline_code x | _::_ -> - let vars = String.concat ", " vars in - "variables " ^ vars ^ " appear " ^ in_different_places + Fmt.dprintf + "variables %a appears in@ different@ places@ in@ \ + different@ or-pattern@ alternatives." + comma_inline_list vars in - Format.asprintf - "Ambiguous or-pattern variables under guard;\n\ - %s.\n\ - Only the first match will be used to evaluate the guard expression.\n\ - %a" - vars_explanation (Format_doc.compat Misc.print_see_manual) ref_manual + msg + "Ambiguous or-pattern variables under@ guard;@ \ + %t@ \ + @[Only the first match will be used to evaluate@ \ + the@ guard@ expression.@ %a@]" + vars_explanation + Misc.print_see_manual ref_manual | No_cmx_file name -> - Printf.sprintf - "no cmx file was found in path for module %s, \ - and its interface was not compiled with -opaque" name + msg + "no cmx file was found@ in@ path@ for@ module@ %a,@ \ + and@ its@ interface@ was@ not@ compiled@ with %a" + Style.inline_code name + Style.inline_code "-opaque" | Flambda_assignment_to_non_mutable_value -> - "A potential assignment to a non-mutable value was detected \n\ - in this source file. Such assignments may generate incorrect code \n\ - when using Flambda." - | Unused_module s -> "unused module " ^ s ^ "." + msg + "A potential@ assignment@ to@ a@ non-mutable@ value@ was@ detected@ \ + in@ this@ source@ file.@ \ + Such@ assignments@ may@ generate@ incorrect@ code@ \ + when@ using@ Flambda." + | Unused_module s -> msg "unused module %a." Style.inline_code s | Unboxable_type_in_prim_decl t -> - Printf.sprintf - "This primitive declaration uses type %s, whose representation\n\ - may be either boxed or unboxed. Without an annotation to indicate\n\ - which representation is intended, the boxed representation has been\n\ - selected by default. This default choice may change in future\n\ - versions of the compiler, breaking the primitive implementation.\n\ - You should explicitly annotate the declaration of %s\n\ - with [@@boxed] or [@@unboxed], so that its external interface\n\ - remains stable in the future." t t + msg + "This primitive declaration uses type %a,@ whose@ representation@ \ + may be either boxed or unboxed.@ Without@ an@ annotation@ to@ \ + indicate@ which@ representation@ is@ intended,@ the@ boxed@ \ + representation@ has@ been@ selected@ by@ default.@ This@ default@ \ + choice@ may@ change@ in@ future@ versions@ of@ the@ compiler,@ \ + breaking@ the@ primitive@ implementation.@ You@ should@ explicitly@ \ + annotate@ the@ declaration@ of@ %a@ with@ %a@ or@ %a,@ so@ that@ its@ \ + external@ interface@ remains@ stable@ in@ the future." + Style.inline_code t + Style.inline_code t + Style.inline_code "[@@boxed]" + Style.inline_code "[@@unboxed]" | Constraint_on_gadt -> - "Type constraints do not apply to GADT cases of variant types." + msg "Type constraints do not apply to@ GADT@ cases@ of@ variant types." | Erroneous_printed_signature s -> - "The printed interface differs from the inferred interface.\n\ - The inferred interface contained items which could not be printed\n\ - properly due to name collisions between identifiers.\n" - ^ s - ^ "\nBeware that this warning is purely informational and will not catch\n\ - all instances of erroneous printed interface." + msg + "The printed@ interface@ differs@ from@ the@ inferred@ interface.@ \ + The@ inferred@ interface@ contained@ items@ which@ could@ not@ be@ \ + printed@ properly@ due@ to@ name@ collisions@ between@ identifiers.@ \ + %s@ \ + Beware@ that@ this@ warning@ is@ purely@ informational@ and@ will@ \ + not@ catch@ all@ instances@ of@ erroneous@ printed@ interface." + s | Unsafe_array_syntax_without_parsing -> - "option -unsafe used with a preprocessor returning a syntax tree" + msg "option@ %a@ used with a preprocessor returning@ a@ syntax tree" + Style.inline_code "-unsafe" | Redefining_unit name -> - Printf.sprintf - "This type declaration is defining a new '()' constructor\n\ - which shadows the existing one.\n\ - Hint: Did you mean 'type %s = unit'?" name - | Unused_functor_parameter s -> "unused functor parameter " ^ s ^ "." + let def ppf name = Fmt.fprintf ppf "type %s = unit" name in + msg + "This type declaration is@ defining@ a new %a constructor@ \ + which@ shadows@ the@ existing@ one.@ \ + %t: Did you mean %a?" + Style.inline_code "()" + Style.hint + (Style.as_inline_code def) name + | Unused_functor_parameter s -> + msg "unused functor parameter %a." Style.inline_code s | Match_on_mutable_state_prevent_uncurry -> - "This pattern depends on mutable state.\n\ - It prevents the remaining arguments from being uncurried, which will \ - cause additional closure allocations." - | Unused_field (s, Unused) -> "unused record field " ^ s ^ "." + msg + "This pattern depends on@ mutable@ state.@ It prevents@ the@ \ + remaining@ arguments@ from@ being@ uncurried,@ which will@ cause@ \ + additional@ closure@ allocations." + | Unused_field (s, Unused) -> + msg "unused record field %a." Style.inline_code s | Unused_field (s, Not_read) -> - "record field " ^ s ^ - " is never read.\n\ - (However, this field is used to build or mutate values.)" + msg "record field %a is never read.@ \ + (However, this field is used to build or mutate values.)" + Style.inline_code s | Unused_field (s, Not_mutated) -> - "mutable record field " ^ s ^ - " is never mutated." + msg "mutable record field %a is never mutated." + Style.inline_code s | Missing_mli -> - "Cannot find interface file." + msg "Cannot find interface file." | Unused_tmc_attribute -> - "This function is marked @tail_mod_cons\n\ - but is never applied in TMC position." + msg "This function is marked %a@ \ + but is never applied in TMC position." + Style.inline_code "@tail_mod_cons" | Tmc_breaks_tailcall -> - "This call\n\ - is in tail-modulo-cons position in a TMC function,\n\ - but the function called is not itself specialized for TMC,\n\ - so the call will not be transformed into a tail call.\n\ - Please either mark the called function with the [@tail_mod_cons]\n\ - attribute, or mark this call with the [@tailcall false] attribute\n\ - to make its non-tailness explicit." + msg "This call@ is@ in@ tail-modulo-cons@ position@ in@ a@ TMC@ \ + function,@ but@ the@ function@ called@ is@ not@ itself@ \ + specialized@ for@ TMC,@ so@ the@ call@ will@ not@ be@ transformed@ \ + into@ a@ tail@ call.@ \ + @[Please@ either@ mark@ the@ called@ function@ with@ the %a@ \ + attribute,@ or@ mark@ this@ call@ with@ the@ %a@ attribute@ to@ \ + make@ its@ non-tailness@ explicit.@]" + Style.inline_code "[@tail_mod_cons]" + Style.inline_code "[@tailcall false]" | Generative_application_expects_unit -> - "A generative functor\n\ - should be applied to '()'; using '(struct end)' is deprecated." + msg "A generative functor@ \ + should be applied@ to@ %a;@ using@ %a@ is deprecated." + Style.inline_code "()" + Style.inline_code "(struct end)" | Degraded_to_partial_match -> let[@manual.ref "ss:warn74"] ref_manual = [ 13; 5; 5 ] in - Format.asprintf - "This pattern-matching is compiled \n\ - as partial, even if it appears to be total. \ - It may generate a Match_failure\n\ - exception. This typically occurs due to \ - complex matches on mutable fields.\n\ - %a" - (Format_doc.compat Misc.print_see_manual) ref_manual + msg + "This pattern-matching@ is@ compiled@ as@ partial,@ even@ if@ it@ \ + appears@ to@ be@ total.@ It@ may@ generate@ a@ %a@ exception.@ This@ \ + typically@ occurs@ due@ to@ complex@ matches@ on@ mutable@ fields.@ %a" + Style.inline_code "Match_failure" + Misc.print_see_manual ref_manual + | Unnecessarily_partial_tuple_pattern -> + msg + "This tuple pattern@ unnecessarily@ ends in %a,@ as@ it@ explicitly@ \ + matches@ all@ components@ of@ its@ expected@ type." + Style.inline_code ".." ;; let nerrors = ref 0 type reporting_information = { id : string - ; message : string + ; message : Fmt.doc ; is_error : bool - ; sub_locs : (loc * string) list; + ; sub_locs : (loc * Fmt.doc) list; } let id_name w = @@ -1192,7 +1299,7 @@ let report_alert (alert : alert) = | true -> let is_error = alert_is_error alert in if is_error then incr nerrors; - let message = Misc.normalise_eol alert.message in + let message = msg "%s" (Misc.normalise_eol alert.message) in (* Reduce \r\n to \n: - Prevents any \r characters being printed on Unix when processing Windows sources @@ -1202,8 +1309,8 @@ let report_alert (alert : alert) = let sub_locs = if not alert.def.loc_ghost && not alert.use.loc_ghost then [ - alert.def, "Definition"; - alert.use, "Expected signature"; + alert.def, msg "Definition"; + alert.use, msg "Expected signature"; ] else [] diff --git a/utils/warnings.mli b/utils/warnings.mli index 1da12c15..5a197817 100644 --- a/utils/warnings.mli +++ b/utils/warnings.mli @@ -39,6 +39,10 @@ type constructor_usage_warning = | Not_constructed | Only_exported_private +type type_declaration_usage_warning = + | Declaration + | Alias + type t = | Comment_start (* 1 *) | Comment_not_end (* 2 *) @@ -47,7 +51,7 @@ type t = | Ignored_partial_application (* 5 *) | Labels_omitted of string list (* 6 *) | Method_override of string list (* 7 *) - | Partial_match of string (* 8 *) + | Partial_match of Format_doc.t (* 8 *) | Missing_record_field_pattern of string (* 9 *) | Non_unit_statement (* 10 *) | Redundant_case (* 11 *) @@ -76,7 +80,7 @@ type t = | Duplicate_definitions of string * string * string * string (* 30 *) | Unused_value_declaration of string (* 32 *) | Unused_open of string (* 33 *) - | Unused_type_declaration of string (* 34 *) + | Unused_type_declaration of string * type_declaration_usage_warning (* 34 *) | Unused_for_index of string (* 35 *) | Unused_ancestor of string (* 36 *) | Unused_constructor of string * constructor_usage_warning (* 37 *) @@ -117,6 +121,7 @@ type t = | Tmc_breaks_tailcall (* 72 *) | Generative_application_expects_unit (* 73 *) | Degraded_to_partial_match (* 74 *) + | Unnecessarily_partial_tuple_pattern (* 75 *) type alert = {kind:string; message:string; def:loc; use:loc} @@ -139,9 +144,9 @@ val defaults_warn_error : string type reporting_information = { id : string - ; message : string + ; message : Format_doc.t ; is_error : bool - ; sub_locs : (loc * string) list; + ; sub_locs : (loc * Format_doc.t) list; } val report : t -> [ `Active of reporting_information | `Inactive ] diff --git a/yacc/defs.h b/yacc/defs.h index 66063da2..344af5ae 100644 --- a/yacc/defs.h +++ b/yacc/defs.h @@ -172,7 +172,7 @@ struct core short number; short accessing_symbol; short nitems; - short items[1]; + short items[/* nitems */]; /* flexible array member */ }; @@ -184,7 +184,7 @@ struct shifts struct shifts *next; short number; short nshifts; - short shift[1]; + short shift[/* nshifts */]; /* flexible array member */ }; @@ -196,7 +196,7 @@ struct reductions struct reductions *next; short number; short nreds; - short rules[1]; + short rules[/* nreds */]; /* flexible array member */ }; @@ -227,7 +227,7 @@ extern char eflag; extern char big_endian; /* myname should be UTF-8 encoded */ -extern char *myname; +extern const char *myname; extern char *cptr; extern char *line; extern int lineno; @@ -238,7 +238,7 @@ extern int outline; extern char_os *action_file_name; extern char_os *entry_file_name; extern char_os *code_file_name; -extern char_os *input_file_name; +extern const char_os *input_file_name; extern char_os *output_file_name; extern char_os *text_file_name; extern char_os *verbose_file_name; @@ -316,8 +316,8 @@ extern short final_state; /* global functions */ extern char *allocate(unsigned int n); -extern bucket *lookup(char *name); -extern bucket *make_bucket(char *name); +extern bucket *lookup(const char *name); +extern bucket *make_bucket(const char *name); extern action *parse_actions(int stateno); extern action *get_shifts(int stateno); extern action *add_reductions(int stateno, action *actions); @@ -327,7 +327,7 @@ extern void create_symbol_table (void); CAMLnoret extern void default_action_error (void); CAMLnoret extern void done (int k); CAMLnoret extern void entry_without_type (char *s); -CAMLnoret extern void fatal (char *msg); +CAMLnoret extern void fatal (const char *msg); extern void finalize_closure (void); extern void free_parser (void); extern void free_symbol_table (void); @@ -339,7 +339,7 @@ extern void lr0 (void); extern void make_parser (void); CAMLnoret extern void no_grammar (void); CAMLnoret extern void no_space (void); -CAMLnoret extern void open_error (char_os *filename); +CAMLnoret extern void open_error (const char_os *filename); extern void output (void); extern void prec_redeclared (void); CAMLnoret extern void polymorphic_entry_point(char *s); @@ -365,7 +365,7 @@ CAMLnoret extern void unterminated_string (int s_lineno, char *s_line, char *s_c CAMLnoret extern void unterminated_text (int t_lineno, char *t_line, char *t_cptr); CAMLnoret extern void used_reserved (char *s); extern void verbose (void); -extern void write_section (char **section); +extern void write_section (char const * const * section); CAMLnoret extern void invalid_literal(int s_lineno, char *s_line, char *s_cptr); #endif /* YACC_DEFS_H */ diff --git a/yacc/error.c b/yacc/error.c index 9dbe42de..cb3ae30d 100644 --- a/yacc/error.c +++ b/yacc/error.c @@ -20,9 +20,9 @@ #include "defs.h" /* String displayed if we can't malloc a buffer for the UTF-8 conversion */ -static char *unknown = ""; +static const char *unknown = ""; -void fatal(char *msg) +void fatal(const char *msg) { fprintf(stderr, "%s: f - %s\n", myname, msg); done(2); @@ -36,7 +36,7 @@ void no_space(void) } -void open_error(char_os *filename) +void open_error(const char_os *filename) { char *u8 = caml_stat_strdup_of_os(filename); fprintf(stderr, "%s: f - cannot open \"%s\"\n", myname, (u8 ? u8 : unknown)); @@ -77,7 +77,8 @@ static void print_pos(char *st_line, char *st_cptr) } -CAMLnoret static void gen_error(int st_lineno, char *st_line, char *st_cptr, char *msg) +CAMLnoret static void gen_error(int st_lineno, char *st_line, char *st_cptr, + const char *msg) { fprintf(stderr, "File \"%s\", line %d: %s\n", virtual_input_file_name, st_lineno, msg); diff --git a/yacc/lr0.c b/yacc/lr0.c index af2ff1f6..b14df427 100644 --- a/yacc/lr0.c +++ b/yacc/lr0.c @@ -321,7 +321,7 @@ new_state(int symbol) iend = kernel_end[symbol]; n = iend - isp1; - p = (core *) allocate((unsigned) (sizeof(core) + (n - 1) * sizeof(short))); + p = (core *) allocate((unsigned) (sizeof(core) + n * sizeof(short))); p->accessing_symbol = symbol; p->number = nstates; p->nitems = n; @@ -423,8 +423,8 @@ void save_shifts(void) short *sp2; short *send; - p = (shifts *) allocate((unsigned) (sizeof(shifts) + - (nshifts - 1) * sizeof(short))); + p = (shifts *) allocate( + (unsigned) (sizeof(shifts) + nshifts * sizeof(short))); p->number = this_state->number; p->nshifts = nshifts; @@ -472,8 +472,8 @@ void save_reductions(void) if (count) { - p = (reductions *) allocate((unsigned) (sizeof(reductions) + - (count - 1) * sizeof(short))); + p = (reductions *) allocate( + (unsigned) (sizeof(reductions) + count * sizeof(short))); p->number = this_state->number; p->nreds = count; diff --git a/yacc/main.c b/yacc/main.c index d2c16513..59cf02d5 100644 --- a/yacc/main.c +++ b/yacc/main.c @@ -18,11 +18,10 @@ #include #include #include "defs.h" -#ifdef HAS_UNISTD -#include -#endif #ifdef _WIN32 #include +#else +#include #endif #include "caml/version.h" @@ -37,7 +36,7 @@ char sflag; char big_endian; char_os *file_prefix = 0; -char *myname = "yacc"; +const char *myname = "yacc"; char_os temp_form[] = T("yacc.XXXXXXX"); #ifdef _WIN32 @@ -57,7 +56,7 @@ char_os *entry_file_name; char_os *code_file_name; char *code_file_name_disp, *interface_file_name_disp; char_os *interface_file_name; -char_os *input_file_name = T(""); +const char_os *input_file_name = T(""); char *input_file_name_disp; char_os *output_file_name; char_os *text_file_name; @@ -287,7 +286,7 @@ allocate(unsigned int n) void create_file_names(void) { int i, len; - char_os *tmpdir; + const char_os *tmpdir; #ifdef _WIN32 tmpdir = _wgetenv(L"TEMP"); diff --git a/yacc/output.c b/yacc/output.c index 9ad9af44..f291236e 100644 --- a/yacc/output.c +++ b/yacc/output.c @@ -61,7 +61,7 @@ int pack_vector (int vector); void output(void) { - extern char *header[], *define_tables[]; + extern char const * const header[], * const define_tables[]; free_itemsets(); free_shifts(); diff --git a/yacc/skeleton.c b/yacc/skeleton.c index e4b6413c..a1ec4f71 100644 --- a/yacc/skeleton.c +++ b/yacc/skeleton.c @@ -17,14 +17,14 @@ #include "defs.h" -char *header[] = +char const * const header[] = { "open Parsing", "let _ = parse_error;;", /* avoid warning 33 (PR#5719) */ 0 }; -char *define_tables[] = +char const * const define_tables[] = { "let yytables =", " { Parsing.actions=yyact;", @@ -46,7 +46,7 @@ char *define_tables[] = 0 }; -void write_section(char **section) +void write_section(char const * const * section) { int i; FILE *fp; diff --git a/yacc/symtab.c b/yacc/symtab.c index e80bd860..96a04d28 100644 --- a/yacc/symtab.c +++ b/yacc/symtab.c @@ -25,9 +25,9 @@ bucket *last_symbol; int -hash(char *name) +hash(const char *name) { - char *s; + const char *s; int c, k; assert(name && *name); @@ -41,7 +41,7 @@ hash(char *name) bucket * -make_bucket(char *name) +make_bucket(const char *name) { bucket *bp; @@ -69,7 +69,7 @@ make_bucket(char *name) bucket * -lookup(char *name) +lookup(const char *name) { bucket *bp, **bpp; -- 2.30.2